Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <sstream>
- #include <vector>
- #include <regex>
- #include <limits>
- using namespace std;
- /**
- * @brief Данные о единичном элементе
- */
- template <typename T>
- struct matrixElement
- {
- //Конструктор. Шоб удобно инициализировать.
- matrixElement(T defValue, size_t i_const, size_t j_const)
- {
- this->value = defValue;
- this->i = i_const;
- this->j = j_const;
- }
- T value = 0; //Значение элемента
- size_t i = 0, //Координата i (Столбец)
- j = 0; //Координата j (Строка)
- //
- string getString()
- {
- return to_string(this->value) + "[" +
- to_string(this->i) + "][" +
- to_string(this->j) + "]";
- };
- };
- /**
- * @brief Данные о матрице
- */
- template <typename T>
- struct matrixData
- {
- size_t positiveElements = 0, //Количество положительных элементов
- negativeElements = 0, //Количество отрицательных элементов
- zeroElements = 0; //Количество нулевых элементов
- double avgValue = 0; //Среднее значение матрицы
- //Значения которые выводятся с адресами элементов
- matrixElement<T> maxValue{numeric_limits<int>::min(), 0, 0}, //Максимальное значение матрицы
- minValue{numeric_limits<int>::max(),0,0}, //Минимальное значение матрицы
- biggestNegativeValue{numeric_limits<int>::min(),0,0}, //Наибольшее отрицательное значение
- smallestPositiveValue{numeric_limits<int>::max(),0,0}; //Наименьшее положительное значение
- };
- /**
- * @brief Получает информацию из матрицы
- * @param matrix Матрица для обработки
- */
- matrixData<int> getMatrixData(vector<vector<int>> matrix)
- {
- matrixData<int> result;
- long long sum = 0; //Сумма всех элементов матрицы
- size_t totalElements = 0; //Количество элементов матрицы
- for (size_t i = 0; i < matrix.size(); i++)
- for (size_t j = 0; j < matrix[i].size(); j++)
- {
- //Проверяем, является ли число максимальным
- if (matrix[i][j] > result.maxValue.value)
- result.maxValue = matrixElement<int>{matrix[i][j], i, j};
- //Проверяем, является ли число минимальным
- if (matrix[i][j] < result.minValue.value)
- result.minValue = matrixElement<int>{matrix[i][j], i, j};
- //Определяем знак числаmatr
- if (matrix[i][j] > 0)
- {
- result.positiveElements++;
- //Проверяем, является ли число наименьшим среди положительных
- if (matrix[i][j] < result.smallestPositiveValue.value)
- result.smallestPositiveValue = matrixElement<int>{matrix[i][j], i, j};
- }
- else if (matrix[i][j] < 0)
- {
- result.negativeElements++;
- //Проверяем, является ли число наибольшим среди отрицательных
- if (matrix[i][j] > result.biggestNegativeValue.value)
- result.biggestNegativeValue = matrixElement<int>(matrix[i][j], i, j);
- }
- else
- result.zeroElements++;
- sum += matrix[i][j]; //Прибавляем значение элемента к сумме
- totalElements++; //Увеличиваем итератор кол-ва элементов
- }
- //Находим среднее значение
- result.avgValue = (double)sum / totalElements;
- return result;
- }
- /**
- * @brief Читает матрицу из файла
- * @param file Имя файла
- * @param sep Разделитель элементов матрицы (Обычно - пробел, в .csv - запятая)
- */
- vector<vector<int>> readMatrix(string file, char sep)
- {
- //Выходная матрица
- vector<vector<int>> data;
- try
- {
- ifstream myReadFile(file);
- string bufStr;
- //Пока не достигнут конец файла
- while (!myReadFile.eof())
- {
- //Проверяем, удалось ли получить строку.
- if (!getline(myReadFile, bufStr))
- break;
- //Разделяем строку на вектор типа int
- stringstream iss(bufStr);
- vector<int> bufVector;
- int number;
- while (iss >> number)
- bufVector.push_back(number);
- //Отправляем строку в выходной массив
- data.push_back(bufVector);
- }
- }
- catch(const exception &exc)
- {
- cerr << exc.what();
- }
- return data;
- }
- /**
- * @brief Записывает данные о матрице в файл
- * @param data Данные о матрице
- * @param file Имя файла
- */
- void writeMatrixData(matrixData<int> data, string file)
- {
- try
- {
- //Создаём файловый поток и открываем файл
- ofstream outFile(file);
- //Вводим данные в файл
- outFile << "Положительных элементов: " << data.positiveElements << endl
- << "Отрицательных элементов: " << data.negativeElements << endl
- << "Нулевых элементов: " << data.zeroElements << endl << endl
- << "Среднее арифметическое значение всех элементов матрицы: " << data.avgValue << endl
- << "Максимальное значение: " << data.maxValue.getString() << endl
- << "Минимальное значение: " << data.minValue.getString() << endl
- << "Наибольшее отрицательное значение: " << data.biggestNegativeValue.getString() << endl
- << "Наименьшее положительное значение значение: " << data.smallestPositiveValue.getString() << endl;
- //Закрываем файл
- outFile.close();
- }
- catch(const exception &exc)
- {
- cerr << exc.what();
- }
- }
- void printMatrix(vector<vector<int>> arr)
- {
- for (size_t i = 0; i < arr.size(); i++)
- {
- for (size_t j = 0; j < arr[i].size(); j++)
- cout << arr[i][j] << " ";
- cout << endl;
- }
- }
- int main(int argc, char* argv[])
- {
- //Проверяем количество аргументов
- if (argc > 3)
- {
- cerr << "Error: invalid arguments. Try this:" << endl
- << " " << argv[0] << " matrix_file.txt output_file.txt" << endl;
- return 1;
- }
- //Строки с именами файлов
- string fileName, outFile;
- //Вводим аргумент с входным файлом
- if (argc >= 2)
- fileName = argv[1];
- else
- {
- //Пользователь вводит файл с матрицей
- cout << "Input file>";
- cin >> fileName;
- }
- //Вводим аргумент
- if (argc == 3)
- outFile = argv[2];
- else
- {
- //Пользователь вводить выходной файл
- cout << "Output file>";
- cin >> outFile;
- }
- //Получаем матрицу из файла
- vector<vector<int>> matrix = readMatrix(fileName, ' ');
- //Получаем данные о матрице
- matrixData<int> matrixDataUser = getMatrixData(matrix);
- //Передаём данные о матрице в функцию и записываем из в файл
- writeMatrixData(matrixDataUser, outFile);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment