TD 1: Matrices

Tristan Crolard - François Pottier

Résumé:

Tableaux à deux dimensions, de taille fixe et de taille variable. Passage par référence et passage par valeur. Utilisation de fprintf et exit.

Matrices de taille fixe

La définition suivante introduit un type matrix dont les dimensions sont données par deux constantes.

typedef double elt;
#define ROWS 3
#define COLS 3
typedef struct {
  elt array[ROWS][COLS];
} matrix;

Écrire les fonctions dont voici les prototypes:

void identity (matrix* out_m);
void transpose (matrix* inout_m);
void add (matrix* in_m1, matrix* in_m2, matrix* out_m);
void display (matrix* in_m);

Aurait-on pu écrire des variantes de la fonction add dotées des prototypes suivants?

void add (matrix in_m1, matrix in_m2, matrix* out_m);
matrix add (matrix in_m1, matrix in_m2);
En quoi est-ce différent? Justifier.

Matrices de taille quelconque

Écrire une fonction error qui affiche, sur stderr, un message passé en paramètre, puis stoppe l'exécution du programme avec le code de sortie 1.

On souhaite à présent manipuler au sein d'un même programme des matrices de taille arbitraire, aussi remplace-t-on la déclaration précédente par celle-ci:

typedef double elt;
typedef struct {
  int rows, cols;
  elt* array;
} matrix;
On suppose (implicitement) que dans toute matrice m, le champ m.array pointe vers un tableau de taille $(\text{\texttt{m.rows}}\times\text{\texttt{m.cols}})$.

Écrire les fonctions de lecture et d'écriture dans une case de la matrice:

elt value (matrix* in_m, int row, int col);
void assign (matrix* out_m, int row, int col, elt e);
Ces fonctions devront vérifier, au passage, que les indices fournis en paramètres sont valides.

Utiliser ces fonctions pour réimplanter les opérations de la première question.



Jean-Baptiste Yunes
1999-02-05