NIKOLAY_TETUS

Lab3_ex2

Apr 22nd, 2022
1,051
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <sstream>
  5. #include <vector>
  6. #include <regex>
  7. #include <limits>
  8.  
  9. using namespace std;
  10.  
  11. /**
  12.  * @brief Данные о единичном элементе
  13.  */
  14. template <typename T>
  15. struct matrixElement
  16. {
  17.     //Конструктор. Шоб удобно инициализировать.
  18.     matrixElement(T defValue, size_t i_const, size_t j_const)
  19.     {
  20.         this->value = defValue;
  21.         this->i = i_const;
  22.         this->j = j_const;
  23.     }
  24.  
  25.     T value  = 0;   //Значение элемента
  26.        
  27.     size_t i = 0,   //Координата i (Столбец)
  28.            j = 0;   //Координата j (Строка)
  29.    
  30.     //
  31.     string getString()
  32.     {  
  33.         return to_string(this->value) + "[" +
  34.                to_string(this->i) + "][" +
  35.                to_string(this->j) + "]";        
  36.     };
  37. };
  38.  
  39.  
  40. /**
  41.  * @brief Данные о матрице
  42.  */
  43. template <typename T>
  44. struct matrixData
  45. {
  46.     size_t positiveElements = 0,    //Количество положительных элементов
  47.            negativeElements = 0,    //Количество отрицательных элементов
  48.            zeroElements     = 0;    //Количество нулевых элементов
  49.    
  50.     double avgValue         = 0;    //Среднее значение матрицы
  51.    
  52.     //Значения которые выводятся с адресами элементов
  53.     matrixElement<T> maxValue{numeric_limits<int>::min(), 0, 0},            //Максимальное значение матрицы
  54.                      minValue{numeric_limits<int>::max(),0,0},              //Минимальное значение матрицы
  55.                      biggestNegativeValue{numeric_limits<int>::min(),0,0},  //Наибольшее отрицательное значение
  56.                      smallestPositiveValue{numeric_limits<int>::max(),0,0}; //Наименьшее положительное значение
  57.        
  58. };
  59.  
  60. /**
  61.  * @brief Получает информацию из матрицы
  62.  * @param matrix Матрица для обработки
  63.  */
  64. matrixData<int> getMatrixData(vector<vector<int>> matrix)
  65. {
  66.     matrixData<int> result;
  67.    
  68.     long long sum           = 0;    //Сумма всех элементов матрицы  
  69.     size_t totalElements    = 0;    //Количество элементов матрицы
  70.    
  71.     for (size_t i = 0; i < matrix.size(); i++)
  72.         for (size_t j = 0; j < matrix[i].size(); j++)
  73.         {
  74.             //Проверяем, является ли число максимальным
  75.             if (matrix[i][j] > result.maxValue.value)
  76.                 result.maxValue = matrixElement<int>{matrix[i][j], i, j};
  77.            
  78.             //Проверяем, является ли число минимальным
  79.             if (matrix[i][j] < result.minValue.value)
  80.                 result.minValue = matrixElement<int>{matrix[i][j], i, j};
  81.            
  82.             //Определяем знак числаmatr
  83.             if (matrix[i][j] > 0)
  84.             {
  85.                 result.positiveElements++;
  86.                
  87.                 //Проверяем, является ли число наименьшим среди положительных
  88.                 if (matrix[i][j] < result.smallestPositiveValue.value)
  89.                     result.smallestPositiveValue = matrixElement<int>{matrix[i][j], i, j};
  90.             }
  91.             else if (matrix[i][j] < 0)
  92.             {
  93.                 result.negativeElements++;
  94.                
  95.                 //Проверяем, является ли число наибольшим среди отрицательных
  96.                 if (matrix[i][j] > result.biggestNegativeValue.value)
  97.                     result.biggestNegativeValue = matrixElement<int>(matrix[i][j], i, j);
  98.             }
  99.             else
  100.                 result.zeroElements++;
  101.            
  102.             sum += matrix[i][j];    //Прибавляем значение элемента к сумме
  103.             totalElements++;        //Увеличиваем итератор кол-ва элементов
  104.         }
  105.    
  106.     //Находим среднее значение
  107.     result.avgValue = (double)sum / totalElements;
  108.    
  109.     return result;
  110. }
  111.  
  112. /**
  113.  * @brief Читает матрицу из файла
  114.  * @param file Имя файла
  115.  * @param sep  Разделитель элементов матрицы (Обычно - пробел, в .csv - запятая)
  116.  */
  117. vector<vector<int>> readMatrix(string file, char sep)
  118. {
  119.     //Выходная матрица
  120.     vector<vector<int>> data;
  121.    
  122.     try
  123.     {
  124.         ifstream myReadFile(file);
  125.        
  126.         string bufStr;
  127.        
  128.         //Пока не достигнут конец файла
  129.         while (!myReadFile.eof())
  130.         {            
  131.             //Проверяем, удалось ли получить строку.
  132.             if (!getline(myReadFile, bufStr))
  133.                 break;
  134.        
  135.             //Разделяем строку на вектор типа int
  136.             stringstream iss(bufStr);
  137.             vector<int> bufVector;
  138.             int number;
  139.            
  140.             while (iss >> number)
  141.                 bufVector.push_back(number);
  142.            
  143.             //Отправляем строку в выходной массив
  144.             data.push_back(bufVector);
  145.         }
  146.     }
  147.     catch(const exception &exc)
  148.     {
  149.         cerr << exc.what();
  150.     }
  151.    
  152.     return data;
  153. }
  154.  
  155. /**
  156.  * @brief Записывает данные о матрице в файл
  157.  * @param data Данные о матрице
  158.  * @param file Имя файла
  159.  */
  160. void writeMatrixData(matrixData<int> data, string file)
  161. {
  162.     try
  163.     {
  164.         //Создаём файловый поток и открываем файл
  165.         ofstream outFile(file);
  166.        
  167.         //Вводим данные в файл
  168.         outFile << "Положительных элементов: " << data.positiveElements << endl
  169.                << "Отрицательных элементов: " << data.negativeElements << endl
  170.                << "Нулевых элементов: " << data.zeroElements << endl << endl
  171.                << "Среднее арифметическое значение всех элементов матрицы: " << data.avgValue << endl
  172.                << "Максимальное значение: " << data.maxValue.getString() << endl
  173.                << "Минимальное значение: " << data.minValue.getString() << endl
  174.                << "Наибольшее отрицательное значение: " << data.biggestNegativeValue.getString() << endl
  175.                << "Наименьшее положительное значение значение: " << data.smallestPositiveValue.getString() << endl;
  176.                
  177.         //Закрываем файл
  178.         outFile.close();
  179.     }
  180.     catch(const exception &exc)
  181.     {
  182.         cerr << exc.what();
  183.     }
  184. }
  185.  
  186. void printMatrix(vector<vector<int>> arr)
  187. {
  188.     for (size_t i = 0; i < arr.size(); i++)
  189.     {
  190.         for (size_t j = 0; j < arr[i].size(); j++)
  191.             cout << arr[i][j] << " ";
  192.            
  193.         cout << endl;
  194.     }
  195. }
  196.  
  197. int main(int argc, char* argv[])
  198. {
  199.     //Проверяем количество аргументов
  200.     if (argc > 3)
  201.     {
  202.         cerr << "Error: invalid arguments. Try this:" << endl
  203.              << "   " << argv[0] << " matrix_file.txt output_file.txt" << endl;
  204.        
  205.         return 1;
  206.     }
  207.    
  208.     //Строки с именами файлов
  209.     string fileName, outFile;
  210.    
  211.     //Вводим аргумент с входным файлом
  212.     if (argc >= 2)
  213.         fileName = argv[1];
  214.     else
  215.     {
  216.         //Пользователь вводит файл с матрицей
  217.         cout << "Input file>";
  218.         cin >> fileName;
  219.     }
  220.    
  221.    
  222.     //Вводим аргумент
  223.     if (argc == 3)
  224.         outFile = argv[2];
  225.     else
  226.     {
  227.         //Пользователь вводить выходной файл
  228.         cout << "Output file>";
  229.         cin >> outFile;
  230.     }    
  231.    
  232.     //Получаем матрицу из файла
  233.     vector<vector<int>> matrix = readMatrix(fileName, ' ');
  234.    
  235.     //Получаем данные о матрице
  236.     matrixData<int> matrixDataUser = getMatrixData(matrix);
  237.    
  238.     //Передаём данные о матрице в функцию и записываем из в файл
  239.     writeMatrixData(matrixDataUser, outFile);
  240.  
  241.     return 0;
  242. }
  243.  
Advertisement
Add Comment
Please, Sign In to add comment