Ch. 02 · Leçon 2
La structure Tant que…Faire
Ce que vous saurez faire
- Décrire le fonctionnement de Tant que…Faire
- Écrire une boucle Tant que en Analyse et Python
- Différencier Tant que de Répéter sur leur condition de continuation/d'arrêt
- Concevoir un algorithme dont le corps peut ne JAMAIS s'exécuter
Plan de cours
Tester d'abord, agir ensuite : le contrat strict
Deuxième structure itérative à condition d'arrêt, Tant que est sans doute la plus polyvalente. À la différence de Répéter, elle peut ne pas exécuter le corps du tout.
Concepts clés
- Test avant action : la condition est évaluée au début.
- Condition de continuation (vrai = on continue, faux = on sort).
- Traduction directe :
Tant que↔while(Python). - Boucle infinie : risque majeur si la condition ne change jamais.
Avant de commencer
- Q1. Si la condition d'un Tant que est fausse au premier test, combien de fois le corps s'exécute-t-il ?
- Q2. Quelle est la différence entre une condition d'arrêt et une condition de continuation ?
- Q3. Qu'est-ce qu'une « boucle infinie » ?
1. Le contenu du cours
1.1 Analogie : la file d'attente
Vous arrivez à un guichet :
Tant qu'il reste des personnes devant vous, attendre.
Si vous arrivez et qu'il n'y a personne devant vous, vous n'attendez pas du tout. C'est exactement le contrat de Tant que…Faire : la condition est testée avant d'entrer dans la boucle.
1.2 La structure Tant que
Forme algorithmique
Tant que condition_de_continuation Faire
instructions
FinTantQue
Sémantique :
- Évaluer
condition_de_continuation. - Si faux → sortir sans exécuter le corps.
- Si vrai → exécuter
instructionspuis retourner en 1.
1.3 Traduction Python directe
Python a un while natif équivalent terme à terme :
i ← 1
Tant que i <= 5 Faire
Écrire(i)
i ← i + 1
FinTantQue
i ← 1
Tant que i <= 5 Faire
Écrire(i)
i ← i + 1
FinTantQue
i = 1
while i <= 5:
print(i)
i = i + 1
Sortie : 1 2 3 4 5. Quand i devient 6, la condition i <= 5 devient fausse → sortie.
1.4 Le piège classique : la boucle infinie
Une boucle infinie se produit quand la condition de continuation ne devient jamais fausse. Ces deux exemples bouclent à l'infini :
# Cas 1 : on oublie de mettre à jour la variable de la condition
i = 1
while i <= 5:
print(i)
# i = i + 1 ← OUBLIÉ !
# Cas 2 : on modifie dans le mauvais sens
i = 1
while i <= 5:
print(i)
i = i - 1 # devrait être i + 1
1.5 Cas canonique : itération sur une condition complexe
Exemple — Compter les chiffres d'un entier positif
n = int(input("Entier > 0 : "))
nb_chiffres = 0
while n > 0:
n = n // 10 # division entière par 10
nb_chiffres = nb_chiffres + 1
print("Nombre de chiffres :", nb_chiffres)
Trace avec n = 4789 :
| Itération | n | nb_chiffres |
|---|---|---|
| Init | 4789 | 0 |
| 1 | 478 | 1 |
| 2 | 47 | 2 |
| 3 | 4 | 3 |
| 4 | 0 | 4 |
| Test n > 0 → faux | 0 | 4 (sortie) |
4789 contient 4 chiffres ✓
1.6 Trace d'exécution interactive
| N° | Instruction | n | nb_chiffres |
|---|---|---|---|
| 01 | ··· | ? | ? |
| 02 | ··· | ? | ? |
| 03 | ··· | ? | ? |
| 04 | ··· | ? | ? |
| 05 | ··· | ? | ? |
| 06 | ··· | ? | ? |
1.7 Tant que vs Répéter — comparaison serrée
| Critère | Tant que | Répéter |
|---|---|---|
| Test | Avant le corps | Après le corps |
| Condition | Continuation (vrai → on continue) | Arrêt (vrai → on sort) |
| Corps exécuté si condition initialement fausse | 0 fois | 1 fois |
| Mot-clé Python | while natif | Émulé avec while True / break |
| Cas typique | Parcours conditionnel | Validation de saisie |
2. Exercices pratiques
Niveau Débutant — Type bac courant
Lire des entiers au clavier jusqu'à saisie de 0 (la valeur sentinelle). Afficher la somme de tous les entiers saisis avant le 0.
Voir le corrigé
S = 0
n = int(input("Entier (0 pour finir) : "))
while n != 0:
S = S + n
n = int(input("Entier (0 pour finir) : "))
print("Somme =", S)
Détails.
- La saisie initiale avant la boucle est obligatoire : sans elle, la première condition de Tant que n'aurait pas de valeur à tester.
- Si l'utilisateur tape
0du premier coup, le corps n'est jamais exécuté etS = 0est affiché. C'est exactement le comportement voulu.
Niveau Intermédiaire — Type bac difficile
Lire un entier positif n et afficher son inverse. Par exemple, pour n = 4789, afficher 9874.
Indice. Utiliser une boucle Tant que avec n % 10 (dernier chiffre) et n // 10 (les autres).
Voir le corrigé
n = int(input("Entier > 0 : "))
inverse = 0
while n > 0:
chiffre = n % 10
inverse = inverse * 10 + chiffre
n = n // 10
print("Inverse :", inverse)
Trace avec n = 4789 :
| Iter | n | chiffre | inverse |
|---|---|---|---|
| 1 | 4789 → 478 | 9 | 0 × 10 + 9 = 9 |
| 2 | 478 → 47 | 8 | 9 × 10 + 8 = 98 |
| 3 | 47 → 4 | 7 | 98 × 10 + 7 = 987 |
| 4 | 4 → 0 | 4 | 987 × 10 + 4 = 9874 |
Inverse de 4789 = 9874 ✓
Bonus. En combinant cet algorithme avec une comparaison à n initial, vous obtenez un détecteur de palindromes numériques : 12321 est un palindrome, 12345 non.
Niveau Avancé — Hors bac (bonus)
La suite de Collatz part d'un entier n > 0 et applique :
- si
nest pair →n ← n / 2, - si
nest impair →n ← 3 × n + 1.
On s'arrête quand n atteint 1. La conjecture (non démontrée à ce jour) affirme que la suite atteint toujours 1, quel que soit le départ.
Questions.
- Écrire un programme qui lit
net affiche toutes les valeurs intermédiaires jusqu'à 1. - Afficher également le nombre d'étapes et la valeur maximale atteinte.
Voir le corrigé
n = int(input("n > 0 : "))
etapes = 0
maximum = n
print(n, end=" ")
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
etapes = etapes + 1
if n > maximum:
maximum = n
print(n, end=" ")
print() # retour à la ligne final
print(f"{etapes} étapes, maximum atteint : {maximum}")
Test pour n = 6 :
6 3 10 5 16 8 4 2 1
8 étapes, maximum atteint : 16
Test pour n = 27 :
27 82 41 124 62 31 ... 1
111 étapes, maximum atteint : 9232
Remarque culturelle. La conjecture de Collatz (ou « problème de Syracuse ») reste non résolue depuis 1937. Personne ne sait prouver qu'elle se termine pour tout entier — mais on a vérifié par ordinateur jusqu'à 10^20. Si vous trouvez un contre-exemple, vous deviendrez célèbre.
⚠️ Erreurs fréquentes au bac
Avant le quiz, mémorisez ces pièges classiques qui font perdre des points :
- Erreur 1. Oublier d'initialiser la variable testée AVANT le
Tant que. SinonNameErrorau premier test. - Erreur 2. Mise à jour de la variable manquante dans le corps → boucle infinie classique.
- Erreur 3. Confondre
Tant que x ≠ 0(continue tant que x non-nul) etTant que x = 0(continue tant que x nul). Sens opposés. - Erreur 4. Penser que le corps s'exécute au moins une fois. FAUX : si la condition est fausse au départ, 0 exécution.
3. Quiz de vérification
Tant que…Faire (5 questions)
Combien de fois MINIMUM s'exécute le corps d'une boucle Tant que…Faire ?
Dans Tant que condition Faire ... FinTantQue, on continue d'itérer quand condition vaut :
Quel est l'équivalent Python natif de Tant que ?
Quelle est la cause principale d'une boucle infinie en Tant que ?
Pour convertir Répéter A Jusqu'à C en Tant que, on écrit :
En résumé
Avant la leçon 2.3 (Comment choisir entre Pour, Tant que et Répéter), assurez-vous de :
- ✅ Reconnaître qu'une boucle Tant que peut ne jamais s'exécuter,
- ✅ Détecter une potentielle boucle infinie en relisant un code,
- ✅ Traduire fluidement entre
Tant quealgorithmique etwhilePython, - ✅ Savoir utiliser une valeur sentinelle pour signaler la fin de saisie.
La prochaine leçon vous donnera un arbre de décision clair pour choisir la bonne structure de boucle face à un énoncé.