Advertisement
MaksNew

Untitled

Feb 1st, 2021
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <filesystem>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7. int readInputType()
  8. {
  9.     bool isIncorrect;
  10.     int value;
  11.     string inputLine;
  12.     cout << "Выберите способ ввода массива и его размера: 1 - файл, 2 – консоль. " << endl;
  13.     do
  14.     {
  15.         isIncorrect = false;
  16.         try
  17.         {
  18.             cin >> inputLine;
  19.             value = stoi(inputLine);
  20.         }
  21.         catch (...)
  22.         {
  23.             isIncorrect = true;
  24.             cout << "Введите одно из предложенных чисел" << endl;
  25.         }
  26.         if ((((value != 1) && (value != 2))) && !isIncorrect)
  27.         {
  28.             cout << "Выберете одно из двух значений! 1 для ввода из файла, или 2 для ввода консоли!" << endl;
  29.             isIncorrect = true;
  30.         }
  31.     } while (isIncorrect);
  32.     return value;
  33. }
  34.  
  35. bool isFileCorrect(string path)
  36. {
  37.     int size;
  38.     int i;
  39.     int elementOfArray;
  40.     string buf;
  41.     fstream fin(path, std::ios_base::in);
  42.     bool isCorrect;
  43.     isCorrect = true;
  44.     while (!fin.eof() && isCorrect)
  45.     {
  46.         fin >> buf;
  47.         try
  48.         {
  49.             size = stoi(buf);
  50.         }
  51.         catch (...)
  52.         {
  53.             isCorrect = false;
  54.         }
  55.         i = 0;
  56.         while (isCorrect && !fin.eof())
  57.         {
  58.             fin >> buf;
  59.             try
  60.             {
  61.                 elementOfArray = stoi(buf);
  62.             }
  63.             catch (...)
  64.             {
  65.                 isCorrect = false;
  66.             }
  67.             ++i;
  68.         }
  69.         if (isCorrect && size != i)
  70.             isCorrect = false;
  71.     }
  72.     fin.close();
  73.     return isCorrect;
  74. }
  75.  
  76. string readFilePath(bool flag)
  77. {
  78.     string path;
  79.     bool isIncorrect;
  80.     do
  81.     {
  82.         isIncorrect = false;
  83.         cout << "Введите абсолютный путь к файлу: " << endl;
  84.         cin >> path;
  85.         if (!std::filesystem::exists(path))
  86.         {
  87.             cout << "Файл не найден. Проверьте введённый путь." << endl;
  88.             isIncorrect = true;
  89.         }
  90.         else
  91.         {
  92.             if (flag && !isFileCorrect(path))
  93.             {
  94.                 cout << "Ошибка при чтении файла! Проверьте данные и попробуйте ещё раз!" << endl;
  95.                 isIncorrect = true;
  96.             }
  97.         }
  98.  
  99.     } while (isIncorrect);
  100.     return path;
  101. }
  102.  
  103. void printArray(int* arr, int size)
  104. {
  105.     for (int i = 0; i < size; ++i)
  106.     {
  107.         cout << arr[i] << " ";
  108.     }
  109. }
  110.  
  111. int* readArrayFromFile(int*& arr, int& size)
  112. {
  113.     bool flag;
  114.     flag = true;
  115.     string path;
  116.     path = readFilePath(flag);
  117.     int i;
  118.     string buf;
  119.     fstream fin(path, std::ios_base::in);
  120.     fin >> buf;
  121.     size = stoi(buf);
  122.     arr = new int[size];
  123.     i = 0;
  124.     while (!fin.eof())
  125.     {
  126.         fin >> buf;
  127.         arr[i] = stoi(buf);
  128.         ++i;
  129.     }
  130.     fin.close();
  131.     cout << "В массиве" << endl;
  132.     printArray(arr, size);
  133.     return arr;
  134. }
  135.  
  136. int readSizeOfArray()
  137. {
  138.     bool isIncorrect;
  139.     int size;
  140.     string inputLine;
  141.     cout << "Введите размер массива:" << endl;
  142.     do
  143.     {
  144.         isIncorrect = false;
  145.         getline(cin, inputLine);
  146.         try
  147.         {
  148.             size = stoi(inputLine);
  149.         }
  150.         catch (...)
  151.         {
  152.             isIncorrect = true;
  153.             cout << "Введите натуральное число в диапазоне от 3 до 2*10^9\n";
  154.         }
  155.         if (!isIncorrect)
  156.         {
  157.             if (size < 3 || size > 2000000000)
  158.             {
  159.                 cout << "Введите натуральное число в диапазоне от 3 до 2*10^9\n";
  160.                 isIncorrect = true;
  161.  
  162.             }
  163.         }
  164.     } while (isIncorrect);
  165.     return size;
  166. }
  167.  
  168. int* readArrayFromConsole(int*& arr, int& size)
  169. {
  170.     bool isIncorrect;
  171.     string inputLine;
  172.     size = readSizeOfArray();
  173.     arr = new int[size];
  174.     for (int i = 0; i < size; i++)
  175.     {
  176.         do
  177.         {
  178.             isIncorrect = false;
  179.             cout << "Введите " << i + 1 << "-ый элемент массива" << endl;
  180.             getline(cin, inputLine);
  181.             try
  182.             {
  183.                 arr[i] = stoi(inputLine);
  184.             }
  185.             catch (...)
  186.             {
  187.                 isIncorrect = true;
  188.                 cout << "Значение массива должно быть числом\n";
  189.             }
  190.             if (!isIncorrect)
  191.             {
  192.                 if (arr[i] < -2000000000 || arr[i] > 2000000000)
  193.                 {
  194.                     cout << "Введите натуральное число в диапазоне +-2*10^9\n";
  195.                     isIncorrect = true;
  196.  
  197.                 }
  198.             }
  199.         } while (isIncorrect);
  200.     }
  201.     cout << "В массиве" << endl;
  202.     printArray(arr, size);
  203.     return arr;
  204. }
  205.  
  206. int* readArrayFrom(int*& arr, int& size)
  207. {
  208.     int value;
  209.     value = readInputType();
  210.     if (value == 1)
  211.     {
  212.         arr = readArrayFromFile(arr, size);
  213.     }
  214.     if (value == 2)
  215.     {
  216.         arr = readArrayFromConsole(arr, size);
  217.     }
  218.     cout << endl;
  219.     cout << "Индексы элементов, которые являются крайними в подпоследовательности перевёртышей:" << endl;
  220.     return arr;
  221. }
  222.  
  223. void searchForPalindrom(int* arr, int size, int& watch)
  224. {
  225.     int bufi, bufj, j;
  226.     bool isPalindrom;
  227.     bufi = 0;
  228.     bufj = 0;
  229.     j = 0;
  230.     isPalindrom = true;
  231.     for (int i = 0; i < size; ++i)
  232.     {
  233.         j = size - 1;
  234.         if (arr[i] == arr[j])
  235.         {
  236.             bufi = i;
  237.             bufj = j;
  238.             isPalindrom = true;
  239.             while (bufi != bufj && isPalindrom)
  240.             {
  241.                 if ((bufi == i) && (bufj == j) && (bufi + 1 == bufj) && (arr[bufi+1] == arr[bufj]))
  242.                     isPalindrom = false;
  243.                 if (isPalindrom && (arr[bufi] != arr[bufj]))
  244.                 {
  245.                     isPalindrom = false;
  246.                 }
  247.                 ++bufi;
  248.                 --bufj;
  249.             }
  250.             if (isPalindrom && i != j)
  251.             {
  252.                 cout << i+1  << " " << j+1  << endl;
  253.                 ++watch;
  254.             }
  255.         }
  256.     }
  257.     if (j > 0)
  258.     {
  259.         searchForPalindrom(arr, size - 1, watch);
  260.     }
  261. }
  262.  
  263. void saveResultToFile(int* arr, int size)
  264. {
  265.     string path;
  266.     int bufi, bufj, j, watch;
  267.     bool isPalindrom, flag;
  268.     flag = false;
  269.     path = readFilePath(flag);
  270.     bufi = 0;
  271.     bufj = 0;
  272.     j = 0;
  273.     watch = 0;
  274.     isPalindrom = true;
  275.     fstream fout(path, std::ios_base::out);
  276.     fout << "В массиве:" << endl;
  277.     for (int i = 0; i < size; ++i)
  278.     {
  279.         fout << arr[i] << " ";
  280.     }
  281.     fout << endl;
  282.     fout << "Индексы элементов, которые являются крайними в подпоследовательности перевёртышей:" << endl;
  283.     fout << endl;
  284.     for (int i = 0; i < size; ++i)
  285.     {
  286.         for (int j = size - 1; j > 0; --j)
  287.         {
  288.             if (arr[i] == arr[j])
  289.             {
  290.                 bufi = i;
  291.                 bufj = j;
  292.                 isPalindrom = true;
  293.                 while (bufi != bufj && isPalindrom)
  294.                 {
  295.                     if ((bufi == i) && (bufj == j) && (bufi + 1 == bufj) && (arr[bufi + 1] == arr[bufj]))
  296.                         isPalindrom = false;
  297.                     if (isPalindrom && (arr[bufi] != arr[bufj]))
  298.                     {
  299.                         isPalindrom = false;
  300.                     }
  301.                     ++bufi;
  302.                     --bufj;
  303.                 }
  304.                 if (isPalindrom && i != j)
  305.                 {
  306.                     fout << i+1 << " " << j+1 << endl;
  307.                     fout << endl;
  308.                     ++watch;
  309.                 }
  310.             }
  311.         }
  312.     }
  313.     if (watch < 1)
  314.     {
  315.         fout << "Отсутствуют!" << endl;
  316.     }
  317.     fout.close();
  318. }
  319.  
  320.  
  321. void checkForAbsense(int watch)
  322. {
  323.     if (watch < 1)
  324.     {
  325.         cout << endl;
  326.         cout << "Отсутствуют!" << endl;
  327.     }
  328. }
  329.  
  330. int main()
  331. {
  332.     setlocale(LC_ALL, "ru");
  333.     int size, watch;
  334.     string path;
  335.     int* arr;
  336.     size = 0;
  337.     watch = 0;
  338.     arr = readArrayFrom(arr, size);
  339.     cout << endl;
  340.     searchForPalindrom(arr, size, watch);
  341.     checkForAbsense(watch);
  342.     saveResultToFile(arr, size);
  343.     delete[]arr;
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement