Exercice langage C: Matrice et Déterminant

Exercice 1 :

Faire le calcul de multiplication d'une matrice (M lignes, L colonnes) par une matrice (L,N) : résultat (M,N).

Exercice 2 :

Ecrire un programme qui calcule le déterminant d'une matrice carrée (N,N), sachant qu'il vaut la somme (sur chaque ligne) de l'élément de la ligne en 1ère colonne par le déterminant de la sous-matrice obtenue en enlevant la ligne et la 1ère colonne (en changeant le signe à chaque fois). Le déterminant d'une matrice (1,1) est sont seul élément. On utilisera bien évidement la récursivité. Il existe (heureusement) d'autres méthodes plus rapides.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#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);
 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#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);
 }