Advertisement
DarkDevourer

Kursach

Oct 22nd, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.72 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