ValeriaAVR

++ 24

Oct 30th, 2024
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. int const MIN_SIZE = 2;
  6. int const MAX_SIZE = 100;
  7. int const MIN_C = 1;
  8. int const MAX_C = 2;
  9. double const MIN_A = -1000.0;
  10. double const MAX_A = 1000.0;
  11.  
  12. int inputInteger(bool isIncorrect, const int MIN, const int MAX) {
  13.     int n;
  14.     n = 0;
  15.     do {
  16.         isIncorrect = false;
  17.         cout << "Введите значение: " << endl;
  18.         cin >> n;
  19.         if (cin.fail()) {
  20.             isIncorrect = true;
  21.             cout << "Некорректный ввод." << endl;
  22.             cin.clear();
  23.             while (cin.get() != '\n');
  24.         }
  25.         if (!isIncorrect && (n < MIN && n > MAX)) {
  26.             isIncorrect = true;
  27.             cout << "Введите корректное значение." << endl;
  28.         }
  29.         if (!isIncorrect && cin.get() != '\n') {
  30.             cout << "Введите корректное значение.";
  31.             isIncorrect = true;
  32.             cin.clear();
  33.             while (cin.get() != '\n');
  34.             cout << endl;
  35.         }
  36.     } while (isIncorrect);
  37.     return n;
  38. }
  39.  
  40. void createArray(const int n, bool isIncorrect, int* arr) {
  41.     arr[n];
  42.     for (int i = 0; i < n; i++) {
  43.             do {
  44.                 cout << "Введите " << i + 1 << " элемент массива : " << endl;
  45.                 isIncorrect = false;
  46.                 cin >> arr[i];
  47.                 if (cin.fail()) {
  48.                     isIncorrect = true;
  49.                     cout << "Некорректный ввод. Введите число." << endl;
  50.                     cin.clear();
  51.                     while (cin.get() != '\n');
  52.                 }
  53.                 if (!isIncorrect && (arr[i] < MIN_A || arr[i] > MAX_A)) {
  54.                     isIncorrect = true;
  55.                     cout << "Диапазон значений А от " << MIN_A << " до " << MAX_A << "." << endl;
  56.                 }
  57.                 if (!isIncorrect && cin.get() != '\n') {
  58.                     cout << "Введите число. " << endl;
  59.                     isIncorrect = true;
  60.                     cin.clear();
  61.                     while (cin.get() != '\n');
  62.                     cout << endl;
  63.                 };
  64.             } while (isIncorrect);
  65.         }
  66.     }
  67.  
  68.  
  69. bool isFileTxt(string path, bool isIncorrect) {
  70.     return (path.length() >= 4 && path.substr(path.length() - 4) == ".txt");
  71. }
  72.  
  73. string takeFilePath(string path, bool isIncorrect) {
  74.     do {
  75.         isIncorrect = false;
  76.         cout << "Введите относительный путь к файлу." << endl;
  77.         cin >> path;
  78.         fstream in(path);
  79.         if (!isFileTxt(path, isIncorrect) || !in.is_open())
  80.         {
  81.             cout << "Проверьте нахождение файла по заданному пути." << endl;
  82.             isIncorrect = true;
  83.         }
  84.         in.close();
  85.     } while (isIncorrect);
  86.     return path;
  87. }
  88.  
  89. bool isFileEmpty(bool isIncorrect, string path) {
  90.     ifstream in(path);
  91.     do {
  92.         isIncorrect = false;
  93.         if (!in.is_open()) {
  94.             cout << "Ошибка открытия файла." << endl;
  95.             isIncorrect = true;
  96.             path = takeFilePath(path, isIncorrect);
  97.         }
  98.     } while (isIncorrect);
  99.     return in.peek() == ifstream::traits_type::eof();
  100. }
  101.  
  102. int readSizeFromFile(int& n, string path, bool isIncorrect) {
  103.     ifstream in(path);
  104.     do {
  105.         isIncorrect = false;
  106.         if (!in.is_open()) {
  107.             cout << "Ошибка открытия файла." << endl;
  108.             isIncorrect = true;
  109.             path = takeFilePath(path, isIncorrect);
  110.         }
  111.         else if (isFileEmpty(isIncorrect, path)) {
  112.             cout << "Файл пустой." << endl;
  113.             isIncorrect = true;
  114.             path = takeFilePath(path, isIncorrect);
  115.         }
  116.         else {
  117.             do {
  118.                 isIncorrect = false;
  119.                 in >> n;
  120.                 if (!isIncorrect && (n < MIN_SIZE || n > MAX_SIZE)) {
  121.                     isIncorrect = true;
  122.                     cout << "Размер массива должен быть в диапазоне от " << MIN_SIZE << " до " << MAX_SIZE << "." << endl;
  123.                     path = takeFilePath(path, isIncorrect);
  124.                     n = readSizeFromFile(n, path, isIncorrect);
  125.                 }
  126.             } while (isIncorrect);
  127.  
  128.         }
  129.     } while (isIncorrect);
  130.     in.close();
  131.     return n;
  132. }
  133.  
  134. void readArrayFromFile(int n, int m, int* arrA, int* arrB, string path, bool isIncorrect) {
  135.     string str;
  136.     str = "";
  137.     ifstream in(path);
  138.     arrA[n];
  139.     getline(in, str);
  140.     do {
  141.         isIncorrect = false;
  142.         for (int i = 0; i < n; i++) {
  143.             in >> arrA[i];
  144.             if (!isIncorrect && (arrA[i] < MIN_A || arrA[i] > MAX_A)) {
  145.                 isIncorrect = true;
  146.             }
  147.         }
  148.         if (isIncorrect) {
  149.             cout << "Диапазон значений элементов от " << MIN_A << " до " << MAX_A << endl;
  150.             path = takeFilePath(path, isIncorrect);
  151.             n = readSizeFromFile(n, path, isIncorrect);
  152.             readArrayFromFile(n, m, arrA, arrB, path, isIncorrect);
  153.             m = readSizeFromFile(m, path, isIncorrect);
  154.             readArrayFromFile(m, n, arrB, arrA, path, isIncorrect);
  155.         }
  156.     } while (isIncorrect);
  157.     in.close();
  158. }
  159.  
  160. int сountSizeOfArrC(int* arrA, int sizeA, int* arrB, int sizeB) {
  161.     int count = 0;
  162.     int j = 0;
  163.  
  164.     for (int i = 0; i < sizeA; ++i) {
  165.         if (i == 0 || arrA[i] != arrA[i - 1]) {
  166.             while (j < sizeB && arrB[j] < arrA[i]) {
  167.                 if (j == 0 || arrB[j] != arrB[j - 1]) {
  168.                     ++count;
  169.                 }
  170.                 ++j;
  171.             }
  172.             if (j >= sizeB || arrA[i] != arrB[j]) {
  173.                 ++count;
  174.             }
  175.         }
  176.     }
  177.  
  178.     for (j = j; j < sizeB; ++j) {
  179.         if (j == 0 || arrB[j] != arrB[j - 1]) {
  180.             ++count;
  181.         }
  182.     }
  183.  
  184.     return count;
  185. }
  186.  
  187. void mergeArrays(int* arrA, int sizeA, int* arrB, int sizeB, int* arrC, int k) {
  188.     int index = 0;
  189.     int i = 0;
  190.     int j = 0;
  191.  
  192.     while (i < sizeA && j < sizeB && index < k) {
  193.         if (arrA[i] < arrB[j]) {
  194.             if (index == 0 || (arrC[index - 1] != arrA[i])){
  195.                 arrC[index] = arrA[i];
  196.                 ++index;
  197.             }
  198.             ++i;
  199.         }
  200.         else if (arrA[i] > arrB[j]) {
  201.             if (index == 0 || arrC[index - 1] != arrB[j]) {
  202.                 arrC[index] = arrB[j];
  203.                 ++index;
  204.             }
  205.             ++j;
  206.         }
  207.         else {
  208.             if (index == 0 || arrC[index - 1] != arrA[i]) {
  209.                 arrC[index] = arrA[i];
  210.                 ++index;
  211.             }
  212.             ++i;
  213.             ++j;
  214.         }
  215.     }
  216.     while (i < sizeA && index < k) {
  217.         if (index == 0 || arrC[index - 1] != arrA[i]) {
  218.             arrC[index] = arrA[i];
  219.             ++index;
  220.         }
  221.         ++i;
  222.     }
  223.     while (j < sizeB && index < k) {
  224.         if (index == 0 || arrC[index - 1] != arrB[j]) {
  225.             arrC[index] = arrB[j];
  226.             ++index;
  227.         }
  228.         ++j;
  229.     }
  230. }
  231.  
  232. void printToConsole(int* arr, int n) {
  233.     for (int  i = 0; i < n; i++) {
  234.         cout << arr[i] << "\t";
  235.     }
  236.     cout << "\n";
  237. }
  238.  
  239. void printToFile(int* arr, string path, bool isIncorrect, const int n) {
  240.     ofstream in(path);
  241.     do {
  242.         isIncorrect = false;
  243.         if (!in.is_open()) {
  244.             cout << "Файл невозможно открыть для записи." << endl;
  245.             isIncorrect = true;
  246.             path = takeFilePath(path, isIncorrect);
  247.         }
  248.     } while (isIncorrect);
  249.     for (int i = 0; i < n; i++) {
  250.         in << arr[i] << "\t";
  251.     }
  252.     in.close();
  253.     cout << "Результат выведен в файле.";
  254. }
  255.  
  256. int main() {
  257.     setlocale(LC_ALL, "RU");
  258.     int n;
  259.     int m;
  260.     int k;
  261.     int choice;
  262.     bool isIncorrect;
  263.     string path;
  264.     int* arrA;
  265.     int* arrB;
  266.     int* arrC;
  267.     n = 0;
  268.     m = 0;
  269.     choice = 0;
  270.     isIncorrect = true;
  271.     path = "";
  272.     cout << "Данная программа выполняет слияние двух упорядоченных по возрастанию массивов целых чисел в один упорядоченный массив (без повторений)." << endl <<
  273.         "Диапазон размеров массивов : " << MIN_SIZE << "..." << MAX_SIZE << endl << "Диапазон для значений элементов массива : " << MIN_A <<
  274.         "..." << MAX_A << endl << "При работе с файлом в нём сначала должны быть прописаны размеры массивов, а затем сами массивы." <<
  275.         "Откуда Вы хотите вводить данные ? " << "1 - консоль, 2 - файл." << endl;
  276.     choice = inputInteger(isIncorrect, MIN_C, MAX_C);
  277.     if (choice == 1) {
  278.         cout << "Введите размер массива А. " << endl;
  279.         n = inputInteger(isIncorrect, MIN_SIZE, MAX_SIZE);
  280.         createArray(n, isIncorrect, arrA);
  281.         cout << "Введите размер массива В. " << endl;
  282.         m = inputInteger(isIncorrect, MIN_SIZE, MAX_SIZE);
  283.         createArray(m, isIncorrect, arrB);
  284.     }
  285.     else {
  286.         path = takeFilePath(path, isIncorrect);
  287.         n = readSizeFromFile(n, path, isIncorrect);
  288.         readArrayFromFile(n, m, arrA, arrB, path, isIncorrect);
  289.         m = readSizeFromFile(m, path, isIncorrect);
  290.         readArrayFromFile(m, n, arrB, arrA, path, isIncorrect);
  291.     }
  292.     k = сountSizeOfArrC(arrA, n, arrB, m);
  293.     mergeArrays(arrA, n, arrB, m, arrC, k);
  294.     cout << "Куда Вы хотите вывести результат?" << endl;
  295.     choice = inputInteger(isIncorrect, MIN_C, MAX_C);
  296.     if (choice == 1) {
  297.         printToConsole(arrC, k);
  298.     }
  299.     else {
  300.         path = takeFilePath(path, isIncorrect);
  301.         printToFile(arrC, path, isIncorrect, n);
  302.     }
  303.     delete[] arrA;
  304.     delete[] arrB;
  305.     delete[] arrC;
  306.  
  307. }
Advertisement
Add Comment
Please, Sign In to add comment