Advertisement
oshige_san

Untitled

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