Exercice 1 (6,5 points) — dans l'esprit de la session principale 2021
Un échange d'ordre n appliqué à une chaîne de caractères ch consiste à permuter les n premiers caractères de ch avec ses n derniers caractères, les caractères du milieu restant à leur place. L'ordre n vérifie 1 ≤ n ≤ Long(ch) Div 2.
Exemples :
- Pour
ch = "soleil"etn = 1, on permute le caractère de têteset le dernier caractèrel: on obtient"loleis". - Pour
ch = "soleil"etn = 2, on permutesoetil, le milieulene bouge pas : on obtient"illeso".
- Pour
ch = "cle_2026", donner le résultat de l'échange d'ordren = 3, puis de l'échange d'ordren = 4. - Écrire un algorithme nommé Echange qui permet de : lire une chaîne
chd'au moins 2 caractères et de 10 caractères au maximum ; lire l'ordren(entier compris entre 1 etLong(ch) Div 2) ; construire, en parcourantchcaractère par caractère, la chaîneresobtenue par l'échange d'ordren, puis l'afficher. - Dresser le tableau de déclaration des objets utilisés dans l'algorithme Echange, en adoptant l'en-tête : Objet | Type | Rôle.
- Réécrire l'étape de construction de
ressans structure itérative, en utilisant uniquement la fonction prédéfinieSous_chaineet l'opérateur de concaténation+.
N.B. Notation algorithmique en vigueur : les caractères d'une chaîne sont indicés à partir de 0 ; Sous_chaine(ch, d, f) retourne les caractères d'indices d à f − 1.
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : découper ch en trois blocs — les n caractères de tête, le milieu, les n derniers — puis écrire les derniers, le milieu, ceux de tête. "cle_2026" compte 8 caractères.
n = 3:cle|_2|026, d'où .n = 4 = Long(ch) Div 2:cle_| (milieu vide) |2026, d'où .
2. Idée : chaque contrainte de saisie devient une boucle Répéter … Jusqu'à ; la borne de n dépend de ch, donc ch est lue en premier.
Algorithme Echange
DEBUT
Répéter
Ecrire("Donner ch : ")
Lire(ch)
Jusqu'à (Long(ch) ≥ 2) Et (Long(ch) ≤ 10)
Répéter
Ecrire("Donner n : ")
Lire(n)
Jusqu'à (n ≥ 1) Et (n ≤ Long(ch) Div 2)
L ← Long(ch)
res ← ""
Pour i de L-n à L-1 Faire
res ← res + ch[i]
Fin Pour
Pour i de n à L-n-1 Faire
res ← res + ch[i]
Fin Pour
Pour i de 0 à n-1 Faire
res ← res + ch[i]
Fin Pour
Ecrire("Résultat : ", res)
FINLa première boucle recopie les n derniers caractères, la deuxième le milieu, la troisième les n caractères de tête. Quand L est pair et n = L Div 2, la deuxième boucle va de n à n − 1 : elle ne s'exécute pas, c'est le cas n = 4 de la question 1.
3. Tableau de déclaration des objets de Echange :
ch— Chaîne — chaîne saisien— Entier — ordre de l'échangeL— Entier — longueur dechres— Chaîne — chaîne obtenue après l'échangei— Entier — compteur
4. Idée : chaque boucle recopie une portion contiguë de ch, c'est-à-dire une sous-chaîne ; dans Sous_chaine(ch, d, f), f est l'indice qui suit le dernier caractère recopié, pas une longueur.
L ← Long(ch)
res ← Sous_chaine(ch, L-n, L)
+ Sous_chaine(ch, n, L-n)
+ Sous_chaine(ch, 0, n)Vérification sur "cle_2026" avec n = 3 et L = 8 : Sous_chaine(ch, 5, 8) = "026", Sous_chaine(ch, 3, 5) = "_2" et Sous_chaine(ch, 0, 3) = "cle", d'où "026_2cle".