0_liprikon_0

Laba_2

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