Создать отдельный класс из общей программы - C#
Формулировка задачи:
Доброго времени суток. Есть программа на C# "Метод Леверье(нахождение собственных значений матрицы)".
Работающий вариант на консоль выдает сами значения. Проблема в том, что весь код написан в static void main класса Program, а программа должна быть более объектно-ориентированной. Как оттуда работу методов переместить в отдельные классы, например, под названием Leverie и Matrix, где бы производился сам расчет, а в самом static void как обычно оставить только процесс вывода на консоль? Спасибо за помощь
Решение задачи: «Создать отдельный класс из общей программы»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MethodLever { public class Matrix { public double[,] Args { get; set; } public int Row { get; set; } public int Col { get; set; } public Matrix(double[] x) { Row = x.Length; Col = 1; Args = new double[Row, Col]; for (int i = 0; i < Args.GetLength(0); i++) for (int j = 0; j < Args.GetLength(1); j++) Args[i, j] = x[i]; } public Matrix(double[,] x) { Row = x.GetLength(0); Col = x.GetLength(1); Args = new double[Row, Col]; for (int i = 0; i < Args.GetLength(0); i++) for (int j = 0; j < Args.GetLength(1); j++) Args[i, j] = x[i, j]; } public Matrix(Matrix other) { this.Row = other.Row; this.Col = other.Col; Args = new double[Row, Col]; for (int i = 0; i < Row; i++) for (int j = 0; j < Col; j++) this.Args[i, j] = other.Args[i, j]; } public override string ToString() { string s = string.Empty; for (int i = 0; i < Args.GetLength(0); i++) { for (int j = 0; j < Args.GetLength(1); j++) { s += string.Format("{0} ", Args[i, j]); } s += "\n"; } return s; } public Matrix Transposition() { double[,] t = new double[Col, Row]; for (int i = 0; i < Row; i++) for (int j = 0; j < Col; j++) t[j, i] = Args[i, j]; return new Matrix(t); } public static Matrix operator *(Matrix m, double k) { Matrix ans = new Matrix(m); for (int i = 0; i < ans.Row; i++) for (int j = 0; j < ans.Col; j++) ans.Args[i, j] = m.Args[i, j] * k; return ans; } public static Matrix operator *(Matrix m1, Matrix m2) { if (m1.Col != m2.Row) throw new ArgumentException("Multiplication of these two matrices can't be done!"); double[,] ans = new double[m1.Row, m2.Col]; for (int i = 0; i < m1.Row; i++) { for (int j = 0; j < m2.Col; j++) { for (int k = 0; k < m2.Row; k++) { ans[i, j] += m1.Args[i, k] * m2.Args[k, j]; } } } return new Matrix(ans); } private Matrix getMinor(int row, int column) { if (Row != Col) throw new ArgumentException("Matrix should be square!"); double[,] minor = new double[Row - 1, Col - 1]; for (int i = 0; i < this.Row; i++) { for (int j = 0; j < this.Col; j++) { if ((i != row) || (j != column)) { if (i > row && j < column) minor[i - 1, j] = this.Args[i, j]; if (i < row && j > column) minor[i, j - 1] = this.Args[i, j]; if (i > row && j > column) minor[i - 1, j - 1] = this.Args[i, j]; if (i < row && j < column) minor[i, j] = this.Args[i, j]; } } } return new Matrix(minor); } public static double Determ(Matrix m) { if (m.Row != m.Col) throw new ArgumentException("Matrix should be square!"); double det = 0; int length = m.Row; if (length == 1) det = m.Args[0, 0]; if (length == 2) det = m.Args[0, 0] * m.Args[1, 1] - m.Args[0, 1] * m.Args[1, 0]; if (length > 2) for (int i = 0; i < m.Col; i++) det += Math.Pow(-1, 0 + i) * m.Args[0, i] * Determ(m.getMinor(0, i)); return det; } public Matrix MinorMatrix() { double[,] ans = new double[Row, Col]; for (int i = 0; i < Row; i++) for (int j = 0; j < Col; j++) ans[i, j] = Math.Pow(-1, i + j) * Determ(this.getMinor(i, j)); return new Matrix(ans); } public Matrix InverseMatrix() { if (Math.Abs(Determ(this)) <= 0.000000001) throw new ArgumentException("Inverse matrix does not exist!"); double k = 1 / Determ(this); Matrix minorMatrix = this.MinorMatrix(); return minorMatrix * k; } } internal static class LeverMethod { public static void Solve(Matrix a, Matrix ak) { if (a.Col!=a.Row || ak.Col!=ak.Row) { throw new Exception("Только для квадратных матриц"); } int n = ak.Col; double[] s = new double[n]; double[] c = new double[n]; for (int i = 0; i < n; i++) { s[0] += a.Args[i, i]; } c[0] = s[0]; for (int i = 1; i < n; i++) { ak = ak*a; for (int j = 0; j < n; j++) s[i] += ak.Args[j,j]; double sum = 0; for (int k = 0, l = i - 1; (k < i) && (l > -1); k++, l--) sum += c[k] * s[l]; c[i] = (s[i] - sum) / (i + 1); } for (int i = 0; i < n; i++) Console.WriteLine("C[{0}] = {1}", i, c[i]); } } class Program { static void Main(string[] args) { double[,] a = new double[4, 4] {{0.10194E+01,0.13661E+01,-0.51685E+01,-0.22275E+01}, {0.13770E+00,0.19687E+00,-0.74484E+00,-0.30089E+00}, {0.14613E+00,0.19598E+00,-0.74144E+00,-0.31930E+00}, {-0.12171E-01,-0.17401E-01,0.65832E-01,0.26593E-01}}; double[,] ak = new double[4, 4] {{0.10194E+01, 0.13661E+01, -0.51685E+01,-0.22275E+01}, {0.13770E+00, 0.19687E+00, -0.74484E+00, -0.30089E+00}, {0.14613E+00, 0.19598E+00, -0.74144E+00, -0.31930E+00}, {-0.12171E-01,-0.17401E-01, 0.65832E-01, 0.26593E-01}}; Matrix Ma = new Matrix(a); Matrix Mak = new Matrix(ak); LeverMethod.Solve(Ma, Mak); Console.ReadLine(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д