Mam oto taki kod:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
/*
Obliczanie wyznacznika metodą rozwinięć Laplace
*/
double det(double**, int);
double odwr(double**, int);
int main(){
int i,j,n;
double** a;
char ch;
do{
printf("Podaj n=");
scanf("%d",&n);
a=(double**)malloc((n+1)*sizeof(double));
for(i=0;i<n+1;i++)
a[i]=(double*)malloc((n+1)*sizeof(double));
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("A[%d][%d]=",i+1,j+1);
scanf("%lf",&a[i][j]);
}
printf("\n");
}
printf("det(A)=%lf\n",det(a,n));
odwr(a,n);
for(i=0;i<n+1;i++)
free(a[i]);
free(a);
ch=getch();
} while(ch!=27);
return 0;
}
double det(double** a, int size)
{
int i, k, l, z = 1;
double** b;
double d = 0;
b=(double**)malloc((size+1)*sizeof(double));
for(i=0;i<size+1;i++)
b[i]=(double*)malloc((size+1)*sizeof(double));
if (size == 1)
d = a[0][0];
else
{
// rozwiniecie Laplace'a względem pierwszego wiersza
for (i = 0; i < size; i++)
{
// przepisywanie wierszy
for (k = 0; k < size - 1; k++)
{
// przepisywanie kolumn
for (l = 0; l < size - 1; l++)
{
// przepisanie komórki znajdującej się w tej
// samej kolumnie lecz w wierszu poniżej
if (l < i) b[k][l] = a[k + 1][l];
// przepisanie komórki znajdującej się
// w następnej kolumnie i wierszu poniżej
else b[k][l]=a[k + 1][l + 1];
}
}
// wywołanie rekurencyjne
d = d + z * a[0][i] * det(b, size-1);
// zmiana znaku
z = -z;
}
}
for(i=0;i<size+1;i++)
free(b[i]);
free(b);
return d;
}
double odwr(double** a, int size)
{
int i, j, k;
double** b;
double d = 0;
b=(double**)malloc((size+1)*sizeof(double));
for(i=0;i<size+1;i++)
b[i]=(double*)malloc((size+1)*sizeof(double));
if (size == 1)
d = a[0][0];
else
{
/*Transponowanie macierzy*/
printf("TRANSPONOWANIE MACIERZY:\n\n");
for(i=0;i<size-1;i++)
{
for(j=i+1;j<size;j++){
k=a[i][j];
a[i][j]=a[j][i];
a[j][i]=k;
for (i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
printf("[%d]", a[j][i]);
}
printf("\n");
}
}
}
/*Odwracanie macierzy*/
printf("MACIERZ ODWROTNA:\n\n");
for(j=0;j<size;j++)
{
for(i=0;i<size;i++)
{
d=((1/(det(a,size)))*(a[j][i]));
for (i=0; i<size; i++)
{
for(j=0;j<size;j++)
{
printf("[%0.2f]", d);
}
printf("\n");
}
}
}
}
for(i=0;i<size+1;i++)
free(b[i]);
free(b);
return d;
}
Prawidłowo liczy wyznacznik metodą laplace'a, jednak błednie wykonuje proces odwracania macierzy. Czy ktoś może widzi błedy? Brakuje też tego warunku, że dla wyznacznika równego 0 ma nie liczyć macierzy odwrotnej.