Retour au cours

Supplément - Cours 5

Le déroulement d'une boucle

Exécuter une boucle à la main, tour par tour

Dérouler, c'est quoi ?

Dérouler une boucle, c'est faire à la main ce que fait Python : exécuter le corps de la boucle un tour à la fois, en notant après chaque tour la valeur de chaque variable.

On note tout dans une table de trace : une ligne par tour, une colonne par variable.

Comprendre

Voir pourquoi le programme affiche ce qu'il affiche.

Prévoir

Trouver la sortie d'un code sans l'exécuter (examens !).

Déboguer

Trouver le tour exact où une variable prend une mauvaise valeur.

La table de trace

Chaque colonne a un rôle précis :

TourVariablesCondition testéeSortie
numéro du tour : 1, 2, 3...valeur de chaque variable après le tourle test et son résultat, Vrai ou Fauxce que print affiche pendant le tour
  • Une ligne « départ » note les valeurs avant la boucle.
  • Pour un while, on note aussi le dernier test, celui qui est faux et qui fait sortir.
  • Pour un for, il n'y a pas de condition : la boucle s'arrête quand range n'a plus de valeurs.

Dérouler un for

Code

for i in range(5): print(i)

range(5) fournit 0, 1, 2, 3, 4 : cinq tours, et i ne vaut jamais 5.

Table de trace

TouriSortie
100
211
322
433
544
finrange(5) est épuisé

Dérouler un for avec un calcul

Code

for i in range(1, 6): carre : int = i * i print(carre)

La borne de fin est exclue : range(1, 6) s'arrête à 5.

Table de trace

TouricarreSortie
1111
2244
3399
441616
552525
finaprès 5

Dérouler un while

Code

i : int = 0 while i < 3: print(i) i += 1

La condition est testée 4 fois pour 3 tours : le dernier test, faux, fait sortir de la boucle.

Table de trace

TouriCondition testéeSortie
10 → 10 < 3 : Vrai0
21 → 21 < 3 : Vrai1
32 → 32 < 3 : Vrai2
sortie33 < 3 : Fauxfin de la boucle

Les accumulateurs

Une variable qui grossit à chaque tour

La sommation, déroulée

Code (R05)

n : int = int(input("Veuillez entrer le nombre maximum à additionner: ")) i : int = 1 somme : int = 0 while i <= n: somme = somme + i i = i + 1 print(f"La somme des entiers de 1 à {n} est {somme}")

Table de trace

TourisommeCondition testée
départ10
1211 <= 5 : Vrai
2332 <= 5 : Vrai
3463 <= 5 : Vrai
45104 <= 5 : Vrai
56155 <= 5 : Vrai
sortie6156 <= 5 : Faux

Sortie, avec la saisie 5

[Veuillez entrer le nombre maximum à additionner: 5] La somme des entiers de 1 à 5 est 15

La factorielle, déroulée

Code (R05, exercice 1)

nombre : int = int(input( "Veuillez saisir un nombre: ")) resultat : int = 1 print("Démarche des calculs:") for i in range(1, nombre + 1): ancien_resultat : int = resultat resultat = resultat * i print(f"{ancien_resultat} x {i} = {resultat}")

ancien_resultat garde la valeur d'avant la multiplication, sinon on ne pourrait plus l'afficher.

Table de trace (saisie : 5)

Touriancien_resultatresultatSortie
départ1
11111 x 1 = 1
22121 x 2 = 2
33262 x 3 = 6
446246 x 4 = 24
552412024 x 5 = 120

Fibonacci, déroulé

Code (R05, exercice 2)

f0 : int = 0 f1 : int = 1 nombreIterations : int = int(input( "Veuillez saisir un nombre: ")) resultat : str = "" for i in range(nombreIterations + 1): resultat += f"{f0} " ftemp : int = f0 f0 = f1 f1 = ftemp + f1 print(resultat)

Table de trace (saisie : 5)

iftempf0f1resultat
départ01""
0011"0 "
1112"0 1 "
2123"0 1 1 "
3235"0 1 1 2 "
4358"0 1 1 2 3 "
55813"0 1 1 2 3 5 "

Sortie : 0 1 1 2 3 5

Le piège de l'échange de valeurs

Pourquoi ftemp ? Déroulons la boucle sans lui :

for i in range(nombreIterations + 1): resultat += f"{f0} " f0 = f1 f1 = f0 + f1 # f0 est déjà écrasé !

Dès le premier tour, f1 vaut le double de f0 : on obtient les puissances de 2, pas Fibonacci. ftemp met l'ancienne valeur de côté avant qu'elle soit écrasée.

if0f1resultat
départ01""
012"0 "
124"0 1 "
248"0 1 2 "
3816"0 1 2 4 "
41632"0 1 2 4 8 "
53264"0 1 2 4 8 16 "

Sortie : 0 1 2 4 8 16 au lieu de 0 1 1 2 3 5

La boucle infinie, déroulée

Code (R05)

i : int = 0 n : int = 15 while i < n: print(i)

En déroulant, on le voit tout de suite : la ligne se répète à l'identique. Aucune variable de la condition ne change, donc le test ne deviendra jamais faux.

Table de trace

TouriCondition testéeSortie
100 < 15 : Vrai0
200 < 15 : Vrai0
300 < 15 : Vrai0
400 < 15 : Vrai0
...toujours 0toujours Vrai...

À vous de dérouler

Remplir la table avant de dévoiler

Exercice #1

Déroulez ce code dans une table de trace. Quelle sera la sortie ?

Code

x : int = 1 for i in range(4): x = x * 2 print(x)

Table de trace (avancer pour dévoiler)

TourixSortie
départ1
1022
2144
3288
431616

Exercice #2

Déroulez ce code. Combien de tours ? Quelle est la valeur de compte à la sortie ?

Code

compte : int = 10 while compte > 0: print(compte) compte = compte - 3

4 tours, et compte sort à -2 : la condition compte > 0 ne cherche pas à tomber pile sur 0.

Table de trace (avancer pour dévoiler)

TourcompteCondition testéeSortie
110 → 710 > 0 : Vrai10
27 → 47 > 0 : Vrai7
34 → 14 > 0 : Vrai4
41 → -21 > 0 : Vrai1
sortie-2-2 > 0 : Fauxfin de la boucle

La méthode en 4 étapes

Tracer la table : une colonne par variable, plus Condition testée et Sortie.
Écrire la ligne départ : les valeurs avant la boucle.
Pour chaque tour : tester la condition, exécuter le corps ligne par ligne, noter les nouvelles valeurs et ce qui s'affiche.
S'arrêter quand le test est Faux (ou quand range est épuisé) et noter cette dernière ligne.

Pour vérifier ton déroulement

Déroule d'abord à la main, puis compare avec les visualisateurs du site :

Déroulé pas-à-pas

Tape ta boucle : la table de trace se remplit tour par tour, avec la condition réévaluée à chaque fois.

Ouvrir le déroulé pas-à-pas

Mémoire pas-à-pas

Factorielle, Fibonacci, accumulateurs : l'état de la mémoire après chaque ligne, en lecture automatique ou ligne par ligne.

Ouvrir la mémoire pas-à-pas