Advertisement
Vernon_Roche

Задание 3 C++ (Лабораторная работа 3)

Nov 19th, 2023 (edited)
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <fstream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. void sortArr(double*&, const int);
  9. int chooseFileOrConsole(const int);
  10. void inputArr(double*&, int&, const int);
  11. string inputFileName(const int);
  12. void inputInFileName(string&);
  13. void inputOutFileName(string&);
  14. bool checkFile(string&);
  15. void inputFromFile(string, double*&, int&);
  16. void inputFromConsole(double*&, int&);
  17. void outputArr(const double*, const int, const int);
  18. void outputInFile(string&, const double*, const int);
  19. void outputInConsole(const double*, const int);
  20.  
  21. const int INPUT = 1,
  22.           OUTPUT = 2,
  23.           MIN_QUANTITY = 1,
  24.           MAX_QUANTITY = 100000,
  25.           FILE_CHOICE = 1,
  26.           CONSOLE_CHOICE = 2;
  27.  
  28. int main()
  29. {
  30.     double* sortableArr;
  31.     int choice, arrLength;
  32.     system("chcp 1251 > nul");
  33.     cout << "Программа сортирует массив методом простых вставок.\n";
  34.     choice = chooseFileOrConsole(INPUT);
  35.     inputArr(sortableArr, arrLength, choice);
  36.     sortArr(sortableArr, arrLength);
  37.     choice = chooseFileOrConsole(OUTPUT);
  38.     outputArr(sortableArr, arrLength, choice);
  39. }
  40.  
  41. void sortArr(double*& sortableArr, const int arrLength)
  42. {
  43.     cout << "Исходный массив:\n";
  44.     outputInConsole(sortableArr, arrLength);
  45.     cout << '\n';
  46.     int position;
  47.     double checkNum;
  48.     for (int checkPosition = arrLength - 2; checkPosition > -1; checkPosition--) {
  49.         position = arrLength - 1;
  50.         while ((position > checkPosition) && (sortableArr[position] > sortableArr[checkPosition]))
  51.             position--;
  52.         checkNum = sortableArr[checkPosition];
  53.         for (int moveNumPosition = checkPosition; moveNumPosition < position; moveNumPosition++)
  54.             sortableArr[moveNumPosition] = sortableArr[moveNumPosition + 1];
  55.         sortableArr[position] = checkNum;
  56.         cout << "Массив на " << arrLength - checkPosition - 1 << "-м шаге сортировки:\n";
  57.         outputInConsole(sortableArr, arrLength);
  58.         cout << '\n';
  59.     }
  60. }
  61.  
  62. int chooseFileOrConsole(const int InOrOutput)
  63. {
  64.     int choice;
  65.     bool isNotCorrect;
  66.     switch (InOrOutput) {
  67.         case INPUT:
  68.             cout << "Выберите вариант ввода:\n";
  69.             cout << "1.Данные вводятся из текстового файла.\n";
  70.             cout << "2.Данные вводятся через консоль.\n";
  71.             break;
  72.         default:
  73.             cout << "Выберите вариант вывода:\n";
  74.             cout << "1.Данные выводятся в текстовый файл.\n";
  75.             cout << "2.Данные выводятся в консоль.\n";
  76.     }
  77.     do {
  78.         cin >> choice;
  79.         if (cin.fail() || cin.get() != '\n') {
  80.             isNotCorrect = true;
  81.             cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
  82.             cin.clear();
  83.             while (cin.get() != '\n');
  84.         }
  85.         else if ((choice < 1) || (choice > 2)) {
  86.             cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
  87.             isNotCorrect = true;
  88.         }
  89.         else
  90.             isNotCorrect = false;
  91.     } while (isNotCorrect);
  92.     return choice;
  93. }
  94.  
  95. void inputArr(double*& inputArr, int& arrLength, const int choice)
  96. {
  97.     switch (choice) {
  98.         case FILE_CHOICE: {
  99.             string fileName;
  100.             bool isCorrect;
  101.             do {
  102.                 fileName = inputFileName(INPUT);
  103.                 isCorrect = checkFile(fileName);
  104.             } while (!isCorrect);
  105.             inputFromFile(fileName, inputArr, arrLength);
  106.             break;
  107.         }
  108.         case CONSOLE_CHOICE:
  109.             inputFromConsole(inputArr, arrLength);
  110.         }
  111. }
  112.  
  113. void inputInFileName(string& fileName)
  114. {
  115.     cout << "Введите имя файла, из которого будут вводиться данные:\n";
  116.     ifstream in;
  117.     bool isCorrect;
  118.     do {
  119.         isCorrect = true;
  120.         getline(cin, fileName);
  121.         if (fileName.ends_with(".txt")) {
  122.             in.open(fileName);
  123.             if (in.is_open()) {
  124.                 in.close();
  125.             }
  126.             else {
  127.                 cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
  128.                 isCorrect = false;
  129.             }
  130.         }
  131.         else {
  132.             cout << "Файл должен иметь расширение .txt! Повторите ввод имени файла:\n";
  133.             isCorrect = false;
  134.         }
  135.     } while (!isCorrect);
  136. }
  137.  
  138. void inputOutFileName(string& fileName)
  139. {
  140.     cout << "Введите имя файла, в который будут выводиться полученные данные (если файл вводится без расширения, то ему автоматически будет добавлено расширение .txt):\n";
  141.     ofstream out;
  142.     bool isCorrect;
  143.     do {
  144.         isCorrect = true;
  145.         getline(cin, fileName);
  146.         if (fileName.find(".") == string::npos)
  147.             fileName = fileName + ".txt";
  148.         out.open(fileName);
  149.         if (out.is_open()) {
  150.             out.close();
  151.         }
  152.         else {
  153.             cout << "Невозможно открыть или создать файл с таким именем! Повторите ввод имени файла:\n";
  154.             isCorrect = false;
  155.         }
  156.     } while (!isCorrect);
  157. }
  158.  
  159. bool checkFile(string& fileName)
  160. {
  161.     ifstream in;
  162.     bool isCorrect;
  163.     int arrLength, i;
  164.     double arrNumber;
  165.     isCorrect = true;
  166.     in.open(fileName);
  167.     in >> arrLength;
  168.     if (in.fail()) {
  169.         isCorrect = false;
  170.         cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.\n";
  171.         in.clear();
  172.     }
  173.     else if ((arrLength < MIN_QUANTITY) || (arrLength > MAX_QUANTITY)) {
  174.         isCorrect = false;
  175.         cout << "Длинна массива вне допустимого диапазона! Измените содержание файла и повторите ввод его имени.\n";
  176.     }
  177.     else {
  178.         i = 0;
  179.         while (isCorrect && (i < arrLength)) {
  180.             in >> arrNumber;
  181.             if (in.fail()) {
  182.                 cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.\n";
  183.                 in.clear();
  184.                 isCorrect = false;
  185.             }
  186.             i++;
  187.         }
  188.         if (isCorrect && !in.eof()) {
  189.             cout << "В файле содержатся лишние данные! Измените содержание файла и повторите ввод его имени.\n";
  190.             isCorrect = false;
  191.         }
  192.     }
  193.     in.close();
  194.     return isCorrect;
  195. }
  196.  
  197. void inputFromFile(string fileName, double*& inputArr, int& arrLength)
  198. {
  199.     ifstream in;
  200.     in.open(fileName);
  201.     in >> arrLength;
  202.     inputArr = new double[arrLength];
  203.     for (int i = 0; i < arrLength; i++)
  204.         in >> inputArr[i];
  205.     in.close();
  206. }
  207.  
  208. void outputArr(const double* sortedArr, const int arrLength, const int choice)
  209. {
  210.     switch (choice) {
  211.         case FILE_CHOICE: {
  212.             string fileName;
  213.             fileName = inputFileName(OUTPUT);
  214.             outputInFile(fileName, sortedArr, arrLength);
  215.             cout << "Искомые данные выведены в файл " << fileName;
  216.             break;
  217.         }
  218.         case CONSOLE_CHOICE:
  219.             cout << "Отсортированный массив:\n";
  220.             outputInConsole(sortedArr, arrLength);
  221.     }
  222. }
  223.  
  224. void outputInFile(string& fileName, const double* sortedArr, const int arrLength)
  225. {
  226.     ofstream out;
  227.     out.open(fileName);
  228.     for (int i = 0; i < arrLength; i++)
  229.         out << sortedArr[i] << ' ';
  230.     out.close();
  231. }
  232.  
  233. void outputInConsole(const double* sortedArr, const int arrLength)
  234. {
  235.     for (int i = 0; i < arrLength; i++)
  236.         cout << sortedArr[i] << ' ';
  237. }
  238.  
  239. string inputFileName(const int inOrOut)
  240. {
  241.     string fileName;
  242.     switch (inOrOut) {
  243.         case INPUT:
  244.             inputInFileName(fileName);
  245.             break;
  246.         case OUTPUT:
  247.             inputOutFileName(fileName);
  248.     }
  249.     return fileName;
  250. }
  251.  
  252. void inputFromConsole(double*& inputArr, int& arrLength)
  253. {
  254.     bool isNotCorrect;
  255.     cout << "Введите длину массива:\n";
  256.     do {
  257.         cin >> arrLength;
  258.         if (cin.fail() || cin.get() != '\n') {
  259.             isNotCorrect = true;
  260.             cout << "Ошибка ввода. Введите натуральное число в диапазоне [" << MIN_QUANTITY << "; " << MAX_QUANTITY << "]\n";
  261.             cin.clear();
  262.             while (cin.get() != '\n');
  263.         }
  264.         else if ((arrLength < MIN_QUANTITY) || (arrLength > MAX_QUANTITY)) {
  265.             cout << "Ошибка ввода. Введите натуральное число в диапазоне [" << MIN_QUANTITY << "; " << MAX_QUANTITY << "]\n";
  266.             isNotCorrect = true;
  267.         }
  268.         else
  269.             isNotCorrect = false;
  270.     } while (isNotCorrect);
  271.     inputArr = new double[arrLength];
  272.     cout << "Введите элементы массива (построчно):\n";
  273.     for (int i = 0; i < arrLength; i++)
  274.         do {
  275.             isNotCorrect = false;
  276.             cin >> inputArr[i];
  277.             if (cin.fail() || cin.get() != '\n') {
  278.                 isNotCorrect = true;
  279.                 cout << "Ошибка ввода! Введите действительное число:" << '\n';
  280.                 cin.clear();
  281.                 while (cin.get() != '\n');
  282.             }
  283.         } while (isNotCorrect);
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement