Guest User

Untitled

a guest
Dec 2nd, 2010
1,246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.90 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace MatrixShmatrix
  7. {
  8.     public class Matrix
  9.     {
  10.     int n; //размеры матрицы
  11.     int m;
  12.     double[] a; // декларация указателей
  13.     double[] c;
  14.     public Matrix(int n, int m, int kod1)
  15.     {
  16.         int i;
  17.         int j;
  18.         Matrix.n =n;
  19.         Matrix.m =m;
  20.         a =new double[n]; // захват памяти под указатели
  21.         for(i =0;i<n;i++)
  22.             a[i] =new double[m]; // захват памяти под элемент
  23.         c =new double[n];
  24.         for(int i =0; i<n; i++)
  25.             c[i] =new double[m];
  26.    
  27.         // Заполнение массива элементами с клавиатуры
  28.         if(kod1 ==0)
  29.         {
  30.             Console.WriteLine("\nВведите элементы матрицы:");
  31.             for(i =0;i<n;i++)
  32.                 for(j =0;j<m;j++)
  33.                 {
  34.                     Console.Write("a[");
  35.                     Console.Write(i);
  36.                     Console.Write("][");
  37.                     Console.Write(j);
  38.                     Console.Write("]=");
  39.                     a[i][j] = SimulateCin.ReadToWhiteSpace(true);
  40.                 }
  41.             Console.Write("\n");
  42.         }
  43.     }
  44.     public void Dispose()
  45.     {
  46.         for(int i =0;i<n;i++)
  47.             a[i] = null; // освобождение памяти
  48.         a = null;
  49.     }
  50.  
  51.     //*
  52.     // * @brief Сложение матриц
  53.     //
  54.     public static Matrix  operator +(Matrix ImpliedObject,  ref Matrix A)
  55.     {
  56.         for(int i =0; i<n; i++)
  57.             for(int j =0; j<m; j++)
  58.                 c[i][j] =a[i][j]+A.a[i][j];
  59.    
  60.         return this;
  61.     }
  62.  
  63.     //*
  64.     // * @brief Вычитание матриц
  65.     //
  66.     public static Matrix  operator -(Matrix ImpliedObject, ref Matrix A)
  67.     {
  68.         for(int i =0; i<n; i++)
  69.             for(int j =0; j<m; j++)
  70.                 c[i][j] =a[i][j]-A.a[i][j];
  71.    
  72.         return this;
  73.     }
  74.  
  75.     //*
  76.     // * @brief Операция присваивания
  77.     //
  78. //C++ TO C# CONVERTER NOTE: This 'CopyFrom' method was converted from the original C++ copy assignment operator:
  79. //ORIGINAL LINE: Matrix &operator =(const Matrix &A)
  80.     public Matrix CopyFrom(Matrix A)
  81.     {
  82.         for(int i =0; i<n; i++)
  83.             for(int j =0; j<m; j++)
  84.                 a[i][j] =A.c[i][j];
  85.         return this;
  86.     }
  87.  
  88.     //*
  89.     // * @brief Умножение матриц
  90.     //
  91.     public static Matrix  operator *(Matrix ImpliedObject,ref Matrix A)
  92.     {
  93.         double s =0;
  94.         for(int i =0;i<n;i++)
  95.             {
  96.                 int z =0;
  97.                 while(z<A.m)
  98.                 {
  99.                     c[i][z] =0;
  100.                     for(int j =0;j<m;j++)
  101.                     {
  102.                         s =GetI(i, j)*A.GetI(j, z);
  103.                         c[i][z]+=s;
  104.                     }
  105.                     z++;
  106.                 }
  107.             }
  108.    
  109.         return this;
  110.     }
  111.  
  112.     //*
  113.     // * @brief комбинированая операция "+="
  114.     //
  115. //C++ TO C# CONVERTER TODO TASK: The += operator cannot be overloaded in C#:
  116.     public static Matrix  operator +( Matrix A)
  117.     {
  118.         for(int i =0; i<n; i++)
  119.             for(int j =0; j<m; j++)
  120.                 a[i][j] =a[i][j]+A.a[i][j];
  121.    
  122.         return this;
  123.     }
  124.  
  125.     //*
  126.     // * @brief комбинированая операция "-="
  127.     //
  128. //C++ TO C# CONVERTER TODO TASK: The -= operator cannot be overloaded in C#:
  129.     public static Matrix  operator -( Matrix A)
  130.     {
  131.         for(int i =0; i<n; i++)
  132.             for(int j =0; j<m; j++)
  133.                 a[i][j] =a[i][j]-A.a[i][j];
  134.    
  135.         return this;
  136.     }
  137.  
  138.     //*
  139.     // * @brief Сравнение матриц
  140.     //
  141.     public static Matrix  operator ==(Matrix ImpliedObject, ref Matrix A)
  142.     {
  143.         int f =0;
  144.         for(int i =0; i<n; i++)
  145.         {
  146.             for(int j =0; j<m; j++)
  147.                 if(a[i][j]!=A.a[i][j])
  148.                 {
  149.                     Console.Write("\nМатрицы не равны!!!\n");
  150.                     f =1;
  151.                     break;
  152.                 }
  153.             if(f ==1)
  154.                 break;
  155.         }
  156.         if(f ==0)
  157.         {
  158.             Console.Write("\nМатрицы равны!\n");
  159.         }
  160.    
  161.         return this;
  162.     }
  163.  
  164.     public static Matrix operator !=(Matrix ImpliedObject,ref Matrix A)
  165.     {
  166.         int f = 0;
  167.         for (int i = 0; i < n; i++)
  168.         {
  169.             for (int j = 0; j < m; j++)
  170.                 if (a[i][j] != A.a[i][j])
  171.                 {
  172.                     Console.Write("\nМатрицы равны!!!\n");
  173.                     f = 1;
  174.                     break;
  175.                 }
  176.             if (f == 1)
  177.                 break;
  178.         }
  179.         if (f == 0)
  180.         {
  181.             Console.Write("\nМатрицы не равны!\n");
  182.         }
  183.  
  184.         return this;
  185.     }
  186.  
  187.     //*
  188.     // * @brief Транспонирование матрицы
  189.     //
  190.     public void Transp()
  191.     {
  192.         c =new double[m];
  193.         for(int i =0;i<m;i++)
  194.             c[i] =new double[n]; // захват памяти под элемент
  195.         for(int i =0; i<n; i++)
  196.             for(int j =0; j<m; j++)
  197.                 c[j][i] =a[i][j];
  198.    
  199.         for(int i =0;i<n;i++)
  200.             a[i] = null; // освобождение памяти
  201.         a = null;
  202.    
  203.         a =new double[m];
  204.         for(int i =0;i<m;i++)
  205.             a[i] =new double[n]; // захват памяти под элемент
  206.    
  207.         for(int i =0; i<m; i++)
  208.             for(int j =0; j<n; j++)
  209.                 a[i][j] =c[i][j];
  210.    
  211.             Matrix.n =m;
  212.             Matrix.m =n;
  213.    
  214.     }
  215.  
  216.     //*
  217.     // * @brief Вывод матрицы
  218.     //
  219.     public void Print(int n, int m)
  220.     {
  221.         for(int i =0; i<n; i++)
  222.         {
  223.             for(int j =0; j<m; j++)
  224.                 Console.Write("{0,8:f2} ",GetI(i, j));
  225.             Console.Write("\n");
  226.         }
  227.     }
  228.  
  229.     //*
  230.     // * @brief Возведение в степень матрицы
  231.     //
  232.     public void Spep(int v)
  233.     {
  234.         int k =1;
  235.         do
  236.         {
  237.         double s =0;
  238.         for(int i =0;i<n;i++)
  239.             {
  240.                 int z =0;
  241.                 while(z<m)
  242.                 {
  243.                     c[i][z] =0;
  244.                     for(int j =0;j<m;j++)
  245.                     {
  246.                         s =a[i][j]*a[j][z];
  247.                         c[i][z]+=s;
  248.                     }
  249.                     z++;
  250.                 }
  251.             }
  252.         k++;
  253.         }
  254.         while(k!=v);
  255.    
  256.         for(int i =0; i<m; i++)
  257.             for(int j =0; j<n; j++)
  258.                 a[i][j] =c[i][j];
  259.     }
  260.     //*
  261.     // * @brief Проверки
  262.     //
  263.     public void Proverka()
  264.     {
  265.         int h =0;
  266.         for(int i =0; i<n; i++)
  267.         {
  268.             for(int j =0; j<m; j++)
  269.                 if(a[i][j]!=0)
  270.                 {
  271.                     if(i!=j)
  272.                     {
  273.                         Console.Write("Матрица №1 не диалогальная");
  274.                         h =1;
  275.                         break;
  276.                     }
  277.                 }
  278.             if(h ==1)
  279.                 break;
  280.         }
  281.         if(h ==0)
  282.         {
  283.             Console.Write("Матрица №1 диалогальная");
  284.             Console.Write("\n");
  285.         }
  286.         h =0;
  287.         for(int i =0; i<n; i++)
  288.         {
  289.             for(int j =0; j<m; j++)
  290.                 if(a[i][j]!=0)
  291.                 {
  292.                     Console.Write(\nатрица №1 не нулевая");
  293.                     Console.Write("\n");
  294.                     h =2;
  295.                     break;
  296.                 }
  297.             if(h ==2)
  298.                 break;
  299.         }
  300.         if(h ==0)
  301.         {
  302.             Console.Write("\nМатрица №1 нулевая");
  303.             Console.Write("\n");
  304.         }
  305.         h =0;
  306.         for(int i =0; i<n; i++)
  307.         {
  308.             for(int j =0; j<m; j++)
  309.                 if(a[i][j]!=1)
  310.                 {
  311.                     Console.Write("Матрица №1 не единичная");
  312.                     Console.Write("\n");
  313.                     h =2;
  314.                     break;
  315.                 }
  316.             if(h ==2)
  317.                 break;
  318.         }
  319.         if(h ==0)
  320.         {
  321.             Console.Write("Матрица №1 единичная");
  322.             Console.Write("\n");
  323.         }
  324.    
  325.         int k =0;
  326.         int l =1;
  327.         int r =0;
  328.         if(n ==m)
  329.         {
  330.         for(int i =1; i<n; i++)
  331.         {
  332.             for(int j =0; j<m; j++)
  333.             {
  334.                 if(i>j)
  335.                 {
  336.                     for(k; k<n; k++)
  337.                     {
  338.                         for(l; l<m; l++)
  339.                         {
  340.                                 if(a[i][k]!=a[k][l])
  341.                                 {
  342.                                     Console.Write("Матрица не симетричная.");
  343.                                     Console.Write("\n");
  344.                                     r =1;
  345.                                     break;
  346.                                 }
  347.                         }
  348.                             if(r ==1)
  349.                                 break;
  350.                     }
  351.                 }
  352.             if(r ==1)
  353.                 break;
  354.             }
  355.             if(r ==1)
  356.                 break;
  357.         }
  358.         if(r ==0)
  359.         {
  360.             Console.Write("Матрица симетричная");
  361.             Console.Write("\n");
  362.         }
  363.         }
  364.         else
  365.         {
  366.             Console.Write("Матрица не симетричная");
  367.             Console.Write("\n");
  368.         }
  369.     }
  370.  
  371.     //*
  372.     // * @brief Проверка на треугольность
  373.     //
  374.     public void Treug()
  375.     {
  376.         int r =0;
  377.         for(int i =0; i<n; i++)
  378.         {
  379.             for(int j =0; j<m; j++)
  380.                 if(i>j)
  381.                 {
  382.                     if(a[i][j]!=0)
  383.                     {
  384.                         Console.Write("\nМатрица №1 не является верхняя треугольная.");
  385.                         Console.Write("\n");
  386.                         r =1;
  387.                         break;
  388.                     }
  389.                 }
  390.             if(r ==1)
  391.                 break;
  392.         }
  393.    
  394.         if(r ==0)
  395.         {
  396.             Console.Write("Матрица №1 является верхней треугольной.");
  397.             Console.Write("\n");
  398.         }
  399.    
  400.         r =0;
  401.         for(int i =0; i<n; i++)
  402.         {
  403.             for(int j =0; j<m; j++)
  404.                 if(i<j)
  405.                 {
  406.                     if(a[i][j]!=0)
  407.                     {
  408.                         Console.Write("Матрица №1 не является нижней треугольной.");
  409.                         Console.Write("\n");
  410.                         r =2;
  411.                         break;
  412.                     }
  413.                 }
  414.             if(r ==2)
  415.                 break;
  416.         }
  417.    
  418.         if(r ==0)
  419.         {
  420.             Console.Write("Матрица №1 является нижней треугольной.");
  421.             Console.Write("\n");
  422.         }
  423.     }
  424.  
  425.     //*
  426.     // * @brief Умножение матрицы на число
  427.     //
  428.     public void Umnog(int z)
  429.     {
  430.         for(int i =0; i<n; i++)
  431.             for(int j =0; j<m; j++)
  432.                 a[i][j] =a[i][j]*z;
  433.     }
  434.  
  435.     //*
  436.     // * @brief Деление матрицы на число
  437.     //
  438.     public void Delenie(int z)
  439.     {
  440.         for(int i =0; i<n; i++)
  441.             for(int j =0; j<m; j++)
  442.                 a[i][j] =a[i][j]/z;
  443.     }
  444.     public double GetI(int i, int j)
  445.     {
  446.         return a[i][j];
  447.     }
  448. }
  449.  
  450. //----------------------------------------------------------------------------------------
  451. //  Copyright © 2006 - 2009 Tangible Software Solutions Inc.
  452. //  This class can be used by anyone provided that the copyright notice remains intact.
  453. //
  454. //  This class provides the ability to convert basic C++ 'cin' behavior.
  455. //----------------------------------------------------------------------------------------
  456. internal static class SimulateCin
  457. {
  458.     private static bool goodlastread = false;
  459.     internal static bool LastReadWasGood
  460.     {
  461.         get
  462.         {
  463.             return goodlastread;
  464.         }
  465.     }
  466.  
  467.     internal static string ReadToWhiteSpace(bool skipleadingwhitespace)
  468.     {
  469.         string input = "";
  470.         char nextchar;
  471.         if (skipleadingwhitespace)
  472.         {
  473.             while (char.IsWhiteSpace(nextchar = (char)Console.Read()))
  474.             {
  475.             }
  476.             input += nextchar;
  477.         }
  478.         while ( ! char.IsWhiteSpace(nextchar = (char)Console.Read()))
  479.         {
  480.             input += nextchar;
  481.         }
  482.         goodlastread = input.Length > 0;
  483.         return input;
  484.     }
  485.     }
  486.     class Program
  487.     {
  488.         static void Main(string[] args)
  489.         {
  490.             int kod;
  491.         int p; // размеры для матриц
  492.         int h;
  493.         int q;
  494.         int w;
  495.         Matrix[] A = new Matrix[3]; // создание массива указателей класса Matrix
  496.  
  497.         Console.Write("\nВведите размеры 1-й марицы:\n Количество строк n=");
  498.         p = Int32.Parse(Console.ReadLine());
  499.         Console.Write(" Количество столбцов m=");
  500.         h = Int32.Parse(Console.ReadLine());
  501.         A[0] =new Matrix(p, h, 0);
  502.         Console.Write("\nВведите размеры 2-й марицы:\n Количество строк k=");
  503.         q = Int32.Parse(Console.ReadLine());
  504.         Console.Write(" Количество столбцов l=");
  505.         w = Int32.Parse(Console.ReadLine());
  506.         A[1] =new Matrix(q, w, 0);
  507.         Console.Write("\tМатрица №1\n");
  508.         Console.Write("\n");
  509.         A[0].Print(p, h);
  510.         Console.Write("\n\tМатрица №2\n");
  511.         Console.Write("\n");
  512.         A[1].Print(q, w);
  513.         while(true)
  514.         {
  515.             Console.Write("\nВыберите операции над матрицами:\n\t1.Сложение, вычитание,умножение,деление.\n\t2.Комбинированные операции присваивания.\n\t3.Сравнения на равенство/неравенство");
  516.             Console.Write("\n\t4.Вычисление транспонированной матрицы\n\t5.Возведения в степень\n\t6.Квадратная, диагональная, нулевая, единичная, симетричная");
  517.             Console.Write("\n\t7.Проверка на верхняя или нижняя треугольная.\n\t8.Ввести новые матрицы.\n\t0.Выход:");
  518.             kod = Int32.Parse(Console.ReadLine());
  519.             switch(kod)
  520.             {
  521.             case 1:
  522.                 Console.Write("\n1.Сложение.\n2.Вычитание.\n3.Умножение.\n4.Деление:");
  523.                 int kod1;
  524.                 kod1 = Int32.Parse(Console.ReadLine());
  525.                 switch(kod1)
  526.                 {
  527.                 case 1:
  528.                     Console.Write("\n****Сложение:*****\n\n");
  529.                     if(p ==q && h ==w)
  530.                     {
  531.                         A[2] = new Matrix(q, w, 1);
  532.                         (A[2])=((A[0]) + (A[1]));
  533.                         A[2].Print(q, w);
  534.                         A[2] = null;
  535.                     }
  536.  
  537.                     else
  538.                     {
  539.                         Console.Write("-----Слаживаются матрицы одинаковых размеров!!!----\n");
  540.                     }
  541.                     break;
  542.  
  543.                 case 2:
  544.                     Console.Write("\n****Вычитание:******\n\n");
  545.                     if(p ==q && h ==w)
  546.                     {
  547.                         A[2] = new Matrix(q, w, 1);
  548.                         (A[2])=(A[0]) - (A[1]);
  549.                         A[2].Print(q, w);
  550.                         A[2] = null;
  551.                     }
  552.                     else
  553.                     {
  554.                         Console.Write("----Матрицы должны быть одинаковых размеров!!!----\n");
  555.                     }
  556.                     break;
  557.                 case 3:
  558.                     Console.Write("\n****Умножение:******\n\n");
  559.                     int z;
  560.                     Console.Write("1. Умножение матриц на число.\n2. Умножение матрицы на матрицу:");
  561.                     z = Int32.Parse(Console.ReadLine());
  562.                     A[2] = new Matrix(p, w, 1);
  563.                     if(z ==2)
  564.                     {
  565.                         if(h ==q)
  566.                         {
  567.                             (A[2])=((A[0]) * (A[1]));
  568.                             Console.Write("\n\tПроизведение матриц:\n");
  569.                             A[2].Print(p, w);
  570.                             A[2] = null;
  571.                         }
  572.                         else
  573.                         {
  574.                             Console.Write("----Умножаются матрицы размеров NxM и KxL, если M=K!!!!!-----\n");
  575.                         }
  576.                     }
  577.  
  578.                     else
  579.                     {
  580.                         double u;
  581.                         Console.Write("Введите коофициент умножения:");
  582.                         u = Int32.Parse(Console.ReadLine());
  583.                         Console.Write("\n\tМатрица №1:\n");
  584.                         Console.Write("\n");
  585.                         A[0].Umnog(u);
  586.                         A[0].Print(p, h);
  587.  
  588.                     }
  589.                     break;
  590.                 case 4:
  591.                     int u;
  592.                     Console.Write("\nДеление матрицы на чило. Введите число:");
  593.                     u = Int32.Parse(Console.ReadLine());
  594.                     if(u ==0)
  595.                     {
  596.                         Console.Write("\nНа 0 делить нельзя!!!\n");
  597.                     }
  598.                     else
  599.                     {
  600.                         Console.Write("\n\tМатрица №1:\n");
  601.                         Console.Write("\n");
  602.                         A[0].Delenie(u);
  603.                         A[0].Print(p, h);
  604.                     }
  605.                     break;
  606.                 }
  607.             break;
  608.  
  609.             case 2:
  610.                 if(p ==q && h ==w)
  611.                 {
  612.                     Console.Write("\nОперация '+='(A+=B)\nМатрица №1:\n");
  613.                     Console.Write("\n");
  614.                     (A[0])+=(A[1]);
  615.                     A[0].Print(p, h);
  616.                     Console.Write("\nОперация '-='(A-=B)\nМатрица №1:\n");
  617.                     Console.Write("\n");
  618.                     (A[0])-=(A[1]);
  619.                     A[0].Print(p, h);
  620.                 }
  621.                 else
  622.                 {
  623.                     Console.Write("\nМатрицы должны быть одинаковых размеров!\n");
  624.                 }
  625.                 break;
  626.  
  627.             case 3:
  628.                 if(p ==q && h ==w)
  629.                     (A[0])==(A[1]);
  630.                 else
  631.                 {
  632.                     Console.Write("\nМатрицы должны быть одинаковых размеров!\n");
  633.                 }
  634.                 break;
  635.  
  636.             case 4:
  637.                 Console.Write("\nТранспонированая матрица №1:\n");
  638.                 Console.Write("\n");
  639.                 A[0].Transp();
  640.                 A[0].Print(h, p);
  641.                 break;
  642.  
  643.             case 5:
  644.                 if(p ==h)
  645.                 {
  646.                     int v;
  647.                     Console.Write("\nВведети степень:");
  648.                     Console.Write("\n");
  649.                     v = Int32.Parse(Console.ReadLine());
  650.                     Console.Write("\nВозведение матрицы №1 в степень:\n");
  651.                     Console.Write("\n");
  652.                     A[0].Spep(v);
  653.                     A[0].Print(p, h);
  654.                 }
  655.                 else
  656.                 {
  657.                     Console.Write("\nНужно ввести квадратную матрицу!!!\n");
  658.                 }
  659.                 break;
  660.  
  661.             case 6:
  662.                 Console.Write("Проверка для матрицы №1");
  663.                 Console.Write("\n");
  664.                 if(p ==h)
  665.                 {
  666.                     Console.Write("\nМатрица №1 квадратная.\n");
  667.                 }
  668.                 else
  669.                 {
  670.                     Console.Write("\nМатрица №1 не квадратная.\n");
  671.                 }
  672.                 A[1].Proverka();
  673.                 break;
  674.  
  675.             case 7:
  676.                 Console.Write("Проверка для матрицы №1");
  677.                 Console.Write("\n");
  678.                 A[0].Treug();
  679.                 break;
  680.  
  681.             case 8:
  682.                 for(int i =0; i<2; i++)
  683.                     A[i] = null;
  684.                 Console.Write("\nВведите размеры 1-й марицы:\n Количество строк n=");
  685.                 p = Int32.Parse(Console.ReadLine());
  686.                 Console.Write(" Количество столбцов m=");
  687.                 h = Int32.Parse(Console.ReadLine());
  688.                 A[0] =new Matrix(p, h, 0);
  689.                 Console.Write("\nВведите размеры 2-й марицы:\n Количество строк k=");
  690.                 q = Int32.Parse(Console.ReadLine());
  691.                 Console.Write(" Количество столбцов l=");
  692.                 w = Int32.Parse(Console.ReadLine());
  693.                 A[1] =new Matrix(q, w, 0);
  694.                 Console.Write("\tМатрица №1\n");
  695.                 Console.Write("\n");
  696.                 A[0].Print(p, h);
  697.                 Console.Write("\n\tМатрица №2\n");
  698.                 Console.Write("\n");
  699.                 A[1].Print(q, w);
  700.             break;
  701.  
  702.             case 0:
  703.                 for(int i =0; i<2; i++)
  704.                     A[i] = null;
  705.                  return 0;
  706.             }
  707.         }
  708.     }
  709. }
  710.         }
Advertisement
Add Comment
Please, Sign In to add comment