Tableaux à deux dimensions
Représenter une grille ou une matrice, la lire et la parcourir ligne par ligne ou colonne par colonne.
Ce que tu vas apprendre
- Déclarer et lire un tableau à deux dimensions
- Parcourir une matrice par lignes ou par colonnes
- Repérer les diagonales et les cases voisines
Lignes et colonnes
int m[10][10]; déclare une grille de 10 lignes et 10 colonnes. m[i][j] est la case de la ligne i, colonne j (les deux commencent à 0).
On lit une matrice de r lignes et c colonnes avec deux boucles imbriquées : i pour les lignes, j pour les colonnes.
Parcourir autrement
Pour un résultat par ligne, la boucle sur i est à l'extérieur. Pour un résultat par colonne, on met la boucle sur j à l'extérieur.
Dans une matrice carrée, la diagonale principale contient les cases où i == j, l'autre diagonale celles où i + j == n - 1.
Les voisines de m[i][j] sont m[i-1][j], m[i+1][j], m[i][j-1] et m[i][j+1] : vérifie que les indices restent dans la grille avant d'y accéder.
Exemples commentés
1.Maximum de chaque colonne
#include <stdio.h>
int main(void) {
int m[10][10], r, c;
scanf("%d %d", &r, &c);
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
scanf("%d", &m[i][j]);
}
}
for (int j = 0; j < c; j++) { // une colonne à la fois
int max = m[0][j];
for (int i = 1; i < r; i++) {
if (m[i][j] > max) {
max = m[i][j];
}
}
printf(j > 0 ? " %d" : "%d", max);
}
printf("\n");
return 0;
}Entrée
2 3 1 8 3 4 2 9
Sortie
4 8 9
La boucle sur les colonnes est à l'extérieur : pour chaque colonne, on parcourt toutes les lignes.
2.Compter les cases nulles
#include <stdio.h>
int main(void) {
int m[10][10], r, c, zeros = 0;
scanf("%d %d", &r, &c);
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
scanf("%d", &m[i][j]);
if (m[i][j] == 0) {
zeros++;
}
}
}
printf("%d\n", zeros);
return 0;
}Entrée
3 2 0 1 5 0 0 0
Sortie
4
On peut traiter chaque case au moment de la lecture quand on n'a pas besoin d'y revenir.
Chaque exemple est compilé et exécuté automatiquement pour garantir la sortie affichée.
Erreurs fréquentes
Inverser lignes et colonnes
À éviter
for (int i = 0; i < c; i++)
for (int j = 0; j < r; j++)
scanf("%d", &m[i][j]);À préférer
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
scanf("%d", &m[i][j]);Si la matrice n'est pas carrée, les valeurs ne sont pas rangées au bon endroit.
Sortir de la grille
En regardant les voisines d'une case du bord, i - 1 peut valoir -1. Teste i > 0 (et les autres bords) avant d'accéder à la case.
Entraîne-toi
6 questions variées pour fixer la leçon : choix, résultat à prévoir, ligne à compléter, code à remettre dans l'ordre, erreur à trouver.
À toi de jouer !
12 exercices pour mettre cette leçon en pratique, du plus simple au plus avancé.