Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- void PrintMatr(int **mas, int m);
- void GetMatr(int **mas, int **p, int i, int j, int m);
- int Determinant(int **mas, int m);
- int** calc_dopmas(int** mas, int size);
- void free_dual_arr(int **arr, int size);
- int main() {
- int m, i, j, d;
- int **mas;
- printf("Введите размерность квадратной матрицы: ");
- scanf("%d", &m);
- mas = (int**) malloc(m * sizeof(int*));
- for (i = 0; i<m; i++) {
- mas[i] = (int*) malloc(m * sizeof(int));
- for (j = 0; j<m; j++) {
- printf("mas[%d][%d]= ", i, j);
- scanf("%d", &mas[i][j]);
- }
- }
- PrintMatr(mas, m);
- d = Determinant(mas, m);
- printf("Определитель матрицы равен %d\n", d);
- if (d == 0) {
- fprintf(stderr, "Ошибка определитель равен 0\n");
- return 0;
- }
- free_dual_arr(mas, m);
- return 0;
- }
- // Функция вывода матрицы
- void PrintMatr(int **mas, int m) {
- int i, j;
- for (i = 0; i<m; i++) {
- for (j = 0; j<m; j++)
- printf("%d ", mas[i][j]);
- printf("\n");
- }
- }
- // Получение матрицы без i-й строки и j-го столбца
- void GetMatr(int **mas, int **p, int i, int j, int m) {
- int ki, kj, di, dj;
- di = 0;
- for (ki = 0; ki<m - 1; ki++) { // проверка индекса строки
- if (ki == i) di = 1;
- dj = 0;
- for (kj = 0; kj<m - 1; kj++) { // проверка индекса столбца
- if (kj == j) dj = 1;
- p[ki][kj] = mas[ki + di][kj + dj];
- }
- }
- }
- // Рекурсивное вычисление определителя
- int Determinant(int **mas, int m) {
- int i, j, d, k, n;
- int **p;
- j = 0; d = 0;
- k = 1; //(-1) в степени i
- n = m - 1;
- if (m<1) printf("Определитель вычислить невозможно!");
- if (m == 1) {
- d = mas[0][0];
- return d;
- }
- if (m == 2) {
- d = mas[0][0] * mas[1][1] - (mas[1][0] * mas[0][1]);
- return d;
- }
- if (m>2) {
- p = (int**) malloc(m * sizeof(int*));
- for (i = 0; i<m; i++)
- p[i] = (int*) malloc(m * sizeof(int));
- for (i = 0; i<m; i++) {
- GetMatr(mas, p, i, 0, m);
- //printf("%d\n", mas[i][j]);
- //PrintMatr(p, n);
- d = d + k * mas[i][0] * Determinant(p, n);
- k = -k;
- free_dual_arr(p, m);
- }
- }
- return d;
- }
- int** calc_dopmas(int** mas, int size) {
- int** dopmas = (int**) malloc(size * sizeof(int*));
- for (int i = 0; i < size; i++) {
- dopmas[i] = (int*) malloc(size * sizeof(int));
- }
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- int** tmpmas = newmas(size-1);
- GetMatr(mas, tmpmas, i, j, size);
- int det_tmpmas = Determinant(tmpmas, size-1);
- dopmas[i][j] = det_tmpmas;
- }
- }
- return dopmas;
- }
- void free_dual_arr(int **arr, int size) {
- for (int i = 0; i < size; i++) {
- free(arr[i]);
- }
- free(arr);
- }
- int** newmas(int size) {
- int **newmas = (int**) malloc(size * sizeof(int*));
- for (int i = 0; i < size; i++) {
- newmas[i] = (int*) malloc(size * sizeof(int));
- }
- return newmas;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement