0_liprikon_0

Лаба4_1

Sep 23rd, 2021
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.25 KB | None | 0 0
  1. //Определить номер строки с минимальным количеством нулевых элементов и
  2. //сложить элементы этой строки с соответствующими элементами всех нечетных строк.
  3.  
  4. #include <iostream> //объявляет объекты, управляющие чтением из стандартных потоков и записью в них
  5. #include <iomanip> //определение нужного числа манипуляторов, каждый из которых принимает один аргумент
  6. #include <Windows.h> //функции WinAPI, константы, типы, прототипы и др.
  7. #include <conio.h> //объявляет несколько библиотечных функций для работы с «консольным вводом и выводом» программы (_getch())
  8. #include <fstream> //определяет несколько классов, поддерживающих операции iostreams для последовательностей, хранящихся во внешних файлах
  9. #include <sstream> //определяет несколько шаблонов классов, поддерживающих операции iostream для последовательностей, хранящихся в выделенном объекте массива
  10. #include <cerrno> //имена, объявленные с помощью внешней компоновки в заголовке стандартной библиотеки C, объявляются в std пространстве имен
  11. #include <string> //методы и переменные для организации работы со строками
  12.  
  13. using namespace std; //std-пространство имён, содержащее все типы и функции стандартной библиотеки с++
  14.  
  15. #define AllocGood -2 //Выделяет блок памяти указанного размера из подраспределителя кэширования среды параллелизма
  16. #define AllocBad -1
  17.  
  18. // внутренний код ошибки
  19.  
  20. //Объявляет перечисление в области видимости пространства имен, которое является определяемым пользователем типом,
  21. //состоящим из ряда именованных констант, называемых перечислителями.
  22. enum Outcomes {
  23.     All_Good, //Все хорошо
  24.     Error_Open,//Ошибка открытия файла
  25.     File_Empty,//Пустой файл
  26.     Error_Elements,//Некорректный элемент
  27.     Not_Rectangular,//Непрямоугольная
  28.     Error_Of_Memory//Ошибка выделения памяти
  29. };
  30.  
  31. //объединение
  32.  
  33.  
  34. union MyUnion { // все члены совместно используют одно и то же расположение в памяти
  35.  
  36.     struct ErrorMatrix { //ошибки в матрице
  37.  
  38.         int row; //строка
  39.         int column; //столбец
  40.         int pos; //позиция
  41.  
  42.     } ErrElem; //имя ошибки
  43.  
  44.     int ErrRectRow;
  45.  
  46.     int ErrAlloc; //ошибка памяти
  47.  
  48.     int ErrOpen; //ошибка открытия
  49. };// NoArg;// = { -1 };
  50.  
  51. //проверка на корректность, прямоугольность, пустоту
  52. Outcomes CheckingMatrix(ifstream& fin, int& row_counter, int& column_counter, MyUnion* VariosError = NULL/*MyUnion &VariosError = NoArg*/) {
  53.     int pos, quantity_of_elements_in_the_other_row = 0;
  54.     //if (&VariosError == &NoArg) // if (VariosError.ErrOpen != -1)
  55.     column_counter = 0;
  56.     row_counter = 0;
  57.     while (true) {
  58.  
  59.         char c = fin.get();
  60.         int var;
  61.         switch (c) {
  62.  
  63.         case ' ': case '\t':
  64.             continue;
  65.         case EOF:
  66.             if (quantity_of_elements_in_the_other_row == 0)
  67.                 break;
  68.         case '\n':
  69.             if (quantity_of_elements_in_the_other_row == 0)
  70.                 continue;
  71.             if (column_counter == 0)
  72.                 column_counter = quantity_of_elements_in_the_other_row;
  73.             else if (column_counter != quantity_of_elements_in_the_other_row) {
  74.                 if (VariosError != NULL)
  75.                     VariosError->ErrRectRow = row_counter;
  76.                 row_counter = 0;
  77.                 column_counter = 0;
  78.                 return Outcomes::Not_Rectangular;
  79.             }
  80.             row_counter++;
  81.             quantity_of_elements_in_the_other_row = 0;
  82.             continue;
  83.         default:
  84.             fin.unget();
  85.             if (VariosError != NULL)
  86.                 pos = fin.tellg();
  87.             fin >> var;
  88.             if (fin.fail() || ((c = fin.peek()) != ' ' && c != '\t' && c != '\n' && c != EOF)) {
  89.                 if (VariosError != NULL) {
  90.                     VariosError->ErrElem.row = row_counter;
  91.                     VariosError->ErrElem.column = quantity_of_elements_in_the_other_row;
  92.                     VariosError->ErrElem.pos = pos;
  93.                 }
  94.                 row_counter = 0;
  95.                 column_counter = 0;
  96.                 return Outcomes::Error_Elements;
  97.             }
  98.             quantity_of_elements_in_the_other_row++;
  99.             continue;
  100.         }
  101.         if (column_counter == 0) {
  102.             row_counter = 0;
  103.             return Outcomes::File_Empty;
  104.         }
  105.         return Outcomes::All_Good;
  106.     }
  107. }
  108.  
  109. //освобождение памяти
  110. void DeletingMatrix(int**& matr, int row_counter) {
  111.     for (int k = 0; k < row_counter; k++)
  112.         delete[]matr[k];
  113.     delete[]matr;
  114.     matr = NULL;
  115. }
  116.  
  117. //выделение памяти
  118. int** AllocatingMatrix(int row_counter, int column_counter, int& i) {
  119.  
  120.     int** matr = NULL;
  121.     i = AllocBad;
  122.     try {
  123.         matr = new int* [row_counter];
  124.         for (i = 0; i < row_counter; i++)
  125.             matr[i] = new int[column_counter];
  126.     }
  127.     catch (...) {
  128.         if (matr != NULL)
  129.             DeletingMatrix(matr, i);
  130.         return NULL;
  131.     }
  132.     i = AllocGood;
  133.     return matr;
  134. }
  135.  
  136. //чтение матрицы
  137. int** ReadingMatrix(ifstream& fin, int** matr, int row_counter, int column_counter) {
  138.     for (int i = 0; i < row_counter; i++)
  139.         for (int j = 0; j < column_counter; j++)
  140.             fin >> *(*(matr + i) + j);
  141.     return matr;
  142. }
  143.  
  144. //вывод матрицы в консоль
  145. string MatrixToStr(int** matr, int row_counter, int column_counter, int number = 5) {
  146.  
  147.     ostringstream ss;
  148.     for (int i = 0; i < row_counter; i++) {
  149.         for (int j = 0; j < column_counter; j++)
  150.             ss << setw(number) << matr[i][j];
  151.         ss << endl;
  152.     }
  153.     return ss.str();
  154. }
  155.  
  156. //обработка матрицы
  157. int** ProcessingMatrix(int** matr, int row_counter, int column_counter, int a, int b) {
  158.    
  159.     int imin;
  160.     int kmin = column_counter + 1;
  161.     int k = 0;
  162.  
  163.     for (int a = 0; a < row_counter; a++)
  164.     {
  165.         for (int b = 0; b < column_counter; b++)
  166.         {
  167.             if (matr[a][b] == 0)
  168.                 k++;
  169.  
  170.             if (k < kmin)
  171.             {
  172.                 imin = a;
  173.                 kmin = k;
  174.             }
  175.         }
  176.  
  177.         k = 0;
  178.     };
  179.  
  180.     cout << endl;
  181.     cout << "Минимальное кол-во нулей содержится в строке " << imin;
  182.  
  183.     for (int a = 0; a < row_counter / 2; a++)
  184.     {
  185.         for (int b = 0; b < column_counter; b++)
  186.         {
  187.             if (imin != a * 2 - 1)
  188.                 matr[a * 2 - 1][b] = imin[b] + matr[a * 2 - 1][b];
  189.         }
  190.     }
  191.     return matr;
  192. }
  193.  
  194. //копирование элементов
  195. int** Copy(int** matr, int** copy_matr, int row_counter, int column_counter) {
  196.     for (int i = 0; i < row_counter; i++)
  197.         for (int j = 0; j < column_counter; j++)
  198.             copy_matr[i][j] = matr[i][j];
  199.     return copy_matr;
  200. }
  201.  
  202. //Создание копии матрицы
  203. int** CopyingMatrix(int** matr, int row_counter, int column_counter, int& i) {
  204.  
  205.     int** copy_matr = AllocatingMatrix(row_counter, column_counter, i);
  206.  
  207.     if (copy_matr == NULL)
  208.         return NULL;
  209.  
  210.     return Copy(matr, copy_matr, row_counter, column_counter);
  211. }
  212.  
  213. //загрузка матрицы
  214. Outcomes LoadingMatrix(const string& file, int**& matr, int& row_counter, int& column_counter, MyUnion* VariosError = NULL) {
  215.  
  216.     Outcomes result;
  217.  
  218.     ifstream fin;
  219.     fin.open(file);
  220.     if (!fin) {
  221.         if (VariosError != NULL)
  222.             VariosError->ErrOpen = errno;
  223.         matr = NULL;
  224.         row_counter = 0;
  225.         column_counter = 0;
  226.         return Outcomes::Error_Open;
  227.     }
  228.  
  229.     result = CheckingMatrix(fin, row_counter, column_counter, VariosError);
  230.     if (result != Outcomes::All_Good) {
  231.         fin.close();
  232.         matr = NULL;
  233.         return result;
  234.     }
  235.     int i;
  236.     matr = AllocatingMatrix(row_counter, column_counter, i);
  237.     if (matr == NULL) {
  238.         fin.close();
  239.         if (VariosError != NULL)
  240.             VariosError->ErrAlloc = i;
  241.         row_counter = 0;
  242.         column_counter = 0;
  243.         return Outcomes::Error_Of_Memory;
  244.     }
  245.  
  246.     fin.clear();
  247.     fin.seekg(0);
  248.     ReadingMatrix(fin, matr, row_counter, column_counter);
  249.     fin.close();
  250.  
  251.     return Outcomes::All_Good;
  252. }
  253.  
  254. //главная
  255. int main() {
  256.  
  257.     SetConsoleCP(1251);
  258.     SetConsoleOutputCP(1251);
  259.  
  260.     for (;;) {
  261.  
  262.         cout << "Введите имя файла или \"*\" для завершения работы: ";
  263.         if (cin.peek() == '*' && cin.rdbuf()->in_avail() == 2)
  264.             return 0;
  265.  
  266.         MyUnion VariosError;
  267.  
  268.         int row_counter, column_counter;
  269.         Outcomes result;
  270.  
  271.         string file;
  272.         getline(cin, file);
  273.  
  274.         int** matr; //указатель на указатель матрицы
  275.  
  276.         if ((result = LoadingMatrix(file, matr, row_counter, column_counter, &VariosError)) != Outcomes::All_Good) {
  277.  
  278.             cout << "\nКод ошибки: " << result << endl;
  279.  
  280.             switch (result) {
  281.             case Error_Open:
  282.                 cout << "Системный код ошибки \"errno\": " << VariosError.ErrOpen << endl;
  283.                 break;
  284.             case File_Empty:
  285.                 cout << "\nФайл пуст.";
  286.                 break;
  287.             case Error_Elements: {
  288.                 ifstream fin(file); //открытие файла для чтения
  289.                 fin.seekg(VariosError.ErrElem.pos);
  290.                 string split;
  291.                 fin >> split; //считывание первой строки файла
  292.                 fin.close(); //закрытие файла
  293.                 cout << "\nОшибка в строке " << 1 + VariosError.ErrElem.row << " в столбце " << 1 + VariosError.ErrElem.column << '.';
  294.                 cout << "\nНекорректный элемент имеет последовательность: " << split;
  295.                 break;
  296.             }
  297.             case Not_Rectangular:
  298.                 cout << "\nМатрица не прямоугольна, начиная со строки " << 1 + VariosError.ErrRectRow << '.';
  299.                 break;
  300.             case Error_Of_Memory:
  301.                 if (VariosError.ErrAlloc == AllocBad) {
  302.                     cout << "\nОшибка выделения памяти под массив указателей для строк матрицы.\n";
  303.                     break;
  304.                 }
  305.                 else {
  306.                     cout << "\nОшибка выделения памяти под строки матрицы, начиная со строки " << VariosError.ErrAlloc + 1 << ".\n";
  307.                     break;
  308.                 }
  309.             }
  310.  
  311.             cout << "\nНажмите любую клавишу, чтобы продолжить...";
  312.             _getch();
  313.             system("cls");
  314.             continue;
  315.         }
  316.  
  317.         cout << "\n\nИсходная матрица: \n\n";
  318.         cout << MatrixToStr(matr, row_counter, column_counter);
  319.  
  320.         int i;
  321.         int** copy_matr = CopyingMatrix(matr, row_counter, column_counter, i); //указатель на указатель копии матрицы
  322.         if (i == AllocBad) {
  323.             cout << "\nОшибка выделения памяти под массив указателей для строк матрицы.\n";
  324.             continue;
  325.         }
  326.         else if (i >= 0) {
  327.             cout << "\nОшибка выделения памяти под строки матрицы, начиная со строки " << i + 1 << ".\n";
  328.             continue;
  329.         }
  330.  
  331.  
  332.         /*int i, j, imin;
  333.         int kmin = column_counter + 1;
  334.         int k = 0;
  335.         int** matr;
  336.  
  337.         for (int i = 0; i < row_counter; i++)
  338.         {
  339.             for (int j = 0; j < column_counter; j++)
  340.             {
  341.                 if (matr[i][j] == 0)
  342.                     k++;
  343.  
  344.                 if (k < kmin)
  345.                 {
  346.                     imin = i;
  347.                     kmin = k;
  348.                 }
  349.             }
  350.  
  351.             k = 0;
  352.         };
  353.  
  354.         cout << endl;
  355.         cout << "Минимальное кол-во нулей содержится в строке " << imin;
  356.  
  357.         for (int i = 0; i < row_counter / 2; i++)
  358.         {
  359.             for (int j = 0; j < column_counter; j++)
  360.             {
  361.                 if (imin != i * 2 - 1)
  362.                     matr[i * 2 - 1][j] = imin[j] + matr[i * 2 - 1][j];
  363.             }
  364.         }
  365.         */
  366.         int a, b;
  367.         ProcessingMatrix(matr, row_counter, column_counter, a, b);
  368.        
  369.         //вывод обработанной матрицы
  370.         cout << "\n\nОбработанная матрица: \n\n";
  371.         cout << MatrixToStr(matr, row_counter, column_counter);
  372.  
  373.         DeletingMatrix(matr, row_counter); //удаление исходной матрицы
  374.         DeletingMatrix(copy_matr, row_counter); //удаление копии матрицы
  375.         return 0;
  376.     }
  377. }
  378.  
Advertisement
Add Comment
Please, Sign In to add comment