Aller au contenu principal

Ch. 02 · Leçon 2

La structure Tant que…Faire

240 minanalyse · python
Affichage du code

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

  1. Test avant action : la condition est évaluée au début.
  2. Condition de continuation (vrai = on continue, faux = on sort).
  3. Traduction directe : Tant quewhile (Python).
  4. 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 :

  1. Évaluer condition_de_continuation.
  2. Si faux → sortir sans exécuter le corps.
  3. Si vrai → exécuter instructions puis 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

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érationnnb_chiffres
Init47890
14781
2472
343
404
Test n > 0 → faux04 (sortie)

4789 contient 4 chiffres

1.6 Trace d'exécution interactive

Trace d'exécution
0 / 6
Instructionnnb_chiffres
01···??
02···??
03···??
04···??
05···??
06···??

1.7 Tant que vs Répéter — comparaison serrée

CritèreTant queRépéter
TestAvant le corpsAprès le corps
ConditionContinuation (vrai → on continue)Arrêt (vrai → on sort)
Corps exécuté si condition initialement fausse0 fois1 fois
Mot-clé Pythonwhile natifÉmulé avec while True / break
Cas typiqueParcours conditionnelValidation de saisie

2. Exercices pratiques

Niveau Débutant — Type bac courant

Exercice 1facile
Somme avec valeur sentinelle

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.

  1. La saisie initiale avant la boucle est obligatoire : sans elle, la première condition de Tant que n'aurait pas de valeur à tester.
  2. Si l'utilisateur tape 0 du premier coup, le corps n'est jamais exécuté et S = 0 est affiché. C'est exactement le comportement voulu.

Niveau Intermédiaire — Type bac difficile

Exercice 2moyen
Inverser un entier

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 :

Iternchiffreinverse
14789 → 47890 × 10 + 9 = 9
2478 → 4789 × 10 + 8 = 98
347 → 4798 × 10 + 7 = 987
44 → 04987 × 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)

Exercice 3difficile
Suite de Collatz

La suite de Collatz part d'un entier n > 0 et applique :

  • si n est pair → n ← n / 2,
  • si n est 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.

  1. Écrire un programme qui lit n et affiche toutes les valeurs intermédiaires jusqu'à 1.
  2. 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. Sinon NameError au 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) et Tant 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)

1

Combien de fois MINIMUM s'exécute le corps d'une boucle Tant que…Faire ?

2

Dans Tant que condition Faire ... FinTantQue, on continue d'itérer quand condition vaut :

3

Quel est l'équivalent Python natif de Tant que ?

4

Quelle est la cause principale d'une boucle infinie en Tant que ?

5

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 que algorithmique et while Python,
  • ✅ 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é.

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.