0_liprikon_0

Laba_1

May 17th, 2021 (edited)
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include <string>
  5. #include <sstream>
  6. #include <Windows.h>
  7.  
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.     SetConsoleCP(1251);
  13.     SetConsoleOutputCP(1251);
  14.  
  15.     ifstream file;
  16.  
  17.     int* C;
  18.     int amount;
  19.  
  20.     do
  21.     {
  22.         amount = 0;
  23.         string name;
  24.         cout << "Введите имя файла с массивом или \"*\", чтобы выйти из программы: ";
  25.         getline(cin, name); //ввод имени файла
  26.         if (name == "*")
  27.             return 0;
  28.  
  29.         /////////////обработка ошибки вне цикла!///////////////
  30.         file.open(name);
  31.         if (!file.is_open())
  32.         {
  33.             cout << "Не удалось открыть файл \"" << name << "\"!\nКод ошибки:" << errno << " ";
  34.             perror("");
  35.             continue;
  36.         }
  37.  
  38.         ///////////////////указать второй способ определения кол-ва чисел в файле/////////////////////
  39.  
  40.         //проверка файла на наличие массива
  41.        /*string er;
  42.         streampos p;
  43.         bool isError = false;
  44.         amount = 0;
  45.         while (!(file>> ws).eof()) {
  46.             int e;
  47.             p = file.tellg();
  48.             data >> e;
  49.             char k;
  50.             if (data.fail() || ((k = file.peek()) != ' ' && k != '\n' && k != '\t' && k != EOF)) {
  51.                 isError = true;
  52.                 file.clear();
  53.                 file.seekg(problemPos);
  54.                 file >> er;
  55.                 break;
  56.             }
  57.             amount++;
  58.         }
  59.         if (isError) {
  60.             file.close();
  61.             cout << "\nОшибка ввода элемента \"" << er << "\" под номером: " << amount + 1
  62.                 << ", начинающегося с позиции указателя \"" << 1 + p << "\"!\n\n";
  63.             er = "";
  64.             system("pause");
  65.             continue;
  66.         }
  67.         if (amount == 0) {
  68.             file.close();
  69.             str = "";
  70.             cout << "\n\nФайл: \"" << fileName << "\" не содержит целых чисел.\n\n";
  71.             system("pause");
  72.             continue;
  73.         }
  74.         er = ""; */
  75.  
  76.  
  77.         streampos p;
  78.         stringstream er;
  79.         string str;
  80.         int b;
  81.         bool isError = false;
  82.         amount = 0;
  83.         while (!(file >> str).fail()) {
  84.             p = file.tellg();
  85.  
  86.             er.str(str);
  87.             er >> b;
  88.  
  89.             if (!er.eof() || er.fail()) {
  90.                 isError = true;
  91.                 break;
  92.             }
  93.             er.clear();
  94.             amount++;
  95.         }
  96.  
  97.         if (isError) {
  98.             file.close();
  99.             cout << "\nОшибка ввода элемента \"" << str << "\" под номером: " << amount + 1
  100.                 << ", начинающегося с позиции указателя \"" << 1 + p - str.length() << "\"!\n\n";
  101.             str = "";
  102.             er.str("");
  103.             system("pause");
  104.             continue;
  105.         }
  106.  
  107.         if (amount == 0) {
  108.             file.close();
  109.             str = "";
  110.             er.str("");
  111.             cout << "\n\nФайл: \"" << name << "\" не содержит целых чисел.\n\n";
  112.             system("pause");
  113.             continue;
  114.         }
  115.  
  116.         str = "";
  117.         er.str("");
  118.        
  119.         try//динамическое выделение памяти (ошибка выделения памяти) //первый способ
  120.         {
  121.             C = new int[amount];
  122.         }
  123.         catch (...)
  124.         {
  125.             file.close();
  126.             cout << "Ошибка выделения динамической памяти\n";
  127.             continue;
  128.         }
  129.  
  130.         int* D = new (nothrow) int[amount]; //второй способ
  131.         if (!D) {
  132.             delete[]C;
  133.             file.close();
  134.             system("cls");
  135.             cout << "Ошибка выделения памяти!\n\n";
  136.             system("pause");
  137.             continue;
  138.         }
  139.         //вывод массива на экран из файла
  140.         cout << setw(10) << "Массив С\n";
  141.         cout << setw(10) << "Номер";
  142.         for (int i = 1; i <= amount; i++)
  143.             cout << setw(4) << i;
  144.         cout << endl << setw(10) << "Элемент";
  145.         file.clear();
  146.         file.seekg(0);
  147.         for (int i = 0; i < amount; i++) {
  148.             file >> C[i];
  149.             cout << setw(4) << C[i];
  150.         }
  151.         file.close();
  152.         cout << endl << endl;
  153.         //обработка массива, запись в новый массив
  154.         int zeroElements = 0;
  155.         for (int i = 0; i < amount; i++) {
  156.             D[i] = C[i];
  157.             if (C[i] == 0)
  158.                 zeroElements++;
  159.         }
  160.        
  161.         zeroElements -= 1;
  162.  
  163.         int i = 0;
  164.         bool isZero = false;
  165.         while (zeroElements > 0) {
  166.             if (D[i] == 0 && isZero) {
  167.                 zeroElements--;
  168.                 isZero = false;
  169.             } else
  170.                 if (isZero)
  171.                     D[i] = 1;
  172.            
  173.             if (D[i] == 0) {
  174.                 isZero = true;
  175.                 i++;
  176.                 continue;
  177.             }
  178.  
  179.             if (isZero)
  180.                 D[i] = 1;
  181.         i++;
  182.         }
  183.         delete[] C;
  184.  
  185.         //вывод нового массива
  186.         cout << setw(10) << "Новый массив D\n";
  187.         cout << setw(10) << "Номер";
  188.         for (int i = 1; i <= amount; i++)
  189.             cout << setw(4) << i;
  190.         cout << endl << setw(10) << "Элемент";
  191.         for (int i = 0; i < amount; i++)
  192.             cout << setw(4) << D[i];
  193.         delete[] D;
  194.         cout << endl << endl;
  195.     } while (true);
  196. }
Advertisement
Add Comment
Please, Sign In to add comment