oshige_san

Untitled

Oct 11th, 2021
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.84 KB | None | 0 0
  1. #include <fstream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <sstream>
  5. #include <iostream>
  6. #include <conio.h>
  7. #include <cerrno>
  8. #include <errno.h>
  9. using namespace std;
  10.  
  11. int main()
  12. {
  13.     setlocale(LC_ALL, "ru");
  14.     typedef int elemType;
  15.     elemType *C = nullptr;
  16.     fstream f1; int q;
  17.     int zap;
  18.     do {
  19.         system("cls");
  20.         char ch; string fname;
  21.         cout << "1. Создать файл с исходными данными." << endl << "2. Загрузить исходные данные." << endl << "3. Вывести исходные данные." << endl << "4. Обработать данные." << endl << "5. Завершить работу с программой." << endl;
  22.         cout << "Для выполнения необходимого действия нажмите соответствующую цифровую клавишу: ";
  23.         bool b = false;
  24.         ch = _getch();
  25.         system("cls");
  26.  
  27.         switch (ch) {
  28.         case '1':
  29.         {
  30.             do {
  31.  
  32.                 cout << "Введите количество элементов массива или \"*\" для возврата в меню: ";
  33.                 cin.ignore(cin.rdbuf()->in_avail());
  34.                 if (cin.rdbuf()->in_avail() == 2 && cin.peek() == '*') {
  35.                     cin.ignore(cin.rdbuf()->in_avail(), '\n');
  36.                     b = true;
  37.                     break;
  38.                 }
  39.                 cin >> q;
  40.  
  41.                 if (cin.peek() == '\n') {
  42.                     if (q < 1) {
  43.                         cin.clear();
  44.                         cin.ignore(std::cin.rdbuf()->in_avail(), '\n');
  45.                         cout << "Введено недопустимое значение! Повторите ввод!\n";
  46.  
  47.                     }
  48.                     else {
  49.                         if (C != nullptr)
  50.                             delete[]C;
  51.                         C = new (nothrow) elemType[q];
  52.                         if (!C) {
  53.                             cout << "Ошибка выделения памяти!]\n";
  54.                             system("pause");
  55.                             system("cls");
  56.                             continue;
  57.                         }
  58.                         break;
  59.                     }
  60.                 }
  61.                 else {
  62.                     cin.clear();
  63.                     cin.ignore(cin.rdbuf()->in_avail(), '\n');
  64.                     cout << "Введено некорректное значение! Повторите ввод!" << endl;
  65.                 }
  66.             } while (true);
  67.  
  68.             if (b) break;
  69.  
  70.             for (int j = 0; j < q;)
  71.             {
  72.                 cout << "Введите " << j + 1 << " элемент массива или \"*\" для возврата в меню: ";
  73.                 cin >> ws;
  74.                 if (cin.rdbuf()->in_avail() == 2 && cin.peek() == '*') {
  75.                     cin.ignore(cin.rdbuf()->in_avail(), '\n');
  76.                     b = true;
  77.                     system("cls");
  78.                     break;
  79.                 }
  80.                 cin >> C[j];
  81.                 if (cin.peek() != '\n')
  82.                 {
  83.                     cin.clear();
  84.                     cin.ignore(cin.rdbuf()->in_avail(), '\n');
  85.                     cout << "Элемент содержит ошибку! Повторите ввод!" << endl;
  86.                     continue;
  87.                 }
  88.                 j++;
  89.             }
  90.  
  91.             if (b) {
  92.                 delete[] C;
  93.                 C = nullptr;
  94.                 break;
  95.             }
  96.  
  97.             cin.ignore(cin.rdbuf()->in_avail(), '\n');
  98.  
  99.             do {
  100.                 cout << "Введите имя файла для записи или \"*\" для возврата в меню: ";
  101.                 getline(cin, fname);
  102.                 if (fname == "*")
  103.                 {
  104.                     system("cls");
  105.                     break;
  106.                 }
  107.  
  108.                 f1.open(fname, ios_base::in);
  109.                 if (f1.is_open()) {
  110.                     f1.close();
  111.                     b = false;
  112.                     do {
  113.                         cout << "Файл \"" << fname << "\" уже существует!" << endl << "Хотите перезаписать его?" << endl <<
  114.                             "1. Да.\n" << "2. Нет.\n";
  115.                         zap = _getch();
  116.                         switch (zap) {
  117.                         case '1': {
  118.                             break;
  119.                         }
  120.                         case '2': {
  121.                             b = true;
  122.                             break;
  123.                         }
  124.                         default:
  125.                             cout << "Введено некорректное значение!\n";
  126.                             continue;
  127.                         }
  128.                         break;
  129.                     } while (true);
  130.  
  131.                     if (b) continue;
  132.                 }
  133.  
  134.                 f1.open(fname, ios_base::out | ios_base::binary);
  135.  
  136.                 if (!f1.is_open())
  137.                 {
  138.                     cout << "Ошибка сохранения массива в файл  " << "\"" <<
  139.                         fname << "\"" << "! Попробуйте еще раз!" << endl << "Код ошибки: \"" << errno << "\"" << endl;
  140.                     perror("");
  141.                     continue;
  142.                 }
  143.  
  144.                 f1.write((char*)&q, sizeof(q));
  145.                 f1.write((char*)C, q * sizeof(elemType));
  146.  
  147.                 f1.close();
  148.                 cout << "Запись массива в файл с именем \"" << fname << "\"  прошла успешно!" << endl;
  149.                 _getch();
  150.                 break;
  151.             } while (true);
  152.  
  153.             if (fname == "*") break;
  154.             break;
  155.         }
  156.  
  157.         case '2':
  158.  
  159.             do {
  160.                 cin.ignore(cin.rdbuf()->in_avail(), '\n');
  161.                 cout << "Введите название файла или \"*\" для возврата в меню: ";
  162.                 getline(cin, fname);
  163.                 if (fname == "*") {
  164.                     system("cls");
  165.                     break;
  166.                 }
  167.  
  168.                 f1.open(fname, ios_base::in | ios_base::binary);
  169.                 if (!f1.is_open())
  170.                 {
  171.                     system("cls");
  172.                     cout << "Не удалось открыть файл \"" << fname << "\"!" << endl << "Код ошибки: \"" << errno << "\"" << endl;
  173.                     perror("");
  174.                     continue;
  175.                 }
  176.  
  177.  
  178.                 f1.seekg(0, ios_base::end);
  179.                 int p = f1.tellg();
  180.                 if (p == 0) {
  181.                     f1.close();
  182.                     cout << "Файл \"" << fname << "\" не содержит данных!\n";
  183.                     cin.ignore(cin.rdbuf()->in_avail(), '\n');
  184.                     continue;
  185.                 }
  186.  
  187.                 if ((p < q) || (p - sizeof(q) % sizeof(elemType)))
  188.                 {
  189.                     f1.close();
  190.                     cout << "Файл \"" << fname << "\" содержит некорректные данные!\n";
  191.                     cin.ignore(cin.rdbuf()->in_avail(), '\n');
  192.                     continue;
  193.                 }
  194.  
  195.                 f1.seekg(0);
  196.                 f1.read((char*)&q, sizeof(q));
  197.  
  198.                 if (q * sizeof(elemType) + sizeof(q) != p) {
  199.                     f1.close();
  200.                     cout << "Ошибка! Файл \"" << fname << "\" содержит некорректные данные!\n\n";
  201.                     continue;
  202.                 }
  203.  
  204.  
  205.                 if (C != nullptr)
  206.                     delete[]C;
  207.  
  208.                 C = new (nothrow) elemType[q];
  209.                 if (!C)
  210.                 {
  211.                     f1.close();
  212.                     system("cls");
  213.                     cout << "Ошибка выделения памяти!\n";
  214.                     continue;
  215.  
  216.                 }
  217.                 break;
  218.  
  219.             } while (true);
  220.  
  221.             if (fname == "*") break;
  222.  
  223.             f1.seekg(sizeof(q));
  224.             f1.read((char*)C, q * sizeof(elemType));
  225.             f1.close();
  226.  
  227.             cout << "Данные из файла \"" << fname << "\" успешно загружены!\n\n";
  228.  
  229.         case '3':
  230.         {
  231.             if (C != nullptr) {
  232.                 cout << "Ниже представлены исходные данные." << endl << endl;
  233.                 cout << setw(10) << "Номер";
  234.                 for (int i = 1; i <= q; i++)
  235.                     cout << setw(4) << i;
  236.                 cout << endl << setw(10) << "Элемент";
  237.                 for (int i = 0; i < q; i++)
  238.                     cout << setw(4) << C[i];
  239.                 cout << endl << endl;
  240.             }
  241.             else cout << "Массив не задан! Перейдите в п.1 или п.2 в меню!";
  242.             _getch();
  243.             break;
  244.         }
  245.  
  246.         case '4': {
  247.             if (C != nullptr) {
  248.                 cout << "Ниже представлена обработка данных соответственно заданию." << endl << endl;
  249.                 int na = 0, nb = 0;
  250.                 for (int i = 0; i < q; i++)
  251.                     if (C[i] < 0)
  252.                         na++;
  253.                     else
  254.                         if (C[i] > 0)
  255.                             nb++;
  256.  
  257.                 int *A = new (nothrow) int[na];
  258.                 if (!A) {
  259.                     cout << "Ошибка выделения памяти! Данные невозможно использовать для успешной работы программы. Перейдите в п.1 или п.2 в меню!" << endl;
  260.                     continue;
  261.                 }
  262.  
  263.                 int *B;
  264.                 try {
  265.                     B = new int[nb];
  266.                 }
  267.                 catch (...)
  268.                 {
  269.                     delete[] A;
  270.                     cout << "Ошибка выделения памяти! Данные невозможно использовать для успешной работы программы. Перейдите в п.1 или п.2 в меню!" << endl;
  271.                     continue;
  272.                 }
  273.  
  274.                 int pa = 1, pb = 1;
  275.                 int j1 = 0, j2 = 0;
  276.  
  277.                 for (int i = 0; i < q; i++) {
  278.                     if (C[i] < 0) {
  279.                         A[j1] = C[i];
  280.                         pa *= A[j1];
  281.                         j1++;
  282.                     }
  283.                     else
  284.                         if (C[i] > 0) {
  285.                             B[j2] = C[i];
  286.                             pb *= B[j2];
  287.                             j2++;
  288.                         }
  289.                 }
  290.                 cout << endl;
  291.                 cout << "Ниже представлены исходные данные." << endl << endl;
  292.                 cout << setw(10) << "Номер";
  293.                 for (int i = 1; i <= q; i++)
  294.                     cout << setw(4) << i;
  295.                 cout << endl << setw(10) << "Элемент";
  296.                 for (int i = 0; i < q; i++)
  297.                     cout << setw(4) << C[i];
  298.                 cout << endl << endl;
  299.  
  300.                 cout << endl;
  301.                 if (na == 0)
  302.                     cout << "Массив не имеет отрицательных элементов!";
  303.                 else {
  304.                     cout << setw(10) << "Массив A" << endl;
  305.                     cout << setw(10) << "Номер";
  306.                     for (int i = 1; i <= na; i++)
  307.                         cout << setw(4) << i;
  308.                     cout << endl << setw(10) << "Элемент";
  309.                     for (int i = 0; i < na; i++)
  310.                         cout << setw(4) << A[i];
  311.                 }
  312.                 cout << endl;
  313.                 delete[] A;
  314.  
  315.                 cout << endl;
  316.                 if (nb == 0)
  317.                     cout << "Массив не имеет положительных элементов!";
  318.                 else {
  319.                     cout << setw(10) << "Массив B" << endl;
  320.                     cout << setw(10) << "Номер";
  321.                     for (int i = 1; i <= nb; i++)
  322.                         cout << setw(4) << i;
  323.                     cout << endl << setw(10) << "Элемент";
  324.                     for (int i = 0; i < nb; i++)
  325.                         cout << setw(4) << B[i];
  326.                 }
  327.                 delete[] B;
  328.  
  329.                 cout << endl << endl;
  330.  
  331.                 if (na != 0 && nb != 0)
  332.                     cout << "Отношение произведения элементов массива  В к произведению элементов массива А: " << (double)pb / pa << endl;
  333.                 else
  334.                     cout << "Невозможно вычислить отношение произведений!";
  335.                 cout << endl;
  336.                 cout << endl;
  337.             }
  338.             else cout << "Массив не задан! Перейдите в п.1 или п.2 в меню!";
  339.             _getch();
  340.             break;
  341.         }
  342.         case '5': {
  343.             if (C != nullptr) delete[] C;
  344.             cout << "Работа программы завершена!";
  345.             return 0;
  346.         }
  347.  
  348.         default:
  349.             cout << "Введено неверное значение! Повторите ввод!" << endl;
  350.             _getch();
  351.             break;
  352.         }
  353.     } while (true);
  354. }
Advertisement
Add Comment
Please, Sign In to add comment