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

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


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

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

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