Exercice 2 (5 points) — dans l'esprit des sessions principales 2017, 2018, 2019 et 2023
Soit le tableau de déclaration des objets suivant : x, nb, d, a, b, i, k, q, e : Entier ; r : Réel ; ch, ch1, ch2, s : Chaîne de caractères ; R : Booléen. Les caractères d'une chaîne sont indicés à partir de 0.
Séquence S1 (0 ≤ a ≤ b ≤ Long(ch)) :
s ← ""
Pour i de a à b - 1 Faire
s ← s + ch[i]
Fin PourSéquence S2 (ch1 non vide) :
k ← -1
i ← 0
Tant que (i ≤ Long(ch) - Long(ch1))
Et (k = -1) Faire
Si Sous_chaine(ch, i, i + Long(ch1)) = ch1
Alors k ← i
Sinon i ← i + 1
FinSi
Fin Tant queSéquence S3 (0 ≤ k ≤ Long(ch)) :
Pour i de 1 à k Faire
ch ← Sous_chaine(ch, 1, Long(ch))
Fin PourSéquence S4 :
R ← Long(ch) > 0
i ← 0
Tant que R Et (i < Long(ch)) Faire
R ← ch[i] ∈ ["0".."9"]
i ← i + 1
Fin Tant queSéquence S5 :
s ← ""
Pour i de 0 à Long(ch) - 1 Faire
Si ch[i] ∈ ["a".."z"] Alors
s ← s + Chr(Ord(ch[i]) - 32)
Sinon
s ← s + ch[i]
FinSi
Fin PourSéquence S6 (r ≥ 0) :
x ← 0
Tant que x + 1 ≤ r Faire
x ← x + 1
Fin Tant queTableau T — initialisations : ch1 ← "Info", ch2 ← "2025/2026", r ← 17.83.
Instruction à exécuter | Valeur finale
…… | ch contient "Info 2026"
…… | q contient 17
…… | e contient 18
…… | a contient 2025
…… | k contient 4
…… | ch2 contient "2026"Séquence S7 (x entier naturel) :
nb ← 0
Répéter
d ← x
x ← x Div 10
nb ← nb + 1
Jusqu'à x = 0- Pour chacune des séquences S1 à S6, écrire l'appel d'une fonction prédéfinie de la liste Effacer, Ent, Estnum, Majus, Pos, Sous_chaine qui retourne le même résultat que la séquence, en précisant les paramètres d'appel (chaque fonction de la liste est utilisée une fois).
- Compléter la colonne « Instruction à exécuter » du tableau T par les instructions permettant d'aboutir aux valeurs finales indiquées. Les instructions doivent utiliser les variables ci-dessus et tenir compte de leur initialisation ; elles sont exécutées dans l'ordre du tableau.
- Concernant la séquence S7 :
- Donner les valeurs finales de
nbet dedpourx = 5070et pourx = 8, en présentant pourx = 5070les valeurs successives ded,xetnb. - Donner le rôle de cette séquence.
- Écrire une séquence algorithmique équivalente, sans structure itérative, qui donne les mêmes valeurs finales de
nbetd, en utilisant les fonctionsConvch,Long,Sous_chaineetValeur.
- Donner les valeurs finales de
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : exécuter chaque séquence sur un petit exemple, reconnaître ce qu'elle rend, puis écrire l'appel au bon type ; pour Sous_chaine et Effacer, le troisième paramètre est l'indice qui suit le dernier caractère concerné.
- S1 recopie les caractères d'indices
aàb − 1:s ← Sous_chaine(ch, a, b), et nonSous_chaine(ch, a, b − a):best l'indice de fin exclu, pas une longueur. - S2 cherche le premier indice où
ch1apparaît danschet laisse −1 sinon :k ← Pos(ch1, ch), la chaîne cherchée en premier. Pourch = "le bac"etch1 = "ba", la boucle s'arrête ài = 3etPos("ba", "le bac") = 3. - S3 supprime
kfois le caractère d'indice 0, c'est-à-dire les caractères d'indices 0 àk − 1:ch ← Effacer(ch, 0, k).Sous_chaine(ch, k, Long(ch))rend la même chaîne, maisSous_chaineest réservée à S1, qu'aucun appel unique d'Effacerne peut produire. - S4 laisse
Rvrai tant que les caractères sont des chiffres, et donne faux pour une chaîne vide :R ← Estnum(ch). - S5 remplace chaque minuscule par la majuscule correspondante (
Ord("a") − Ord("A") = 32) et recopie les autres caractères :s ← Majus(ch). - S6 donne le plus grand entier
xtel quex ≤ r:x ← Ent(r).
2. Idée : chaque ligne part des valeurs laissées par les lignes précédentes ; la dernière modifie ch2, elle vient donc après toutes celles qui lisent ch2.
ch ← ch1 + " " + Sous_chaine(ch2, 5, 9)
q ← Ent(r)
e ← Arrondi(r)
a ← Valeur(Sous_chaine(ch2, 0, 4))
k ← Pos("/", ch2)
ch2 ← Effacer(ch2, 0, 5)Dans "2025/2026", le / est à l'indice 4 et "2026" occupe les indices 5 à 8, d'où Sous_chaine(ch2, 5, 9) (Long(ch2) peut remplacer 9). Ent(17.83) = 17 et Arrondi(17.83) = 18 ; Valeur convertit la chaîne "2025" en entier ; Effacer(ch2, 0, 5) supprime les indices 0 à 4, soit "2025/". Placée plus haut, cette dernière instruction fausserait les lignes qui lisent ch2 : Pos("/", ch2) vaudrait −1. D'autres instructions correctes sont acceptées, par exemple ch2 ← Sous_chaine(ch2, 5, 9) pour la dernière ligne.
3.a Valeurs successives pour x = 5070 :
d x nb
5070 507 1
507 50 2
50 5 3
5 0 4Pour x = 5070 : ; pour x = 8, un seul passage : .
3.b Cette séquence permet de déterminer le nombre de chiffres nb de l'entier x et son chiffre de gauche d.
3.c Idée : l'écriture décimale de x est une chaîne ; sa longueur est le nombre de chiffres, son caractère d'indice 0 le chiffre de gauche.
ch ← Convch(x)
nb ← Long(ch)
d ← Valeur(Sous_chaine(ch, 0, 1))Pour x = 0, la boucle Répéter s'exécute une fois (nb = 1, d = 0) et Convch(0) = "0" donne les mêmes valeurs : l'équivalence vaut pour tout entier naturel.