Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <math.h>
- #include <string>
- using namespace std;
- int main()
- {
- FILE *in;
- setlocale(LC_ALL, "RUSSIAN");
- string key, key1, N1, x, buff;
- double const pi = 3.141592653589793238463;
- int N, k, u, flag;
- char temps[256];
- int elements_count = 0; //Счётчик для проверки, что число элементов равно тому, которое было заявлено
- int i;
- cout << "Программа для преобразования массива X[k] в массив H[u] по формуле дискретного преобразования Хартли и массива H[u] Xобр[k] по формуле обратного преобразования Хартли" << endl;
- while (1)
- {
- cout << "Выберите режим работы программы:\n1 - ввод элементов массива с клавиатуры.\n2 - создание массива на основе файла.\n0 - выход из программы.\nПримечание: название файла: \"C:\\test\\KursovayaInput.txt\"" << endl << "Выбрано ";
- getline(cin, key);
- cout << endl;
- if (key == "1")
- {
- flag = 0;
- cout << "Введите размерность массива, который хотите заполнить" << endl << "N = ";
- cin >> N1;// Ввод размера массива
- size_t number1 = N1.find_first_not_of("0123456789");
- if (number1 != std::string::npos)// Если найдено что-то помимо цифр
- {
- cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
- N1 = "0";
- }
- N = stoi(N1.c_str());
- double *X = new double[N];//Создание динамических массивов (эта и две след. строки)
- double *Xobr = new double[N];
- double *H = new double[N];
- if (N != 0)
- cout << "Введите с клавиатуры значения элементов массива X[k]. После введения числа нажмите Enter.\n";
- for (k = 0; k < N; k++) // Заполнение массива X[k]
- {
- cin >> x;
- size_t number2 = x.find_first_not_of("-,.0123456789");
- size_t symbols = x.find_first_not_of("-,.");
- size_t point = x.find_first_not_of(".");
- size_t comma = x.find_first_not_of(",");
- if ((number2 != std::string::npos) || (symbols == std::string::npos) || ((point == std::string::npos) && (comma == std::string::npos)))
- {
- cout << "Ошибка. Наличие постороннего символа (написано не число). Возврат в меню." << endl;
- flag = 1;
- break;
- }
- while (x.find(".") != -1)
- {
- x.replace(x.find("."), 1, ",");
- }
- X[k] = stod(x.c_str());
- if (errno == ERANGE)
- {
- flag = 1;
- errno = 0;
- cout << "Произошло переполнение.\n";
- break;
- }
- }
- if (flag == 0)
- {
- for (k = 0; k < N; k++)
- cout << "X[" << k << "] = " << X[k] << "\n";
- for (u = 0; u < N; u++) // Заполнение массива H[u] по формуле дискретного преобразования Хартли
- {
- H[u] = 0;
- for (k = 0; k < N; k++)
- {
- H[u] = H[u]+ X[k] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
- }
- H[u] = H[u] / sqrt(N);
- if (errno == ERANGE)
- {
- flag = 1;
- errno = 0;
- cout << "Произошло переполнение.\n";
- break;
- }
- cout << "H[" << u << "] = " << H[u] << "\n";
- }
- for (k = 0; k < N; k++) // Заполнение массива X обратный [k]
- {
- Xobr[k] = 0;
- for (u = 0; u < N; u++)
- {
- Xobr[k] = Xobr[k]+ H[u] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
- }
- Xobr[k] = Xobr[k] / sqrt(N);
- if (fabs(Xobr[k] - X[k]) > 0.00001)
- {
- cout << "Произошла ошибка в вычислениях.\n";
- break;
- }
- cout << "Xobr[" << k << "] = " << Xobr[k] << "\n";
- }
- }
- delete[] X;//Очистка памяти от динамических массивов (эта и дву след. строки)
- delete[] H;
- delete[] Xobr;
- }
- else if (key == "2")
- {
- i = 0;
- flag = 0; //Флаг для проверки правильности ввода
- fopen_s(&in,"C:\\test\\KursovayaInput.txt", "rt"); //Открытие файла
- if (in == NULL) //Проверка, открылся файл или нет
- {
- cout << "Файл открыть не удалось. Пожалуйста, проверьте, правильно ли введено имя файла и его наличие." << endl;
- continue;
- }
- fseek(in, 0, SEEK_END); //Проверка файла на пустоту
- if (ftell(in) == 0)
- {
- cout << "Файл пустой. Пожалуйста, заполните его прежде, чем запускть программу.";
- fclose(in);
- continue;
- }
- fseek(in, 0, SEEK_SET);
- fgets(temps, 256, in);
- N1 = "";
- while ((temps[i]!=' ')&&(temps[i] != '\t') && (temps[i] != ';') && (temps[i] != '\n') && (temps[i] != '\0'))
- {
- N1 = N1 + temps[i]; //Запись первой цифры в строку.
- i++;
- }
- size_t number1 = N1.find_first_not_of("0123456789");
- if (number1 != std::string::npos) //Если найдено что-то помимо цифр
- {
- cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
- N1 = "0";
- }
- while ((temps[i] == ' ') || (temps[i] == '\t') || (temps[i] == ';'))
- {
- i++;
- }
- N = stoi(N1.c_str());
- double *X = new double[N]; //Создание динамических массивов (эта и две след. строки)
- double *Xobr = new double[N];
- double *H = new double[N];
- k = 0;
- if (N != 0)
- {
- do
- {
- while (1)
- {
- x = "";
- while ((temps[i] != ' ') && (temps[i] != '\t') && (temps[i] != ';') && (temps[i] != '\n') && (temps[i] != '\0'))
- {
- x = x + temps[i]; //Запись первой цифры в строку.
- i++;
- }
- size_t number2 = x.find_first_not_of("-,.0123456789"); //Проверка на наличие символов помимо цифр
- size_t symbols = x.find_first_not_of("-,."); //Для проверки наличия только символов
- size_t point = x.find_first_not_of("."); //Для проверки наличия точки и запятой в одной введённой цифре
- size_t comma = x.find_first_not_of(",");
- if ((number2 != std::string::npos) || (symbols == std::string::npos) || ((point == std::string::npos) && (comma == std::string::npos)))
- {
- cout << "Ошибка. В файле найдено не число действительного типа. Возврат в меню." << endl;
- flag = 1;
- break;
- }
- while (x.find(".") != -1)
- {
- x.replace(x.find("."), 1, ","); //Замена "." на ",", так как при подключённой русской раскладке программа анализирует , как разделитель целой части и десятичной дроби
- }
- X[k] = stod(x.c_str()); //Перевод введённого значения из строкового типа в действительный
- elements_count++;
- if (errno == ERANGE)
- {
- flag = 1;
- errno = 0;
- cout << "Произошло переполнение.\n";
- break;
- }
- if (elements_count == N)
- {
- break;
- }
- k++;
- while ((temps[i] == ' ') || (temps[i] == '\t') || (temps[i] == ';'))
- {
- i++;
- }
- if ((temps[i] == '\n') || (temps[i] == '\0')) //Выход из цикла анализа строки, если дошли до конца строки
- {
- break;
- }
- }
- i = 0;
- if (flag == 1) //Если в файле не только числа или их количество превысело заявленное
- {
- break;
- }
- }
- while (fgets(temps, 256, in) != NULL);
- if ((elements_count < N)) //Если в файле оказалось чисел больше или меньше заявленного
- {
- cout << "В файле кольчество элементов, который нужно записать в массив X меньше заявленному количества элементов.\n";
- }
- else if (flag == 0)
- {
- for (k = 0; k < N; k++)
- cout << "X[" << k << "] = " << X[k] << "\n";
- for (u = 0; u < N; u++) // Заполнение массива H[u] по формуле дискретного преобразования Хартли
- {
- H[u] = 0;
- for (k = 0; k < N; k++)
- {
- H[u] = H[u] + X[k] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
- }
- H[u] = H[u] / sqrt(N);
- if (errno == ERANGE)
- {
- flag = 1;
- errno = 0;
- cout << "Произошло переполнение.\n";
- break;
- }
- cout << "H[" << u << "] = " << H[u] << "\n";
- }
- if (flag == 0)
- {
- for (k = 0; k < N; k++) // Заполнение массива X обратный [k]
- {
- Xobr[k] = 0;
- for (u = 0; u < N; u++)
- {
- Xobr[k] = Xobr[k] + H[u] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
- }
- Xobr[k] = Xobr[k] / sqrt(N);
- if (fabs(Xobr[k]-X[k])>0.00001)
- {
- cout << "Произошла ошибка в вычислениях.\n";
- break;
- }
- cout << "Xobr[" << k << "] = " << Xobr[k] << "\n";
- }
- }
- }
- }
- fclose(in);
- delete[] X;//Очистка памяти от динамических массивов (эта и две след. строки)
- delete[] H;
- delete[] Xobr;
- }
- else if (key == "0")
- {
- cout << "Завершение работы программы." << endl;
- return 0;
- }
- else
- {
- cout << "Такой команды не существует в данной программе. Возврат в меню." << endl;
- }
- }
- }
Add Comment
Please, Sign In to add comment