DarkDevourer

Курсовая ЯВУ

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