Наследования класс Matrix - как вызвать наследника - C#

Узнай цену своей работы

Формулировка задачи:

Помогите разобраться. Мне нужно было создать класс-наследник класса Matrix. Как его теперь вызвать и как в него добавить вызов всех других методов из Matrix?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication49
{
    class Program
    {
        public class Matrix
        {
            public double[,] matrix;
            public int Row = 0, Col = 0;
 
            //конструктор
            public Matrix(int row, int col)
            {
                matrix = new double[row, col];
                Row = row; Col = col;
            }
 
            //доступ к элементу по индексам
            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 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");
                }
 
            }
        }
        class Matrix_Step:Matrix
        {
            Matrix_Step(int Row, int Col):base(Row, Col){}
            
              //возведение в степень
            public static Matrix_Step operator ^(Matrix_Step first, int pow)
            {
                Matrix_Step matr = new Matrix_Step(first.Row, first.Col);
                matr = first;
                for (int z = 1; z < pow; z++)
                {
                    Matrix_Step bufer = new Matrix_Step(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;
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Введите размерность первой матрицы:\n");
            int N = Convert.ToInt32(Console.ReadLine());
            int M = Convert.ToInt32(Console.ReadLine());
            Matrix first = new Matrix(N, M);//обьект класса
            Console.WriteLine("Введите элементы матрицы:\n");
            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                {
                    first[i, j] = double.Parse(Console.ReadLine());
 
                }
            Console.WriteLine("Введите размерность второй матрицы:\n");
            int K = Convert.ToInt32(Console.ReadLine());
            int L = Convert.ToInt32(Console.ReadLine());
            Matrix second = new Matrix(K, L);//обьект класса
            Console.WriteLine("Введите элементы матрицы:\n");
            for (int i = 0; i < K; i++)
                for (int j = 0; j < L; j++)
                {
                    second[i, j] = double.Parse(Console.ReadLine());
 
                }
            Console.WriteLine("Введите степень:\n");
            int pow = Convert.ToInt32(Console.ReadLine());
 
            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();
        }
    }
}

Решение задачи: «Наследования класс Matrix - как вызвать наследника»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication49
{
    class Program
    {
        public class Matrix
        {
            public double[,] matrix;
            public int Row = 0, Col = 0;
            //конструктор
            public Matrix(int row, int col)
            {
                matrix = new double[row, col];
                Row = row; Col = col;
                d1 = row;
                d2 = col;
            }
 
            //доступ к элементу по индексам
            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 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");
                }
 
            }
            private int d1;//объект динам. метода
            private int d2;//объект динам. метода
            public void din1()//динамический метод
            {
                Console.WriteLine("Я динамический метод класса Matrix");
                Console.WriteLine("Мои поля {0},{1}", d1, d2);
            }
            public static void stat1()//статический метод 
            {
                Console.WriteLine("Я статический метод класса Matrix");
            }
        }
        class Matrix_1 : Matrix
        {
 
            public Matrix_1(int row, int col) : base(row, col) { }
            //возведение в степень
            public static Matrix operator ^(Matrix_1 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;
            }
 
        }
        class client//подкласс
        {
            public client(int row, int col)//конструктор
            {
                owner = new Matrix(row, col);
            }
            Matrix owner;
            public void din2()//динамический метод
            {
                Console.WriteLine("Я динамический метод класса client");
                Console.WriteLine("Я вызываю динамический метод класса ");
                owner.din1();//вызов динам метода
            }
            public void stat2()
            {
                Console.WriteLine("Я динамический метод класса client");
                Console.WriteLine("Я вызываю статический метод класса Matrix");
                Matrix.stat1();
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Введите размерность первой матрицы:\n");
            int N = Convert.ToInt32(Console.ReadLine());
            int M = Convert.ToInt32(Console.ReadLine());
            Matrix_1 first = new Matrix_1(N, M);//обьект класса
            Console.WriteLine("Введите элементы матрицы:\n");
            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                {
                    first[i, j] = double.Parse(Console.ReadLine());
 
                }
            Console.WriteLine("Введите размерность второй матрицы:\n");
            int K = Convert.ToInt32(Console.ReadLine());
            int L = Convert.ToInt32(Console.ReadLine());
            Matrix second = new Matrix(K, L);//обьект класса
            Console.WriteLine("Введите элементы матрицы:\n");
            for (int i = 0; i < K; i++)
                for (int j = 0; j < L; j++)
                {
                    second[i, j] = double.Parse(Console.ReadLine());
 
                }
            Console.WriteLine("Введите степень:\n");
            int pow = Convert.ToInt32(Console.ReadLine());
            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());
            client obj = new client(2, 3);
            obj.din2();//вызов метода
            obj.stat2();//вызов метода
            Console.ReadKey();
        }
    }
}

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


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

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

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