Rešenje (C)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*Određuje determinantu matrice a
parametri:
a-matrica početna n*n
n-dimenzija kvadratne matrice
r-red za razvijanje matrice ili -1 ako se ne razvija po redu
c-kolona za razvijanje matrice ili -1 ako se ne razvija po koloni
redP-niz precrtanih redova u matrici
colP-niz precrtanih kolona u matrici
*/
float ** inverzna(int ** aT, int det, int n)
{
float **aI;
aI = (float **)malloc(n*sizeof(float*));
for(int i=0; i < n; i++)
{
aI[i]=(float *)malloc(n*sizeof(float));
for(int j=0; j < n; j++)
{
aI[i][j]=(float)aT[i][j]/det;
}
}
return aI;
}
int ** copyMatrix(int ** aT, int n)
{
int **aC;
aC = (int**)malloc(n*sizeof(int*));
for(int i=0; i < n; i++)
{
aC[i]=(int*)malloc(n*sizeof(int));
for(int j=0; j < n; j++)
{
aC[i][j]=aT[i][j];
}
}
return aC;
}
void transponovana(int ** a, int n)
{
for(int i=0; i < n; i++)
{
for(int j=i; j < n; j++)
{
/*zamena*/
int b=a[i][j];
a[i][j]=a[j][i];
a[j][i]=b;
}
}
}
void ispisatiMatricuF( float ** a, int n)
{
for(int i=0; i < n; i++)
{
for(int j=0; j < n; j++)
{
printf("%.2f ",a[i][j]);
}
printf("\n");
}
}
/*Funkcija za ispisivanje matrice
* parametri su
* a- pokazivač na matricu(pokazivač na pokazivač)
* n -dimenzija matrice
*/
void ispisatiMatricu( int ** a, int n)
{
for(int i=0; i < n; i++)
{
for(int j=0; j < n; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
/*Određuje determinantu matrice a
parametri:
a-matrica početna n*n
n-dimenzija kvadratne matrice
r-red za razvijanje matrice ili -1 ako se ne razvija po redu
c-kolona za razvijanje matrice ili -1 ako se ne razvija po koloni
redP-niz precrtanih redova u matrici
colP-niz precrtanih kolona u matrici
*/
int determinanta(int ** a,int n, int r,int c,int dim, int * redP, int * colP)
{
int rez=0;
if(dim==1)
{
int i=0,j=0;
while(redP[i])
{
i++;
}
while(colP[j])
{
j++;
}
rez=a[i][j];
}
else
{
int k=1;
if(r!=-1 && c==-1) //ako se determinanta razvija po redu
{
int pom=n-dim;//smanjenje broja posmatranih redova u originalnoj matrici
while(redP[r]){
r++;
}
r=r%n;//korekcija ako je r > n
for(int j = 0,t = 0; j < n; j++)
{
if(colP[j])
{
continue;
}
k=(int)pow(-1,(r-pom+t));//koeficijent kofaktora(1 ili -1)
colP[j]=1;//precrtana kolona u velikoj matrici
redP[r]=1;//precrtan red u velikoj matrici
/*Rekurzivni poziv iste funkcije*/
int d=determinanta(a,n,0,-1,dim-1,redP,colP);
printf("red %d, col %d: %d * %d * %d\n",r,j,k,a[r][j],d);
rez=rez+k*a[r][j]*d;
colP[j]=0;//vracena precrtana kolona u velikoj matrici
redP[r]=0;//vracen precrtan red u velikoj matrici
t++;
}
}
else if(c!=-1 && r==-1)
{
int pom=n-dim;//smanjenje broja posmatranih redova u originalnoj matrici
while(colP[c]){
c++;
}
c=c%n;//korekcija ako je r>n
for(int i=0,h=0; i < n; i++)
{
if(redP[i])
{
continue;
}
k=(int)pow(-1,(c-pom+h));//koeficijent kofaktora(1 ili -1)
colP[c]=1;//precrtana kolona u velikoj matrici
redP[i]=1;//precrtan red u velikoj matrici
int d=determinanta(a,n,-1,0,dim-1,redP,colP);
printf("red %d, col %d: %d * %d * %d\n",i,c,k,a[i][c],d);
rez=rez+k*a[i][c]*d;
colP[c]=0;//vracena precrtana kolona u velikoj matrici
redP[i]=0;//vracen precrtan red u velikoj matrici
h++;
}
}
else /*Greska*/
{
printf("Greska");
return -1;
}
}
return rez;
}
void adjugovana(int ** a, int n)
{
int **aA;
aA= copyMatrix(a,n);
int k=1;
for(int i=0; i < n; i++)
{
for(int j=0; j < n; j++)
{
int * colP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
colP[i]=0;
}
int * redP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
redP[i]=0;
}
redP[i]=1;
colP[j]=1;
int kofA;
kofA=determinanta(aA,n,0,-1,n-1,redP,colP);
k=(int)pow(-1,(i+j));
a[i][j]=k*kofA;
free(redP);
free(colP);
}
}
}
int main()
{
int n;
int **A;
float ** AI;
printf("n=?\n");
scanf("%d",&n);
A=(int**)malloc(n*sizeof(int*));
printf("Matrica?\n");
for(int i=0; i < n; i++)
{
A[i]=(int*)malloc(n*sizeof(int));
for(int j=0; j < n; j++)
{
scanf("%d",&A[i][j]);
}
}
printf("Matrica ispis:\n");
ispisatiMatricu(A,n);
int * colP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
colP[i]=0;
}
int * redP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
redP[i]=0;
}
int d=determinanta(A,n,0,-1,n,redP,colP);/*parametri: matrica n*n(A), red po kome ce se razvijati,
kolona=-1 znaci da se ne razvija po koloni, niz precrtanih redova, niz precrtanih kolona*/
free(colP);
free(redP);
printf("Determinanta(A): %d\n",d);
if(d==0)
{
printf("Matrica je singularna");
return 0;
}
transponovana(A,n);
ispisatiMatricu(A,n);
printf("Adjugovana matrica A:\n");
adjugovana(A,n);
ispisatiMatricu(A,n);
AI=inverzna(A,d,n);
ispisatiMatricuF(AI,n);
return 0;
}
Rešenje (C)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*Određuje determinantu matrice a
parametri:
a-matrica početna n*n
n-dimenzija kvadratne matrice
r-red za razvijanje matrice ili -1 ako se ne razvija po redu
c-kolona za razvijanje matrice ili -1 ako se ne razvija po koloni
redP-niz precrtanih redova u matrici
colP-niz precrtanih kolona u matrici
*/
float ** inverzna(int ** aT, int det, int n)
{
float **aI;
aI = (float **)malloc(n*sizeof(float*));
for(int i=0; i < n; i++)
{
aI[i]=(float *)malloc(n*sizeof(float));
for(int j=0; j < n; j++)
{
aI[i][j]=(float)aT[i][j]/det;
}
}
return aI;
}
int ** copyMatrix(int ** aT, int n)
{
int **aC;
aC = (int**)malloc(n*sizeof(int*));
for(int i=0; i < n; i++)
{
aC[i]=(int*)malloc(n*sizeof(int));
for(int j=0; j < n; j++)
{
aC[i][j]=aT[i][j];
}
}
return aC;
}
void transponovana(int ** a, int n)
{
for(int i=0; i < n; i++)
{
for(int j=i; j < n; j++)
{
/*zamena*/
int b=a[i][j];
a[i][j]=a[j][i];
a[j][i]=b;
}
}
}
void ispisatiMatricuF( float ** a, int n)
{
for(int i=0; i < n; i++)
{
for(int j=0; j < n; j++)
{
printf("%.2f ",a[i][j]);
}
printf("\n");
}
}
/*Funkcija za ispisivanje matrice
* parametri su
* a- pokazivač na matricu(pokazivač na pokazivač)
* n -dimenzija matrice
*/
void ispisatiMatricu( int ** a, int n)
{
for(int i=0; i < n; i++)
{
for(int j=0; j < n; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
/*Određuje determinantu matrice a
parametri:
a-matrica početna n*n
n-dimenzija kvadratne matrice
r-red za razvijanje matrice ili -1 ako se ne razvija po redu
c-kolona za razvijanje matrice ili -1 ako se ne razvija po koloni
redP-niz precrtanih redova u matrici
colP-niz precrtanih kolona u matrici
*/
int determinanta(int ** a,int n, int r,int c,int dim, int * redP, int * colP)
{
int rez=0;
if(dim==1)
{
int i=0,j=0;
while(redP[i])
{
i++;
}
while(colP[j])
{
j++;
}
rez=a[i][j];
}
else
{
int k=1;
if(r!=-1 && c==-1) //ako se determinanta razvija po redu
{
int pom=n-dim;//smanjenje broja posmatranih redova u originalnoj matrici
while(redP[r]){
r++;
}
r=r%n;//korekcija ako je r > n
for(int j = 0,t = 0; j < n; j++)
{
if(colP[j])
{
continue;
}
k=(int)pow(-1,(r-pom+t));//koeficijent kofaktora(1 ili -1)
colP[j]=1;//precrtana kolona u velikoj matrici
redP[r]=1;//precrtan red u velikoj matrici
/*Rekurzivni poziv iste funkcije*/
int d=determinanta(a,n,0,-1,dim-1,redP,colP);
printf("red %d, col %d: %d * %d * %d\n",r,j,k,a[r][j],d);
rez=rez+k*a[r][j]*d;
colP[j]=0;//vracena precrtana kolona u velikoj matrici
redP[r]=0;//vracen precrtan red u velikoj matrici
t++;
}
}
else if(c!=-1 && r==-1)
{
int pom=n-dim;//smanjenje broja posmatranih redova u originalnoj matrici
while(colP[c]){
c++;
}
c=c%n;//korekcija ako je r>n
for(int i=0,h=0; i < n; i++)
{
if(redP[i])
{
continue;
}
k=(int)pow(-1,(c-pom+h));//koeficijent kofaktora(1 ili -1)
colP[c]=1;//precrtana kolona u velikoj matrici
redP[i]=1;//precrtan red u velikoj matrici
int d=determinanta(a,n,-1,0,dim-1,redP,colP);
printf("red %d, col %d: %d * %d * %d\n",i,c,k,a[i][c],d);
rez=rez+k*a[i][c]*d;
colP[c]=0;//vracena precrtana kolona u velikoj matrici
redP[i]=0;//vracen precrtan red u velikoj matrici
h++;
}
}
else /*Greska*/
{
printf("Greska");
return -1;
}
}
return rez;
}
void adjugovana(int ** a, int n)
{
int **aA;
aA= copyMatrix(a,n);
int k=1;
for(int i=0; i < n; i++)
{
for(int j=0; j < n; j++)
{
int * colP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
colP[i]=0;
}
int * redP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
redP[i]=0;
}
redP[i]=1;
colP[j]=1;
int kofA;
kofA=determinanta(aA,n,0,-1,n-1,redP,colP);
k=(int)pow(-1,(i+j));
a[i][j]=k*kofA;
free(redP);
free(colP);
}
}
}
int main()
{
int n;
int **A;
float ** AI;
printf("n=?\n");
scanf("%d",&n);
A=(int**)malloc(n*sizeof(int*));
printf("Matrica?\n");
for(int i=0; i < n; i++)
{
A[i]=(int*)malloc(n*sizeof(int));
for(int j=0; j < n; j++)
{
scanf("%d",&A[i][j]);
}
}
printf("Matrica ispis:\n");
ispisatiMatricu(A,n);
int * colP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
colP[i]=0;
}
int * redP=(int*) malloc(n*sizeof(int));
for(int i=0; i < n; i++)
{
redP[i]=0;
}
int d=determinanta(A,n,0,-1,n,redP,colP);/*parametri: matrica n*n(A), red po kome ce se razvijati,
kolona=-1 znaci da se ne razvija po koloni, niz precrtanih redova, niz precrtanih kolona*/
free(colP);
free(redP);
printf("Determinanta(A): %d\n",d);
if(d==0)
{
printf("Matrica je singularna");
return 0;
}
transponovana(A,n);
ispisatiMatricu(A,n);
printf("Adjugovana matrica A:\n");
adjugovana(A,n);
ispisatiMatricu(A,n);
AI=inverzna(A,d,n);
ispisatiMatricuF(AI,n);
return 0;
}