Witam.
Mam pewien problem z wyznacznikiem macierzy kwadratowej. Problem występuje przy macierzy >=4. Prosiłbym o pomoc. Z góry dziękuje.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int **Wczytywanie(int *rozmiar);
int Wyznacznik(int rozmiar, int **buffor);
int Sarusa(int rozmiar, int **buffor);
int Tworz_Minor(int rozmiar, int **buffor, int ktory_minor);
int _tmain()
{
int rozmiar = 0; // rozmiar macierzy kwadratowej
int **buffor = Wczytywanie(&rozmiar);
printf("Wyznacznik tej macierzy to: %d", Wyznacznik(rozmiar, buffor));
free(buffor);
getchar();
return 0;
}
int **Wczytywanie(int *rozmiar)
{
FILE *plik;
if ((plik = fopen("macierz.txt", "r")) == NULL)
{
printf("Nie mozna otworzyc pliku\n");
getchar();
exit(1);
}
fscanf(plik, "%d\n", rozmiar);
int **tab = NULL;
tab = (int**)malloc(*rozmiar * sizeof(int *));
int i, j = 0;
for (i = 0; i < *rozmiar; i++)
{
tab[i] = (int*)malloc(*rozmiar * sizeof(int));
for (j = 0; j < *rozmiar; j++)
{
fscanf(plik, "%d", &tab[i][j]);
printf("%3d ", tab[i][j]);
}
printf("\n");
}
return tab;
}
int Sarusa(int rozmiar, int **buffor)
{
int wyznacznik = 0;
wyznacznik += buffor[0][0] * buffor[1][1] * buffor[2][2];
wyznacznik += buffor[1][0] * buffor[2][1] * buffor[0][2];
wyznacznik += buffor[2][0] * buffor[0][1] * buffor[1][2];
wyznacznik -= buffor[2][0] * buffor[1][1] * buffor[0][2];
wyznacznik -= buffor[2][1] * buffor[1][2] * buffor[0][0];
wyznacznik -= buffor[2][2] * buffor[1][0] * buffor[0][1];
return wyznacznik;
}
int Tworz_Minor(int rozmiar, int **buffor, int ktory_minor)
{
int wyznacznik_minora = 0;
int **minor = (int**)malloc(rozmiar*sizeof(int*)); //alokowanie pamieci dla minora
for (int z = 0; z < rozmiar; z++)
{
minor[z] = (int*)malloc(rozmiar*sizeof(int));
}
for (int q = 0; q < rozmiar; q++) //wymelnienie minora
{
for (int w = 0; w < rozmiar; w++)
{
int flaga = 0;
if (w == ktory_minor) flaga++;
minor[q][w] = buffor[q + 1][flaga]; //q+1 bo pierwszy wieesz usuwamy
flaga++;
}
}
int potega = 1 + ktory_minor + 1; // 1 i k_m + 1 bo macierze numeruje sie od 1
wyznacznik_minora = pow(-1.0, potega) * buffor[0][ktory_minor] * Wyznacznik(rozmiar, buffor);
return wyznacznik_minora;
}
int Wyznacznik(int rozmiar, int **buffor)
{
if (rozmiar == 1) return 1;
else if (rozmiar == 2)
{
return (buffor[0][0] * buffor[1][1]) - (buffor[0][1] * buffor[1][0]);
}
else if (rozmiar == 3)
{
return Sarusa(rozmiar, buffor);
}
else if (rozmiar >= 4)
{
int suma_wyznacznikow = 0;
int wyznacznik_minora;
for (int i = 0; i < rozmiar; i++)
{
wyznacznik_minora = 0;
wyznacznik_minora = Tworz_Minor(rozmiar - 1, buffor, i);
suma_wyznacznikow += wyznacznik_minora;
}
return suma_wyznacznikow;
}
}