Advertisement
Vernon_Roche

Задание 4 С++ (Лабораторная работа 2)

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