Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- using namespace std;
- void outputTask() {
- cout << "Данная программа находит такие I, J для последовательности, что ai, ai+1...aj являются перевертышем." << endl;
- }
- void chooseInput(bool& isFromFile) {
- bool isNotCorrect;
- int num;
- do {
- isNotCorrect = false;
- cout << "Выберите, откуда вводить данные: 0, если с консоли; 1, если с файла" << endl;
- cin >> num;
- if (cin.fail() or ((num != 0) and (num != 1))) {
- cin.clear();
- while (cin.get() != '\n');
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- isFromFile = (num == 1);
- }
- int inputSizeFromConsole() {
- int size;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите размер массива:" << endl;
- cin >> size;
- if (cin.fail() or (size < 1) or (size > 100)) {
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- return size;
- }
- void fillArrayFromConsole(int*& arr, int size) {
- bool isNotCorrect;
- for (int i = 0; i < size; i++) {
- do {
- isNotCorrect = false;
- cout << "Введите элемент под номером " << (i + 1) << " : " << endl;
- cin >> arr[i];
- if (cin.fail()) {
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- }
- }
- int* inputArrayFromConsole(int& size) {
- int* arr;
- size = inputSizeFromConsole();
- arr = new int[size];
- fillArrayFromConsole(arr, size);
- return arr;
- }
- string choosePath() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите путь к файлу для ввода информации:" << endl;
- cin >> path;
- ifstream fin(path);
- if ((!fin.is_open()) or (path.length() < 5)) {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- else {
- if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.') {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- }
- fin.close();
- } while (isNotCorrect);
- return path;
- }
- int inputSizeFromFile(string path) {
- int size;
- ifstream fin(path);
- cout << "Ввод размера массива..." << endl;
- fin >> size;
- if (fin.fail() or (size < 1) or (size > 100)) {
- cout << "Ошибка ввода! Введите размер массива с клавиатуры." << endl;
- size = inputSizeFromConsole();
- }
- fin.close();
- return size;
- }
- int exceptionRead(int i) {
- bool isNotCorrect;
- int num;
- do {
- isNotCorrect = false;
- cout << "Введите элемент под номером " << (i + 1) << " : " << endl;
- cin >> num;
- if (cin.fail()) {
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- return num;
- }
- void fillArrayFromFile(int*& arr, int size, string path) {
- string line;
- cout << "Запись массива..." << endl;
- ifstream fin(path);
- getline(fin, line);
- for (int i = 0; i < size; i++) {
- fin >> arr[i];
- if (fin.fail()) {
- cout << "Данные введены неккоректно. Введите значение с клавиатуры." << endl;
- arr[i] = exceptionRead(i);
- fin.clear();
- while (fin.get() != ' ');
- }
- }
- fin.close();
- }
- int* inputArrayFromFile(int& size) {
- string path;
- int* arr;
- path = choosePath();
- size = inputSizeFromFile(path);
- arr = new int[size];
- fillArrayFromFile(arr, size, path);
- return arr;
- }
- void outputArray(int* arr, int size) {
- cout << "Введенный массив:" << endl;
- for (int i = 0; i < size; i++) {
- cout << arr[i] << " ";
- }
- cout << endl;
- }
- int* inputArray(int& size, bool isFromFile) {
- int* arr;
- if (isFromFile) {
- arr = inputArrayFromFile(size);
- }
- else {
- arr = inputArrayFromConsole(size);
- }
- outputArray(arr, size);
- return arr;
- }
- bool isPalindrome(int* arr, int left, int right) {
- bool isCorrect;
- if (left >= right) {
- isCorrect = true;
- }
- else {
- isCorrect = ((arr[left] == arr[right]) and isPalindrome(arr, left + 1, right - 1));
- }
- return isCorrect;
- }
- void findPalindrome(int* arr, int& i, int& j, int size) {
- int indexI, indexJ;
- int maxI, maxJ;
- maxI = 0;
- maxJ = 0;
- for (indexI = 0; indexI < size; indexI++) {
- for (indexJ = size - 1; indexJ > indexI; indexJ--) {
- if (isPalindrome(arr, indexI, indexJ)) {
- if ((indexJ - indexI) > (maxJ - maxI)) {
- maxI = indexI;
- maxJ = indexJ;
- }
- }
- }
- }
- i = maxI;
- j = maxJ;
- }
- string choosePathForOutput() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите путь к файлу для вывода информации:" << endl;
- cin >> path;
- ofstream fout(path);
- if ((!fout.is_open()) or (path.length() < 5)) {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- else {
- if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.') {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- }
- fout.close();
- } while (isNotCorrect);
- return path;
- }
- void outputInFile(int i, int j) {
- string path;
- path = choosePathForOutput();
- ofstream fout(path);
- if (i != j) {
- fout << "Перевертышем являются элементы с индексами от " << (i + 1) << " до " << j + 1 << endl;
- }
- else {
- fout << "Данный массив чисел не обладает палиндромом." << endl;
- }
- cout << "Данные успешно записаны в файл!" << endl;
- fout.close();
- }
- void outputAnswer(int i, int j) {
- if (i != j) {
- cout << "Перевертышем являются элементы с индексами от " << (i + 1) << " до " << j + 1 << endl;
- }
- else {
- cout << "Данный массив чисел не обладает палиндромом." << endl;
- }
- outputInFile(i, j);
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- system("chcp 1251");
- bool isFromFile;
- int size;
- int* arr;
- int i, j;
- outputTask();
- chooseInput(isFromFile);
- arr = inputArray(size, isFromFile);
- i = 0;
- j = 0;
- findPalindrome(arr, i, j, size);
- outputAnswer(i, j);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement