Exercice — matrice et fichier texte (5 points), dans l'esprit des sessions 2016–2026
Un géomètre relève les altitudes (en mètres) d'un terrain aux nœuds d'une grille, rangées dans une matrice M de L lignes et C colonnes d'entiers (2 ≤ L ≤ 20 et 2 ≤ C ≤ 20). Les lignes et les colonnes sont numérotées à partir de 0.
Un élément M[i, j] est un point selle de M s'il est à la fois le maximum de sa ligne i et le minimum de sa colonne j. Une ligne peut contenir plusieurs maximums égaux, et une colonne plusieurs minimums égaux.
Pour trouver les points selles, on procède ainsi :
- on remplit un tableau MaxL de L entiers, où MaxL[i] est le maximum de la ligne i, et un tableau MinC de C entiers, où MinC[j] est le minimum de la colonne j ;
- on parcourt M ligne par ligne : M[i, j] est un point selle si M[i, j] = MaxL[i] et M[i, j] = MinC[j] ;
- on écrit chaque point selle trouvé dans une ligne d'un fichier texte "Selles.txt", à la racine du disque D, au format
valeur : ligne i, colonne j, puis on écrit une dernière ligneNombre de points selles : k, où k est le nombre de points selles trouvés.
Exemple : pour L = 5, C = 4 et la matrice M suivante :
| i \ j | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 0 | 58 | 40 | 44 | 39 |
| 1 | 63 | 28 | 71 | 66 |
| 2 | 42 | 35 | 42 | 17 |
| 3 | 47 | 50 | 60 | 33 |
| 4 | 51 | 36 | 49 | 51 |
Travail demandé :
- Déclarer le type Mat de la matrice M et le type Tab des tableaux MaxL et MinC.
- Pour la matrice de l'exemple, donner le contenu des tableaux MaxL et MinC, puis le contenu du fichier "Selles.txt".
- Écrire l'algorithme d'une procédure Extremes(M, L, C, MaxL, MinC) qui remplit les tableaux MaxL et MinC.
- Écrire l'algorithme d'une procédure Selles(M, L, C) qui crée le fichier "Selles.txt", le remplit comme décrit ci-dessus en faisant appel à la procédure Extremes, puis le ferme.
- Sans les tableaux MaxL et MinC, il faudrait parcourir la ligne i et la colonne j pour chacune des L × C cases. Expliquer l'intérêt de calculer MaxL et MinC une seule fois, avant le parcours.
NB : M, L et C sont saisis dans le programme appelant. Chaque algorithme est accompagné du tableau de déclaration de ses objets locaux.
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : on déclare la matrice à sa taille maximale, 20 × 20 ; la partie utile, L lignes et C colonnes, est fixée à l'exécution.
| Nouveaux types |
|---|
| Mat = Tableau de 20 lignes et 20 colonnes d'Entiers |
| Tab = Tableau de 20 Entiers |
2. Idée : on calcule les deux tableaux auxiliaires, puis on ne retient que les cases égales à la fois à MaxL[i] et à MinC[j].
| i | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| MaxL[i] | 58 | 71 | 42 | 60 | 51 |
| j | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| MinC[j] | 42 | 28 | 42 | 17 |
La ligne 2 a deux maximums égaux à 42, aux colonnes 0 et 2, et 42 est justement le minimum de ces deux colonnes. Aucune autre case ne convient : 71 est le maximum de la ligne 1 mais pas le minimum de la colonne 2, et 28 est le minimum de la colonne 1 mais pas le maximum de sa ligne.
Contenu du fichier "Selles.txt" :
42 : ligne 2, colonne 0
42 : ligne 2, colonne 2
Nombre de points selles : 23. Idée : deux doubles boucles indépendantes. Pour MaxL, la ligne est fixée et on parcourt les colonnes ; pour MinC, c'est l'inverse. Chaque recherche démarre sur le premier élément, pas sur 0 : une altitude peut être négative.
Procédure Extremes (M : Mat, L, C : Entier,
@ MaxL, MinC : Tab)
DEBUT
Pour i de 0 à L - 1 Faire
MaxL[i] ← M[i, 0]
Pour j de 1 à C - 1 Faire
Si M[i, j] > MaxL[i] Alors
MaxL[i] ← M[i, j]
Fin Si
Fin Pour
Fin Pour
Pour j de 0 à C - 1 Faire
MinC[j] ← M[0, j]
Pour i de 1 à L - 1 Faire
Si M[i, j] < MinC[j] Alors
MinC[j] ← M[i, j]
Fin Si
Fin Pour
Fin Pour
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| i, j | Entier | Indices de ligne et de colonne |
4. Idée : on ouvre le fichier en création, on parcourt M ligne par ligne et on écrit une ligne par point selle. Le compteur k sert à écrire la dernière ligne après le parcours, et à écrire 0 s'il n'y a aucun point selle.
Procédure Selles (M : Mat, L, C : Entier)
DEBUT
Extremes (M, L, C, MaxL, MinC)
Ouvrir ("D:\Selles.txt", F, "w")
k ← 0
Pour i de 0 à L - 1 Faire
Pour j de 0 à C - 1 Faire
Si (M[i, j] = MaxL[i]) Et (M[i, j] = MinC[j]) Alors
ch ← Convch (M[i, j]) + " : ligne " + Convch (i)
ch ← ch + ", colonne " + Convch (j)
Ecrire_nl (F, ch)
k ← k + 1
Fin Si
Fin Pour
Fin Pour
Ecrire_nl (F, "Nombre de points selles : " + Convch (k))
Fermer (F)
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| MaxL, MinC | Tab | Maximums des lignes, minimums des colonnes |
| F | Fichier texte | Nom logique du fichier "Selles.txt" |
| i, j | Entier | Indices de parcours |
| k | Entier | Nombre de points selles |
| ch | Chaîne | Ligne à écrire |
| Extremes | Procédure | Remplir MaxL et MinC |
5. Idée : compter les comparaisons. Tester directement une case demande de parcourir sa ligne (C éléments) et sa colonne (L éléments) : environ L × C × (L + C) comparaisons, soit 20 × 20 × 40 = 16 000 pour une matrice 20 × 20. Avec MaxL et MinC, chaque maximum et chaque minimum est calculé une seule fois (environ 2 × L × C comparaisons), puis chaque case ne demande que deux tests : de l'ordre de 4 × 400 = 1 600 comparaisons.