Advertisement
dxvmxnd

Untitled

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