Advertisement
gguuppyy

лаба2н4

Nov 1st, 2023 (edited)
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.35 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. void outputCondition()
  8. {
  9.     cout << "Данная программа находит элемент массива, состоящего из N натуральных чисел, сумма цифр которого наибольшая.\n";
  10. }
  11.  
  12. void outputInputChoice()
  13. {
  14.     cout << "Введите 0, если хотите ввести данные из консоли, и 1, если из файла:\n";
  15. }
  16.  
  17. bool isUserChoice()
  18. {
  19.     const int MIN = 0;
  20.     const int MAX = 1;
  21.     int k;
  22.     bool isIncorrect;
  23.     bool isChoice;
  24.     do
  25.     {
  26.         isIncorrect = false;
  27.         cin >> k;
  28.         if (cin.get() != '\n')
  29.         {
  30.             isIncorrect = true;
  31.             cout << "Введены некорректные данные. Повторите ввод:\n";
  32.             cin.clear();
  33.             while (cin.get() != '\n');
  34.         }
  35.         if ((!isIncorrect) && ((k < MIN) || (k > MAX)))
  36.         {
  37.             isIncorrect = true;
  38.             cout << "Число не входит в допустимый диапазон. Повторите ввод:\n";
  39.             cin.clear();
  40.         }
  41.     } while (isIncorrect);
  42.     isChoice = !(k == MIN);
  43.     return isChoice;
  44. }
  45.  
  46. void outputPathInputCondition()
  47. {
  48.     cout << "Введите путь к файлу, содержащему массив:\n";
  49. }
  50.  
  51. bool isFileCorrect(string path)
  52. {
  53.     bool isIncorrect = false;
  54.     string line;
  55.     fstream f(path);
  56.     if (!f.is_open())
  57.     {
  58.         isIncorrect = true;
  59.         cout << "Файл по заданному пути отсутствует или недоступен для открытия. ";
  60.     }
  61.     else if ((path[path.length() - 1] != 't') &&
  62.         (path[path.length() - 2] != 'x') &&
  63.         (path[path.length() - 3] != 't') &&
  64.         (path[path.length() - 4] != '.'))
  65.     {
  66.         isIncorrect = true;
  67.         cout << "Недопустимое расширение файла. ";
  68.     }
  69.     f.close();
  70.     return isIncorrect;
  71. }
  72.  
  73. string takePath()
  74. {
  75.     bool isIncorrect;
  76.     string path;
  77.     do
  78.     {
  79.         isIncorrect = false;
  80.         cin >> path;
  81.         isIncorrect = isFileCorrect(path);
  82.         if (isIncorrect)
  83.         {
  84.             cout << "Повторите ввод пути к файлу:\n";
  85.         }
  86.     } while (isIncorrect);
  87.     return path;
  88. }
  89.  
  90. void outputSuccessfulInput()
  91. {
  92.     cout << "Данные из файла считаны успешно.\n";
  93. }
  94.  
  95. void outputNumberConditionForConsole()
  96. {
  97.     cout << "Введите количество элементов массива N:\n";
  98. }
  99.  
  100. int inputNumberFromConsole()
  101. {
  102.     const int MIN = 2;
  103.     int n;
  104.     bool isIncorrect;
  105.     do
  106.     {
  107.         isIncorrect = false;
  108.         cin >> n;
  109.         if (cin.get() != '\n')
  110.         {
  111.             isIncorrect = true;
  112.             cout << "Введены некорректные данные. Повторите ввод:\n";
  113.             cin.clear();
  114.             while (cin.get() != '\n');
  115.         }
  116.         if ((!isIncorrect) && (n < MIN))
  117.         {
  118.             isIncorrect = true;
  119.             cout << "Введено недопустимое число элементов. Повторите ввод:\n";
  120.             cin.clear();
  121.         }
  122.     } while (isIncorrect);
  123.     return n;
  124. }
  125.  
  126. void outputInputConditionForConsole()
  127. {
  128.     cout << "Введите натуральные числа, являющиеся элементами массива.\n";
  129. }
  130.  
  131. int* inputArrayFromConsole(int n)
  132. {
  133.     int* a = new int[n];
  134.  
  135.     const int NUM_MIN = 1;
  136.     bool isIncorrect;
  137.     for (int i = 0; i < n; i++)
  138.     {
  139.         do
  140.         {
  141.             cout << "Введите " << i + 1 << " элемент массива:\n";
  142.             isIncorrect = false;
  143.             cin >> a[i];
  144.  
  145.             if (cin.get() != '\n')
  146.             {
  147.                 isIncorrect = true;
  148.                 cout << "Введены некорректные данные. Повторите ввод:\n";
  149.                 cin.clear();
  150.                 while (cin.get() != '\n');
  151.             }
  152.             if ((!isIncorrect) && (a[i] < NUM_MIN))
  153.             {
  154.                 isIncorrect = true;
  155.                 cout << "Введённые данные не соответствуют условию. Повторите ввод:\n";
  156.                 cin.clear();
  157.             }
  158.         } while (isIncorrect);
  159.     }
  160.     return a;
  161. }
  162.  
  163. int inputNumberFromFile(ifstream &fin)
  164. {
  165.     int n;
  166.     fin >> n;
  167.     return n;
  168. }
  169.  
  170. int* inputArrayFile(int& n)
  171. {
  172.     string path;
  173.     bool isIncorrect;
  174.     int* a = nullptr;
  175.     do
  176.     {
  177.         isIncorrect = false;
  178.         path = takePath();
  179.         ifstream fin(path);
  180.         if (fin.fail())
  181.         {
  182.             cout << "Проверьте файл на доступ к чтению." << endl;
  183.             isIncorrect = true;
  184.         }
  185.         if (!isIncorrect)
  186.             n = inputNumberFromFile(fin);
  187.         if (!isIncorrect)
  188.         {
  189.             if (n < 1)
  190.             {
  191.                 cout << "Проверьте данные для размера в файле." << endl;
  192.                 isIncorrect = true;
  193.             }
  194.             else
  195.             {
  196.                 a = new int[n];
  197.                 for (int i = 0; i < n && !isIncorrect; i++) {
  198.                     fin >> a[i];
  199.                     if (fin.fail()) {
  200.                         isIncorrect = true;
  201.                         cout << "Некорректные данные в файле.\n";
  202.                         delete[] a;
  203.                     }
  204.                 }
  205.  
  206.             }
  207.         }
  208.     } while (isIncorrect);
  209.     return a;
  210. }
  211.  
  212. int* inputArray(bool isInput, int &n)
  213. {
  214.     string path;
  215.     int* a;
  216.     if (isInput)
  217.     {
  218.         outputPathInputCondition();
  219.         a = inputArrayFile(n);
  220.         outputSuccessfulInput();
  221.     }
  222.     else
  223.     {
  224.         outputNumberConditionForConsole();
  225.         n = inputNumberFromConsole();
  226.         outputInputConditionForConsole();
  227.         a = inputArrayFromConsole(n);
  228.     }
  229.     return a;
  230. }
  231.  
  232. int sumNumbers(int num)
  233. {
  234.     int sum = 0;
  235.     while (num > 0)
  236.     {
  237.         sum += num % 10;
  238.         num /= 10;
  239.     }
  240.     return sum;
  241. }
  242.  
  243. int maxSumNumbers(int* a, int n)
  244. {
  245.     int maxSum = 0;
  246.     int maxNum = 0;
  247.     for (int i = 0; i < n; i++)
  248.     {
  249.         int currentSum = sumNumbers(a[i]);
  250.         if (currentSum > maxSum)
  251.         {
  252.             maxSum = currentSum;
  253.             maxNum = a[i];
  254.         }
  255.     }
  256.     return maxNum;
  257. }
  258.  
  259. void outputOutputChoice()
  260. {
  261.     cout << "Введите 0, если хотите вывести данные в консоль, и 1, если в файл:\n";
  262. }
  263.  
  264. void outputPathOutputCondition()
  265. {
  266.     cout << "Введите путь к файлу, в который вы хотите вывести результат: \n";
  267. }
  268.  
  269. void outputInFile(int greatestDivider)
  270. {
  271.     string path;
  272.     bool isIncorrect;
  273.     do {
  274.         isIncorrect = false;
  275.         path = takePath();
  276.         ofstream fout(path);
  277.         if (fout.fail()) {
  278.             cout << "Проверьте файл на доступ к записи." << endl;
  279.             isIncorrect = true;
  280.         }
  281.         if (!isIncorrect) {
  282.             fout << "Число с наибольшей суммой: " << greatestDivider;
  283.         }
  284.         fout.close();
  285.     } while (isIncorrect);
  286. }
  287.  
  288. void outputSuccessfulOutput()
  289. {
  290.     cout << "Данные записаны в файл успешно.\n";
  291. }
  292.  
  293. void outputInConsole(int greatestDivider)
  294. {
  295.     cout << "Число с наибольшей суммой: " << greatestDivider << "\n";
  296. }
  297.  
  298. void outputmaxNum(bool isOutput, int greatestDivider)
  299. {
  300.     string path;
  301.     if (isOutput)
  302.     {
  303.         outputPathOutputCondition();
  304.         outputInFile(greatestDivider);
  305.         outputSuccessfulOutput();
  306.     }
  307.     else
  308.     {
  309.         outputInConsole(greatestDivider);
  310.     }
  311. }
  312. int main()
  313. {
  314.     setlocale(LC_ALL, "Russian");
  315.     int maxNum = 0;
  316.     bool isInput;
  317.     bool isOutput;
  318.     int* a;
  319.     int n;
  320.     outputCondition();
  321.     outputInputChoice();
  322.     isInput = isUserChoice();
  323.     a = inputArray(isInput, n);
  324.     maxNum = maxSumNumbers(a, n);
  325.     outputOutputChoice();
  326.     isOutput = isUserChoice();
  327.     outputmaxNum(isOutput, maxNum);
  328.     delete[] a;
  329.     return 0;
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement