Advertisement
Guest User

Kursach

a guest
Oct 22nd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.44 KB | None | 0 0
  1. #define CRT_SECURE_NO_WARNINGS
  2. #include "pch.h"
  3. #include <iostream>
  4. #include <math.h>
  5. #include <string>
  6.  
  7. using namespace std;
  8. int main()
  9. {
  10. setlocale(LC_ALL, "RUSSIAN");
  11. string key, key1, N1, x;
  12. double const pi = 3.141592653589793238463;
  13. int N, k, u, flag;
  14. std::string::size_type sz;
  15. cout << "Программа для преобразования массива X[k] в массив H[u] по формуле дискретного преобразования Хартли и массива H[u] Xобр[k] по формуле обратного преобразования Хартли" << endl;
  16. while (1)
  17. {
  18. cout << "Выберите режим работы программы:\n1 - ввод элементов массива с клавиатуры.\n2 - создание массива на основе файла.\n0 - выход из программы." << endl << "Выбрано ";
  19. getline(cin, key);
  20. cout << endl;
  21. if (key == "1")
  22. while (1)
  23. {
  24. {
  25. cout << "Выберите режим заполнения массива X[k]:\n1 - заранее заполненный в программе массив (контрольное значение)\n2 - заполнение массива с клавиатуры\n0 - возврат в меню." << endl << "Выбран режим ";
  26. cin >> key1;// Ключ - выбор типа работы
  27. cout << endl;
  28. if (key1 == "1")// Массив создаётся из данных в самой программе
  29. {
  30. N = 10;
  31. double *X = new double[N];// Создание динамических массивов (эта и две след. строки)
  32. double *Xobr = new double[N];
  33. double *H = new double[N];
  34. for (k = 0; k < N; k++) // Заполнение массива X[k]
  35. {
  36. X[k] = k + 1;
  37. }
  38. for (k = 0; k < N; k++)
  39. cout << "X[" << k << "] = " << X[k] << "\n";
  40. for (u = 0; u < N; u++) // Заполнение массива H[u] по формуле дискретного преобразования Хартли
  41. {
  42. for (k = 0; k < N; k++)
  43. {
  44. H[u] = X[k] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
  45. }
  46. H[u] = H[u] / sqrt(N);
  47. cout << "H[" << u << "] = " << H[u] << "\n";
  48. }
  49. for (k = 0; k < N; k++) // Заполнение массива X обратный [k]
  50. {
  51. for (u = 0; u < N; u++)
  52. {
  53. Xobr[k] = H[u] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
  54. }
  55. Xobr[k] = Xobr[k] / sqrt(N);
  56. cout << "Xobr[" << k << "] = " << Xobr[k] << "\n";
  57. }
  58. delete[] X;//Очистка памяти от динамических массивов (эта и дву след. строки)
  59. delete[] H;
  60. delete[] Xobr;
  61. }
  62. else if (key1 == "2")
  63. {
  64. flag = 0;
  65. cout << "Введите размерность массива, который хотите заполнить" << endl << "N = ";
  66. cin >> N1;// Ввод размера массива
  67. size_t number1 = N1.find_first_not_of("0123456789");
  68. if (number1 != std::string::npos)// Если найдено что-то помимо цифр
  69. {
  70. cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
  71. N1 = "0";
  72. }
  73. N = stoi(N1.c_str());
  74. double *X = new double[N];//Создание динамических массивов (эта и две след. строки)
  75. double *Xobr = new double[N];
  76. double *H = new double[N];
  77. if (N!=0)
  78. cout << "Введите с клавиатуры значения элементов массива X[k]. После введения числа нажмите Enter.\n";
  79. for (k = 0; k < N; k++) // Заполнение массива X[k]
  80. {
  81. cin >> x;
  82. size_t number2 = x.find_first_not_of("-,.0123456789");
  83. size_t symbols = x.find_first_not_of("-,.");
  84. size_t point = x.find_first_not_of(".");
  85. size_t comma = x.find_first_not_of(",");
  86. if ((number2 != std::string::npos)||(symbols == std::string::npos)||((point == std::string::npos)&&(comma == std::string::npos)))
  87. {
  88. cout << "Ошибка. Наличие постороннего символа (написано не число). Возврат в меню." << endl;
  89. flag = 1;
  90. break;
  91. }
  92. while (x.find(".") != -1)
  93. {
  94. x.replace(x.find("."), 1, ",");
  95. }
  96. X[k] = stod(x.c_str());
  97. }
  98. if (flag == 0)
  99. {
  100. for (k = 0; k < N; k++)
  101. cout << "X[" << k << "] = " << X[k] << "\n";
  102. for (u = 0; u < N; u++) // Заполнение массива H[u] по формуле дискретного преобразования Хартли
  103. {
  104. for (k = 0; k < N; k++)
  105. {
  106. H[u] = X[k] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
  107. }
  108. H[u] = H[u] / sqrt(N);
  109. cout << "H[" << u << "] = " << H[u] << "\n";
  110. }
  111. for (k = 0; k < N; k++) // Заполнение массива X обратный [k]
  112. {
  113. for (u = 0; u < N; u++)
  114. {
  115. Xobr[k] = H[u] * (sin(2 * pi*k*u / N) + cos(2 * pi*k*u / N));
  116. }
  117. Xobr[k] = Xobr[k] / sqrt(N);
  118. cout << "Xobr[" << k << "] = " << Xobr[k] << "\n";
  119. }
  120. }
  121. delete[] X;//Очистка памяти от динамических массивов (эта и дву след. строки)
  122. delete[] H;
  123. delete[] Xobr;
  124. }
  125. else if (key1 == "0")// Выход в меню
  126. {
  127. cout << "Выход из данного режима работы программы." << endl;
  128. cin.ignore();
  129. break;
  130. }
  131. else// Введение любого другого числа
  132. {
  133. cout << "Данного типа заполнения массива не существует." << endl;
  134. continue;
  135. }
  136. }
  137. }
  138. else if (key == "2")
  139. {
  140. cout << "Такая функция пока недоступна" << endl;
  141. }
  142. else if (key == "0")
  143. {
  144. cout << "Завершение работы программы." << endl;
  145. return 0;
  146. }
  147. else
  148. {
  149. cout << "Такой команды не существует в данной программе. Возврат в меню." << endl;
  150. }
  151. }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement