Advertisement
Ewerlost

Lab3_3C++

Nov 19th, 2023
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5.  
  6. const int MIN_A_VALUE = -1000000;
  7. const int MAX_A_VALUE = 1000000;
  8. const int MAX_ARR_LENGTH = 10;
  9. const int MIN_ARR_LENGTH = 1;
  10.  
  11. int inputInt(int min, int max) {
  12.     int num = 0;
  13.     bool isNotCorrect = true;
  14.     do {
  15.         cout << "Введите число: \n";
  16.         cin >> num;
  17.         if (cin.fail() || (cin.get() != '\n'))
  18.         {
  19.             cout << "Введены некорректные данные" << endl;
  20.             cin.clear();
  21.             while (cin.get() != '\n');
  22.         }
  23.         else
  24.         {
  25.             cin.clear();
  26.             if (min <= num && max >= num)
  27.             {
  28.                 isNotCorrect = false;
  29.             }
  30.             else
  31.             {
  32.                 cout << "Введено значение не входящее в диапазон допустимых значений"
  33.                     << endl;
  34.             }
  35.         }
  36.     } while (isNotCorrect);
  37.     return num;
  38. }
  39.  
  40. void inputConsoleArray(int*& arr, int& len)
  41. {
  42.    
  43.     cout << "Введите число элементов масcива: \n";
  44.     len = inputInt(MIN_ARR_LENGTH, MAX_ARR_LENGTH);
  45.     arr = new int[len];
  46.     for (int i = 0; i < len; i++)
  47.     {
  48.         cout << "Введите элемент массива №" << i + 1 << ":\n";
  49.         arr[i] = inputInt(MIN_A_VALUE, MAX_A_VALUE);
  50.     }
  51. }
  52.  
  53. string inputFilePathForInput()
  54. {
  55.     ifstream fin;
  56.     string path;
  57.     bool isIncorrect;
  58.     do
  59.     {
  60.         isIncorrect = false;
  61.         cout << "Введите путь к файлу для получения исходных данных: \n";
  62.         cin >> path;
  63.         fin.open(path);
  64.         if (!isIncorrect && !fin.is_open())
  65.         {
  66.             cout << "Файл по введенному пути не найден! Проверьте корректность введенных данных и повторите ввод.\n";
  67.                 isIncorrect = true;
  68.         }
  69.     } while (isIncorrect);
  70.     fin.close();
  71.     return path;
  72. }
  73.  
  74. string inputFilePathForOutput()
  75. {
  76.     string path;
  77.     string extension;
  78.     bool isIncorrect;
  79.     cout << "Введите путь к файлу для вывода ответа(если файла не существует, он будет создан автоматически): \n";
  80.         cin >> path;
  81.     return path;
  82. }
  83.  
  84. bool checkAndTakeFileData(const string path, int*& arr, int& len)
  85. {
  86.     ifstream fin;
  87.     bool isIncorrect;
  88.     fin.open(path);
  89.     isIncorrect = false;
  90.     fin >> len;
  91.     arr = new int[len];
  92.     if (fin.fail())
  93.     {
  94.         fin.clear();
  95.         isIncorrect = true;
  96.         cout << "Данные в файле представлены в неправильном формате! Внесите изменения в файл и повторите попытку.\n" << endl;
  97.             while (fin.get() != '\n');
  98.     }
  99.     if (!isIncorrect && ((MIN_ARR_LENGTH > len) || (MAX_ARR_LENGTH < len)))
  100.     {
  101.         isIncorrect = true;
  102.         cout << "Данные в файле представлены в неправильном формате! Внесите изменения в файл и повторите попытку.\n" << endl;
  103.     }
  104.     int i = 0;
  105.     while ((i < (len)) && (!isIncorrect))
  106.     {
  107.         fin >> arr[i];
  108.         if (!fin.eof() && fin.fail())
  109.         {
  110.             cout << "Массив введен некорректно! Внесите изменения в файл и повторите попытку.\n" << endl;
  111.                 isIncorrect = true;
  112.             fin.clear();
  113.             while (cin.get() != '\n');
  114.         }
  115.         if (!isIncorrect && ((MIN_A_VALUE > arr[i]) || (MAX_A_VALUE < arr[i])))
  116.         {
  117.             isIncorrect = true;
  118.             cout << "Данные в файле представлены в неправильном формате!  Внесите изменения в файл и повторите попытку.\n" << endl;
  119.         }
  120.         i++;
  121.     }
  122.     fin.close();
  123.     return isIncorrect;
  124. }
  125.  
  126. void inputArray(int*& arr, int choice, int& length)
  127. {
  128.  
  129.     if (choice == 1)
  130.     {
  131.         inputConsoleArray(arr, length);
  132.     }
  133.     else
  134.     {
  135.         bool IsIncorrect;
  136.         string path;
  137.         do
  138.         {
  139.             path = inputFilePathForInput();
  140.             IsIncorrect = checkAndTakeFileData(path, arr, length);
  141.         } while (IsIncorrect);
  142.     }
  143. }
  144.  
  145. void sortArr(int*& arr, const int length)
  146. {
  147.     int i, j, buff;
  148.     for (i = 1; i < length; i++)
  149.     {
  150.         buff = arr[i];
  151.         j = i;
  152.         while ((j > 0) && (arr[j - 1] > buff))
  153.         {
  154.             arr[j] = arr[j - 1];
  155.             j--;
  156.         }
  157.         arr[j] = buff;
  158.     }  
  159. }
  160.  
  161. void outputAnswer(int choice, const int* arr, const int length)
  162. {
  163.     int i;
  164.     if (choice == 1)
  165.     {
  166.         cout << "Результат" << endl;
  167.         for (i = 0; i < length; i++) {
  168.             cout << arr[i] << " ";
  169.         }
  170.     }
  171.     else
  172.     {
  173.         ofstream fout;
  174.         bool isFileIncorrect = false;
  175.         string path;
  176.         path = inputFilePathForOutput();
  177.         fout.open(path);
  178.         do {
  179.             isFileIncorrect = false;
  180.             fout << "Результат:\n";
  181.             for (i = 0; i < length; i++) {
  182.                 fout << arr[i] << " ";
  183.             }
  184.             if (fout.fail()) {
  185.                 cout << "Не удалось вывести в файл\n";
  186.                 isFileIncorrect = true;
  187.             }
  188.         } while (isFileIncorrect);
  189.         fout.close();
  190.     }
  191. }
  192.  
  193. int main()
  194. {
  195.     const int CONSOLE_CHOICE_NUMBER = 1;
  196.     const int FILE_CHOICE_NUMBER = 2;
  197.     setlocale(LC_ALL, "Russian");
  198.     cout << "Программа сортирует массив методом простых вставок.\n" << "Диапазон значений для длины массива - от 1 до 10.\n" << "Диапазон для элементов массива - от -1000000 до 1000000." << endl;
  199.     int length, choiceInput, choiceOutput;
  200.     int* arr = nullptr;
  201.     cout << "Доступные варианты ввода данных:\n1. Ввод через консоль.\n2. Ввод через файл." << endl;
  202.         choiceInput = inputInt(CONSOLE_CHOICE_NUMBER, FILE_CHOICE_NUMBER);
  203.     inputArray(arr, choiceInput, length);
  204.     cout << "Доступные варианты вывода данных:\n1. Вывод через консоль.\n2. Вывод через файл." << endl;
  205.         choiceOutput = inputInt(CONSOLE_CHOICE_NUMBER, FILE_CHOICE_NUMBER);
  206.     sortArr(arr, length);
  207.     outputAnswer(choiceOutput, arr, length);
  208.     return 0;
  209. }
  210.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement