Создать отдельный класс из общей программы - 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();
}
}
}