Advertisement
Guest User

Kursach

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