Описать класс, реализующий тип "Вещественная матрица" - C#
Формулировка задачи:
Здравствуйте! При написании программы у меня возникли такие проблемы:
1. Если ввести не квадратную матрицу, доступ к элементу по индексу выдает ошибку.
2. Как вызывать в основной программе метод доступа к элементу по индексу?
3. Как сделать метод ввода матриц с клавиатуры вместо рандома?
Зарание благодарю за помощь.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication49 { class Program { public class Matrix { double[,] matrix; int Row = 0, Col = 0; //матрица N x M public Matrix(int row, int col) { matrix = new double[row, col]; Row = row; Col = col; } /* //квадратная матрица public Matrix(int N) { matrix = new double[N, N]; Row = Col = N; }*/ //доступ к элементу по индексам public double this[int i, int j] { get { return matrix[i, j]; } set { matrix[i, j] = value; } } //произведение матриц public static Matrix operator *(Matrix first, Matrix second) { Matrix matr = new Matrix(first.Row, first.Col); if (first.Col != second.Row) throw new ArgumentException("Число столбцов матрицы А не равно числу строк матрицы В."); for (int i = 0; i < first.Row; i++) { for (int j = 0; j < second.Col; j++) { double sum = 0; for (int r = 0; r < first.Col; r++) sum += first[i, r] * second[r, j]; matr[i, j] = sum; } } return matr; } //умножение на число public static Matrix operator *(Matrix m, int t) { Matrix mat = new Matrix(m.Row, m.Col); for (int i = 0; i < m.Row; i++) for (int j = 0; j < m.Col; j++) mat[i, j] = m[i, j] * t; return mat; } //деление на число public static Matrix operator /(Matrix m, int t) { Matrix mat = new Matrix(m.Row, m.Col); for (int i = 0; i < m.Row; i++) for (int j = 0; j < m.Col; j++) mat[i, j] = m[i, j] / t; return mat; } //возведение в степень public static Matrix operator ^(Matrix first, int pow) { Matrix matr = new Matrix(first.Row, first.Col); matr = first; for (int z = 1; z < pow; z++) { Matrix bufer = new Matrix(first.Row, first.Col); for (int i = 0; i < first.Row; i++) { for (int j = 0; j < first.Row; j++) { double sum = 0; for (int r = 0; r < first.Row; r++) sum += matr[i, r] * first[r, j]; bufer[i, j] = sum; } } matr = bufer; } return matr; } //детерминант public double Determinant() { if (Col!= Row) throw new ArgumentException("Вычисление определителя возможно только для квадратных матриц."); Matrix matr = new Matrix(Row,Col); matr.matrix = (double[,])this.matrix.Clone(); double det = 1; int order = Row; for (int i = 0; i < order - 1; i++) { double[] masterRow = matr.GetRow(i); det *= masterRow[i]; if (det == 0) return 0; for (int t = i + 1; t < order; t++) { double[] slaveRow = matr.GetRow(t); double[] tmp = MulArrayConst(masterRow, slaveRow[i] / masterRow[i]); double[] source = matr.GetRow(t); matr.SetRow(SubArray(source, tmp), t); } } det *= matr[order - 1, order - 1]; return det; } // возвращает массив соответствующий указанной строке матрицы public double[] GetRow(int row) { if (row >= Row) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву."); double[] ret = new double[Col]; for (int i = 0; i < Col; i++) ret[i] = matrix[row, i]; return ret; } // заполняет указанную строку матрицы значениями из массива public void SetRow(double[] values, int row) { if (row >= Row) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву."); for (int i = 0; i < (Col > values.Length ? values.Length : Col); i++) matrix[row, i] = values[i]; } double[] SubArray(double[] A,double[] B) { double[] ret = (double[])A.Clone(); for (int i = 0; i < (A.Length > B.Length ? A.Length : B.Length); i++) ret[i] -= B[i]; return ret; } double[] MulArrayConst(double[] array, double number) { double[] ret = (double[])array.Clone(); for (int i = 0; i < ret.Length; i++) ret[i] *= number; return ret; } //вывод матрицы public void PrintMatrix() { for (int i = 0; i < this.Row; i++) { for (int j = 0; j < this.Col; j++) Console.Write("{0} ", this[i, j]); Console.Write("\n"); } } } static void Main(string[] args) { Console.WriteLine("Введите размерность первой матрицы:\n"); int N = Convert.ToInt32(Console.ReadLine()); int M = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите размерность второй матрицы:\n"); int K = Convert.ToInt32(Console.ReadLine()); int L = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите степень:\n"); int pow = Convert.ToInt32(Console.ReadLine()); Random rand = new Random(); Matrix first = new Matrix(N,M); Matrix second = new Matrix(K,L); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) { first[i, j] = rand.Next(1, 5); second[i, j] = rand.Next(1, 5); } Console.WriteLine("Первая матрица:\n\n"); first.PrintMatrix(); Console.WriteLine("\n\nВторая матрица:\n\n"); second.PrintMatrix(); Console.WriteLine("\n\nУмножение на число:\n\n"); (first * 3).PrintMatrix(); Console.WriteLine("\n\nДеление на число:\n\n"); (first / 3).PrintMatrix(); Console.WriteLine("\n\nПроизведение матриц:\n\n"); (first * second).PrintMatrix(); Console.WriteLine("\n\n{0} степень матрицы:\n\n", pow); (first ^ pow).PrintMatrix(); Console.WriteLine("\n\nДетерминант матрицы:\n\n"); Console.WriteLine(first.Determinant()); Console.ReadKey(); } } }
Решение задачи: «Описать класс, реализующий тип "Вещественная матрица"»
textual
Листинг программы
for (int i = 0; i < K; i++) for (int j = 0; j < L; j++) { second[i, j] = rand.Next(1, 5); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д