Exercice 1:
#include #define DIM 10 typedef float ligne[DIM]; typedef ligne matrice[DIM]; typedef float *pointeur; void lecture(matrice t,int *lig,int *col) /* lit à l'écran une matrice */ { int l,c; float f; puts("nombre de lignes de la matrice ?"); scanf("%d",lig); puts("nombre de colonnes de la matrice ?"); scanf("%d",col); for (l=0;l<*lig;l++) for(c=0;c<*col;c++) { printf("élément [%d,%d] ? ",l,c); scanf("%f",&f); t[l][c]=f; } } void zero(float *t) /* met toute la matrice à 0 */ { int i; for(i=0;i<DIM*DIM;i++) *t++=0; } void unit(matrice t) /* remplit la matrice unité (1 diagonale, 0 autre) */ { int i; zero(t); for(i=0;i<DIM;i++) t[i][i]=1; } void init(matrice t) /* initialisation de matrice à numlig.numcol */ { int i,j; for(i=0;i<DIM;i++) for(j=0;j<DIM;j++) t[i][j]=i+j/10.0; } void affiche(matrice t,int l,int c) /* puts("affichage du tableau ligne par ligne :"); */ { int i,j; for(i=0;i<l;i++) { printf("ligne %d : ",i); for(j=0;j<c;j++) printf("%3.1f ",t[i][j]); printf("\n"); } } void produit(matrice a,matrice b,matrice c,int m,int l,int n) /* calcul du produit */ { int im,il,in; zero(c); for(im=0;im<m;im++) for(in=0;in<n;in++) for(il=0;il<l;il++) c[im][in]+=a[im][il]*b[il][in]; } void main(void) { int m,l,n,i; matrice a,b,c; lecture(a,&m,&l); lecture(b,&i,&n); if(i!=l) puts("calcul impossible : dimensions incompatibles"); affiche(a,m,l); puts("--- FOIS ---"); affiche(b,l,n); puts("--- FAIT ---"); produit(a,b,c,m,l,n); affiche(c,m,n); }
Exercice 2 :
#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); }