Exercice — recherche séquentielle, variante de boucle et exploration symétrique
Recherche dans un tableau (esprit de l'exercice 2 de la session principale 2024)
On dispose d'un tableau V de n entiers distincts, avec 5 ≤ n ≤ 100. L'indice du premier élément est zéro. La fonction Position ci-dessous retourne l'indice de la case contenant l'entier x s'il figure dans V, et la valeur -1 sinon.
Fonction Position (x : entier ; V : Tab ; n : entier) : entier
DEBUT
i ← 0
Tant que (i < n) ET (V[i] ≠ x) Faire
i ← i + 1
Fin Tant que
Si (i < n) Alors Retourner i
Sinon Retourner -1
FinSi
FIN
On considère, pour n = 8 : V = [ 17 , 4 , 23 , 8 , 41 , 12 , 5 , 30 ], la première case portant l'indice 0.
- Donner la déclaration du nouveau type correspondant au tableau
V. - Écrire, en utilisant une structure
Répéter … Jusqu'à, l'équivalent de la boucleTant quede la fonctionPosition. - Donner le résultat de chacun des appels
Position(41, V, 8)etPosition(9, V, 8), puis en déduire le rôle exact de la valeur retournée. - On veut transformer ce principe en une exploration symétrique : à la première itération on compare
xau premier et au dernier élément, à la deuxième au deuxième et à l'avant-dernier, et ainsi de suite jusqu'à trouverxou jusqu'à ce qu'il n'y ait plus d'élément à comparer. Écrire l'algorithme de la fonctionPosition2 (x, V, n)réalisant ce parcours, ainsi que son tableau de déclaration des objets locaux. La saisie dendoit être contrôlée.
Voir la correction commentéeAprès avoir posé votre démarche
1. Le tableau n'est pas un type prédéfini : il faut le déclarer. Tab = tableau de 100 entiers — la taille déclarée est le maximum autorisé par l'énoncé, pas la valeur courante de n.
2. La boucle Tant que teste avant d'entrer, Répéter teste après : il faut donc protéger le premier accès en partant de l'indice -1, et conclure sur le contenu de la case plutôt que sur i < n : lorsque x est absent, la boucle s'arrête avec i = n-1, valeur qui satisfait pourtant i < n.
i ← -1
Répéter
i ← i + 1
Jusqu'à (i = n-1) OU (V[i] = x)
Si (V[i] = x) Alors Retourner i
Sinon Retourner -1
FinSi
3. Position(41, V, 8) : la boucle s'arrête sur la case d'indice 4, qui contient 41. On retourne 4. Position(9, V, 8) : aucune case ne contient 9, i atteint 8, la condition i < n est fausse. On retourne -1. La valeur retournée n'est donc pas un booléen : c'est l'emplacement de la valeur cherchée, -1 servant de code d'absence parce qu'aucun indice réel ne peut valoir -1.
4. Deux compteurs encadrent la zone encore à explorer et se rapprochent d'un pas à chaque tour.
DEF FN Position2 (x : entier ; V : Tab ; n : entier) : entier
1) g ← 0
d ← n - 1
trouve ← -1
2) Tant que (g ≤ d) ET (trouve = -1) Faire
Si (V[g] = x) Alors trouve ← g
Sinon Si (V[d] = x) Alors trouve ← d
Sinon g ← g + 1
d ← d - 1
FinSi
FinSi
Fin Tant que
3) Retourner trouve
FIN Position2
TDOL de Position2
- Objet
g— Type/Nature : entier — Rôle : indice courant du côté gauche - Objet
d— Type/Nature : entier — Rôle : indice courant du côté droit - Objet
trouve— Type/Nature : entier — Rôle : indice de la case trouvée,-1tant que rien n'a été trouvé
Le test g ≤ d couvre les deux fins possibles : les compteurs se croisent quand n est pair, et se rejoignent sur la case centrale quand n est impair — cette case est alors comparée deux fois (V[g] puis V[d], avec g = d), ce qui reste correct mais coûte une comparaison de plus ; le contrôle de saisie de n appartient au programme appelant, pas à la fonction, qui reçoit n en paramètre.