Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
SD-HStructures de données et modularité

Recherche séquentielle dans un tableau : indice trouvé ou -1, TDNT et exploration par les deux bouts

Idée directrice

Deuxième exercice de l'épreuve (session principale 2024) : un module de recherche séquentielle est donné tout fait, et l'énoncé fait travailler autour de lui. On demande d'abord le type du tableau, puis la même boucle écrite avec une autre structure itérative, enfin une variante du principe de parcours — ici l'exploration simultanée des deux extrémités vers le centre. La valeur retournée reste la même dans les trois versions : l'indice de la case trouvée, ou -1.

Ce qui aide à reconnaître la démarche

« Compléter le tableau ci-dessous par la déclaration du nouveau type correspondant au tableau T » ; « Ecrire, en utilisant la boucle Tant que, l'équivalent de la séquence d'instructions » ; « retourne l'indice de la case contenant le réel a s'il existe dans T ou la valeur -1 dans le cas contraire » ; « on explore, simultanément, les éléments des deux côtés du tableau en se déplaçant vers le centre »

Besoin d’un point de départ ? Voir la méthode
  • Un tableau passé en paramètre exige un type déclaré avant la fonction : c'est le tableau de déclaration des nouveaux types, jamais le tableau des objets globaux.
  • Passer de Tant que à Répéter déplace le test : on part d'un indice décalé d'un cran et on inverse la condition.
  • Une fonction de recherche retourne un indice, pas un booléen ; la valeur -1 code l'absence parce qu'elle n'est l'indice d'aucune case.
  • Toute saisie chiffrée dans l'énoncé se contrôle par Jusqu'à (n dans [min..max]) : le barème compte ce contrôle.
  • Pour un parcours à deux compteurs, vérifier à la main le cas n pair et le cas n impair avant de recopier l'algorithme au propre.
Les pièges à vérifier dans ta démarche

Écrire Jusqu'à (V[i] = x) sans la seconde condition d'arrêt : quand x est absent, l'algorithme sort du tableau. Autre erreur classique : arrêter l'exploration symétrique sur g < d, ce qui laisse la case centrale d'un tableau de taille impaire jamais comparée. Enfin, déclarer le type du tableau dans le tableau des objets globaux au lieu du tableau des nouveaux types coûte des points même si l'algorithme est juste.

Sujet principal

Exercice — recherche séquentielle, variante de boucle et exploration symétrique

4 questionsCorrigé masqué

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.

  1. Donner la déclaration du nouveau type correspondant au tableau V.
  2. Écrire, en utilisant une structure Répéter … Jusqu'à, l'équivalent de la boucle Tant que de la fonction Position.
  3. Donner le résultat de chacun des appels Position(41, V, 8) et Position(9, V, 8), puis en déduire le rôle exact de la valeur retournée.
  4. On veut transformer ce principe en une exploration symétrique : à la première itération on compare x au premier et au dernier élément, à la deuxième au deuxième et à l'avant-dernier, et ainsi de suite jusqu'à trouver x ou jusqu'à ce qu'il n'y ait plus d'élément à comparer. Écrire l'algorithme de la fonction Position2 (x, V, n) réalisant ce parcours, ainsi que son tableau de déclaration des objets locaux. La saisie de n doit ê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, -1 tant 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.

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Exercices d'entraînement — une nuance à la fois

1 Drill SD-H.1 — deux propositions, une seule équivalente
Entraînement 01 / 05

Drill SD-H.1 — deux propositions, une seule équivalente

2 questionsCorrigé masqué

La fonction Compte ci-dessous retourne le nombre de fois qu'un caractère c apparaît dans une chaine ch non vide. Les indices d'une chaîne commencent à zéro.

Fonction Compte (ch : chaine ; c : caractère) : entier
DEBUT
  k ← 0
  Pour i de 0 à Long(ch)-1 Faire
    Si (ch[i] = c) Alors k ← k + 1 FinSi
  Fin Pour
  Retourner k
FIN

On propose deux autres écritures. Une seule est équivalente à Compte.

Proposition A                          Proposition B
Fonction Autre (ch, c) : entier        Fonction Autre (ch, c) : entier
DEBUT                                  DEBUT
  k ← 0                                  k ← 0
  Tant que (ch ≠ "") Faire                Tant que (ch ≠ "") Faire
    Si (ch[0] = c) Alors k ← k+1 FinSi      Si (ch[0] = c) Alors k ← k+1
    ch ← Effacer(ch, 0, 1)                  Sinon ch ← Effacer(ch, 0, 1)
  Fin Tant que                              FinSi
  Retourner k                            Fin Tant que
FIN                                      Retourner k
                                       FIN
  1. Donner le résultat de l'appel Autre("informatique", "i") pour chacune des deux propositions.
  2. En déduire la proposition équivalente à Compte, et dire ce qui cloche dans l'autre.
Voir la correction commentéeAprès avoir posé votre démarche

1. Proposition A : la chaîne est raccourcie à chaque tour quoi qu'il arrive, la boucle parcourt donc les 12 caractères et compte les deux i (positions 0 et 8). On retourne 2.

Proposition B : l'effacement est placé dans la branche Sinon. Dès que ch[0] vaut "i", la chaîne n'est plus raccourcie, la condition ch ≠ "" reste vraie et le même caractère est recompté indéfiniment. Sur "informatique" le premier caractère est déjà un i : la boucle ne s'arrête jamais et aucune valeur n'est retournée.

2. La proposition A est équivalente à Compte : les deux versions examinent chaque caractère une fois et une seule. La proposition B est fautive parce qu'elle fait dépendre l'avancement du parcours du résultat du test, alors que l'avancement doit être inconditionnel.

2 Drill SD-H.2 — combien de comparaisons dans une exploration symétrique ?
Entraînement 02 / 05

Drill SD-H.2 — combien de comparaisons dans une exploration symétrique ?

4 questionsCorrigé masqué

Un module explore un tableau T de n entiers distincts en comparant, à chaque itération, la valeur cherchée x avec l'element de gauche puis avec celui de droite, les deux indices se rapprochant du centre. Le module s'arrête dès que x est trouvé, ou lorsqu'il n'y a plus d'élément à comparer.

On travaille sur T = [ 6 , 19 , 3 , 44 , 27 , 8 , 15 ], soit n = 7, la première case portant l'indice 0.

  1. Pour x = 15, indiquer le nombre de comparaisons effectuées et l'indice retourné.
  2. Pour x = 44, indiquer le nombre de comparaisons effectuées et l'indice retourné.
  3. Pour x = 50, indiquer le nombre de comparaisons effectuées et la valeur retournée.
  4. Écrire la séquence de contrôle de saisie de n, sachant que le module n'accepte que 5 ≤ n ≤ 100.
Voir la correction commentéeAprès avoir posé votre démarche

1. x = 15 occupe la dernière case, d'indice 6. Première itération : on compare T[0] = 6 puis T[6] = 15, égalité. Deux comparaisons. On retourne 6.

2. x = 44 occupe la case d'indice 3, exactement au centre du tableau de 7 cases. Itération 1 : T[0] puis T[6]. Itération 2 : T[1] puis T[5]. Itération 3 : T[2] puis T[4]. Itération 4 : les deux compteurs valent 3, on compare T[3], égalité. Sept comparaisons. On retourne 3.

3. x = 50 n'est nulle part. Toutes les cases sont examinées, soit huit comparaisons : trois paires (six comparaisons), puis la case centrale d'indice 3 comparée deux fois, T[g] puis T[d] avec g = d = 3. La valeur retournée est -1.

4. Le contrôle est une boucle à test final, qui redemande tant que la valeur est hors bornes.

Répéter
  Ecrire("Donner le nombre d'éléments : ")
  Lire(n)
Jusqu'à (n dans [5..100])
3 Drill SD-H.3 — choisir la structure itérative adéquate : corriger trois propositions d'élève
Entraînement 03 / 05

Drill SD-H.3 — choisir la structure itérative adéquate : corriger trois propositions d'élève

3 questionsCorrigé masqué

Afin de réaliser les trois tâches ci-dessous, un élève propose les séquences suivantes. Les indices d'un tableau et d'une chaîne commencent à 0.

Tâche 1 — Saisir une chaîne ch non vide d'au plus 20 caractères.

Lire(ch)
Tant que (Long(ch) = 0) OU (Long(ch) > 20) Faire
  Lire(ch)
Fin Tant que

Tâche 2 — Calculer la somme S des n éléments d'un tableau T d'entiers.

S ← 0
i ← 0
Répéter
  S ← S + T[i]
  i ← i + 1
Jusqu'à (i > n)

Tâche 3 — Vérifier si une chaîne ch non vide contient au moins un chiffre.

Trouve ← Faux
Pour i de 0 à Long(ch) - 1 Faire
  Si (ch[i] ∈ ["0".."9"]) Alors Trouve ← Vrai FinSi
Fin Pour
  1. Pour chaque tâche, réécrire la séquence en utilisant la structure itérative la plus adéquate, et justifier ce choix en une phrase.
  2. Pour la tâche 2, avec n = 4 : combien d'additions la proposition de l'élève effectue-t-elle, et quelle case du tableau lit-elle en trop ?
  3. Pour la tâche 3, avec ch = "Bac2026 Sciences" : combien de caractères la proposition de l'élève examine-t-elle, et combien votre correction en examine-t-elle ? Quelle est la valeur finale de Trouve ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Tâche 1 — Idée : le nombre de saisies n'est pas connu, mais il en faut au moins une : c'est la boucle à test final. La proposition de l'élève fonctionne, mais elle écrit la lecture deux fois, avant la boucle et dans la boucle.

Répéter
  Ecrire("Donner une chaîne : ")
  Lire(ch)
Jusqu'à (Long(ch) ≥ 1) ET (Long(ch) ≤ 20)

Tâche 2 — Idée : on connaît d'avance le nombre d'itérations, n : c'est la boucle Pour. Elle fixe elle-même les bornes 0 et n - 1, ce qui supprime l'erreur de condition d'arrêt de la proposition.

S ← 0
Pour i de 0 à n - 1 Faire
  S ← S + T[i]
Fin Pour

Tâche 3 — Idée : on peut s'arrêter dès qu'un chiffre est trouvé ; la boucle Pour parcourt toujours toute la chaîne. On prend une boucle à condition d'arrêt : ch n'est pas vide, donc un premier passage est toujours possible.

i ← -1
Répéter
  i ← i + 1
  Trouve ← (ch[i] ∈ ["0".."9"])
Jusqu'à (Trouve) OU (i = Long(ch) - 1)

2. Avec n = 4, l'addition est faite pour i = 0, 1, 2, 3, 4 : la condition i > 4 n'est vraie qu'une fois i passé à 5. Cela fait 5 additions au lieu de 4, et la cinquième lit T[4], case qui ne fait pas partie des n éléments : la somme contient une valeur indéterminée.

3. La proposition de l'élève examine les 16 caractères de "Bac2026 Sciences". La correction s'arrête sur le 2 d'indice 3, après avoir examiné B, a, c, 2 : 4 caractères. Dans les deux cas Trouve vaut Vrai, mais la boucle Pour continue pour rien après la découverte.

4 Drill SD-H.4 — une boucle Répéter qui sort du tableau : borner la recherche du premier jour de gel
Entraînement 04 / 05

Drill SD-H.4 — une boucle Répéter qui sort du tableau : borner la recherche du premier jour de gel

5 questionsCorrigé masqué

Une station météo enregistre dans un tableau T les températures minimales (des réels) de n jours consécutifs, avec 5 ≤ n ≤ 31 ; la case d'indice 0 correspond au premier jour. La séquence suivante, une recherche séquentielle, doit placer dans J l'indice du premier jour de gel, c'est-à-dire du premier jour dont la température est strictement négative.

1) i ← -1
   Répéter
     i ← i + 1
   Jusqu'à (T[i] < 0)
2) J ← i
  1. Donner la valeur de J après l'exécution des séquences 1) et 2) pour T = [4.5, 2, -1.5, 3, -2, 6], puis pour T = [0, -3, 5, 1, 2, 7] (n = 6 dans les deux cas).
  2. Quel est le rôle de la variable J ?
  3. Que se passe-t-il lors de l'exécution de la séquence 1) pour T = [3, 1.5, 0, 2, 4, 5] ?
  4. J doit valoir n lorsque aucune température n'est négative : pour le tableau de la question 3, J doit valoir 6. Modifier la séquence 1), en gardant une boucle Répéter, pour donner une valeur valide à J quel que soit le contenu de T.
  5. Écrire une seconde version de la séquence avec une boucle Tant que, puis vérifier les deux versions sur les trois tableaux.
Voir la correction commentéeAprès avoir posé votre démarche

1. Premier tableau : T[0] = 4.5 et T[1] = 2 ne sont pas négatifs, T[2] = -1.5 l'est, donc J = 2. Second tableau : T[0] = 0 n'est pas strictement négatif, la boucle continue et s'arrête sur T[1] = -3, donc J = 1.

2. J est l'indice du premier jour de gel, c'est-à-dire de la première case de T qui contient une température strictement négative.

3. Aucune case n'est négative : après i = 5 (T[5] = 5), la condition reste fausse, i passe à 6 et la boucle lit T[6], case qui ne fait pas partie des 6 jours. Son contenu est indéterminé : la boucle peut s'arrêter sur une valeur sans signification ou continuer au-delà du tableau. La séquence est incorrecte dès qu'il n'y a pas de gel.

4. Idée : ajouter une seconde condition d'arrêt qui empêche de dépasser la dernière case, puis décider après la boucle d'après le contenu de la case où l'on s'est arrêté.

1) i ← -1
   Répéter
     i ← i + 1
   Jusqu'à (T[i] < 0) OU (i = n - 1)
   Si (T[i] < 0) Alors J ← i
   Sinon J ← n
   FinSi

On ne peut pas conclure sur i = n - 1 seul : si le seul jour de gel est le dernier, la boucle s'arrête aussi avec i = n - 1, et c'est bien J = n - 1 qu'il faut retourner.

5. Idée : Tant que teste avant d'entrer ; on place i < n en premier pour ne jamais lire T[n].

1) i ← 0
   Tant que (i < n) ET (T[i] ≥ 0) Faire
     i ← i + 1
   Fin Tant que
2) J ← i

Vérification. Premier tableau : les deux versions s'arrêtent sur l'indice 2, J = 2. Second tableau : arrêt sur l'indice 1, J = 1. Troisième tableau : la version Répéter s'arrête sur i = 5 avec T[5] = 5 ≥ 0, d'où J = 6 ; la version Tant que sort quand i atteint 6, d'où J = 6.

5 Drill SD-H.5 — arrêt anticipé au premier couple différent : tableau symétrique
Entraînement 05 / 05

Drill SD-H.5 — arrêt anticipé au premier couple différent : tableau symétrique

4 questionsCorrigé masqué

Un tableau T de n entiers (2 ≤ n ≤ 50, indices de 0 à n - 1) est dit symétrique si T[i] = T[n-1-i] pour tout indice i. On propose la fonction suivante :

Fonction Symetrique (T : Tab ; n : entier) : booléen
DEBUT
  S ← Vrai
  Pour i de 0 à (n Div 2) - 1 Faire
    Si T[i] ≠ T[n-1-i] Alors
      S ← Faux
    FinSi
  Fin Pour
  Retourner S
FIN
  1. Donner le résultat de l'appel de Symetrique et le nombre de comparaisons T[i] = T[n-1-i] effectuées pour T1 = [3, 7, 1, 7, 3] (n = 5) et pour T2 = [5, 2, 8, 6, 9, 5] (n = 6).
  2. Justifier la borne (n Div 2) - 1 de la boucle, pour n pair puis pour n impair.
  3. Dans le but d'améliorer la fonction, réécrire sa boucle en utilisant la structure itérative adéquate, qui s'arrête dès le premier couple d'éléments différents.
  4. Donner le nombre de comparaisons effectuées par la nouvelle version pour T2, puis pour T3 = [1, 4, 4, 9, 0, 2, 6, 6, 4, 8] (n = 10), et le comparer à celui de la version proposée.
Voir la correction commentéeAprès avoir posé votre démarche

1. T1 : n Div 2 = 2, la boucle fait i = 0 (T[0] = 3 et T[4] = 3) puis i = 1 (T[1] = 7 et T[3] = 7) : 2 comparaisons, résultat Vrai. T2 : n Div 2 = 3, la boucle fait i = 0 (5 = 5), i = 1 (2 ≠ 9, S devient Faux) puis i = 2 (8 ≠ 6) : 3 comparaisons, résultat Faux.

2. Pour n pair, les n Div 2 couples (i, n-1-i) avec i de 0 à (n Div 2) - 1 couvrent tout le tableau : pour n = 6, (0, 5), (1, 4), (2, 3). Pour n impair, la case centrale d'indice n Div 2 serait comparée à elle-même, ce qui est inutile : pour n = 5, on s'arrête à i = 1 et la case d'indice 2 n'est pas testée.

3. Idée : dès que S devient Faux, le résultat est acquis ; la boucle doit donc s'arrêter sur S ou sur la fin des couples — une boucle à condition d'arrêt, pas Pour.

S ← Vrai
i ← 0
Tant que S ET (i < n Div 2) Faire
  S ← (T[i] = T[n-1-i])
  i ← i + 1
Fin Tant que
Retourner S

L'affectation S ← (T[i] = T[n-1-i]) suffit : on n'entre dans la boucle que si S est encore Vrai.

4. T2 : 5 = 5, puis 2 ≠ 9, la boucle s'arrête : 2 comparaisons au lieu de 3. T3 : dès le premier couple, T[0] = 1 et T[9] = 8 diffèrent : 1 comparaison au lieu de 10 Div 2 = 5. Sur un tableau symétrique, comme T1, les deux versions font le même nombre de comparaisons, n Div 2 : l'arrêt anticipé ne fait gagner du temps que lorsque le tableau n'est pas symétrique.

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.