Séance 3 — Les boucles

Répéter une action, compter, accumuler, s’arrêter

Dr. El Hadji Bassirou TOURÉ

Département de Mathématiques et Informatique, Faculté des Sciences et Techniques, Université Cheikh Anta Diop de Dakar

Objectifs de la séance

Ce que la séance construit

La boucle, instruction qui répète un bloc tant qu’une condition le demande : ses trois formes (TantQue, Pour, Répéter … Jusqu’à), les deux usages qui reviennent partout (compter, accumuler), les deux erreurs les plus fréquentes (la boucle qui ne s’arrête pas, le tour en trop ou en moins) et les boucles placées l’une dans l’autre. Chaque algorithme est suivi pas à pas : la ligne exécutée, l’état des variables, ce qu’écrit Écrire.

  • Dérouler à la main une boucle TantQue, Pour ou Répéter dans un tableau d’état des variables.
  • Repérer l’initialisation, la condition, le corps et la progression d’une boucle.
  • Écrire un compteur et un accumulateur avec la bonne valeur initiale.
  • Contrôler une saisie au clavier jusqu’à obtenir une valeur valide.
  • Reconnaître, par une trace, une boucle infinie et une erreur de décalage d’une unité {(off-by-one error)}.
  • Compter les tours de deux boucles imbriquées.

Les conventions du pseudo-code

écriture sens
\(x\leftarrow e\) \(x\) reçoit la valeur de l’expression \(e\) (lire « \(x\) reçoit »)
Lire n n reçoit la valeur tapée au clavier (une valeur par ligne)
Écrire "tour", i écrit les valeurs séparées par une espace, puis passe à la ligne : tour 1
\(=\)  \(\neq\)  \(<\)  \(\leq\)  \(>\)  \(\geq\) ; ET, OU, NON comparaisons et connecteurs logiques (résultat vrai ou faux)
\(+\)  \(-\)  \(\times\)  \(/\) ; div, mod opérations ; quotient et reste de la division entière (\(7\) mod \(2=1\))
TantQue \(C\) Faire … FinTantQue test de \(C\) avant chaque tour ; de 0 à plusieurs tours
Pour \(i\) de \(a\) à \(b\) [pas \(p\)] Faire … FinPour \(i=a, a+p, \dots\) tant que \(i\leq b\) (\(i\geq b\) si \(p<0\)) ; pas de 1 par défaut
Répéter … Jusqu’à \(C\) corps exécuté, puis test ; sortie quand \(C\) est vraie ; au moins un tour
retrait de 2 espaces, mot de fin délimitent le corps d’une boucle ou d’un Si

Le compteur d’un Pour

Le corps ne le modifie pas ; sa valeur après FinPour n’est pas définie (un algorithme ne s’en sert pas) ; deux boucles imbriquées ont deux compteurs différents.

L’instruction TantQue

Une condition (Séance 2) exécute un bloc au plus une fois ; la boucle le répète.

{TantQue \(C\) Faire \(B\) FinTantQue}

Tant que \(C\) est vraie, exécuter le corps \(B\) (un tour) et tester de nouveau ; sinon, suite.

Lecture. Initialisation, condition, corps, progression ; seule la branche « faux » fait sortir.

Le comptage de 1 à \(n\), pas à pas

Tableau d’état : les 6 derniers pas.

Entrée au clavier : 3

Écrit par Écrire \(\rightarrow\)

tour 1
tour 2
tour 3
fin, i = 4

Lecture. Ligne 1 : Lire n ; l’entrée au clavier donne n \(=\) 3.

Lecture. Ligne 2 : i reçoit 1.

Lecture. Ligne 3 : test i ≤ n, soit 1 ≤ 3 : vrai ; le corps est exécuté.

Lecture. Ligne 4 : Écrire écrit « tour 1 ».

Lecture. Ligne 5 : i ← i + 1 : i passe de 1 à 2.

Lecture. Ligne 3 : test i ≤ n, soit 2 ≤ 3 : vrai ; le corps est exécuté.

Lecture. Ligne 4 : Écrire écrit « tour 2 ».

Lecture. Ligne 5 : i ← i + 1 : i passe de 2 à 3.

Lecture. Ligne 3 : test i ≤ n, soit 3 ≤ 3 : vrai ; le corps est exécuté.

Lecture. Ligne 4 : Écrire écrit « tour 3 ».

Lecture. Ligne 5 : i ← i + 1 : i passe de 3 à 4.

Lecture. Ligne 3 : test i ≤ n, soit 4 ≤ 3 : faux ; la boucle s’arrête ; suite à la ligne 7.

Lecture. Ligne 7 : Écrire écrit « fin, i = 4 ». Trois tours, quatre tests : le test du pas 12 (\(i=4\)) est le seul faux. Après la boucle, \(i\) vaut 4, la première valeur qui rend la condition fausse.

Le cas de zéro tour, pas à pas

Tableau d’état : les 8 derniers pas.

Entrée au clavier : 0

Écrit par Écrire \(\rightarrow\)

fin, i = 1

Lecture. Ligne 1 : Lire n ; l’entrée au clavier donne n \(=\) 0.

Lecture. Ligne 2 : i reçoit 1.

Lecture. Ligne 3 : test i ≤ n, soit 1 ≤ 0 : faux ; la boucle s’arrête ; suite à la ligne 7.

Lecture. Ligne 7 : Écrire écrit « fin, i = 1 ». Le premier test est faux : zéro tour, rien n’est écrit dans la boucle. Une boucle TantQue peut ne jamais exécuter son corps.

Exercice : déroulement d’une boucle TantQue

Lire versement
Lire objectif
total ← 0
semaine ← 0
TantQue total < objectif Faire
  semaine ← semaine + 1
  total ← total + versement
FinTantQue
Écrire semaine, total

Entrées : 7000 puis 30000

  1. Trace de semaine, total et du test (ligne 5).
  2. Nombre de tours ; ce qu’écrit la ligne 9.
  3. De combien le total dépasse-t-il l’objectif, et pourquoi ?
  4. Combien de fois la condition est-elle testée ?

Correction

test semaine total total \(<\) 30000
1 0 0 vrai
2 1 7000 vrai
3 2 14000 vrai
4 3 21000 vrai
5 4 28000 vrai
6 5 35000 faux
  1. Avant le premier tour, \(0<30000\) ; chaque tour ajoute 7 000 F.
  2. 5 tours ; la ligne 9 écrit 5 35000.
  3. \(35\,000-30\,000=5\,000\) F : le test n’a lieu qu’entre deux versements.
  4. 6 fois : 5 vrais, puis le faux qui arrête.

L’accumulateur, pas à pas : la somme \(1+2+\dots+n\)

Tableau d’état : les 8 derniers pas.

Entrée au clavier : 4

Écrit par Écrire \(\rightarrow\)

somme : 10

Lecture. Ligne 1 : Lire n ; l’entrée au clavier donne n \(=\) 4.

Lecture. Ligne 2 : s reçoit 0.

Lecture. Ligne 3 : i reçoit 1.

Lecture. Ligne 4 : test i ≤ n, soit 1 ≤ 4 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : s ← s + i : s passe de 0 à 1.

Lecture. Ligne 6 : i ← i + 1 : i passe de 1 à 2.

Lecture. Ligne 4 : test i ≤ n, soit 2 ≤ 4 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : s ← s + i : s passe de 1 à 3.

Lecture. Ligne 6 : i ← i + 1 : i passe de 2 à 3.

Lecture. Ligne 4 : test i ≤ n, soit 3 ≤ 4 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : s ← s + i : s passe de 3 à 6.

Lecture. Ligne 6 : i ← i + 1 : i passe de 3 à 4.

Lecture. Ligne 4 : test i ≤ n, soit 4 ≤ 4 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : s ← s + i : s passe de 6 à 10.

Lecture. Ligne 6 : i ← i + 1 : i passe de 4 à 5.

Lecture. Ligne 4 : test i ≤ n, soit 5 ≤ 4 : faux ; la boucle s’arrête ; suite à la ligne 8.

Lecture. Ligne 8 : Écrire écrit « somme : 10 ». \(s=1+2+3+4=10\). \(s\) part de 0, l’élément neutre de l’addition : c’est aussi le bon résultat si la boucle ne fait aucun tour.

Le compteur, pas à pas : les notes d’au moins 10

Tableau d’état : les 8 derniers pas.

Entrée au clavier : 3 ; 12 ; 8 ; 15

Écrit par Écrire \(\rightarrow\)

admis : 2

Lecture. Ligne 1 : Lire n ; l’entrée au clavier donne n \(=\) 3.

Lecture. Ligne 2 : admis reçoit 0.

Lecture. Ligne 3 : k reçoit 0.

Lecture. Ligne 4 : test k < n, soit 0 < 3 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : Lire note ; l’entrée au clavier donne note \(=\) 12.

Lecture. Ligne 6 : test du Si, 12 ≥ 10 : vrai ; le bloc Alors est exécuté.

Lecture. Ligne 7 : admis ← admis + 1 : admis passe de 0 à 1.

Lecture. Ligne 9 : k ← k + 1 : k passe de 0 à 1.

Lecture. Ligne 4 : test k < n, soit 1 < 3 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : Lire note ; l’entrée au clavier donne note \(=\) 8.

Lecture. Ligne 6 : test du Si, 8 ≥ 10 : faux ; le bloc est sauté.

Lecture. Ligne 9 : k ← k + 1 : k passe de 1 à 2.

Lecture. Ligne 4 : test k < n, soit 2 < 3 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : Lire note ; l’entrée au clavier donne note \(=\) 15.

Lecture. Ligne 6 : test du Si, 15 ≥ 10 : vrai ; le bloc Alors est exécuté.

Lecture. Ligne 7 : admis ← admis + 1 : admis passe de 1 à 2.

Lecture. Ligne 9 : k ← k + 1 : k passe de 2 à 3.

Lecture. Ligne 4 : test k < n, soit 3 < 3 : faux ; la boucle s’arrête ; suite à la ligne 11.

Lecture. Ligne 11 : Écrire écrit « admis : 2 ». admis n’augmente qu’aux tours où le test du Si est vrai (12 et 15) : 2 admis. k, lui, compte tous les tours et commande la boucle.

Le maximum, pas à pas

Tableau d’état : les 8 derniers pas.

Entrée au clavier : 3 ; 31 ; 35 ; 33

Écrit par Écrire \(\rightarrow\)

maximum : 35

Lecture. Ligne 1 : Lire n ; l’entrée au clavier donne n \(=\) 3.

Lecture. Ligne 2 : Lire x ; l’entrée au clavier donne x \(=\) 31.

Lecture. Ligne 3 : maxi reçoit x, soit 31.

Lecture. Ligne 4 : k reçoit 1.

Lecture. Ligne 5 : test k < n, soit 1 < 3 : vrai ; le corps est exécuté.

Lecture. Ligne 6 : Lire x ; l’entrée au clavier donne x \(=\) 35.

Lecture. Ligne 7 : test du Si, 35 > 31 : vrai ; le bloc Alors est exécuté.

Lecture. Ligne 8 : maxi ← x : maxi passe de 31 à 35.

Lecture. Ligne 10 : k ← k + 1 : k passe de 1 à 2.

Lecture. Ligne 5 : test k < n, soit 2 < 3 : vrai ; le corps est exécuté.

Lecture. Ligne 6 : Lire x ; l’entrée au clavier donne x \(=\) 33.

Lecture. Ligne 7 : test du Si, 33 > 35 : faux ; le bloc est sauté.

Lecture. Ligne 10 : k ← k + 1 : k passe de 2 à 3.

Lecture. Ligne 5 : test k < n, soit 3 < 3 : faux ; la boucle s’arrête ; suite à la ligne 12.

Lecture. Ligne 12 : Écrire écrit « maximum : 35 ». maxi est le plus grand des nombres déjà lus ; il part de la première valeur lue, non de 0.

Quoi, pourquoi, quand ça échoue : compter et accumuler

Quoi

Un compteur augmente de 1 à chaque tour où un événement se produit ; un accumulateur combine à chaque tour sa valeur avec une nouvelle donnée (\(+\) pour une somme, \(\times\) pour un produit, « le plus grand des deux » pour un maximum). Initialisés avant la boucle, mis à jour dans le corps, lus après.

Pourquoi la valeur initiale

Après \(k\) tours, l’accumulateur contient le résultat sur les \(k\) premières données (\(s_k=x_1+\dots+x_k\)) ; pour que ce soit vrai dès \(k=0\) (\(k=1\) pour un maximum), il part de l’élément neutre (0 pour une somme, 1 pour un produit) ou, pour un maximum, de la première donnée.

Quand ça échoue

Produit initialisé à 0 : il reste nul. Maximum initialisé à 0 sur \(-3\), \(-7\), \(-2\) : 0 au lieu de \(-2\). Initialisation placée dans le corps : remise à zéro à chaque tour.

L’instruction Pour

Dans la somme, les lignes \(i\leftarrow1\), \(i\leq n\) et \(i\leftarrow i+1\) font varier un compteur de 1 à \(n\) : quand le nombre de tours est connu avant d’entrer, Pour les réunit en une ligne.

{Pour \(i\) de \(a\) à \(b\) Faire \(B\) FinPour}

Exécuter \(B\) une fois pour chaque valeur entière de \(i\) de \(a\) à \(b\), bornes incluses, dans l’ordre croissant ; avec pas \(p\), \(i\) avance de \(p\) (compte à rebours si \(p<0\)).

Équivalence et nombre de tours

\[ \textbf{Pour}\ i\ \textbf{de}\ a\ \textbf{à}\ b\ \equiv\ i\leftarrow a~;\ \textbf{TantQue}\ i\leq b\ \textbf{Faire}\ \big(B~;\ i\leftarrow i+1\big) \]

\[ \text{tours}=\max(0,\ b-a+1) \text{(pas de 1)} \]

De 1 à 10 : 10 tours ; de 3 à 7 : \(7-3+1=5\) tours (3, 4, 5, 6, 7) ; de 1 à 0 : aucun tour.

Lecture. Pour rend impossible l’oubli de la progression : elle est faite par l’en-tête, après chaque tour. Le corps ne modifie pas le compteur.

La factorielle, pas à pas

Tableau d’état : les 8 derniers pas.

Entrée au clavier : 4

Écrit par Écrire \(\rightarrow\)

factorielle : 24

Lecture. Ligne 1 : Lire n ; l’entrée au clavier donne n \(=\) 4.

Lecture. Ligne 2 : f reçoit 1.

Lecture. Ligne 3 : Pour donne à i sa première valeur, 1 ; test 1 ≤ 4 : vrai ; un tour du corps.

Lecture. Ligne 4 : f ← f × i : f passe de 1 à 1.

Lecture. Ligne 3 : Pour augmente i : 2 ; test 2 ≤ 4 : vrai ; un tour du corps.

Lecture. Ligne 4 : f ← f × i : f passe de 1 à 2.

Lecture. Ligne 3 : Pour augmente i : 3 ; test 3 ≤ 4 : vrai ; un tour du corps.

Lecture. Ligne 4 : f ← f × i : f passe de 2 à 6.

Lecture. Ligne 3 : Pour augmente i : 4 ; test 4 ≤ 4 : vrai ; un tour du corps.

Lecture. Ligne 4 : f ← f × i : f passe de 6 à 24.

Lecture. Ligne 3 : Pour augmente i : 5 ; test 5 ≤ 4 : faux ; fin du Pour ; suite à la ligne 6.

Lecture. Ligne 6 : Écrire écrit « factorielle : 24 ». Pour gère seul le compteur (initialisation, test, augmentation) : 4 tours, 5 tests, \(f=1\times2\times3\times4=24\). \(f\) part de 1, l’élément neutre de la multiplication.

Exercice : une boucle Pour et un Si

s ← 0
Pour i de 1 à 6 Faire
  Si i mod 2 = 0 Alors
    s ← s + i
  FinSi
FinPour
Écrire s

Énoncé

  1. Donner, pour chaque tour, \(i\), le test \(i\) mod \(2=0\) et \(s\) après le tour.
  2. Qu’écrit la ligne 7 ?
  3. Combien de fois le test du Si est-il évalué ?
  4. Réécrire la boucle avec pas 2, sans Si ; combien de tours ?

Correction

\(i\) \(i\) mod \(2=0\) \(s\) après
1 faux 0
2 vrai 2
3 faux 2
4 vrai 6
5 faux 6
6 vrai 12
  1. \(s\) n’augmente qu’aux valeurs paires de \(i\).
  2. 12, soit \(2+4+6\).
  3. 6 fois, une par tour.
  4. Pour \(i\) de 2 à 6 pas 2 Faire \(s\leftarrow s+i\) : 3 tours (\(i=2,4,6\)), même résultat 12.

L’instruction Répéter … Jusqu’à

Pour lire une note valide, il faut d’abord la lire : la condition porte sur ce que produit le corps.

{Répéter \(B\) Jusqu’à \(C\)}

Exécuter \(B\), puis évaluer la condition de sortie \(C\) : vraie, la boucle s’arrête ; fausse, \(B\) recommence. Le corps est exécuté au moins une fois.

Lecture. Répéter \(B\) Jusqu’à \(C\) équivaut à \(B\) suivi de TantQue NON \(C\) Faire \(B\).

La saisie contrôlée, pas à pas

Tableau d’état : les 6 derniers pas.

Entrée au clavier : 25 ; -3 ; 14

Écrit par Écrire \(\rightarrow\)

invalide : 25
invalide : -3
note retenue : 14

Lecture. Ligne 1 : début du tour 1 de Répéter ; le corps s’exécute sans test préalable.

Lecture. Ligne 2 : Lire note ; l’entrée au clavier donne note \(=\) 25.

Lecture. Ligne 3 : test du Si, 25 < 0 OU 25 > 20 : vrai ; le bloc Alors est exécuté.

Lecture. Ligne 4 : Écrire écrit « invalide : 25 ».

Lecture. Ligne 6 : condition de sortie note ≥ 0 ET note ≤ 20, soit 25 ≥ 0 ET 25 ≤ 20 : faux ; un tour de plus.

Lecture. Ligne 1 : début du tour 2 de Répéter ; le corps s’exécute sans test préalable.

Lecture. Ligne 2 : Lire note ; l’entrée au clavier donne note \(=\) -3.

Lecture. Ligne 3 : test du Si, -3 < 0 OU -3 > 20 : vrai ; le bloc Alors est exécuté.

Lecture. Ligne 4 : Écrire écrit « invalide : -3 ».

Lecture. Ligne 6 : condition de sortie note ≥ 0 ET note ≤ 20, soit -3 ≥ 0 ET -3 ≤ 20 : faux ; un tour de plus.

Lecture. Ligne 1 : début du tour 3 de Répéter ; le corps s’exécute sans test préalable.

Lecture. Ligne 2 : Lire note ; l’entrée au clavier donne note \(=\) 14.

Lecture. Ligne 3 : test du Si, 14 < 0 OU 14 > 20 : faux ; le bloc est sauté.

Lecture. Ligne 6 : condition de sortie note ≥ 0 ET note ≤ 20, soit 14 ≥ 0 ET 14 ≤ 20 : vrai ; sortie de la boucle.

Lecture. Ligne 7 : Écrire écrit « note retenue : 14 ». Trois tours : 25 et \(-3\) font recommencer, 14 fait sortir. Le corps passe toujours avant le test : au moins une lecture.

La boucle infinie, pas à pas

Tableau d’état : les 6 derniers pas.

Écrit par Écrire \(\rightarrow\)

tour 1
tour 1
tour 1
tour 1
[...]

Lecture. Ligne 1 : i reçoit 1.

Lecture. Ligne 2 : test i ≤ 3, soit 1 ≤ 3 : vrai ; le corps est exécuté.

Lecture. Ligne 3 : Écrire écrit « tour 1 ».

Lecture. Ligne 2 : test i ≤ 3, soit 1 ≤ 3 : vrai ; le corps est exécuté.

Lecture. Ligne 3 : Écrire écrit « tour 1 ».

Lecture. Ligne 2 : test i ≤ 3, soit 1 ≤ 3 : vrai ; le corps est exécuté.

Lecture. Ligne 3 : Écrire écrit « tour 1 ».

Lecture. Ligne 2 : test i ≤ 3, soit 1 ≤ 3 : vrai ; le corps est exécuté.

Lecture. Ligne 3 : Écrire écrit « tour 1 ». Le pas 9 a le même état que le pas 3 : \(i\) reste 1, le test reste vrai. La boucle ne s’arrête jamais (trace interrompue ici) ; la ligne 5 n’est jamais atteinte.

Le décalage d’une unité, pas à pas

Tableau d’état : les 8 derniers pas.

Entrée au clavier : 4

Écrit par Écrire \(\rightarrow\)

somme : 6

Lecture. Ligne 1 : Lire n ; l’entrée au clavier donne n \(=\) 4.

Lecture. Ligne 2 : s reçoit 0.

Lecture. Ligne 3 : i reçoit 1.

Lecture. Ligne 4 : test i < n, soit 1 < 4 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : s ← s + i : s passe de 0 à 1.

Lecture. Ligne 6 : i ← i + 1 : i passe de 1 à 2.

Lecture. Ligne 4 : test i < n, soit 2 < 4 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : s ← s + i : s passe de 1 à 3.

Lecture. Ligne 6 : i ← i + 1 : i passe de 2 à 3.

Lecture. Ligne 4 : test i < n, soit 3 < 4 : vrai ; le corps est exécuté.

Lecture. Ligne 5 : s ← s + i : s passe de 3 à 6.

Lecture. Ligne 6 : i ← i + 1 : i passe de 3 à 4.

Lecture. Ligne 4 : test i < n, soit 4 < 4 : faux ; la boucle s’arrête ; suite à la ligne 8.

Lecture. Ligne 8 : Écrire écrit « somme : 6 ». Avec < au lieu de \(\leq\), le tour \(i=n\) manque : \(s=1+2+3=6\) au lieu de 10 (diapositive de la somme). La boucle s’arrête, sans erreur, un tour trop tôt.

Quoi, pourquoi, quand ça échoue : les boucles fautives

Quoi

Une boucle infinie ne rencontre jamais de test faux : progression oubliée, ou progression qui saute la valeur d’arrêt (\(i\leftarrow i+2\) avec TantQue \(i\neq10\) à partir de \(i=1\)). Une erreur de décalage d’une unité fait un tour de trop ou de moins (\(<\) au lieu de \(\leq\)).

Pourquoi elles passent inaperçues

L’algorithme respecte les règles d’écriture : il fait exactement ce qui est écrit, sans message d’erreur. Seule la comparaison avec une trace à la main, sur une petite entrée dont on connaît le résultat, les révèle.

Quand ça échoue encore : un réel comme compteur

En machine, les réels sont rangés en base 2 sur 64 bits : \(0{,}1\) ajouté dix fois à 0 donne \(0{,}9999999999999999\), et non 1 ; un test \(x\neq1\) ne devient jamais faux. Un compteur doit être entier ; préférer \(\leq\) ou \(<\) à \(\neq\) dans une condition d’arrêt.

Deux boucles imbriquées, pas à pas

Tableau d’état : les 6 derniers pas.

Écrit par Écrire \(\rightarrow\)

1 1
1 2
1 3
2 1
2 2
2 3

Lecture. Ligne 1 : Pour donne à i sa première valeur, 1 ; test 1 ≤ 2 : vrai ; un tour du corps.

Lecture. Ligne 2 : Pour donne à j sa première valeur, 1 ; test 1 ≤ 3 : vrai ; un tour du corps.

Lecture. Ligne 3 : Écrire écrit « 1 1 ».

Lecture. Ligne 2 : Pour augmente j : 2 ; test 2 ≤ 3 : vrai ; un tour du corps.

Lecture. Ligne 3 : Écrire écrit « 1 2 ».

Lecture. Ligne 2 : Pour augmente j : 3 ; test 3 ≤ 3 : vrai ; un tour du corps.

Lecture. Ligne 3 : Écrire écrit « 1 3 ».

Lecture. Ligne 2 : Pour augmente j : 4 ; test 4 ≤ 3 : faux ; fin du Pour ; retour à l’en-tête de la ligne 1.

Lecture. Ligne 1 : Pour augmente i : 2 ; test 2 ≤ 2 : vrai ; un tour du corps.

Lecture. Ligne 2 : Pour donne à j sa première valeur, 1 ; test 1 ≤ 3 : vrai ; un tour du corps.

Lecture. Ligne 3 : Écrire écrit « 2 1 ».

Lecture. Ligne 2 : Pour augmente j : 2 ; test 2 ≤ 3 : vrai ; un tour du corps.

Lecture. Ligne 3 : Écrire écrit « 2 2 ».

Lecture. Ligne 2 : Pour augmente j : 3 ; test 3 ≤ 3 : vrai ; un tour du corps.

Lecture. Ligne 3 : Écrire écrit « 2 3 ».

Lecture. Ligne 2 : Pour augmente j : 4 ; test 4 ≤ 3 : faux ; fin du Pour ; retour à l’en-tête de la ligne 1.

Lecture. Ligne 1 : Pour augmente i : 3 ; test 3 ≤ 2 : faux ; fin du Pour ; l’algorithme est terminé. Pour chaque valeur de \(i\), la boucle interne refait ses trois tours depuis \(j=1\) : \(2\times3=6\) écritures, dans l’ordre (1,1), (1,2), (1,3), (2,1), (2,2), (2,3).

Le nombre de tours de deux boucles imbriquées

Tours du corps intérieur

Pour \(i\) de 1 à \(n\), Pour \(j\) de 1 à \(m\) : \(n\times m\) tours ; Pour \(i\) de 1 à \(n\), Pour \(j\) de 1 à \(i\) : \(1+2+\dots+n=n(n+1)/2\) tours (la somme écrite à l’endroit puis à l’envers donne \(n\) colonnes de valeur \(n+1\)).

\(n=4\) ; encadrée en orange, la ligne \(i=3\) : un tour externe, pendant lequel la boucle interne fait 3 tours.

Lecture. \(n=10\) : 55 et 100 tours ; \(n=1000\) : \(500\,500\) et un million : croissance en \(n^2\).

Exercice : une double boucle triangulaire

Pour i de 1 à 3 Faire
  Pour j de 1 à i Faire
    Écrire i, j
  FinPour
FinPour

Énoncé

  1. Donner les lignes écrites, dans l’ordre.
  2. Combien de fois la ligne 3 est-elle exécutée ? Vérifier avec \(n(n+1)/2\), avec \(n=3\).
  3. Même question si la ligne 2 devient Pour \(j\) de 1 à \(i-1\).
  4. Pour \(i\) de 1 à \(n\), combien de tours dans chaque cas ?

Correction

\(i\) \(j\) de 1 à \(i\) lignes écrites
1 1 1 1
2 1, 2 2 1, 2 2
3 1, 2, 3 3 1, 3 2, 3 3
  1. Six lignes : 1 1, 2 1, 2 2, 3 1, 3 2, 3 3.
  2. \(1+2+3=6\) fois \(=3\times4/2\).
  3. \(0+1+2=3\) fois : 2 1, 3 1, 3 2 ; pour \(i=1\), la boucle de 1 à 0 ne fait aucun tour.
  4. \(n(n+1)/2\) avec « à \(i\) », \(n(n-1)/2\) avec « à \(i-1\) » : une borne décalée d’une unité retire \(n\) tours.

À retenir

boucle test tours au moins quand l’utiliser
TantQue \(C\) Faire … FinTantQue avant le corps 0 nombre de tours inconnu à l’entrée
Pour \(i\) de \(a\) à \(b\) Faire … FinPour avant le corps 0 nombre de tours connu : \(\max(0,b-a+1)\) (pas de 1)
Répéter … Jusqu’à \(C\) après le corps 1 la condition porte sur ce que produit le corps (saisie)

À retenir

  • Quatre éléments : initialisation, condition, corps, progression ; arrêt à un test faux.
  • Compteur, accumulateur : initialisés avant la boucle (0 pour une somme, 1 pour un produit, première donnée pour un maximum).
  • Une trace à la main révèle la boucle infinie et le décalage d’une unité.
  • Imbrication : la boucle interne s’exécute en entier à chaque tour externe (\(n\times m\) ou \(n(n+1)/2\) tours).

Prochaine séance

Séance 4 — Les tableaux

Un tableau range plusieurs valeurs de même type sous un seul nom, chacune repérée par un indice. Le lire, l’écrire, chercher son maximum ou sa somme, c’est parcourir ses indices par une boucle Pour : les compteurs, les accumulateurs et les bornes de cette séance s’appliquent case par case, et un décalage d’une unité devient un accès hors du tableau.

À préparer : refaire à la main les traces de la somme, du compteur et de la saisie contrôlée avec d’autres entrées.

Références

  • Cormen — Algorithms Unlocked, MIT Press, 2013 (ch. 2, « How to Describe and Evaluate Computer Algorithms »).
  • Bhargava — Grokking Algorithms, 2e éd., Manning, 2024.
  • Cormen, Leiserson, Rivest, Stein — Introduction to Algorithms, 4e éd., MIT Press, 2022 (ch. 2, « Getting Started », § 2.1 : invariant de boucle).
  • Notes de cours en ligne : CS50 (Harvard), 6.100A (MIT), CS106A (Stanford), séances sur les boucles.