Advertisement
oshige_san

Untitled

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