Algorithmique 1 · C2 Boucles et tableaux · Chapitre 1 · 25 min
Boucles
Choisir entre Pour et Tant que, maîtriser le compteur et l'accumulateur.
Écrire cent fois la même ligne n'est pas une option. La boucle est la construction qui permet à quinze lignes d'algorithme de traiter un million de données — et c'est précisément ce qui rend une machine utile.
Tant que : répéter jusqu'à ce que la condition tombe
TantQue condition Faire ...instructions...FinTantQueLe mécanisme tient en trois temps, et l'ordre compte. On évalue la condition. Si elle est
VRAIE, on exécute le corps, puis on revient au test. Si elle est FAUSSE, on saute
directement après le FinTantQue.
Conséquence importante : le test a lieu avant le corps. Si la condition est fausse dès le départ, le corps n'est jamais exécuté. Zéro tour est un résultat parfaitement normal, et souvent le comportement correct — une boucle qui traite les éléments d'une liste vide ne doit rien faire.
Compteur et accumulateur
Presque toute boucle utile met en scène deux rôles distincts, qu'il faut apprendre à distinguer.
Le compteur sait où on en est : i ← i + 1 à chaque tour. Il ne dépend pas du contenu
traité, seulement du nombre de tours effectués.
L'accumulateur garde la mémoire de ce qui a été traité : somme ← somme + i. Sa valeur
finale est le résultat de l'algorithme.
Les deux doivent être initialisés avant la boucle. Et cette initialisation n'est pas arbitraire : un accumulateur de somme part de 0, l'élément neutre de l'addition ; un accumulateur de produit part de 1. Partir de 0 pour un produit donnerait invariablement 0.
Animation · 16 étapes
Somme des entiers de 1 à 4 avec une boucle Tant que
- Le compteur démarre à 1 — i compte les tours. Il doit exister AVANT la boucle : une variable créée dans le corps repartirait de zéro à chaque tour.
- L'accumulateur démarre à 0 — 0 est l'élément neutre de l'addition : il ne fausse pas le total. Pour un produit, on initialiserait à 1.
- Tour 1 — test : 1 ≤ 4 ? VRAI — Le test a lieu AVANT le corps. S'il était faux dès le départ, le corps ne serait jamais exécuté — zéro tour est un résultat parfaitement valide.
- Tour 1 — on accumule : 0 + 1 = 1 — somme ← somme + i : on relit somme, on ajoute i, on range le tout dans somme.
- Tour 1 — on avance : i passe à 2 — La ligne la plus oubliée du cours. Sans elle, i resterait à 1, le test resterait vrai, et la boucle tournerait indéfiniment.
- Tour 2 — test : 2 ≤ 4 ? VRAI — Retour en haut de la boucle. Le test est réévalué avec les valeurs actuelles.
- Tour 2 — on accumule : 1 + 2 = 3 — L'accumulateur garde la mémoire des tours précédents.
- Tour 2 — on avance : i passe à 3 — Le compteur, lui, ne dépend pas du contenu traité.
- Tour 3 — test : 3 ≤ 4 ? VRAI — Même schéma : test, corps, avancement.
- Tour 3 — on accumule : 3 + 3 = 6 — Les deux 3 n'ont rien à voir : l'un est somme, l'autre est i.
- Tour 3 — on avance : i passe à 4 — Encore un tour possible.
- Tour 4 — test : 4 ≤ 4 ? VRAI — L'égalité passe, car ≤ inclut 4. Avec < on ferait un tour de moins et la somme vaudrait 6 : c'est l'erreur « à un près » la plus courante.
- Tour 4 — on accumule : 6 + 4 = 10 — Dernier ajout.
- Tour 4 — on avance : i passe à 5 — C'est cet avancement qui va faire échouer le test et arrêter la boucle.
- Test : 5 ≤ 4 ? FAUX — on sort — Le corps n'est pas exécuté cette fois. On saute au FinTantQue. Notez que i vaut 5 après la boucle, pas 4.
- On affiche le total — 1 + 2 + 3 + 4 = 10. Quatre tours pour quatre valeurs.
Cliquez l'étape 5, puis l'étape 15. Entre les deux, le même bloc de trois lignes a été
parcouru quatre fois — c'est exactement ce que « boucle » veut dire. Et remarquez l'étape
15 : i vaut 5 à la sortie, pas 4. Le compteur dépasse toujours d'un cran la dernière
valeur traitée, puisque c'est ce dépassement qui fait échouer le test et arrête la boucle.
Quiz · 1 question
Dans la trace, pourquoi la boucle s'arrête-t-elle après le quatrième tour ?
- Parce que somme a atteint 10
- Parce que i vaut 5 et que le test 5 ≤ 4 est FAUX
- Parce qu'une boucle Tant que fait toujours quatre tours
Réponse : Seule la condition décide. C'est l'incrément de i qui finit par la rendre fausse : la boucle s'arrête parce qu'elle a été construite pour progresser vers son propre arrêt.
La boucle infinie
Retirez la ligne i ← i + 1 de la trace précédente. i reste à 1, le test 1 ≤ 4 reste
vrai, et la boucle tourne pour toujours. C'est l'erreur la plus courante du semestre, et
elle viole la première exigence de la leçon 1 : la finitude.
La règle de relecture est simple : le corps de la boucle doit contenir quelque chose qui fait progresser la condition vers FAUX. Si vous ne trouvez pas cette instruction, la boucle ne s'arrêtera pas.
Quiz · 1 question
Que fait cet algorithme : i ← 10 ; TantQue i > 0 Faire ; Écrire(i) ; i ← i + 1 ; FinTantQue ?
- Il affiche 10, 9, 8… jusqu'à 1
- Il n'affiche rien
- Il affiche 10, 11, 12… indéfiniment
Réponse : L'incrément va dans le mauvais sens : i s'éloigne de la condition d'arrêt au lieu de s'en rapprocher. Il fallait i ← i − 1. Une boucle infinie n'est pas forcément une boucle sans incrément.
Pour : quand le nombre de tours est connu d'avance
Pour i de 1 à 4 Faire somme ← somme + iFinPourCette boucle fait exactement la même chose que la trace ci-dessus, en trois lignes au lieu
de sept. Le Pour regroupe au même endroit l'initialisation du compteur, le test et
l'incrément — ce qui rend l'oubli de l'incrément impossible. C'est sa vraie qualité,
bien plus que la concision.
Les bornes sont incluses des deux côtés : Pour i de 1 à 4 fait quatre tours, avec i
valant successivement 1, 2, 3 puis 4.
Le choix entre les deux se fait sur une seule question : sait-on compter les tours avant d'entrer dans la boucle ?
| Situation | Boucle |
|---|---|
| Parcourir les 20 cases d'un tableau | Pour |
| Répéter 10 fois une opération | Pour |
| Lire des données jusqu'au mot « fin » | TantQue |
| Redemander une saisie tant qu'elle est invalide | TantQue |
Tout Pour peut se réécrire en TantQue ; l'inverse est faux. Un Pour est un TantQue
discipliné.
Quiz · 1 question
Combien de tours fait Pour i de 0 à 9 Faire … FinPour ?
- 9 — bornes exclues
- 10 — bornes incluses
- 11 — une borne comptée deux fois
Réponse : Les deux bornes sont incluses : i prend les valeurs 0, 1, …, 9, soit dix valeurs. La formule générale est fin − début + 1. Compter les tours d'une boucle est la première étape de la leçon 8.
Cette somme des entiers de 1 à a d'ailleurs une formule fermée, connue depuis l'Antiquité :
Elle donne le même résultat que la boucle, mais en une seule opération au lieu de . Gardez-la en tête : nous la retrouverons à la leçon 8, quand il s'agira de compter le travail d'un algorithme de tri.
À vous
Exercice de code
Écrivez la somme de 1 à n des deux façons, puis vérifiez qu'elles donnent le même résultat.
Point de départ
// 1. Corrigez la boucle Tant que pour qu'elle somme les entiers de 1 à n.
// 2. Écrivez ensuite la même chose avec une boucle Pour.
function sommeTantQue(n) {
let i = 1;
let somme = 0;
while (i <= 0) { // ← condition à corriger
// à compléter : accumuler, PUIS avancer le compteur
}
return somme;
}
function sommePour(n) {
let somme = 0;
// à compléter
return somme;
}
console.log(sommeTantQue(4), sommePour(4)); // attendu : 10 10
console.log(sommeTantQue(100), sommePour(100)); // attendu : 5050 5050
Solution
function sommeTantQue(n) {
let i = 1;
let somme = 0;
while (i <= n) {
somme = somme + i;
i = i + 1; // sans cette ligne : boucle infinie
}
return somme;
}
// Quand le nombre de tours est connu d'avance, la boucle Pour dit la même
// chose en une ligne : déclaration, condition et avancement au même endroit,
// donc impossible d'oublier l'incrément.
function sommePour(n) {
let somme = 0;
for (let i = 1; i <= n; i++) {
somme = somme + i;
}
return somme;
}
console.log(sommeTantQue(4), sommePour(4));
console.log(sommeTantQue(100), sommePour(100));
À retenir
Flashcards · 2 cartes
- Quelle question décide entre Pour et Tant que ?
- Sait-on compter les tours AVANT d'entrer dans la boucle ? Oui : Pour. Non : Tant que.
- Comment initialiser un accumulateur ?
- Avec l'élément neutre de l'opération : 0 pour une somme, 1 pour un produit. Et toujours AVANT la boucle.