Задание 1. Жерновой. Матрица
unknown
csharp
a year ago
8.5 kB
6
Indexable
using System; public class Matrix { private int rows; private int columns; private double[,] elements; public int Rows { get { return rows; } } public int Columns { get { return columns; } } public Matrix(int rows, int columns) { this.rows = rows; this.columns = columns; this.elements = new double[rows, columns]; } ~Matrix() { // Деструктор } // Свойство для получения количества строк матрицы public int RowsS { get { return rows; } set { if (value <= 0) { throw new ArgumentOutOfRangeException(nameof(value), "Количество строк должно быть больше нуля."); } rows = value; ResizeMatrix(); } } // Свойство для получения количества столбцов матрицы public int ColumnsS { get { return columns; } set { if (value <= 0) { throw new ArgumentOutOfRangeException(nameof(value), "Количество столбцов должно быть больше нуля."); } columns = value; ResizeMatrix(); } } // Приватный метод для изменения размера матрицы private void ResizeMatrix() { // Создание нового двумерного массива нужного размера double[,] newElements = new double[rows, columns]; // Вычисление минимального значения для количества строк и столбцов int minRows = Math.Min(rows, elements.GetLength(0)); int minColumns = Math.Min(columns, elements.GetLength(1)); // Копирование элементов из старой матрицы в новую for (int i = 0; i < minRows; i++) { for (int j = 0; j < minColumns; j++) { newElements[i, j] = elements[i, j]; } } // Присваивание новой матрицы переменной elements elements = newElements; } public void SetElement(int rowIndex, int columnIndex, double value) { if (rowIndex < 0 || rowIndex >= rows) { throw new ArgumentOutOfRangeException(nameof(rowIndex)); } if (columnIndex < 0 || columnIndex >= columns) { throw new ArgumentOutOfRangeException(nameof(columnIndex)); } elements[rowIndex, columnIndex] = value; } public void PrintMatrix() { for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { Console.Write(elements[i, j] + " "); } Console.WriteLine(); } } public double CalculateDeterminant() { if (rows != columns) { throw new InvalidOperationException("Матрица должна быть квадратной."); } // Реализация вычисления определителя if (rows == 1) { return elements[0, 0]; } else if (rows == 2) { return elements[0, 0] * elements[1, 1] - elements[0, 1] * elements[1, 0]; } else { double determinant = 0; for (int i = 0; i < columns; i++) { determinant += elements[0, i] * GetCofactor(0, i).CalculateDeterminant() * Math.Pow(-1, i); } return determinant; } } //Получение кофакторов private Matrix GetCofactor(int row, int column) { Matrix cofactor = new Matrix(rows - 1, columns - 1); int rowIndex = 0; for (int i = 0; i < rows; i++) { if (i == row) continue; int columnIndex = 0; for (int j = 0; j < columns; j++) { if (j == column) continue; cofactor.elements[rowIndex, columnIndex] = elements[i, j]; columnIndex++; } rowIndex++; } return cofactor; } // перегрузка оператора + public static Matrix operator +(Matrix matrix1, Matrix matrix2) { if (matrix1.Rows != matrix2.Rows || matrix1.Columns != matrix2.Columns) { throw new ArgumentException("Матрицы должны быть одинаковой размерности."); } Matrix sum = new Matrix(matrix1.Rows, matrix1.Columns); for (int i = 0; i < matrix1.Rows; i++) { for (int j = 0; j < matrix1.Columns; j++) { sum.elements[i, j] = matrix1.elements[i, j] + matrix2.elements[i, j]; } } return sum; } // перегрузка оператора - public static Matrix operator -(Matrix matrix1, Matrix matrix2) { if (matrix1.Rows != matrix2.Rows || matrix1.Columns != matrix2.Columns) { throw new ArgumentException("Матрицы должны быть одинаковой размерности."); } Matrix difference = new Matrix(matrix1.Rows, matrix1.Columns); for (int i = 0; i < matrix1.Rows; i++) { for (int j = 0; j < matrix1.Columns; j++) { difference.elements[i, j] = matrix1.elements[i, j] - matrix2.elements[i, j]; } } return difference; } // перегрузка оператора * для матрицы на число public static Matrix operator *(Matrix matrix, double scalar) { Matrix result = new Matrix(matrix.Rows, matrix.Columns); for (int i = 0; i < matrix.Rows; i++) { for (int j = 0; j < matrix.Columns; j++) { result.elements[i, j] = matrix.elements[i, j] * scalar; } } return result; } // перегрузка оператора * для матрицы на матрицу public static Matrix operator *(Matrix matrix1, Matrix matrix2) { if (matrix1.Columns != matrix2.Rows) { throw new ArgumentException("Несовместимые размерности матриц."); } Matrix product = new Matrix(matrix1.Rows, matrix2.Columns); for (int i = 0; i < matrix1.Rows; i++) { for (int j = 0; j < matrix2.Columns; j++) { double sum = 0; for (int k = 0; k < matrix1.Columns; k++) { sum += matrix1.elements[i, k] * matrix2.elements[k, j]; } product.elements[i, j] = sum; } } return product; } class Program { static void Main(string[] args) { Matrix A = new Matrix(3, 3); // Инициализация элементов матрицы A A.elements[0, 0] = 2; A.elements[0, 1] = 0; A.elements[0, 2] = 0; A.elements[1, 0] = 0; A.elements[1, 1] = 2; A.elements[1, 2] = 0; A.elements[2, 0] = 0; A.elements[2, 1] = 0; A.elements[2, 2] = 2; Matrix B = new Matrix(3, 3); // Инициализация элементов матрицы B B.elements[0, 0] = 1; B.elements[0, 1] = 0; B.elements[0, 2] = 0; B.elements[1, 0] = 0; B.elements[1, 1] = 1; B.elements[1, 2] = 0; B.elements[2, 0] = 0; B.elements[2, 1] = 0; B.elements[2, 2] = 1; //операции Matrix C = A - B; C = C * 2; C = C * (A * A + B); //вывод C.PrintMatrix(); //определитель и вывод double determinant = C.CalculateDeterminant(); Console.WriteLine("Determinant: " + determinant); } } }
Editor is loading...