Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //include "phc.h"
- #include <iostream>
- #include <math.h>
- #include <string>
- #include <fstream>
- //#include "graphics.h"
- using namespace std;
- double const pi = 4 * atan(1);
- void From_String_To_Double(int *flag, string &x, int *k, double *X, int *N); //Подпрограмма для получения элементов массива X[k] из строки x
- void Creating_Arrays_H_and_Xobr(double *X, double *H, double *Xobr, int *N); //Подпрограмма создания массивов H из массива X и массива X [обратное] из массива H
- int main()
- {
- ifstream in;
- setlocale(LC_ALL, "RUSSIAN");
- string key, key1, N1, x, temps;
- int N, k, flag;
- 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);
- if (key == "1")
- {
- flag = 0;
- k = 0;
- cout << "Введите размерность массива, который хотите заполнить" << endl << "N = ";
- cin >> N1;// Ввод размера массива
- size_t number1 = N1.find_first_not_of("0123456789");
- if (number1 != std::string::npos)// Если найдено что-то помимо цифр
- {
- cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
- cin.ignore();
- break;
- }
- N = stoi(N1.c_str());
- double *X = new double[N];//Создание динамических массивов (эта и две след. строки)
- double *Xobr = new double[N];
- double *H = new double[N];
- cout << "Введите с клавиатуры значения элементов массива X[k]. После введения числа нажмите Enter.\n";
- while ((k < N))// Заполнение массива X[k]
- {
- cin >> temps;
- From_String_To_Double(&flag, temps, &k, X, &N);
- if (flag == 1)
- {
- cin.ignore();
- break;
- }
- }
- if (flag == 0)
- {
- Creating_Arrays_H_and_Xobr(X, H, Xobr, &N); //Создание массивов H из массива X и массива X[обратное] из массива H
- }
- cin.ignore();
- delete[] X;//Очистка памяти от динамических массивов (эта и дву след. строки)
- delete[] H;
- delete[] Xobr;
- }
- else if (key == "2")
- {
- flag = 0; //Флаг для проверки правильности ввода
- k = 0;
- N1 = "";
- in.open("C:\\test\\KursovayaInput.txt"); //Открытие файла
- if (!in.is_open()) //Проверка, открылся файл или нет
- {
- cout << "Файл открыть не удалось. Пожалуйста, проверьте, правильно ли введено имя файла и его наличие.\nИмя файла по умолчанию - C:\\test\\KursovayaInput.txt" << endl;
- cin.ignore();
- break;
- }
- if (in.eof())
- {
- cout << "Файл пустой. Пожалуйста, заполните его.\nАдрес файла: C:\\test\\KursovayaInput.txt\n";
- in.close();
- cin.ignore();
- break;
- }
- getline(in, x);
- if (x.find(" ") < x.find("\t") || x.find("\t") == -1)
- {
- N1.insert(0, x, 0, x.find(" "));
- }
- else
- {
- N1.insert(0, x, 0, x.find("\t"));
- }
- size_t number1 = N1.find_first_not_of("0123456789");
- if (number1 != std::string::npos) //Если найдено что-то помимо цифр
- {
- cout << "Не удалось создать массив, так как первая лексема в файле - не число целого типа. Возврат в последнее меню.\n" << endl;
- in.close();
- cin.ignore();
- break;
- }
- N = stoi(N1.c_str());
- double *X = new double[N]; //Создание динамических массивов (эта и две след. строки)
- double *Xobr = new double[N];
- double *H = new double[N];
- x.erase(0, N1.length());
- while ((x.find("\t") == 0 || x.find(" ") == 0) && (x.find("\t") != -1 || x.find(" ") != -1))
- {
- x.erase(0, 1);
- }
- k = 0;
- if (N != 0)
- {
- do
- {
- while (1)
- {
- temps = "";
- i = 0;
- while ((x.find(' ') != 0) && (x.find('\t') != 0) && (x.length() != 0))
- {
- temps.insert(i, x, 0, 1);
- i++;
- x.erase(0, 1);
- }
- From_String_To_Double(&flag, temps, &k, X, &N);
- while ((x.find('\t') == 0 || x.find(' ') == 0) && (x.find("\t") != -1 || x.find(" ") != -1))
- {
- x.erase(0, 1);
- }
- if (x.length() == 0 || k == N) //Выход из цикла анализа строки, если дошли до конца строки
- {
- break;
- }
- }
- if (flag == 1 || k == N) //Если в файле не только числа или массив заполнен
- {
- break;
- }
- getline(in, x);
- } while (x != "");
- if ((k < N)) //Если в файле оказалось чисел больше или меньше заявленного
- {
- cout << "В файле количество элементов, который нужно записать в массив X, меньше заявленного количества элементов.\n";
- }
- else if (flag == 0)
- {
- Creating_Arrays_H_and_Xobr(X, H, Xobr, &N); //Создание массивов H из массива X и массива X[обратное] из массива H
- }
- }
- in.close();
- delete[] X;//Очистка памяти от динамических массивов (эта и две след. строки)
- delete[] H;
- delete[] Xobr;
- }
- else if (key == "0")
- {
- cout << "Завершение работы программы." << endl;
- return 0;
- }
- else
- {
- cout << "Такой команды не существует в данной программе. Возврат в меню." << endl;
- }
- }
- }
- void From_String_To_Double(int *flag, string &x, int *k, double *X, int *N)
- {
- 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(".");
- if ((number2 != std::string::npos) || (symbols == std::string::npos) || (x.find(".") != x.rfind(".")))
- {
- cout << "Ошибка. Наличие постороннего символа (написано не число). Возврат в меню." << endl;
- *flag = 1;
- return;
- }
- while (x.find(".") != -1)
- {
- x.replace(x.find("."), 1, ",");
- }
- X[*k] = stod(x.c_str());
- *k += 1;
- }
- void Creating_Arrays_H_and_Xobr(double *X, double *H, double *Xobr, int *N) //Подпрограмма создания массивов H из массива X и массива X [обратное] из массива H
- {
- int k, u;
- 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);
- 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";
- }
- }
Add Comment
Please, Sign In to add comment