#include
#include
#define DIM 10
typedef float ligne[DIM];
typedef ligne matrice[DIM];
typedef float *pointeur;
long nb_appels;
void lecture(matrice t,int *lig)
/* lit une matrice (au clavier) */
{
int l,c;
float f;
puts("dimension de la matrice ?");
scanf("%d",lig);
for (l=0;l<*lig;l++) for(c=0;c<*lig;c++)
{
printf("élément [%d,%d] ? ",l,c);
scanf("%f",&f);
t[l][c]=f;
}
}
void zero(matrice t,int dim)
/* met toute la matrice à 0 */
{
int i,j;
for(i=0;i<dim;i++)for(j=0;j<dim;j++) t[i][j]=0;
}
void unit(matrice t, int dim)
/* remplit la matrice unité (1 diagonale, 0 autre) */
{
int i;
zero(t,dim);
for(i=0;i<dim;i++) t[i][i]=1;
}
void affiche(matrice t,int l)
/* puts("affichage du tableau ligne par ligne :"); */
{
int i,j;
for(i=0;i<l;i++)
{
printf("ligne %d : ",i);
for(j=0;j<l;j++) printf("%3.1f ",t[i][j]);
printf("\n");
}
}
void copiesauflc(matrice source,matrice dest,int dim,int ligavirer)
{
int l,c,ld=0;
for (l=0;l<dim;l++) if (l!=ligavirer)
{
for (c=1;c<dim;c++) dest[ld][c-1]=source[l][c];
ld++;
}
}
float determinant(matrice m,int dim)
{
matrice sous_m;
int l,signe=1;
float det=0;
nb_appels++;
if (dim==1) return(m[0][0]);
for(l=0;l<dim;l++)
{
copiesauflc(m,sous_m,dim,l);
det+=signe*m[l][0]*determinant(sous_m,dim-1);
signe=-signe;
}
return(det);
}
void produit(matrice a,matrice b,matrice c,int dim)
/* calcul du produit */
{
int im,il,in;
zero(c,dim);
for(im=0;im<dim;im++)
for(in=0;in<dim;in++)
for(il=0;il<dim;il++)
c[im][in]+=a[im][il]*b[il][in];
}
void main(int argc,char *argv[])
{
int taille;
matrice mat;
/* lecture(mat,&taille); */
taille=atoi(argv[1]); /* test avec matrice unité, */
unit(mat,taille); /* au moins je connais le résultat*/
affiche(mat,taille);
printf("déterminant : %20.17f ",determinant(mat,taille));
printf(" en %ld appels\n",nb_appels);
}