Advertisement
THOMAS_SHELBY_18

Lab3_3(C++)

Nov 20th, 2023
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.98 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <windows.h>
  5. using namespace std;
  6.  
  7. const int MIN_ARR_VALUE = -1000;
  8. const int MAX_ARR_VALUE = 1000;
  9. const int MAX_ARR_LENGTH = 10;
  10. const int MIN_ARR_LENGTH = 1;
  11.  
  12. void printCondition()
  13. {
  14.     cout << "Данная программа сортирует массив методом простых вставок." << endl;
  15.     cout << "Диапазон значений для длины массива - от " << MIN_ARR_LENGTH << " до " << MAX_ARR_LENGTH << "." << endl;
  16.     cout << "Диапазон значений для элементов массива - от " << MIN_ARR_VALUE << " до " << MAX_ARR_VALUE << "." << endl;
  17. }
  18. int readNum(int min, int max)
  19. {
  20.     bool isIncorrect;
  21.     int num;
  22.  
  23.     do
  24.     {
  25.         isIncorrect = true;
  26.         cin >> num;
  27.         if (cin.fail() || (cin.get() != '\n'))
  28.         {
  29.             cout << "Некорректный ввод! Введите значение еще раз:" << endl;
  30.             cin.clear();
  31.             while (cin.get() != '\n');
  32.         }
  33.         else
  34.         {
  35.             if (num < min || num > max)
  36.             {
  37.                 cout << "Недопустимое значение! Введите значение еще раз:" << endl;
  38.             }
  39.             else
  40.             {
  41.                 isIncorrect = false;
  42.             }
  43.         }
  44.     }
  45.     while (isIncorrect);
  46.  
  47.     return num;
  48. }
  49.  
  50. int* inputArrFromConsole(int& len) {
  51.     int buf;
  52.     int* arr;
  53.     cout << "Введите количество элементов:" << endl;
  54.     len = readNum(MIN_ARR_LENGTH, MAX_ARR_LENGTH);
  55.  
  56.     arr = new int[len];
  57.  
  58.     for (int i = 0; i < len; i++) {
  59.         cout << "Введите элемент последовательности №" << i + 1 << ":" << endl;
  60.         buf = readNum(MIN_ARR_VALUE, MAX_ARR_VALUE);
  61.         arr[i] = buf;
  62.     }
  63.     return arr;
  64. }
  65.  
  66. bool checkFile(string path) {
  67.     ifstream fin;
  68.     bool isFileCorrect;
  69.     int buf, i, lengthArr;
  70.     int* checkArr;
  71.  
  72.     fin.open(path);
  73.     isFileCorrect = true;
  74.  
  75.     fin >> lengthArr;
  76.     if (fin.fail()) {
  77.         fin.clear();
  78.         isFileCorrect = false;
  79.         cout << "Файл не найден или данные некоректны.\nВнесите изменения в файл и повторите попытку!" << endl;
  80.     }
  81.  
  82.     else if ((MIN_ARR_LENGTH > lengthArr) || (MAX_ARR_LENGTH < lengthArr)) {
  83.         isFileCorrect = false;
  84.         cout << "Значение выходит за возможные пределы!\nВнесите изменения в файл и повторите попытку!" << endl;
  85.     }
  86.     if (isFileCorrect) {
  87.  
  88.         checkArr = new int[lengthArr];
  89.         i = 0;
  90.  
  91.         do {
  92.             fin >> buf;
  93.             if (fin.fail()) {
  94.                 cout << "Элементы массива введены некорректно!\nВнесите изменения в файл и повторите попытку!" << endl;
  95.                 isFileCorrect = false;
  96.                 fin.clear();
  97.             }
  98.             else
  99.                 checkArr[i] = buf;
  100.             i++;
  101.         } while (isFileCorrect && i < lengthArr);
  102.     }
  103.  
  104.     if (isFileCorrect && !fin.eof()) {
  105.         cout << "Элементы массива введены некорректно!\nВнесите изменения в файл и повторите попытку!" << endl;
  106.         isFileCorrect = false;
  107.     }
  108.  
  109.     fin.close();
  110.     return isFileCorrect;
  111. }
  112. int* readFile(string path, int& len) {
  113.     ifstream fin;
  114.     int buf;
  115.     int *arr;
  116.  
  117.     fin.open(path);
  118.  
  119.     fin >> len;
  120.     arr = new int[len];
  121.  
  122.     for (int i = 0; i < len; i++)
  123.     {
  124.         fin >> buf;
  125.         arr[i] = buf;
  126.     }
  127.  
  128.     fin.close();
  129.     return arr;
  130. }
  131. int* inputArrFromFile(int& len)
  132. {
  133.     int* arr;
  134.     string pathFile;
  135.     bool isInputFromFileSuccessfully;
  136.  
  137.     cout << "Данные в файле должны содержать количество элементов в первой строке и жлементы массива во второй строке" << endl;
  138.     do
  139.     {
  140.         cout << "Введите путь к файлу и его имя с его расширением:";
  141.         cin >> pathFile;
  142.         isInputFromFileSuccessfully = checkFile(pathFile);
  143.     } while(!isInputFromFileSuccessfully);
  144.     arr = readFile(pathFile, len);
  145.  
  146.     return arr;
  147. }
  148.  
  149. int* inputArr(int& len)
  150. {
  151.     int choice;
  152.     int* arr;
  153.  
  154.     cout << "Выберите вариант ввода:" << endl << "1. Ввод из консоли" << endl << "2. Ввод из файла" << endl << "Использовать вариант:";
  155.     choice = readNum(1, 2);
  156.  
  157.     if (choice == 1)
  158.     {
  159.         arr = inputArrFromConsole(len);
  160.     }
  161.     else
  162.     {
  163.         arr = inputArrFromFile(len);
  164.     }
  165.  
  166.     return arr;
  167. }
  168. int* sortArr(int* arr, int& len)
  169. {
  170.     int i, j, buf;
  171.  
  172.     for (i = 1; i < len; i++)
  173.     {
  174.         buf = arr[i];
  175.         j = i;
  176.         while ((j > 0) && (arr[j - 1] > buf))
  177.         {
  178.             arr[j] = arr[j - 1];
  179.             j--;
  180.         }
  181.         arr[j] = buf;
  182.     }
  183.     return arr;
  184. }
  185. void outputArrToConsole(int*& arr, int& len)
  186. {
  187.     for (int i = 0; i < len; i++)
  188.     {
  189.         cout << arr[i] << " ";
  190.     }
  191. }
  192.  
  193. void outputArrToFile(int*& arr, int& len)
  194. {
  195.     ofstream fout;
  196.     string path;
  197.     bool isFileIncorrect;
  198.  
  199.     cout << "Для вывода введите путь к файлу и его имя c расширением." << endl;
  200.     cout << "Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)" << endl;
  201.     do
  202.     {
  203.         cout << "Введите путь:";
  204.         cin >> path;
  205.         fout.open(path);
  206.         isFileIncorrect = false;
  207.  
  208.         for (int i = 0; i < len; i++)
  209.         {
  210.             fout << arr[i] << " ";
  211.         }
  212.  
  213.         if (fout.fail())
  214.         {
  215.             cout << "Не удалось вывести в файл! ";
  216.             isFileIncorrect = true;
  217.             fout.clear();
  218.         }
  219.     }
  220.     while (isFileIncorrect);
  221.  
  222.     fout.close();
  223.     cout << "Вывод данных... успешно!";
  224. }
  225.  
  226. void outputArr(int*& arr, int& len)
  227. {
  228.     int  choice;
  229.  
  230.     cout << "Выберите вариант вывода:" << endl << "1. Вывод в консоль" << endl << "2. Вывод в файл" << endl << "Использовать вариант:";
  231.     choice = readNum(1, 2);
  232.  
  233.     if (choice == 1)
  234.     {
  235.         outputArrToConsole(arr, len);
  236.     }
  237.     else
  238.     {
  239.         outputArrToFile(arr, len);
  240.     }
  241. }
  242.  
  243. int main() {
  244.     int* numArr;
  245.     int lengthArr;
  246.  
  247.     SetConsoleOutputCP(CP_UTF8);
  248.  
  249.     printCondition();
  250.     numArr = inputArr(lengthArr);
  251.     numArr = sortArr(numArr, lengthArr);
  252.     outputArr(numArr, lengthArr);
  253.     return 0;
  254. }
  255.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement