Aller au contenu principal

Ch. 02 · Leçon 1

La structure Répéter…Jusqu'à

240 minanalyse · python
Affichage du code

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

  1. Au moins une exécution garantie avant le premier test.
  2. Condition d'arrêt (on sort quand elle devient vraie).
  3. Émulation Python : while True / break (Python n'a pas de do…while natif).
  4. 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 :

  1. Exécuter les instructions.
  2. Évaluer condition_d_arret.
  3. 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

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)

1.5 Trace d'exécution

Énoncé. L'utilisateur saisit successivement -3, 0, 15, 7. Trace de la boucle ci-dessus :

Trace d'exécution
0 / 8
Instructionmoissortie
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èrePourRépéter
Nombre d'itérationsConnu à l'avanceInconnu à l'avance
Corps exécuté au moins une foisPas forcément (si début > fin)Toujours
TestImplicite (compteur ≤ fin)Explicite (Jusqu'à)
Cas d'usageParcours d'intervallesValidation, jeu avec essais limités

2. Exercices pratiques

Niveau Débutant — Type bac courant

Exercice 1facile
Saisir un entier strictement positif

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

Exercice 2moyen
Devinez le nombre

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)

Exercice 3difficile
Calcul du PGCD par soustractions successives

Implémenter l'algorithme d'Euclide par soustractions pour calculer le PGCD de deux entiers strictement positifs a et b :

Tant que a et b sont 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érationabAction
Init4818
13018a > b → a ← a-b
21218a > b → a ← a-b
3126b > a → b ← b-a
466a > b → a ← a-b
Sortie66a = 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 que quand il faut au moins une exécution (saisie utilisateur, validation). Répéter est plus naturel.
  • Erreur 4. En Python, oublier le break à la fin de while True: → boucle infinie réelle.

3. Quiz de vérification

Répéter…Jusqu'à (5 questions)

1

Combien de fois MINIMUM s'exécute le corps d'une boucle Répéter…Jusqu'à ?

2

Dans Répéter … Jusqu'à condition, on sort quand condition vaut :

3

Quel est l'équivalent Python le plus direct de Répéter…Jusqu'à condition ?

4

Cas d'usage le PLUS typique de Répéter…Jusqu'à au bac :

5

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.

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