Advertisement
vadimpirog

Untitled

Apr 8th, 2022
820
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. void PrintMatr(int **mas, int m);
  6. void GetMatr(int **mas, int **p, int i, int j, int m);
  7. int Determinant(int **mas, int m);
  8. int** calc_dopmas(int** mas, int size);
  9. void free_dual_arr(int **arr, int size);
  10.  
  11.  
  12. int main() {
  13.   int m, i, j, d;
  14.   int **mas;
  15.   printf("Введите размерность квадратной матрицы: ");
  16.   scanf("%d", &m);
  17.   mas = (int**) malloc(m * sizeof(int*));
  18.   for (i = 0; i<m; i++) {
  19.     mas[i] = (int*) malloc(m * sizeof(int));
  20.     for (j = 0; j<m; j++) {
  21.       printf("mas[%d][%d]= ", i, j);
  22.       scanf("%d", &mas[i][j]);
  23.     }
  24.   }
  25.   PrintMatr(mas, m);
  26.   d = Determinant(mas, m);
  27.   printf("Определитель матрицы равен %d\n", d);
  28.   if (d == 0) {
  29.     fprintf(stderr, "Ошибка определитель равен 0\n");
  30.     return 0;
  31.   }
  32.   free_dual_arr(mas, m);
  33.   return 0;
  34. }
  35.  
  36.  
  37. // Функция вывода матрицы
  38. void PrintMatr(int **mas, int m) {
  39.   int i, j;
  40.   for (i = 0; i<m; i++) {
  41.     for (j = 0; j<m; j++)
  42.       printf("%d ", mas[i][j]);
  43.     printf("\n");
  44.   }
  45. }
  46.  
  47. // Получение матрицы без i-й строки и j-го столбца
  48. void GetMatr(int **mas, int **p, int i, int j, int m) {
  49.   int ki, kj, di, dj;
  50.   di = 0;
  51.   for (ki = 0; ki<m - 1; ki++) { // проверка индекса строки
  52.     if (ki == i) di = 1;
  53.     dj = 0;
  54.     for (kj = 0; kj<m - 1; kj++) { // проверка индекса столбца
  55.       if (kj == j) dj = 1;
  56.       p[ki][kj] = mas[ki + di][kj + dj];
  57.     }
  58.   }
  59. }
  60.  
  61. // Рекурсивное вычисление определителя
  62. int Determinant(int **mas, int m) {
  63.   int i, j, d, k, n;
  64.   int **p;
  65.   j = 0; d = 0;
  66.   k = 1; //(-1) в степени i
  67.   n = m - 1;
  68.   if (m<1) printf("Определитель вычислить невозможно!");
  69.   if (m == 1) {
  70.     d = mas[0][0];
  71.     return d;
  72.   }
  73.   if (m == 2) {
  74.     d = mas[0][0] * mas[1][1] - (mas[1][0] * mas[0][1]);
  75.     return d;
  76.   }
  77.   if (m>2) {
  78.     p = (int**) malloc(m * sizeof(int*));
  79.     for (i = 0; i<m; i++)
  80.       p[i] = (int*) malloc(m * sizeof(int));
  81.     for (i = 0; i<m; i++) {
  82.       GetMatr(mas, p, i, 0, m);
  83.       //printf("%d\n", mas[i][j]);
  84.       //PrintMatr(p, n);
  85.       d = d + k * mas[i][0] * Determinant(p, n);
  86.       k = -k;
  87.       free_dual_arr(p, m);
  88.     }
  89.   }
  90.   return d;
  91. }
  92.  
  93. int** calc_dopmas(int** mas, int size) {
  94.   int** dopmas = (int**) malloc(size * sizeof(int*));
  95.   for (int i = 0; i < size; i++) {
  96.     dopmas[i] = (int*) malloc(size * sizeof(int));
  97.   }
  98.  
  99.   for (int i = 0; i < size; i++) {
  100.     for (int j = 0; j < size; j++) {
  101.       int** tmpmas = newmas(size-1);
  102.       GetMatr(mas, tmpmas, i, j, size);
  103.       int det_tmpmas = Determinant(tmpmas, size-1);
  104.       dopmas[i][j] = det_tmpmas;
  105.     }
  106.   }
  107.   return dopmas;
  108. }
  109.  
  110. void free_dual_arr(int **arr, int size) {
  111.   for (int i = 0; i < size; i++) {
  112.     free(arr[i]);
  113.   }
  114.   free(arr);
  115. }
  116.  
  117. int** newmas(int size) {
  118.   int **newmas = (int**) malloc(size * sizeof(int*));
  119.   for (int i = 0; i < size; i++) {
  120.     newmas[i] = (int*) malloc(size * sizeof(int));
  121.   }
  122.   return newmas;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement