Advertisement
xamperus

Rinat_lovi

Apr 16th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 24.27 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Zharkova_OOP_1
  8. {
  9.     class Matrix
  10.     {
  11.         private double[,] array;
  12.         private int array_str;
  13.         private int array_stolb;
  14.  
  15.         public Matrix(int i, int j) // инициализация и ввод матрицы
  16.         {
  17.             array_str = i;
  18.             array_stolb = j;
  19.             array = new double[i, j];
  20.  
  21.             Console.WriteLine("Введине значения для матрицы " + i + "x" + j);
  22.             for (i = 0; i < array_str; i++)
  23.             {
  24.                 for (j = 0; j < array_stolb; j++)
  25.                 {
  26.                     array[i, j] = Double.Parse(Console.ReadLine());
  27.                 }
  28.             }
  29.         }
  30.         public Matrix(int i, int j, bool flag) // инициализация нулевой матрицы
  31.         {
  32.             array_str = i;
  33.             array_stolb = j;
  34.             array = new double[i, j];
  35.  
  36.             for (i = 0; i < array_str; i++)
  37.             {
  38.                 for (j = 0; j < array_stolb; j++)
  39.                 {
  40.                     array[i, j] = 0;
  41.                 }
  42.             }
  43.         }
  44.         // перегрузка операторов
  45.         #region
  46.         public double Determinant(Matrix op2)//Нахождение определителя матрицы
  47.         {
  48.             double sum = 0;
  49.             int flag = 1;
  50.             for (int j = 0; j < op2.array_stolb; j++)
  51.             {
  52.                 sum += op2.array[0, j] * Opredelit(op2.array, 0, j, op2.array_stolb) * flag;
  53.                 flag *= -1;
  54.             }
  55.             if (sum == 0)
  56.                 throw new Exception("Определитель матрицы равен 0 , найти обратную матрицу невозможно");
  57.             return sum;
  58.         }
  59.         public double Opredelit(double[,] array, int error_i, int error_j, int n)//Нахождение определителя подматрицы
  60.         {
  61.             double answer = 0;
  62.             double[,] array_ans = new double[n - 1, n - 1];
  63.             int k = 0;
  64.             int m = 0;
  65.  
  66.             for (int i = 0; i < n; i++)
  67.             {
  68.                 if (i == error_i)
  69.                     continue;
  70.                 for (int j = 0; j < n; j++)
  71.                 {
  72.                     if (j == error_j)
  73.                         continue;
  74.                     array_ans[m, k++] = array[i, j];
  75.                 }
  76.                 k = 0;
  77.                 m++;
  78.             }
  79.             double sum1 = 1;
  80.             double sum2 = 1;
  81.  
  82.             if (n - 2 == 0)
  83.             {
  84.                 answer = array_ans[0, 0];
  85.             }
  86.             else
  87.             {
  88.                 for (int i = n - 1 - 1, j = 0; i > -1; i--, j++)
  89.                 {
  90.                     sum1 *= array_ans[i, i];
  91.                     sum2 *= array_ans[j, i];
  92.                 }
  93.                 answer = sum1 - sum2;
  94.             }
  95.             return answer;
  96.         }
  97.         public double Morma(Matrix op1)//Нахождение Нормы матрицы
  98.         {
  99.             double sum = 0;
  100.             for (int i = 0; i < op1.array_str; i++)
  101.             {
  102.                 for (int j = i + 1; j < op1.array_stolb; j++)
  103.                 {
  104.                     sum += Math.Pow(op1.array[i, j], 2);
  105.                 }
  106.             }
  107.             return Math.Sqrt(sum);
  108.         }
  109.         public Matrix Obr_matrix(Matrix op1)//Нахождение обратной матрицы
  110.         {
  111.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  112.             double sum = 0;
  113.             int flag = 1;
  114.  
  115.             //Находим определитель
  116.             try
  117.             {
  118.                 sum = Determinant(op1);
  119.             }
  120.             catch(Exception e)
  121.             {
  122.                 throw e;
  123.             }
  124.             Console.WriteLine("Obrata9 matrica = " + sum);
  125.             //матрица алгебраических дополнений
  126.             for (int i = 0; i < op1.array_str; i++)
  127.             {
  128.                 if (i % 2 == 0)
  129.                     flag = 1;
  130.                 else
  131.                     flag = -1;
  132.                 for (int j = 0; j < op1.array_stolb; j++)
  133.                 {
  134.                     result.array[i, j] = Opredelit(op1.array, i, j, op1.array_stolb) * flag;
  135.                     flag *= -1;
  136.                 }
  137.             }
  138.             Console.WriteLine("Матрица алгебраических дорполнений");
  139.             op1.Print();
  140.             //транспонированная матрица алгебраических дополнений
  141.             double buf;
  142.             for (int i = 0; i < op1.array_str; i++)
  143.             {
  144.                 for (int j = i + 1; j < op1.array_stolb; j++)
  145.                 {
  146.                     buf = result.array[i, j];
  147.                     result.array[i, j] = result.array[j, i];
  148.                     result.array[j, i] = buf;
  149.                 }
  150.             }
  151.             Console.WriteLine(" транспонированная Матрица алгебраических дорполнений");
  152.             op1.Print();
  153.             result = result * (1 / sum);
  154.             return result;
  155.  
  156.         }
  157.         public Matrix Transonir(Matrix op1)// нахождение Транспонированная матрицы
  158.         {
  159.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  160.             double buf;
  161.             for (int i = 0; i < op1.array_str; i++)
  162.             {
  163.                 for (int j = 0; j < op1.array_stolb; j++)
  164.                 {
  165.                     result.array[j, i] = op1.array[i, j];
  166.                 }
  167.             }
  168.             return result;
  169.         }
  170.  
  171.         public static Matrix operator +(Matrix op1, Matrix op2) // перегрузка оператора сложение
  172.         {
  173.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  174.  
  175.             for (int i = 0; i < op1.array_str; i++)
  176.             {
  177.                 for (int j = 0; j < op1.array_stolb; j++)
  178.                 {
  179.                     result.array[i, j] = op1.array[i, j] + op2.array[i, j];
  180.                 }
  181.             }
  182.             return result;
  183.         }
  184.         public static Matrix operator -(Matrix op1, Matrix op2) // перегрузка оператора вычитания
  185.         {
  186.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  187.  
  188.             for (int i = 0; i < op1.array_str; i++)
  189.             {
  190.                 for (int j = 0; j < op1.array_stolb; j++)
  191.                 {
  192.                     result.array[i, j] = op1.array[i, j] - op2.array[i, j];
  193.                 }
  194.             }
  195.             return result;
  196.         }
  197.         public static Matrix operator *(Matrix op1, Matrix op2) // перегрузка оператора умножения
  198.         {
  199.             Matrix result = new Matrix(op1.array_str, op2.array_stolb, true);
  200.             result.Print();
  201.             double sum = 0;
  202.             if (op1.array_stolb != op2.array_str)
  203.                 throw new Exception("Нельзя умножить матрицы");
  204.             for (int i = 0; i < op1.array_str; i++)
  205.             {
  206.                 for (int k = 0; k < op2.array_stolb; k++)
  207.                 {
  208.                     for (int j = 0; j < op2.array_str; j++)
  209.                     {
  210.                         sum += op1.array[i, j] * op2.array[j, k];
  211.                         Console.WriteLine("Summa" + sum);
  212.                     }
  213.                     result.array[i, k] = sum;
  214.                     sum = 0;
  215.                 }
  216.             }
  217.             return result;
  218.         }
  219.         public static Matrix operator *(Matrix op1, double op2) // перегрузка оператора умножения с числом
  220.         {
  221.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  222.  
  223.             for (int i = 0; i < op1.array_str; i++)
  224.             {
  225.                 for (int k = 0; k < op1.array_stolb; k++)
  226.                 {
  227.                     result.array[i, k] = op1.array[i, k] * op2;
  228.                 }
  229.             }
  230.             return result;
  231.         }
  232.         public static Matrix operator /(Matrix op1, Matrix op2) // перегрузка оператора деления
  233.         {
  234.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  235.             if (op1.array_str != op1.array_stolb || op1.array_stolb != op2.array_stolb || op2.array_str != op2.array_stolb)
  236.                 throw new Exception("Невозможно умножить эти матрицы так-как они не подходящих размеров");
  237.  
  238.             result = result.Obr_matrix(op2);//Нахождение обратной матрицы
  239.             result *= op1;
  240.             return result;
  241.         }
  242.         public static Matrix operator /(Matrix op1, double op2) // перегрузка оператора деления с числом
  243.         {
  244.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  245.  
  246.             for (int i = 0; i < op1.array_str; i++)
  247.             {
  248.                 for (int k = 0; k < op1.array_stolb; k++)
  249.                 {
  250.                     result.array[i, k] = op1.array[i, k] * 1 / op2;
  251.                 }
  252.             }
  253.             return result;
  254.         }
  255.         public static bool operator >(Matrix op1, Matrix op2) // перегрузка оператора сравнения >
  256.         {
  257.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  258.  
  259.             bool flag = true;
  260.             for (int i = 0; flag && i < op1.array_str; i++)
  261.             {
  262.                 for (int j = 0; flag && j < op1.array_stolb; j++)
  263.                 {
  264.                     if (op1.array[i, j] > op2.array[i, j])
  265.                         continue;
  266.                     else
  267.                         return (flag = false);
  268.                 }
  269.             }
  270.             return flag;
  271.         }
  272.         public static bool operator <(Matrix op1, Matrix op2) // перегрузка оператора сравнения <
  273.         {
  274.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  275.  
  276.             bool flag = true;
  277.             for (int i = 0; flag && i < op1.array_str; i++)
  278.             {
  279.                 for (int j = 0; flag && j < op1.array_stolb; j++)
  280.                 {
  281.                     if (op1.array[i, j] < op2.array[i, j])
  282.                         continue;
  283.                     else
  284.                         return (flag = false);
  285.                 }
  286.             }
  287.             return flag;
  288.         }
  289.         public static bool operator ==(Matrix op1, Matrix op2) // перегрузка оператора сравнения <
  290.         {
  291.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  292.  
  293.             bool flag = true;
  294.             for (int i = 0; flag && i < op1.array_str; i++)
  295.             {
  296.                 for (int j = 0; flag && j < op1.array_stolb; j++)
  297.                 {
  298.                     if (op1.array[i, j] != op2.array[i, j])
  299.                         return false;
  300.                 }
  301.             }
  302.             return flag;
  303.         }
  304.         public static bool operator !=(Matrix op1, Matrix op2) // перегрузка оператора сравнения <
  305.         {
  306.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  307.  
  308.             bool flag = true;
  309.             for (int i = 0; flag && i < op1.array_str; i++)
  310.             {
  311.                 for (int j = 0; flag && j < op1.array_stolb; j++)
  312.                 {
  313.                     if (op1.array[i, j] == op2.array[i, j])
  314.                         return  false;
  315.                 }
  316.             }
  317.             return flag;
  318.         }
  319.         public static Matrix operator ^(Matrix op1, int degree)//перегрузка оператора степени ^
  320.         {
  321.             Matrix result = new Matrix(op1.array_str, op1.array_stolb, true);
  322.             result = result + op1;
  323.             int i = 1;
  324.             while (i < degree)
  325.             {
  326.                 result = result * op1;
  327.                 i++;
  328.             }
  329.             return result;
  330.         }
  331.         #endregion
  332.         public void Print() // вывод матрицы на экран
  333.         {
  334.             for (int i = 0; i < array_str; i++)
  335.             {
  336.                 for (int j = 0; j < array_stolb; j++)
  337.                 {
  338.                     Console.Write(array[i, j] + "\t");
  339.                 }
  340.                 Console.WriteLine();
  341.             }
  342.         }
  343.     }
  344.     class Program
  345.     {
  346.         static void Main(string[] args)
  347.         {
  348.             List<Matrix> list_matrix = new List<Matrix>();
  349.             bool flag = true;
  350.             while (flag)
  351.             {
  352.                 Console.WriteLine("Выберите вариант работы с матрицей :\n1=Работа с одной матрицей \n2=Работа с двумя матрицами ");
  353.                 Console.WriteLine("Введите 0 чтобы выйти");
  354.  
  355.                 int flag_ = int.Parse(Console.ReadLine());
  356.                 if (flag_ == 1)
  357.                 {
  358.                     while (flag)
  359.                     {
  360.                         Console.WriteLine("Введите 1 чтобы добавить матрицу");
  361.                         Console.WriteLine("Введите 2 чтобы вывести матрицы");
  362.                         Console.WriteLine("Введите 3 чтобы вывести обратную матрицу");
  363.                         Console.WriteLine("Введите 4 чтобы вывести транспонированную матрицу");
  364.                         Console.WriteLine("Введите 5 чтобы возвести матрицу в степень");
  365.                         Console.WriteLine("Введите 0 чтобы вернуться назад");
  366.                         flag_ = int.Parse(Console.ReadLine());
  367.                         //вызов действий
  368.                         #region
  369.                         if (flag_ == 0)
  370.                             flag = false;
  371.                         if (flag_ == 1)
  372.                         {
  373.                             Console.WriteLine("Введите колличество строк в матрице ");
  374.                             int i = int.Parse(Console.ReadLine());
  375.                             Console.WriteLine("Введите колличество столбцов в матрице ");
  376.                             int j = int.Parse(Console.ReadLine());
  377.                             list_matrix.Add(new Matrix(i, j));
  378.                         }
  379.                         if (flag_ == 2)
  380.                         {
  381.                             if (list_matrix.Count == 0)
  382.                             {
  383.                                 Console.WriteLine("Пожалуйста, добавьте матрицу прежде чем выводить.\n");
  384.                             }
  385.                             else
  386.                             {
  387.                                 for (int i = 0; i < list_matrix.Count; i++)
  388.                                 {
  389.                                     Console.WriteLine("Матрица номер " + (i + 1));
  390.                                     list_matrix[i].Print();
  391.                                     Console.WriteLine();
  392.                                 }
  393.                             }
  394.                         }
  395.                         if (flag_ == 3)
  396.                         {
  397.                             Console.WriteLine("Выберите номер матрицы для данной операции");
  398.                             int matr = int.Parse(Console.ReadLine());
  399.                             try
  400.                             {
  401.                                 (list_matrix[matr - 1].Obr_matrix(list_matrix[matr - 1])).Print();
  402.                             }
  403.                             catch(Exception e)
  404.                             {
  405.                                 Console.WriteLine("Для данной матрицы невозможно выполнить это действие\n");
  406.                                 flag = false;
  407.                             }
  408.                         }
  409.                         if (flag_ == 4)
  410.                         {
  411.                             Console.WriteLine("Выберите номер матрицы для данной операции");
  412.                             int matr = int.Parse(Console.ReadLine());
  413.                             (list_matrix[matr - 1].Transonir(list_matrix[matr - 1])).Print();
  414.                         }
  415.                         if (flag_ == 5)
  416.                         {
  417.                             Console.WriteLine("Выберите номер матрицы для данной операции");
  418.                             int matr = int.Parse(Console.ReadLine());
  419.                             Console.WriteLine("Введите в какую степень возвести матирцу");
  420.                             int stepen = int.Parse(Console.ReadLine());
  421.                             (list_matrix[matr - 1] ^ stepen).Print();
  422.                         }
  423.                         #endregion
  424.                     }
  425.                     flag = true;
  426.                 }
  427.                 else if (flag_ == 2)
  428.                 {
  429.                     while (flag)
  430.                     {
  431.                         Console.WriteLine("Введите 1 чтобы добавить матрицу");
  432.                         Console.WriteLine("Введите 2 чтобы вывести матрицы");
  433.                         Console.WriteLine("Введите 3 чтобы сложить 2 матрицы");
  434.                         Console.WriteLine("Введите 4 чтобы умножить 2 матрицы");
  435.                         Console.WriteLine("Введите 5 чтобы поделить 2 матрицы");
  436.                         Console.WriteLine("Введите 6 чтобы вычесть 2 матрицы");
  437.                         Console.WriteLine("Введите 7 чтобы сравнить 2 матрицы");
  438.                         Console.WriteLine("Введите 0 чтобы вернуться назад");
  439.                         flag_ = int.Parse(Console.ReadLine());
  440.                         //вызов действий
  441.                         #region
  442.                         if (flag_ == 0)
  443.                             flag = false;
  444.                         if (flag_ == 1)
  445.                         {
  446.                             Console.WriteLine("Введите колличество строк в матрице ");
  447.                             int i = int.Parse(Console.ReadLine());
  448.                             Console.WriteLine("Введите колличество столбцов в матрице ");
  449.                             int j = int.Parse(Console.ReadLine());
  450.                             list_matrix.Add(new Matrix(i, j));
  451.                         }
  452.  
  453.                         if (flag_ == 2)
  454.                         {
  455.                             if (list_matrix.Count == 0)
  456.                             {
  457.                                 Console.WriteLine("Пожалуйста, добавьте матрицу прежде чем выводить.\n");
  458.                             }
  459.                             else
  460.                             {
  461.                                 for (int i = 0; i < list_matrix.Count; i++)
  462.                                 {
  463.                                     Console.WriteLine("Матрица номер " + (i + 1));
  464.                                     list_matrix[i].Print();
  465.                                     Console.WriteLine();
  466.                                 }
  467.                             }
  468.                         }
  469.                         if (flag_ == 3)
  470.                         {
  471.                             Console.WriteLine("Выберите матрицы для данной операции\n матрица 1 :");
  472.                             int matr1 = int.Parse(Console.ReadLine());
  473.                             Console.WriteLine("матрица 2 :");
  474.                             int matr2 = int.Parse(Console.ReadLine());
  475.                             Console.WriteLine("Сложение");
  476.                             (list_matrix[matr1 - 1] + list_matrix[matr2 - 1]).Print();
  477.                         }
  478.                         if (flag_ == 4)
  479.                         {
  480.                             Console.WriteLine("Выберите матрицы для данной операции\n матрица 1 :");
  481.                             int matr1 = int.Parse(Console.ReadLine());
  482.                             Console.WriteLine("матрица 2 :");
  483.                             int matr2 = int.Parse(Console.ReadLine());
  484.                             try
  485.                             {
  486.                                 Console.WriteLine("Умножение");
  487.                                 (list_matrix[matr1 - 1] * list_matrix[matr2 - 1]).Print();
  488.                             }
  489.                             catch (Exception e)
  490.                             {
  491.                                 Console.WriteLine(e.Message);
  492.                             }
  493.                         }
  494.                         if (flag_ == 5)
  495.                         {
  496.                             Console.WriteLine("Выберите матрицы для данной операции\n матрица 1 :");
  497.                             int matr1 = int.Parse(Console.ReadLine());
  498.                             Console.WriteLine("матрица 2 :");
  499.                             int matr2 = int.Parse(Console.ReadLine());
  500.                             try
  501.                             {
  502.                                 Console.WriteLine("Деление");
  503.                                 (list_matrix[matr1 - 1] / list_matrix[matr2 - 1]).Print();
  504.                             }
  505.                             catch (Exception e)
  506.                             {
  507.                                 Console.WriteLine(e.Message);
  508.                             }
  509.                         }
  510.                         if (flag_ == 6)
  511.                         {
  512.                             Console.WriteLine("Выберите матрицы для данной операции\n матрица 1 :");
  513.                             int matr1 = int.Parse(Console.ReadLine());
  514.                             Console.WriteLine("матрица 2 :");
  515.                             int matr2 = int.Parse(Console.ReadLine());
  516.                             Console.WriteLine("Разность");
  517.                             (list_matrix[matr1 - 1] - list_matrix[matr2 - 1]).Print();
  518.                         }
  519.                         if (flag_ == 7)
  520.                         {
  521.                             Console.WriteLine("Выберите матрицы для данной операции\n матрица 1 :");
  522.                             int matr1 = int.Parse(Console.ReadLine());
  523.                             Console.WriteLine("матрица 2 :");
  524.                             int matr2 = int.Parse(Console.ReadLine());
  525.                             Console.WriteLine("Сравнение");
  526.                             if (list_matrix[matr1 - 1] > list_matrix[matr2 - 1])
  527.                                 Console.WriteLine("Матрица " + matr1 + " больше чем матрица" + matr2);
  528.                             else if (list_matrix[matr1 - 1] < list_matrix[matr2 - 1])
  529.                                 Console.WriteLine("Матрица " + matr1 + " меньше чем матрица" + matr2);
  530.                             else if (list_matrix[matr1 - 1] == list_matrix[matr2 - 1])
  531.                                 Console.WriteLine("Матрица " + matr1 + " равна матрице " + matr2);
  532.                             else
  533.                                 Console.WriteLine("Матрица " + matr1 + " не  равна матрице " + matr2);
  534.                         }
  535.                         #endregion
  536.                     }
  537.                     flag = true;
  538.                 }
  539.                 else
  540.                     flag = false;
  541.             }
  542.         }
  543.     }
  544. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement