Advertisement
oshige_san

Untitled

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