Advertisement
dxvmxnd

Untitled

Apr 14th, 2024
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. void outputTask() {
  8. cout << "Данная программа находит такие I, J для последовательности, что ai, ai+1...aj являются перевертышем." << endl;
  9. }
  10.  
  11. void chooseInput(bool& isFromFile) {
  12. bool isNotCorrect;
  13. int num;
  14.  
  15. do {
  16. isNotCorrect = false;
  17. cout << "Выберите, откуда вводить данные: 0, если с консоли; 1, если с файла" << endl;
  18. cin >> num;
  19. if (cin.fail() or ((num != 0) and (num != 1))) {
  20. cin.clear();
  21. while (cin.get() != '\n');
  22. cout << "Ошибка ввода! Повторите попытку." << endl;
  23. isNotCorrect = true;
  24. }
  25. } while (isNotCorrect);
  26.  
  27. isFromFile = (num == 1);
  28. }
  29.  
  30. int inputSizeFromConsole() {
  31. int size;
  32. bool isNotCorrect;
  33.  
  34. do {
  35. isNotCorrect = false;
  36. cout << "Введите размер массива:" << endl;
  37. cin >> size;
  38. if (cin.fail() or (size < 1) or (size > 100)) {
  39. cout << "Ошибка ввода! Повторите попытку." << endl;
  40. isNotCorrect = true;
  41. cin.clear();
  42. while (cin.get() != '\n');
  43. }
  44. } while (isNotCorrect);
  45.  
  46. return size;
  47. }
  48.  
  49. void fillArrayFromConsole(int*& arr, int size) {
  50. bool isNotCorrect;
  51.  
  52. for (int i = 0; i < size; i++) {
  53. do {
  54. isNotCorrect = false;
  55. cout << "Введите элемент под номером " << (i + 1) << " : " << endl;
  56. cin >> arr[i];
  57. if (cin.fail()) {
  58. cout << "Ошибка ввода! Повторите попытку." << endl;
  59. isNotCorrect = true;
  60. cin.clear();
  61. while (cin.get() != '\n');
  62. }
  63. } while (isNotCorrect);
  64. }
  65. }
  66.  
  67. int* inputArrayFromConsole(int& size) {
  68. int* arr;
  69.  
  70. size = inputSizeFromConsole();
  71. arr = new int[size];
  72. fillArrayFromConsole(arr, size);
  73.  
  74. return arr;
  75. }
  76.  
  77. string choosePath() {
  78. string path;
  79. bool isNotCorrect;
  80.  
  81. do {
  82. isNotCorrect = false;
  83. cout << "Введите путь к файлу для ввода информации:" << endl;
  84. cin >> path;
  85. ifstream fin(path);
  86. if ((!fin.is_open()) or (path.length() < 5)) {
  87. isNotCorrect = true;
  88. cout << "Ошибка ввода! Повторите попытку." << endl;
  89. }
  90. else {
  91. if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.') {
  92. isNotCorrect = true;
  93. cout << "Ошибка ввода! Повторите попытку." << endl;
  94. }
  95. }
  96. fin.close();
  97. } while (isNotCorrect);
  98.  
  99. return path;
  100. }
  101.  
  102. int inputSizeFromFile(string path) {
  103. int size;
  104.  
  105. ifstream fin(path);
  106. cout << "Ввод размера массива..." << endl;
  107. fin >> size;
  108. if (fin.fail() or (size < 1) or (size > 100)) {
  109. cout << "Ошибка ввода! Введите размер массива с клавиатуры." << endl;
  110. size = inputSizeFromConsole();
  111. }
  112.  
  113. fin.close();
  114.  
  115. return size;
  116. }
  117.  
  118. int exceptionRead(int i) {
  119. bool isNotCorrect;
  120. int num;
  121.  
  122. do {
  123. isNotCorrect = false;
  124. cout << "Введите элемент под номером " << (i + 1) << " : " << endl;
  125. cin >> num;
  126. if (cin.fail()) {
  127. cout << "Ошибка ввода! Повторите попытку." << endl;
  128. isNotCorrect = true;
  129. cin.clear();
  130. while (cin.get() != '\n');
  131. }
  132. } while (isNotCorrect);
  133.  
  134. return num;
  135. }
  136.  
  137. void fillArrayFromFile(int*& arr, int size, string path) {
  138. string line;
  139.  
  140. cout << "Запись массива..." << endl;
  141. ifstream fin(path);
  142. getline(fin, line);
  143. for (int i = 0; i < size; i++) {
  144. fin >> arr[i];
  145. if (fin.fail()) {
  146. cout << "Данные введены неккоректно. Введите значение с клавиатуры." << endl;
  147. arr[i] = exceptionRead(i);
  148. fin.clear();
  149. while (fin.get() != ' ');
  150. }
  151. }
  152.  
  153. fin.close();
  154. }
  155.  
  156. int* inputArrayFromFile(int& size) {
  157. string path;
  158. int* arr;
  159.  
  160. path = choosePath();
  161. size = inputSizeFromFile(path);
  162. arr = new int[size];
  163. fillArrayFromFile(arr, size, path);
  164.  
  165. return arr;
  166. }
  167.  
  168. void outputArray(int* arr, int size) {
  169. cout << "Введенный массив:" << endl;
  170. for (int i = 0; i < size; i++) {
  171. cout << arr[i] << " ";
  172. }
  173. cout << endl;
  174. }
  175.  
  176. int* inputArray(int& size, bool isFromFile) {
  177. int* arr;
  178.  
  179. if (isFromFile) {
  180. arr = inputArrayFromFile(size);
  181. }
  182. else {
  183. arr = inputArrayFromConsole(size);
  184. }
  185.  
  186. outputArray(arr, size);
  187.  
  188. return arr;
  189. }
  190.  
  191. bool isPalindrome(int* arr, int left, int right) {
  192. bool isCorrect;
  193.  
  194. if (left >= right) {
  195. isCorrect = true;
  196. }
  197. else {
  198. isCorrect = ((arr[left] == arr[right]) and isPalindrome(arr, left + 1, right - 1));
  199. }
  200.  
  201. return isCorrect;
  202. }
  203.  
  204. void findPalindrome(int* arr, int& i, int& j, int size) {
  205. int indexI, indexJ;
  206. int maxI, maxJ;
  207.  
  208. maxI = 0;
  209. maxJ = 0;
  210. for (indexI = 0; indexI < size; indexI++) {
  211. for (indexJ = size - 1; indexJ > indexI; indexJ--) {
  212. if (isPalindrome(arr, indexI, indexJ)) {
  213. if ((indexJ - indexI) > (maxJ - maxI)) {
  214. maxI = indexI;
  215. maxJ = indexJ;
  216. }
  217. }
  218. }
  219. }
  220.  
  221. i = maxI;
  222. j = maxJ;
  223. }
  224.  
  225. string choosePathForOutput() {
  226. string path;
  227. bool isNotCorrect;
  228.  
  229. do {
  230. isNotCorrect = false;
  231. cout << "Введите путь к файлу для вывода информации:" << endl;
  232. cin >> path;
  233. ofstream fout(path);
  234. if ((!fout.is_open()) or (path.length() < 5)) {
  235. isNotCorrect = true;
  236. cout << "Ошибка ввода! Повторите попытку." << endl;
  237. }
  238. else {
  239. if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.') {
  240. isNotCorrect = true;
  241. cout << "Ошибка ввода! Повторите попытку." << endl;
  242. }
  243. }
  244. fout.close();
  245. } while (isNotCorrect);
  246.  
  247. return path;
  248. }
  249.  
  250. void outputInFile(int i, int j) {
  251. string path;
  252.  
  253. path = choosePathForOutput();
  254. ofstream fout(path);
  255. if (i != j) {
  256. fout << "Перевертышем являются элементы с индексами от " << (i + 1) << " до " << j + 1 << endl;
  257. }
  258. else {
  259. fout << "Данный массив чисел не обладает палиндромом." << endl;
  260. }
  261.  
  262. cout << "Данные успешно записаны в файл!" << endl;
  263.  
  264. fout.close();
  265.  
  266. }
  267.  
  268. void outputAnswer(int i, int j) {
  269. if (i != j) {
  270. cout << "Перевертышем являются элементы с индексами от " << (i + 1) << " до " << j + 1 << endl;
  271. }
  272. else {
  273. cout << "Данный массив чисел не обладает палиндромом." << endl;
  274. }
  275.  
  276. outputInFile(i, j);
  277. }
  278.  
  279. int main() {
  280. setlocale(LC_ALL, "Rus");
  281. system("chcp 1251");
  282.  
  283. bool isFromFile;
  284. int size;
  285. int* arr;
  286. int i, j;
  287.  
  288. outputTask();
  289. chooseInput(isFromFile);
  290. arr = inputArray(size, isFromFile);
  291. i = 0;
  292. j = 0;
  293. findPalindrome(arr, i, j, size);
  294. outputAnswer(i, j);
  295.  
  296. return 0;
  297.  
  298. }
  299.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement