Ch. 02 · Leçon 1
La structure Répéter…Jusqu'à
Ce que vous saurez faire
- Décrire le fonctionnement de la boucle Répéter…Jusqu'à
- Écrire une boucle Répéter en Analyse et son équivalent Python
- Comparer la boucle Répéter à la boucle Pour
- Concevoir une validation de saisie robuste avec Répéter
Plan de cours
Faire au moins une fois, puis re-tester
Quand le nombre d'itérations n'est pas connu à l'avance mais que l'on sait qu'il faut faire au moins une fois l'opération, la boucle Pour ne convient plus. Voici la première de deux structures itératives à condition d'arrêt.
Concepts clés
- Au moins une exécution garantie avant le premier test.
- Condition d'arrêt (on sort quand elle devient vraie).
- Émulation Python :
while True / break(Python n'a pas dedo…whilenatif). - Cas d'usage : validation d'une donnée saisie au clavier.
Avant de commencer
- Q1. Combien de fois s'exécute au minimum le corps d'une boucle
Pour i de 5 à 3? - Q2. Que faire si on doit demander un nombre positif à l'utilisateur jusqu'à ce qu'il en donne un ?
- Q3. Connaissez-vous le mot-clé Python pour sortir prématurément d'une boucle ?
1. Le contenu du cours
1.1 Analogie : le distributeur de billets
Vous tentez votre code à un distributeur :
Répéter — saisir le code et appuyer sur Valider — jusqu'à ce que le code soit correct OU que la 3ème tentative ait été utilisée.
Vous ne savez pas à l'avance combien de tentatives seront nécessaires (1, 2 ou 3). Mais vous savez que vous tenterez au moins une fois. C'est exactement le contrat de Répéter…Jusqu'à.
1.2 La structure Répéter
Forme algorithmique
Répéter
instructions
Jusqu'à condition_d_arret
Sémantique :
- Exécuter les
instructions. - Évaluer
condition_d_arret. - Si vraie → sortir de la boucle. Si fausse → retourner en 1.
1.3 Émulation Python
Python n'a pas de Répéter…Jusqu'à natif. On émule avec while True + break :
Répéter
Lire(nombre)
Jusqu'à nombre > 0
Répéter
Lire(nombre)
Jusqu'à nombre > 0
while True:
nombre = int(input("Nombre positif : "))
if nombre > 0:
break
1.4 Cas canonique : validation de saisie
L'usage n°1 de Répéter au bac est la validation d'entrée utilisateur.
Exemple — Saisir un mois valide (1 à 12)
Répéter
Écrire("Mois (1-12) : ")
Lire(mois)
Jusqu'à (mois >= 1) ET (mois <= 12)
Répéter
Écrire("Mois (1-12) : ")
Lire(mois)
Jusqu'à (mois >= 1) ET (mois <= 12)
while True:
mois = int(input("Mois (1-12) : "))
if 1 <= mois <= 12:
break
1.5 Trace d'exécution
Énoncé. L'utilisateur saisit successivement -3, 0, 15, 7. Trace de la boucle ci-dessus :
| N° | Instruction | mois | sortie |
|---|---|---|---|
| 01 | ··· | ? | ? |
| 02 | ··· | ? | ? |
| 03 | ··· | ? | ? |
| 04 | ··· | ? | ? |
| 05 | ··· | ? | ? |
| 06 | ··· | ? | ? |
| 07 | ··· | ? | ? |
| 08 | ··· | ? | ? |
1.6 Répéter avec compteur
On peut limiter le nombre d'essais en ajoutant un compteur :
NB_ESSAIS_MAX = 3
essai = 0
mot_de_passe_correct = False
while True:
essai = essai + 1
saisi = input("Mot de passe : ")
if saisi == "BacInfo2026":
mot_de_passe_correct = True
break
if essai >= NB_ESSAIS_MAX:
break
if mot_de_passe_correct:
print("Accès accordé")
else:
print("Trop de tentatives. Compte bloqué.")
1.7 Comparaison rapide Pour / Répéter
| Critère | Pour | Répéter |
|---|---|---|
| Nombre d'itérations | Connu à l'avance | Inconnu à l'avance |
| Corps exécuté au moins une fois | Pas forcément (si début > fin) | Toujours |
| Test | Implicite (compteur ≤ fin) | Explicite (Jusqu'à) |
| Cas d'usage | Parcours d'intervalles | Validation, jeu avec essais limités |
2. Exercices pratiques
Niveau Débutant — Type bac courant
Demander à l'utilisateur de saisir un entier. Continuer à demander tant que l'entier saisi n'est pas strictement positif. Afficher la valeur finale.
Voir le corrigé
while True:
n = int(input("Entier strictement positif : "))
if n > 0:
break
print("Valeur saisie :", n)
Variante avec message d'erreur explicite :
while True:
n = int(input("Entier strictement positif : "))
if n > 0:
break
print(" → Refusé. Doit être > 0. Recommencez.")
Niveau Intermédiaire — Type bac difficile
Le programme tire un nombre aléatoire entre 1 et 100. L'utilisateur doit le deviner. À chaque essai :
- afficher
"Trop grand"si la proposition est supérieure, - afficher
"Trop petit"si elle est inférieure, - afficher
"Bravo en X essais !"quand il trouve.
Limiter à 7 essais maximum.
Voir le corrigé
import random
cible = random.randint(1, 100)
essai = 0
NB_MAX = 7
while True:
essai = essai + 1
proposition = int(input(f"Essai {essai}/{NB_MAX} : "))
if proposition == cible:
print(f"Bravo en {essai} essais !")
break
elif proposition > cible:
print("Trop grand")
else:
print("Trop petit")
if essai >= NB_MAX:
print(f"Perdu. Le nombre était {cible}.")
break
Stratégie optimale. Avec 7 essais et la dichotomie (couper la plage en deux à chaque coup), on peut deviner un nombre entre 1 et 100 à coup sûr (2^7 = 128 > 100). C'est une jolie introduction à la recherche dichotomique (chapitre 4).
Niveau Avancé — Hors bac (bonus)
Implémenter l'algorithme d'Euclide par soustractions pour calculer le PGCD de deux entiers strictement positifs a et b :
Tant que
aetbsont différents, soustraire le plus petit du plus grand. Le PGCD est la valeur commune obtenue.
Utiliser uniquement la structure Répéter…Jusqu'à (donc while True + break en Python). Construire le Tableau de Déclaration des Objets (T.D.O), l'algorithme, le code Python et une trace pour a = 48, b = 18.
Voir le corrigé
T.D.O
a | Variable / entier | Premier opérande
b | Variable / entier | Second opérande
Algorithme
0) Début pgcd_soustractions
1) Lire(a) ; Lire(b)
2) Répéter
Si a > b Alors
a ← a - b
Sinon Si b > a Alors
b ← b - a
FinSi
Jusqu'à a = b
3) Écrire("PGCD = ", a)
4) Fin pgcd_soustractions
Python 3
a = int(input("a > 0 : "))
b = int(input("b > 0 : "))
while True:
if a > b:
a = a - b
elif b > a:
b = b - a
if a == b:
break
print("PGCD =", a)
Trace avec a = 48, b = 18
| Itération | a | b | Action |
|---|---|---|---|
| Init | 48 | 18 | — |
| 1 | 30 | 18 | a > b → a ← a-b |
| 2 | 12 | 18 | a > b → a ← a-b |
| 3 | 12 | 6 | b > a → b ← b-a |
| 4 | 6 | 6 | a > b → a ← a-b |
| Sortie | 6 | 6 | a = b → STOP |
PGCD(48, 18) = 6 ✓
Remarque pédagogique. Cet algorithme est inefficace pour de grandes différences (ex. PGCD(1, 1000000) ferait 999999 soustractions). L'algorithme d'Euclide par division (a ← b ; b ← a MOD b) le rend log-fois plus rapide. À voir au chapitre 4 quand on étudiera la complexité.
⚠️ Erreurs fréquentes au bac
Avant le quiz, mémorisez ces pièges classiques qui font perdre des points :
- Erreur 1. Oublier d'incrémenter / mettre à jour une variable de la condition d'arrêt → boucle infinie.
- Erreur 2. Confondre condition d'arrêt (sortie quand vrai) et condition de continuation. Inversement = boucle infinie ou jamais exécutée.
- Erreur 3. Utiliser
Tant quequand il faut au moins une exécution (saisie utilisateur, validation).Répéterest plus naturel. - Erreur 4. En Python, oublier le
breakà la fin dewhile True:→ boucle infinie réelle.
3. Quiz de vérification
Répéter…Jusqu'à (5 questions)
Combien de fois MINIMUM s'exécute le corps d'une boucle Répéter…Jusqu'à ?
Dans Répéter … Jusqu'à condition, on sort quand condition vaut :
Quel est l'équivalent Python le plus direct de Répéter…Jusqu'à condition ?
Cas d'usage le PLUS typique de Répéter…Jusqu'à au bac :
Différence essentielle entre Pour et Répéter ?
En résumé
Avant la leçon 2.2 (Tant que…Faire), assurez-vous de pouvoir :
- ✅ Écrire un Répéter…Jusqu'à correct en algorithmique sans confondre la sémantique d'arrêt,
- ✅ Le traduire en Python avec
while True / break, - ✅ Reconnaître un cas où Répéter est plus naturel que Pour,
- ✅ Construire une validation de saisie en moins de 5 minutes.
Notez que la leçon 2.3 vous donnera un arbre de décision clair pour choisir entre Pour / Tant que / Répéter. Patience.