Описать класс, реализующий тип "Вещественная матрица" - 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);
 }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.667 из 5
Похожие ответы