Наследования класс 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();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д