Advertisement
Ilya_and

Матрицы с разностью

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