Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <sstream>
- #include <filesystem>
- #include <fstream>
- using namespace std;
- int readInputType()
- {
- bool isIncorrect;
- int value;
- string inputLine;
- cout << "Выберите способ ввода массива и его размера: 1 - файл, 2 – консоль. " << endl;
- do
- {
- isIncorrect = false;
- try
- {
- cin >> inputLine;
- value = stoi(inputLine);
- }
- catch (...)
- {
- isIncorrect = true;
- cout << "Введите одно из предложенных чисел" << endl;
- }
- if ((((value != 1) && (value != 2))) && !isIncorrect)
- {
- cout << "Выберете одно из двух значений! 1 для ввода из файла, или 2 для ввода консоли!" << endl;
- isIncorrect = true;
- }
- } while (isIncorrect);
- return value;
- }
- bool isFileCorrect(string path)
- {
- int size;
- int i;
- int elementOfArray;
- string buf;
- fstream fin(path, std::ios_base::in);
- bool isCorrect;
- isCorrect = true;
- while (!fin.eof() && isCorrect)
- {
- fin >> buf;
- try
- {
- size = stoi(buf);
- }
- catch (...)
- {
- isCorrect = false;
- }
- i = 0;
- while (isCorrect && !fin.eof())
- {
- fin >> buf;
- try
- {
- elementOfArray = stoi(buf);
- }
- catch (...)
- {
- isCorrect = false;
- }
- ++i;
- }
- if (isCorrect && size != i)
- isCorrect = false;
- }
- fin.close();
- return isCorrect;
- }
- string readFilePath(bool flag)
- {
- string path;
- bool isIncorrect;
- do
- {
- isIncorrect = false;
- cout << "Введите абсолютный путь к файлу: " << endl;
- cin >> path;
- if (!std::filesystem::exists(path))
- {
- cout << "Файл не найден. Проверьте введённый путь." << endl;
- isIncorrect = true;
- }
- else
- {
- if (flag && !isFileCorrect(path))
- {
- cout << "Ошибка при чтении файла! Проверьте данные и попробуйте ещё раз!" << endl;
- isIncorrect = true;
- }
- }
- } while (isIncorrect);
- return path;
- }
- void printArray(int* arr, int size)
- {
- for (int i = 0; i < size; ++i)
- {
- cout << arr[i] << " ";
- }
- }
- int* readArrayFromFile(int*& arr, int& size)
- {
- bool flag;
- flag = true;
- string path;
- path = readFilePath(flag);
- int i;
- string buf;
- fstream fin(path, std::ios_base::in);
- fin >> buf;
- size = stoi(buf);
- arr = new int[size];
- i = 0;
- while (!fin.eof())
- {
- fin >> buf;
- arr[i] = stoi(buf);
- ++i;
- }
- fin.close();
- cout << "В массиве" << endl;
- printArray(arr, size);
- return arr;
- }
- int readSizeOfArray()
- {
- bool isIncorrect;
- int size;
- string inputLine;
- cout << "Введите размер массива:" << endl;
- do
- {
- isIncorrect = false;
- getline(cin, inputLine);
- try
- {
- size = stoi(inputLine);
- }
- catch (...)
- {
- isIncorrect = true;
- cout << "Введите натуральное число в диапазоне от 3 до 2*10^9\n";
- }
- if (!isIncorrect)
- {
- if (size < 3 || size > 2000000000)
- {
- cout << "Введите натуральное число в диапазоне от 3 до 2*10^9\n";
- isIncorrect = true;
- }
- }
- } while (isIncorrect);
- return size;
- }
- int* readArrayFromConsole(int*& arr, int& size)
- {
- bool isIncorrect;
- string inputLine;
- size = readSizeOfArray();
- arr = new int[size];
- for (int i = 0; i < size; i++)
- {
- do
- {
- isIncorrect = false;
- cout << "Введите " << i + 1 << "-ый элемент массива" << endl;
- getline(cin, inputLine);
- try
- {
- arr[i] = stoi(inputLine);
- }
- catch (...)
- {
- isIncorrect = true;
- cout << "Значение массива должно быть числом\n";
- }
- if (!isIncorrect)
- {
- if (arr[i] < -2000000000 || arr[i] > 2000000000)
- {
- cout << "Введите натуральное число в диапазоне +-2*10^9\n";
- isIncorrect = true;
- }
- }
- } while (isIncorrect);
- }
- cout << "В массиве" << endl;
- printArray(arr, size);
- return arr;
- }
- int* readArrayFrom(int*& arr, int& size)
- {
- int value;
- value = readInputType();
- if (value == 1)
- {
- arr = readArrayFromFile(arr, size);
- }
- if (value == 2)
- {
- arr = readArrayFromConsole(arr, size);
- }
- cout << endl;
- cout << "Индексы элементов, которые являются крайними в подпоследовательности перевёртышей:" << endl;
- return arr;
- }
- void searchForPalindrom(int* arr, int size, int& watch)
- {
- int bufi, bufj, j;
- bool isPalindrom;
- bufi = 0;
- bufj = 0;
- j = 0;
- isPalindrom = true;
- for (int i = 0; i < size; ++i)
- {
- j = size - 1;
- if (arr[i] == arr[j])
- {
- bufi = i;
- bufj = j;
- isPalindrom = true;
- while (bufi != bufj && isPalindrom)
- {
- if ((bufi == i) && (bufj == j) && (bufi + 1 == bufj) && (arr[bufi+1] == arr[bufj]))
- isPalindrom = false;
- if (isPalindrom && (arr[bufi] != arr[bufj]))
- {
- isPalindrom = false;
- }
- ++bufi;
- --bufj;
- }
- if (isPalindrom && i != j)
- {
- cout << i+1 << " " << j+1 << endl;
- ++watch;
- }
- }
- }
- if (j > 0)
- {
- searchForPalindrom(arr, size - 1, watch);
- }
- }
- void saveResultToFile(int* arr, int size)
- {
- string path;
- int bufi, bufj, j, watch;
- bool isPalindrom, flag;
- flag = false;
- path = readFilePath(flag);
- bufi = 0;
- bufj = 0;
- j = 0;
- watch = 0;
- isPalindrom = true;
- fstream fout(path, std::ios_base::out);
- fout << "В массиве:" << endl;
- for (int i = 0; i < size; ++i)
- {
- fout << arr[i] << " ";
- }
- fout << endl;
- fout << "Индексы элементов, которые являются крайними в подпоследовательности перевёртышей:" << endl;
- fout << endl;
- for (int i = 0; i < size; ++i)
- {
- for (int j = size - 1; j > 0; --j)
- {
- if (arr[i] == arr[j])
- {
- bufi = i;
- bufj = j;
- isPalindrom = true;
- while (bufi != bufj && isPalindrom)
- {
- if ((bufi == i) && (bufj == j) && (bufi + 1 == bufj) && (arr[bufi + 1] == arr[bufj]))
- isPalindrom = false;
- if (isPalindrom && (arr[bufi] != arr[bufj]))
- {
- isPalindrom = false;
- }
- ++bufi;
- --bufj;
- }
- if (isPalindrom && i != j)
- {
- fout << i+1 << " " << j+1 << endl;
- fout << endl;
- ++watch;
- }
- }
- }
- }
- if (watch < 1)
- {
- fout << "Отсутствуют!" << endl;
- }
- fout.close();
- }
- void checkForAbsense(int watch)
- {
- if (watch < 1)
- {
- cout << endl;
- cout << "Отсутствуют!" << endl;
- }
- }
- int main()
- {
- setlocale(LC_ALL, "ru");
- int size, watch;
- string path;
- int* arr;
- size = 0;
- watch = 0;
- arr = readArrayFrom(arr, size);
- cout << endl;
- searchForPalindrom(arr, size, watch);
- checkForAbsense(watch);
- saveResultToFile(arr, size);
- delete[]arr;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement