Advertisement
Guest User

Матрица (не готовая)

a guest
Dec 16th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <math.h>
  5. #include <time.h>
  6.  
  7. const int n=15 , m = 15;
  8. const float eps = 0.000000001;
  9. void vivodMAT(double A[n][n],int N,int M)
  10. {
  11.     for (int i = 0; i < N; i++)
  12.     {
  13.         printf("     ( ");
  14.         for (int j = 0; j < M; j++)
  15.         {
  16.             printf("\t%.2lf ",A[i][j]);
  17.         }
  18.         printf(")\n");
  19.     }
  20. }
  21.  
  22. void deter(double A[n][n],double e[n][n],int n)
  23. {
  24.     double mesto,mesto1;
  25.     double det = 1;
  26.     for (int i =0; i < n; i++)
  27.     {
  28.         for (int j = 0; j < n; j++)
  29.         {
  30.             if (j == i)
  31.                 e[i][j] = 1;
  32.             else e[i][j] = 0;
  33.         }
  34.     }
  35.  
  36.  
  37.     for (int i = 0; i < n; i++)
  38.     {
  39.         int imax = i;
  40.         for (int j = i + 1; j < n; j++)
  41.         {
  42.             if (fabs(A[j][i])>fabs(A[imax][i]))
  43.                 imax = j;
  44.             if (fabs(A[imax][i])<eps) {
  45.                 break; printf("Матрица вырождена;"); getchar();system("cls"); }
  46.  
  47.         }
  48.         if (imax != i)
  49.         {
  50.             for (int j1 = 0; j1 < n; j1++)
  51.             {
  52.                 mesto = A[i][j1];////////Для матрицы А
  53.                 A[i][j1] = A[imax][j1];
  54.                 A[imax][j1] = mesto;
  55.  
  56.                 mesto1 = e[i][j1];///////Для ед.матрицы
  57.                 e[i][j1] = e[imax][j1];
  58.                 e[imax][j1] = mesto1;
  59.  
  60.             }
  61.             det = - det;
  62.         }
  63.         double t = A[i][i];
  64.         det *= t;
  65.         for (int j1 = 0; j1 < n; j1++)
  66.         {
  67.             A[i][j1] /= t;
  68.             e[i][j1] /= t;
  69.         }
  70.         for (int k = 0; k < n; k++)
  71.         {
  72.             if (k != i)
  73.             {
  74.                 double t1 = A[k][i];
  75.                 for (int k1 = 0; k1 < n; k1++)
  76.                 {
  77.                     A[k][k1]-=t1 * A[i][k1];
  78.                     e[k][k1]-=t1 * e[i][k1];
  79.                 }
  80.             }
  81.         }
  82.     }
  83. }
  84.  
  85. void MATxX(double A[n][n],int n,int k)
  86. {
  87.     for (int i =0; i < n; i++)
  88.     {
  89.         for (int j = 0; j < n; j++)
  90.         {
  91.             A[i][j]*=k;
  92.         }
  93.     }
  94. }
  95.  
  96. void MATxMAT(double A[n][n],double A1[n][n],double res[n][n],int N)
  97. {
  98.     for (int i = 0; i < N; i++)
  99.     {
  100.         int j1 = 0;
  101.         while(j1 < N)
  102.         {
  103.         for (int j =0; j < N; j++)
  104.         {
  105.             res[i][j1]+= A[i][j] * A1[j][j1];
  106.         }
  107.         j1++;
  108.         }
  109.     }
  110. }
  111.  
  112. void MATminusMAT(double A[n][n],double A1[n][n],double res[n][n],int n)
  113. {
  114.     for (int i = 0; i < n; i++)
  115.     {
  116.         for (int j = 0; j < n; j++)
  117.         {
  118.             res[i][j] = A[i][j] - A1[i][j];
  119.         }
  120.     }
  121. }
  122.  
  123. int main ()
  124. {
  125.     int m,N;
  126.     setlocale(LC_ALL,"Rus");
  127.     double A[n][n];
  128.     double A1[n][n];
  129.     double B[n][n];
  130.     double e[n][n];////Обратная матрица
  131.     double res[n][n];
  132.     double res1[n][n];
  133.     double res2[n][n];
  134.     double res3[n][n];
  135.     double x[n][n];
  136.  
  137.     int num;
  138.     printf(" 1.Ввод вручную;\n");
  139.     printf(" 2.Случайная генерация;\n");
  140.     printf("   Выберите один из вариантов: ");
  141.     scanf("%d",&num);
  142.     if (num < 1 || num > 2) { system("cls"); printf("    Ошибка!!!\n\n"); }
  143.     else {
  144.     system("cls");
  145.     printf(" Введите размерность А: "); scanf("%d",&N);
  146.     printf(" Введите размерность В (Столбцов): "); scanf("%d",&m);
  147.     getchar(); system("cls");
  148.     switch(num)
  149.     {
  150.     case 2:
  151.         {
  152.             srand(time(NULL));
  153.             for (int i = 0; i < N; i++)
  154.             {
  155.                 for (int j = 0; j < N; j++)
  156.                 {
  157.                     A[i][j] = rand()%51 + 1;
  158.                     A1[i][j] = A[i][j];
  159.                 }
  160.             }
  161.             for (int i = 0; i < N; i++)
  162.             {
  163.                 for (int j = 0; j < m; j++)
  164.                 {
  165.                     B[i][j] = rand()%51 + 1;
  166.                 }
  167.             }
  168.             break;
  169.         }
  170.     case 1:
  171.         {
  172.             printf("Введите значения матрицы A:\n");
  173.             for (int i = 0; i < N; i++)
  174.             {
  175.                 if(i > 0) printf("\n");
  176.                 for (int j = 0; j < N; j++)
  177.                 {
  178.                     scanf("%lf",&A[i][j]);
  179.                     A1[i][j] = A[i][j];
  180.                 }
  181.             }
  182.             system("cls");
  183.             printf("Введите значения матрицы B:\n");
  184.             for (int i = 0; i < N; i++)
  185.             {
  186.                 if(i > 0) printf("\n");
  187.                 for (int j = 0; j < m; j++)
  188.                 {
  189.                     scanf("%lf",&B[i][j]);
  190.                 }
  191.             }
  192.             system("cls");
  193.             break;
  194.         }
  195.     }
  196.     printf("Матрица А: \n\n");
  197.     vivodMAT(A,N,N);
  198.  
  199.     printf("\n\n\nМатрица В: \n\n");
  200.     vivodMAT(B,N,m);
  201.  
  202.     printf("\n\n\nОбратная матрица: \n\n");
  203.     deter(A,e,N);
  204.     vivodMAT(e,N,N);
  205.  
  206.     printf("\n\n\nМатрица Х (E(обр) * B): \n\n");
  207.     MATxMAT(e,B,x,N);
  208.     vivodMAT(x,N,m);
  209.  
  210.     printf("\n\n\nПроверка: \n\n");
  211.  
  212.     printf(" matA * E(обр); \n\n");
  213.     vivodMAT(A1,N,N);
  214.     printf("\n   *   \n");
  215.     vivodMAT(e,N,N);
  216.     printf("\n   = \n");
  217.     MATxMAT(A1,e,res,N);
  218.     vivodMAT(res,N,N);
  219.  
  220.     printf(" \nE(обр) * matA; \n\n");
  221.     vivodMAT(e,N,N);
  222.     printf("\n   *   \n");
  223.     vivodMAT(A1,N,N);
  224.     printf("\n   = \n");
  225.     MATxMAT(e,A1,res1,N);
  226.     vivodMAT(res1,N,N);
  227.  
  228.     printf(" \nmatA * X; \n\n");
  229.     vivodMAT(A1,N,N);
  230.     printf("\n   *   \n");
  231.     vivodMAT(x,N,N);
  232.     printf("\n   = \n");
  233.     MATxMAT(A1,x,res2,N);
  234.     vivodMAT(res2,N,m);
  235.  
  236.     printf(" \nA*X - B; \n\n");
  237.     vivodMAT(res2,N,m);
  238.     printf("\n   -   \n");
  239.     vivodMAT(B,N,m);
  240.     printf("\n   = \n");
  241.     MATminusMAT(res2,B,res3,N);
  242.     vivodMAT(res3,N,m);
  243.     }
  244.     return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement