Module 01 · Leçon 4
Tableaux à deux dimensions (matrices)
Ce que vous saurez faire
- Déclarer une matrice n × p
- Parcourir une matrice avec deux boucles imbriquées
- Distinguer parcours par lignes vs par colonnes
Avant de commencer
Une feuille de notes a 30 élèves × 8 matières. Comment représenter
proprement ces 240 notes ? Vous pourriez utiliser 8 tableaux de
30 éléments — ou bien une matrice 30 × 8.
1. Définition
colonne 1 col 2 col 3
┌─────────┬───────┬───────┐
ligne 1 │ T[1,1] │ T[1,2]│ T[1,3]│
├─────────┼───────┼───────┤
ligne 2 │ T[2,1] │ T[2,2]│ T[2,3]│
└─────────┴───────┴───────┘
2. Déclaration
T.D.N.T
─────────────────────────────────────
Type
Notes = Tableau de 30 × 8 réels
─────────────────────────────────────
T.D.O
─────────────────────────────────
M │ variable Notes
i │ variable entier
j │ variable entier
─────────────────────────────────
T.D.N.T
─────────────────────────────────────
Type
Notes = Tableau de 30 × 8 réels
─────────────────────────────────────
T.D.O
─────────────────────────────────
M │ variable Notes
i │ variable entier
j │ variable entier
─────────────────────────────────
PROGRAM ExempleNotes;
CONST
NB_ELEVES = 30;
NB_MATIERES = 8;
TYPE
Notes = ARRAY[1..NB_ELEVES, 1..NB_MATIERES] OF real;
VAR
M : Notes;
i, j : integer;
BEGIN
{ ... }
END.
3. Parcours d'une matrice
Parcours ligne par ligne (le plus courant)
Pour i de 1 à NB_LIGNES Faire
Pour j de 1 à NB_COLONNES Faire
Traiter(M[i, j])
FinPour
FinPour
Parcours colonne par colonne
Pour j de 1 à NB_COLONNES Faire
Pour i de 1 à NB_LIGNES Faire
Traiter(M[i, j])
FinPour
FinPour
4. Exemple complet : moyennes par élève
PROGRAM MoyennesParEleve;
CONST
NB_ELEVES = 3;
NB_MAT = 4;
VAR
M : ARRAY[1..NB_ELEVES, 1..NB_MAT] OF real;
i, j : integer;
somme, moy : real;
BEGIN
{ Saisie }
FOR i := 1 TO NB_ELEVES DO
FOR j := 1 TO NB_MAT DO
BEGIN
Write('M[', i, ',', j, '] = ');
Readln(M[i, j]);
END;
{ Moyennes }
FOR i := 1 TO NB_ELEVES DO
BEGIN
somme := 0;
FOR j := 1 TO NB_MAT DO
somme := somme + M[i, j];
moy := somme / NB_MAT;
Writeln('Moyenne élève ', i, ' : ', moy:5:2);
END;
END.
5. Exercices
Écrire un algorithme qui calcule la somme totale des éléments d'une
matrice M de n lignes et p colonnes.
Voir le corrigé
somme ← 0
Pour i de 1 à n Faire
Pour j de 1 à p Faire
somme ← somme + M[i, j]
FinPour
FinPour
Une matrice carrée M (n × n) est symétrique si pour tous i, j :
M[i, j] = M[j, i]. Écrire une fonction EstSymetrique(M, n) qui renvoie
Vrai ou Faux.
Voir le corrigé
Fonction EstSymetrique(M : Matrice, n : entier) : booléen
Début
Pour i de 1 à n Faire
Pour j de i+1 à n Faire { On ne teste que la moitié supérieure }
Si M[i, j] ≠ M[j, i] Alors
EstSymetrique ← Faux
Sortir { ou utiliser un drapeau }
FinSi
FinPour
FinPour
EstSymetrique ← Vrai
FinFonction
En Pascal avec drapeau (sans goto) :
FUNCTION EstSymetrique(M : Matrice; n : integer) : boolean;
VAR
i, j : integer;
ok : boolean;
BEGIN
ok := true;
FOR i := 1 TO n DO
FOR j := i + 1 TO n DO
IF M[i, j] <> M[j, i] THEN
ok := false;
EstSymetrique := ok;
END;
Soit M une matrice n × p. Sa transposée T est de taille p × n
et vérifie T[j, i] = M[i, j]. Écrire un programme qui calcule et
affiche la transposée.
Voir le corrigé
PROGRAM Transposee;
CONST
N = 3; P = 2;
VAR
M : ARRAY[1..N, 1..P] OF integer;
T : ARRAY[1..P, 1..N] OF integer;
i, j : integer;
BEGIN
{ Saisie de M omise }
{ Calcul de T }
FOR i := 1 TO N DO
FOR j := 1 TO P DO
T[j, i] := M[i, j];
{ Affichage de T }
FOR i := 1 TO P DO
BEGIN
FOR j := 1 TO N DO
Write(T[i, j]:4);
Writeln;
END;
END.
6. Erreurs fréquentes au bac
- Inverser les indices dans
M[i, j](lignes vs colonnes). - Déclarer une matrice avec des bornes incompatibles avec son usage
(ex.
[1..N, 1..N]pour une matrice rectangulaire). - Faire
n * pcomparaisons inutiles dans un test de symétrie (la moitié supérieure suffit).
7. Quiz
Quiz (5 questions)
Combien d'éléments contient une matrice `ARRAY[1..5, 1..8]` ?
Quelle paire de boucles parcourt une matrice **colonne par colonne** ?
Pour vérifier qu'une matrice carrée n×n est symétrique, on peut tester :
La transposée de la matrice `[[1, 2], [3, 4], [5, 6]]` est :
Dans `ARRAY[1..N, 1..P]`, l'accès `M[N+1, 1]` :