#include #include #include #include "crtdynmem.h" // библиотека для отслеживания операций выделения памяти #include "hw2D.h" using namespace std; // Ввод двумерного массива c клавиатуры (элементы вводятся по строкам) // Двумерный массив хранится как плотный (одномерный массив, элементы по строкам) // Перегруженная функция read_new. void read_new(double* &a, size_t &rows, size_t &cols) { assert(a == nullptr); cout << "Введите количество строк " << endl; cin >> rows; cout << "Введите количество столбцов " << endl; cin >> cols; a = new double[rows*cols]; cout << "Введите " << rows*cols << " элементов" << endl; for (size_t i = 0; i < rows; ++i) for (size_t j = 0; j < cols; ++j) cin >> a[i*cols + j]; } // Ввод двумерного массива c клавиатуры (элементы вводятся по строкам) // Двумерный массив хранится как разреженный (двумерный массив) // Перегруженная функция read_new. void read_new(double** &m, size_t &rows, size_t &cols) { assert(m == nullptr); cout << "Введите количество строк " << endl; cin >> rows; cout << "Введите количество столбцов " << endl; cin >> cols; // выделяем массив указателей m = new double*[rows]; cout << "Введите " << rows*cols << " элементов" << endl; for (size_t i = 0; i < rows; ++i) { // выделяем память под каждую строку отдельно m[i] = new double[cols]; for (size_t j = 0; j < cols; ++j) cin >> m[i][j]; } } // Освобождение памяти занимаемой двумерным массивом, который хранится как разреженный // в заголовочном файле для cols задано значение по умолчанию: cols=0 void delete_matrix(double **& m, const size_t rows, const size_t cols) { assert(m != nullptr); // Освобождаем память занимаемую строками for (size_t i = 0; i < rows; ++i) delete[] m[i]; // Освобождаем память занимаемую массивом строк delete[] m; // Обнуляем указатель m = nullptr; } // Вывод одномерного массива на консоль в виде матрицы // Двумерный массив хранится как плотный (одномерный массив) // Перегруженная функция print. void print(const double *a, const size_t rows, const size_t cols) { assert(a != nullptr); for (size_t i = 0; i < rows; ++i) { for (size_t j = 0; j < cols; ++j) { // Форматированый вывод для выравнивания столбцов cout << setw(cout.precision() * 2 + 1); cout << a[i*cols + j] << " "; } cout << endl; } } // Вывод матрицы (двумерного массива) на консоль // Двумерный массив хранится как разреженный (двумерный массив) // Перегруженная функция print. void print(double const*const* m, const size_t rows, const size_t cols) { assert(m != nullptr); for (size_t i = 0; i < rows; ++i) { for (size_t j = 0; j < cols; ++j) { cout << setw(cout.precision() * 2 + 1); cout << m[i][j] << " "; } cout << endl; } } // Проверка, что одномерный массив состоит из нолей // в заголовочном файле для precision задано значение по умолчанию bool is_zeros(const double *a, const size_t len, const double precision) { for (size_t i = 0; i < len; ++i) { if (fabs(a[i])>precision) return false; } return true; } // Проверка, что в матрице есть нолевой столбец // Двумерный массив хранится как плотный (одномерный массив) // в заголовочном файле для precision задано значение по умолчанию bool has_zero_col(const double *a, const size_t rows, const size_t cols, const double precision) { // Элемента столбца находятся в разреженных ячейках памяти for (int j = 0; j < cols; ++j) { bool is_zero_col = true; for (int i = 0; i < rows; ++i) { // Проверка на наличие не нулевых элементов в столбце is_zero_col = is_zero_col && fabs( a[i*cols+j] ) <= precision; } if (is_zero_col) return true; } return false; } // Проверка, что в матрице есть нолевой столбец // Двумерный массив хранится как разреженный (двумерный массив) // в заголовочном файле для precision задано значение по умолчанию bool has_zero_col(double const* const* m, const size_t rows, const size_t cols, const double precision) { // Элемнта столбца находятся в несвязанных ячейках памяти for (int j = 0; j < cols; ++j) { bool is_zero_col = true; for (int i = 0; i < rows; ++i) { // Проверка на наличие не нулевых элементов в столбце is_zero_col = is_zero_col && fabs( m[i][j] ) <= precision; } if (is_zero_col) return true; } return false; } // Проверка, что в матрице есть нолевая строка // Двумерный массив хранится как плотный (одномерный массив) // в заголовочном файле для precision задано значение по умолчанию bool has_zero_row(const double * a, const size_t rows, const size_t cols, const double precision) { // Строки матрицы располагаются в памяти линейно for (int i = 0; i < rows; ++i) { // каждая строка начинается с индекса // кратного количеству элементов в строке if (is_zeros(a + (i * cols), cols, precision))// сдвиг указателя return true; } return false; } // Проверка, что в матрице есть нолевая строка // Двумерный массив хранится как разреженный // в заголовочном файле для precision задано значение по умолчанию bool has_zero_row( double const* const* m, const size_t rows, const size_t cols, const double precision) { // Строки матрицы располагаются в памяти линейно for (int i = 0; i < rows; ++i) { // каждый элемент массива - указатель на строку if (is_zeros(m[i], cols, precision)) return true; } return false; }