DarkDevourer

Курсовая ЯВУ - рабочая, без графики и записи в файл

Dec 1st, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.41 KB | None | 0 0
  1. //include "phc.h"
  2. #include <iostream>
  3. #include <math.h>
  4. #include <string>
  5. #include <fstream>
  6. //#include "graphics.h"
  7.  
  8. using namespace std;
  9.  
  10. double const pi = 4 * atan(1);
  11.  
  12. void From_String_To_Double(int *flag, string &x, int *k, double *X, int *N); //Подпрограмма для получения элементов массива X[k] из строки x
  13.  
  14. void Creating_Arrays_H_and_Xobr(double *X, double *H, double *Xobr, int *N); //Подпрограмма создания массивов H из массива X и массива X [обратное] из массива H
  15.  
  16. int main()
  17. {
  18. ifstream in;
  19. setlocale(LC_ALL, "RUSSIAN");
  20. string key, key1, N1, x, temps;
  21. int N, k, flag;
  22. int i;
  23.  
  24. cout << "Программа для преобразования массива X[k] в массив H[u] по формуле дискретного преобразования Хартли и массива H[u] Xобр[k] по формуле обратного преобразования Хартли" << endl;
  25. while (1)
  26. {
  27. cout << "Выберите режим работы программы:\n1 - ввод элементов массива с клавиатуры.\n2 - создание массива на основе файла.\n0 - выход из программы.\nПримечание: название файла: \"C:\\test\\KursovayaInput.txt\"" << endl << "Выбрано ";
  28. getline(cin, key);
  29.  
  30. if (key == "1")
  31. {
  32. flag = 0;
  33. k = 0;
  34.  
  35. cout << "Введите размерность массива, который хотите заполнить" << endl << "N = ";
  36. cin >> N1;// Ввод размера массива
  37. size_t number1 = N1.find_first_not_of("0123456789");
  38. if (number1 != std::string::npos)// Если найдено что-то помимо цифр
  39. {
  40. cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
  41. cin.ignore();
  42. break;
  43. }
  44. N = stoi(N1.c_str());
  45.  
  46. double *X = new double[N];//Создание динамических массивов (эта и две след. строки)
  47. double *Xobr = new double[N];
  48. double *H = new double[N];
  49.  
  50. cout << "Введите с клавиатуры значения элементов массива X[k]. После введения числа нажмите Enter.\n";
  51. while ((k < N))// Заполнение массива X[k]
  52. {
  53. cin >> temps;
  54.  
  55. From_String_To_Double(&flag, temps, &k, X, &N);
  56.  
  57. if (flag == 1)
  58. {
  59. cin.ignore();
  60. break;
  61. }
  62. }
  63.  
  64. if (flag == 0)
  65. {
  66. Creating_Arrays_H_and_Xobr(X, H, Xobr, &N); //Создание массивов H из массива X и массива X[обратное] из массива H
  67. }
  68. cin.ignore();
  69.  
  70. delete[] X;//Очистка памяти от динамических массивов (эта и дву след. строки)
  71. delete[] H;
  72. delete[] Xobr;
  73.  
  74. }
  75.  
  76. else if (key == "2")
  77. {
  78. flag = 0; //Флаг для проверки правильности ввода
  79. k = 0;
  80. N1 = "";
  81.  
  82. in.open("C:\\test\\KursovayaInput.txt"); //Открытие файла
  83. if (!in.is_open()) //Проверка, открылся файл или нет
  84. {
  85. cout << "Файл открыть не удалось. Пожалуйста, проверьте, правильно ли введено имя файла и его наличие.\nИмя файла по умолчанию - C:\\test\\KursovayaInput.txt" << endl;
  86. cin.ignore();
  87. break;
  88. }
  89. if (in.eof())
  90. {
  91. cout << "Файл пустой. Пожалуйста, заполните его.\nАдрес файла: C:\\test\\KursovayaInput.txt\n";
  92. in.close();
  93. cin.ignore();
  94. break;
  95. }
  96.  
  97. getline(in, x);
  98. if (x.find(" ") < x.find("\t") || x.find("\t") == -1)
  99. {
  100. N1.insert(0, x, 0, x.find(" "));
  101. }
  102. else
  103. {
  104. N1.insert(0, x, 0, x.find("\t"));
  105. }
  106. size_t number1 = N1.find_first_not_of("0123456789");
  107. if (number1 != std::string::npos) //Если найдено что-то помимо цифр
  108. {
  109. cout << "Не удалось создать массив, так как первая лексема в файле - не число целого типа. Возврат в последнее меню.\n" << endl;
  110. in.close();
  111. cin.ignore();
  112. break;
  113. }
  114. N = stoi(N1.c_str());
  115.  
  116. double *X = new double[N]; //Создание динамических массивов (эта и две след. строки)
  117. double *Xobr = new double[N];
  118. double *H = new double[N];
  119.  
  120. x.erase(0, N1.length());
  121. while ((x.find("\t") == 0 || x.find(" ") == 0) && (x.find("\t") != -1 || x.find(" ") != -1))
  122. {
  123. x.erase(0, 1);
  124. }
  125.  
  126. k = 0;
  127. if (N != 0)
  128. {
  129. do
  130. {
  131. while (1)
  132. {
  133. temps = "";
  134. i = 0;
  135.  
  136. while ((x.find(' ') != 0) && (x.find('\t') != 0) && (x.length() != 0))
  137. {
  138. temps.insert(i, x, 0, 1);
  139. i++;
  140. x.erase(0, 1);
  141. }
  142.  
  143. From_String_To_Double(&flag, temps, &k, X, &N);
  144.  
  145. while ((x.find('\t') == 0 || x.find(' ') == 0) && (x.find("\t") != -1 || x.find(" ") != -1))
  146. {
  147. x.erase(0, 1);
  148. }
  149.  
  150. if (x.length() == 0 || k == N) //Выход из цикла анализа строки, если дошли до конца строки
  151. {
  152. break;
  153. }
  154.  
  155. }
  156. if (flag == 1 || k == N) //Если в файле не только числа или массив заполнен
  157. {
  158. break;
  159. }
  160. getline(in, x);
  161. } while (x != "");
  162.  
  163. if ((k < N)) //Если в файле оказалось чисел больше или меньше заявленного
  164. {
  165. cout << "В файле количество элементов, который нужно записать в массив X, меньше заявленного количества элементов.\n";
  166. }
  167. else if (flag == 0)
  168. {
  169. Creating_Arrays_H_and_Xobr(X, H, Xobr, &N); //Создание массивов H из массива X и массива X[обратное] из массива H
  170. }
  171. }
  172. in.close();
  173.  
  174. delete[] X;//Очистка памяти от динамических массивов (эта и две след. строки)
  175. delete[] H;
  176. delete[] Xobr;
  177. }
  178.  
  179. else if (key == "0")
  180. {
  181. cout << "Завершение работы программы." << endl;
  182. return 0;
  183. }
  184.  
  185. else
  186. {
  187. cout << "Такой команды не существует в данной программе. Возврат в меню." << endl;
  188. }
  189. }
  190. }
  191.  
  192. void From_String_To_Double(int *flag, string &x, int *k, double *X, int *N)
  193. {
  194. size_t number2 = x.find_first_not_of("-,.0123456789");
  195. size_t symbols = x.find_first_not_of("-,.");
  196. size_t point = x.find_first_not_of(".");
  197. if ((number2 != std::string::npos) || (symbols == std::string::npos) || (x.find(".") != x.rfind(".")))
  198. {
  199. cout << "Ошибка. Наличие постороннего символа (написано не число). Возврат в меню." << endl;
  200. *flag = 1;
  201. return;
  202. }
  203.  
  204. while (x.find(".") != -1)
  205. {
  206. x.replace(x.find("."), 1, ",");
  207. }
  208.  
  209. X[*k] = stod(x.c_str());
  210.  
  211. *k += 1;
  212. }
  213.  
  214. void Creating_Arrays_H_and_Xobr(double *X, double *H, double *Xobr, int *N) //Подпрограмма создания массивов H из массива X и массива X [обратное] из массива H
  215. {
  216. int k, u;
  217.  
  218. for (k = 0; k < *N; k++)
  219. cout << "X[" << k << "] = " << X[k] << "\n";
  220.  
  221. for (u = 0; u < *N; u++) // Заполнение массива H[u] по формуле дискретного преобразования Хартли
  222. {
  223. H[u] = 0;
  224. for (k = 0; k < *N; k++)
  225. {
  226. H[u] = H[u] + X[k] * (sin(2 * pi*k*u / *N) + cos(2 * pi*k*u / *N));
  227. }
  228. H[u] = H[u] / sqrt(*N);
  229. cout << "H[" << u << "] = " << H[u] << "\n";
  230. }
  231.  
  232. for (k = 0; k < *N; k++) // Заполнение массива X обратный [k]
  233. {
  234. Xobr[k] = 0;
  235. for (u = 0; u < *N; u++)
  236. {
  237. Xobr[k] = Xobr[k] + H[u] * (sin(2 * pi*k*u / *N) + cos(2 * pi*k*u / *N));
  238. }
  239. Xobr[k] = Xobr[k] / sqrt(*N);
  240. if (fabs(Xobr[k] - X[k]) > 0.00001)
  241. {
  242. cout << "Произошла ошибка в вычислениях.\n";
  243. break;
  244. }
  245. cout << "Xobr[" << k << "] = " << Xobr[k] << "\n";
  246. }
  247. }
Add Comment
Please, Sign In to add comment