Exercice 2 (5 points) — dans l'esprit des sessions 2020–2025
Soit l'algorithme suivant de la fonction Quoi, où TAB est un nouveau type désignant un tableau de 50 entiers (indices de 0 à 49) :
Fonction Quoi (T : TAB, d, f : Entier) : ……
DEBUT
i ← d
p ← -1
Tant que (i < f) Et (p = -1) Faire
Si T[i] > T[i+1] Alors
p ← i
Sinon
i ← i + 1
FinSi
Fin Tant que
Retourner p
FIN- Déterminer le type du résultat retourné par la fonction Quoi.
- Compléter le tableau de déclaration des objets locaux (T.D.O.L) de la fonction Quoi : colonnes Objet et Type/Nature.
- Soit le tableau
Tsuivant de 10 entiers, d'indices 0 à 9 :T = [12, 15, 15, 21, 8, 10, 30, 4, 4, 9].- Donner le résultat de chacun des appels :
Quoi(T, 0, 9);Quoi(T, 4, 9);Quoi(T, 7, 9);Quoi(T, 8, 8). - Pour l'appel
Quoi(T, 4, 9), donner les valeurs successives deiet dep.
- Donner le résultat de chacun des appels :
- Déduire le rôle de la fonction Quoi.
- On appelle portion croissante d'un tableau une suite maximale d'éléments adjacents rangés dans l'ordre croissant au sens large. Écrire l'algorithme d'une procédure Portions, d'en-tête
Procédure Portions (V : TAB, N : Entier), qui affiche chaque portion croissante du tableauVdeNentiers sur une ligne. Pour le tableauTci-dessus, on doit obtenir les trois lignes12 15 15 21,8 10 30et4 4 9. Le module Portions doit faire appel à la fonction Quoi ; dresser son T.D.O.L. - En faisant appel à Quoi, écrire une seule instruction qui affiche
Vraisi le tableauVdeNéléments est rangé dans l'ordre croissant au sens large, etFauxsinon.
N.B. Le candidat n'est pas appelé à déclarer le nouveau type TAB.
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : le type se lit sur ce que la fonction retourne. Quoi retourne p, qui reçoit soit -1, soit la valeur d'un indice i : le résultat est de type . L'en-tête complet est Fonction Quoi (T : TAB, d, f : Entier) : Entier.
2. T.D.O.L de Quoi — les paramètres T, d et f n'y figurent pas, seuls les objets affectés dans le corps :
i— Type/Nature : Entier — parcourt les indices dedàfp— Type/Nature : Entier — indice trouvé,-1tant que rien n'est trouvé
3.a Idée : on compare chaque élément à son suivant tant que i < f ; la boucle s'arrête dès que p reçoit un indice.
Quoi(T, 0, 9): 12 ≤ 15, 15 ≤ 15, 15 ≤ 21, puis 21 > 8 à l'indice 3 : .Quoi(T, 4, 9): 8 ≤ 10, 10 ≤ 30, puis 30 > 4 à l'indice 6 : .Quoi(T, 7, 9): 4 ≤ 4, 4 ≤ 9, puisiatteint 9 =fsans descente : .Quoi(T, 8, 8):d = f, la conditioni < fest fausse dès l'entrée, la boucle ne s'exécute pas etpgarde son initialisation : .
3.b Trace de Quoi(T, 4, 9) :
i p test T[i] > T[i+1]
4 -1 8 > 10 : faux
5 -1 10 > 30 : faux
6 6 30 > 4 : vraiLa boucle s'arrête car p ≠ -1 ; la fonction retourne 6.
4. La fonction Quoi retourne l'indice du premier élément de la portion T[d..f] strictement supérieur à son suivant (la première « descente »), et -1 si cette portion est rangée dans l'ordre croissant au sens large — en particulier lorsque d ≥ f.
5. Idée : l'appel Quoi(V, d, N-1) donne la fin de la portion qui commence en d ; la portion suivante commence juste après. Un retour -1 signifie que la portion va jusqu'au dernier élément.
Procédure Portions (V : TAB, N : Entier)
DEBUT
d ← 0
Tant que d ≤ N-1 Faire
p ← Quoi(V, d, N-1)
Si p = -1 Alors
f ← N-1
Sinon
f ← p
FinSi
ligne ← ""
Pour i de d à f Faire
ligne ← ligne + Convch(V[i]) + " "
Fin Pour
Ecrire(ligne)
d ← f + 1
Fin Tant que
FINT.D.O.L de Portions :
d,f,p,i— Type/Nature : Entier — début et fin de la portion, résultat de l'appel, compteurligne— Type/Nature : Chaîne — portion en cours d'affichageQuoi— Type/Nature : Fonction — première descente entre deux indices
Sur l'exemple : d = 0 donne p = 3, ligne « 12 15 15 21 » ; d = 4 donne p = 6, ligne « 8 10 30 » ; d = 7 donne p = -1, ligne « 4 4 9 » ; puis d = 10 > 9 arrête la boucle. Les comparaisons V[i] > V[i+1] ne sont jamais réécrites : elles restent dans Quoi, comme l'exige la consigne.
6. Ecrire(Quoi(V, 0, N-1) = -1) : Quoi retourne -1 exactement lorsqu'aucune descente n'existe entre les indices 0 et N − 1.