Aller au contenu principal

Boucles et répétitions

Ce que ce chapitre apporte 5 points
  • Choisir entre Pour et TantQue d'après ce qui est connu au moment d'entrer dans la boucle.
  • Prévoir le nombre de tours d'une boucle, et la valeur de ses variables à la sortie, en déroulant le dernier tour.
  • Préparer avant la boucle, et jamais dans son corps, une variable qui accumule ou qui compte.
  • Écrire un TantQue qui s'arrête, et reconnaître une boucle qui ne s'arrêtera pas.
  • Lire une boucle placée dans une autre.

Au contrôle qualité, un technicien mesure chaque jour les pièces d'un lot dont le nombre change d'un jour à l'autre ; au poste de commande, un opérateur ressaisit une quantité tant qu'elle est refusée. Écrire cent fois la même instruction ne conviendrait à aucun des deux : ce n'est pas seulement pénible, c'est impossible à maintenir, et impossible tout court dès que le nombre de répétitions n'est connu qu'à l'exécution. Les boucles règlent les deux. Reste à choisir la bonne : Pour quand on sait combien de tours faire au moment d'entrer dans la boucle, TantQue quand on sait seulement jusqu'à quand. Et reste à savoir, avant de la lancer, combien de tours elle fera.

Le chapitre sur le pseudo-code a présenté les deux boucles du cours en quelques lignes, celui sur les variables l'accumulateur qui retient un total, et celui sur les conditions la borne, qui décide ici du nombre de tours. Ce chapitre les assemble, et s'attache à ce qui fait qu'une boucle est juste : le nombre de tours qu'elle fait, la valeur de ses variables quand elle s'arrête, et la ligne qui la fait s'arrêter.

Pourquoi répéter des instructions ?

Définition

Une boucle est une structure qui répète un ensemble d'instructions, son corps, soit un nombre de fois déterminé, soit tant qu'une condition reste vraie. Chaque passage dans le corps s'appelle un tour, ou une itération.

Pour afficher les nombres de 1 à 10 sans boucle, il faudrait écrire dix instructions Écrire à la suite. Avec une boucle, une seule structure suffit :

Algorithme
pas 1 / 21
Début
Pour i de 1 à 10
Écrire i
FinPour
Fin

programme principal

i1

La variable i joue ici le rôle de compteur : elle prend successivement toutes les valeurs de 1 à 10, une par tour, et l'instruction Écrire i s'exécute à chaque fois avec la valeur du moment.

Dix Écrire à la suite restaient possibles. Ce qui rend la boucle indispensable, c'est le cas où le nombre de répétitions n'est pas connu de celui qui écrit l'algorithme : le nombre de mesures d'une série, qui change d'un jour à l'autre, ou le nombre d'essais qu'il faudra à un opérateur pour saisir une valeur correcte. Aucune suite d'instructions écrite d'avance ne convient alors ; une boucle, si.

La boucle Pour : un nombre de tours connu en entrant

Définition

La boucle Pour répète son corps pour chaque valeur d'un compteur, de la borne de départ à la borne d'arrivée, les deux bornes comprises. Elle convient lorsque le nombre de tours est connu au moment d'entrer dans la boucle, même s'il n'est connu qu'à l'exécution : un nombre saisi, la taille d'une série.

Sa structure générale est la suivante :

Algorithme
Pour variable de valeur_début à valeur_fin
instructions répétées
FinPour

Le mot-clé Pour ouvre la boucle, FinPour la ferme, et les lignes indentées entre les deux forment le corps. Le compteur, souvent appelé i, j ou k, avance de lui-même de 1 d'un tour à l'autre : il n'y a rien à écrire pour cela.

Algorithme
pas 1 / 11
Début
Pour i de 1 à 5
Écrire "Étiquette FRAGILE"
FinPour
Fin

programme principal

i1

Cet algorithme imprime cinq fois la même étiquette. Le compteur i prend successivement les valeurs 1, 2, 3, 4 et 5. Après le tour où i vaut 5, la boucle s'arrête d'elle-même, et i garde la dernière valeur prise : 5. Python fait de même ; d'autres langages, comme C, y laissent 6, et un algorithme n'a donc pas à compter sur la valeur du compteur une fois la boucle finie. Ici, i ne sert qu'à compter les répétitions.

On peut comparer la boucle Pour à une échelle : à chaque tour, on monte une marche, jusqu'à la dernière, et l'on sait dès le pied de l'échelle combien il y en a. De a à b, quand a ne dépasse pas b, une boucle Pour fait b - a + 1 tours.

Le compteur est aussi une valeur

Le compteur peut entrer dans les calculs. Une machine produit 40 pièces par heure ; cette boucle affiche la production cumulée au bout de chaque heure :

Algorithme
pas 1 / 9
Début
Pour heure de 1 à 4
Écrire "Après ", heure, " h : ", heure * 40, " pièces"
FinPour
Fin

programme principal

heure1

À chaque tour, heure * 40 se calcule avec la valeur du compteur à ce tour-là : 40, puis 80, 120 et 160.

Connu en entrant ne veut pas dire écrit dans le texte

Les bornes d'un Pour ne sont pas forcément des nombres écrits dans l'algorithme. Un technicien relève une série de mesures dont le nombre change d'un jour à l'autre : l'algorithme lit d'abord ce nombre, puis s'en sert comme borne.

Algorithme
pas 1 / 16
séparées par des virgules, décimales au point
Début
Lire n
total ← 0
Pour i de 1 à n
Lire mesure
total ← total + mesure
FinPour
Écrire "Moyenne des ", n, " mesures : ", total / n
Fin

programme principal

nsaisi4

Celui qui écrit l'algorithme ignore combien de mesures seront saisies ; la machine, elle, le sait avant le premier tour, puisque n est lu avant la boucle. C'est ce qui fait un Pour : un nombre de tours connu en entrant dans la boucle, et non un nombre écrit dans le texte. Remplacer la première entrée, 4, par 2 suffit à changer le nombre de tours : la figure fait alors la moyenne des deux premières mesures. total est un accumulateur : préparé à zéro avant la boucle, il reçoit une mesure de plus à chaque tour. La division / rend un nombre décimal, ici 12,75 : l'affichage l'écrit avec une virgule, alors que l'algorithme et les entrées écrivent les décimaux avec un point, comme 12.5.

Des bornes à l'envers : aucun tour

Une boucle Pour dont la borne de départ dépasse la borne d'arrivée ne fait aucun tour :

Algorithme
pas 1 / 1
Début
Pour i de 10 à 1
Écrire i
FinPour
Fin

programme principal

aucune variable

Le compteur part de 10 et avance de 1 : 10 dépasse déjà 1, et la boucle passe directement à la suite. Dans ce cours, cette boucle n'affiche donc rien, et la figure le montre ; certains langages descendent d'eux-mêmes, d'autres non, et il vaut mieux ne jamais compter sur cette tolérance. Pour compter à rebours, il faut le dire, avec un pas négatif :

Algorithme
pas 1 / 21
Début
Pour i de 10 à 1 pas -1
Écrire i
FinPour
Fin

programme principal

i10

Le mot pas indique de combien le compteur change à chaque tour ; sans lui, il avance de 1.

Vérification rapideon peut se reprendre

Pour i de 1 à 10 fait combien de tours ?

La boucle TantQue : répéter jusqu'à une condition

Définition

La boucle TantQue répète son corps tant qu'une condition reste vraie. Elle convient lorsque le nombre de tours n'est pas connu en entrant dans la boucle, parce qu'il dépend de ce qui se passe pendant les tours eux-mêmes : une saisie, une mesure, un calcul.

Sa structure est la suivante :

Algorithme
TantQue condition
instructions répétées
FinTantQue

Le principe est simple : avant chaque tour, l'algorithme vérifie la condition. Si elle est vraie, le corps de la boucle s'exécute en entier, puis l'algorithme remonte au test. Si elle est fausse, la boucle s'arrête et le programme reprend après le FinTantQue. La condition n'est examinée qu'à cet endroit, en tête de tour : si elle devient fausse au milieu du corps, le tour en cours va quand même jusqu'au bout.

Le cas type est la saisie contrôlée. Une commande porte sur un nombre de pièces, qui doit être strictement positif ; tant que l'opérateur saisit une quantité négative ou nulle, l'algorithme la redemande.

Algorithme
pas 1 / 9
séparées par des virgules, décimales au point
Début
Lire quantite
TantQue quantite <= 0
Écrire "Quantité refusée : un nombre strictement positif est attendu."
Lire quantite
FinTantQue
Écrire "Commande enregistrée : ", quantite, " pièces"
Fin

programme principal

quantitesaisi-3
À manipuler
Remplacer les saisies par 8 seul, dans le champ « Ce que Lire reçoit », et dérouler : le test quantite <= 0 est faux dès le premier passage, aucune ligne du corps n'est surlignée, et le total de pas affiché à droite des boutons tombe de 9 à 3. Saisir ensuite 0, -1, -2, 5 : trois messages de refus s'affichent, un par valeur négative ou nulle, et le total monte à 12 pas. Chaque tour coûte trois pas, le test, le message et la nouvelle lecture : le nombre de tours est celui des saisies refusées, et il ne se connaît qu'une fois ces saisies faites. C'est ce qui fait un TantQue.

La condition quantite <= 0 est le critère de poursuite : tant qu'elle reste vraie, la boucle continue. Dès qu'une quantité strictement positive est saisie, elle devient fausse et la boucle s'arrête. La deuxième saisie de la figure, 0, est refusée comme la première : c'est la borne, et c'est elle qu'il faut essayer. La première lecture a lieu avant la boucle, sans quoi la condition porterait sur une variable qui n'existe pas encore, et l'algorithme s'arrêterait ; la seconde a lieu dans la boucle, sans quoi la condition ne changerait jamais.

La question que se pose tout débutant, « par où l'algorithme repasse-t-il pour recommencer ? », a une réponse visuelle. Dans un organigramme, la boucle se dessine avec une flèche qui remonte au test : c'est le seul trait qui aille vers le haut, et il porte à lui seul toute l'idée de répétition. Le parcours Flowgorithm dessine ainsi toutes ses boucles, dans le chapitre qui leur est consacré.

Organigramme
VraiFauxDébutLire quantitequantite <= 0Afficher "Quantité refusée"Lire quantiteAfficher "Commande enregistrée : ",quantiteFin

Le test est en tête de boucle, et la flèche qui remonte y ramène après chaque tour. Une première saisie correcte fait sauter la boucle entière.

Cette boucle sert chaque fois que le nombre de tours dépend de ce qui se passe pendant les tours :

  • redemander une saisie jusqu'à ce qu'elle soit valide ;
  • remplir une cuve par apports successifs jusqu'au niveau voulu ;
  • traiter des commandes en attente jusqu'à ce qu'il n'en reste plus.
La variante Répéter … Jusqu'à, et sa condition inversée

Il existe une variante, Répéter … Jusqu'à, qui vérifie la condition à la fin du tour au lieu du début :

Algorithme
pas 1 / 10
séparées par des virgules, décimales au point
Début
Répéter
Lire quantite
Jusqu'à quantite > 0
Écrire "Commande enregistrée : ", quantite, " pièces"
Fin

programme principal

aucune variable

Le corps s'exécute donc toujours au moins une fois, avant tout test : c'est la forme naturelle d'une saisie, où il faut bien lire une première valeur avant de pouvoir la juger.

Attention au sens de la condition, qui s'inverse. TantQue attend la condition pour continuer, Jusqu'à la condition pour s'arrêter. La saisie contrôlée de plus haut, qui refuse les quantités négatives ou nulles, s'écrit TantQue quantite <= 0 dans un cas et Jusqu'à quantite > 0 dans l'autre : chacune est la négation exacte de l'autre, bornes comprises. Recopier la condition d'un TantQue dans un Jusqu'à donne une boucle qui s'arrête exactement quand elle devrait continuer.

Vérification rapideon peut se reprendre

Quand préférer Répéter … Jusqu'à à un TantQue ?

Ce qui fait qu'un TantQue s'arrête

Un Pour s'arrête de lui-même, à sa borne. Un TantQue ne s'arrête que si l'une des lignes de son corps finit par rendre la condition fausse, et cette ligne, c'est à celui qui écrit l'algorithme de la prévoir.

La boucle qui ne s'arrête jamais

L'erreur la plus spectaculaire consiste à oublier de modifier la variable que teste la condition. Elle donne une boucle infinie :

Algorithme
pas 1 / 501
Début
x ← 0
TantQue x <= 5
Écrire x
FinTantQue
Fin

programme principal

x0

x ne change jamais, donc la condition x <= 5 reste toujours vraie. Déroulée, la figure affiche des zéros jusqu'à la limite de 500 pas, puis s'interrompt en nommant la cause. Pour que la boucle s'arrête, la variable doit évoluer à chaque tour, dans le sens qui rapproche la condition de sa fin :

Algorithme
pas 1 / 20
Début
x ← 0
TantQue x <= 5
Écrire x
x ← x + 1
FinTantQue
Fin

programme principal

x0

Le dernier tour, et le test qui le suit

Reste à savoir quand la boucle corrigée s'arrête, et c'est là que les bornes se trompent. Le tableau suit les tests, un par ligne :

Testx au moment du testx <= 5Ce que fait le tour
10vraiaffiche 0, x passe à 1
21vraiaffiche 1, x passe à 2
3 à 52, 3, 4vraiaffiche 2, 3, 4
65vraiaffiche 5, x passe à 6
76fauxaucun tour : la boucle s'arrête

Quand x vaut 5, la condition est encore vraie : le sixième tour a lieu et affiche 5. C'est le septième test, avec x à 6, qui échoue. La boucle affiche donc six valeurs, de 0 à 5, et x vaut 6 à la sortie. Écrire TantQue x < 5 l'aurait arrêtée un tour plus tôt, après l'affichage de 4. Pour choisir entre < et <=, il n'y a qu'un moyen sûr : dérouler le dernier tour, puis le test qui le suit.

Les trois temps d'un TantQue

Un TantQue bien écrit a trois temps : initialiser avant la boucle la variable que teste la condition, la faire progresser dans le corps vers la valeur qui rendra la condition fausse, et vérifier sur le dernier tour que ce moment arrive, et où il laisse les variables. Le troisième temps réserve des surprises quand la variable avance par grands pas. Un bac doit recevoir au moins 100 litres, par apports de 30 litres :

Algorithme
pas 1 / 15
Début
niveau ← 0
TantQue niveau < 100
niveau ← niveau + 30
Écrire "Niveau : ", niveau, " litres"
FinTantQue
Écrire "Remplissage terminé à ", niveau, " litres"
Fin

programme principal

niveau0
Testniveau au moment du testniveau < 100Ce que fait le tour
10vrainiveau passe à 30
230vrainiveau passe à 60
360vrainiveau passe à 90
490vrainiveau passe à 120
5120fauxaucun tour : la boucle s'arrête

À 90 litres, la condition est encore vraie, et le quatrième apport porte le niveau à 120. La condition dit quand la boucle cesse de tourner, pas où elle laisse les variables : ici, 20 litres au-delà du niveau voulu. Si le bac ne pouvait contenir que 110 litres, il aurait débordé, et seul le déroulement du dernier tour le fait voir.

La question à se poser avant d'écrire une boucle. « Qu'est-ce qui fera qu'elle s'arrête ? » Pour un Pour, la réponse est donnée par les bornes. Pour un TantQue, elle doit être écrite à la main, dans le corps de la boucle, et c'est la ligne qu'on oublie.

Vérification rapideon peut se reprendre

1.Qu'est-ce qui fait qu'un TantQue finit par s'arrêter ?

2.Après x ← 0, une boucle TantQue x < 3 affiche x puis l'augmente de 1. Que vaut x à la sortie ?

Une boucle dans une boucle

Le corps d'une boucle peut contenir une autre boucle. La boucle intérieure est alors relancée en entier à chaque tour de la boucle extérieure : pour trois jours de quatre relevés, elle fait quatre tours, trois fois, soit douze passages.

Algorithme
pas 1 / 31
Début
Pour jour de 1 à 3
Pour releve de 1 à 4
Écrire "jour ", jour, ", relevé ", releve
FinPour
FinPour
Fin

programme principal

jour1

Pendant les quatre tours intérieurs, jour ne bouge pas. C'est seulement quand releve a fait ses quatre tours que la boucle extérieure passe au jour suivant, et que la boucle intérieure repart de 1.

La borne intérieure peut aussi dépendre du compteur extérieur. Pour comparer chaque capteur d'une installation à chacun des autres une seule fois, le capteur i n'est comparé qu'à ceux qui le suivent :

Algorithme
pas 1 / 20
Début
n ← 4
Pour i de 1 à n - 1
Pour j de i + 1 à n
Écrire "comparer le capteur ", i, " au capteur ", j
FinPour
FinPour
Fin

programme principal

n4
ivaleurs prises par jcomparaisons
12, 3, 43
23, 42
341

La boucle intérieure fait trois tours, puis deux, puis un : six comparaisons, sans qu'aucun capteur soit comparé à lui-même ni deux fois au même voisin. La boucle extérieure s'arrête à n - 1 pour une raison qui se lit sur le tour suivant : avec i à 4, la boucle intérieure irait de 5 à 4, et ne ferait aucun tour. C'est la forme exacte des tris du chapitre Les algorithmes de tri.

Vérification rapideon peut se reprendre

Dans Pour i de 1 à 3 qui contient Pour j de 1 à 4, combien de fois s'exécute le corps de la boucle intérieure ?

Trois erreurs qui laissent la boucle se terminer

La boucle sans fin est la plus spectaculaire des erreurs de boucle. Les trois suivantes sont plus sournoises : le programme se termine, et le résultat est faux.

L'accumulateur remis à zéro à chaque tour
Algorithme
pas 1 / 11
Début
Pour i de 1 à 3
somme ← 0
somme ← somme + i
FinPour
Écrire somme
Fin

programme principal

i1

somme ← 0 est dans la boucle : il s'exécute à chaque tour et efface le total précédent.

Tourisomme après somme ← 0somme en fin de tour
1101
2202
3303

Chaque tour repart de zéro : à la sortie, somme ne contient que la contribution du dernier tour. L'algorithme affiche 3 au lieu de 6, sans le moindre message. L'initialisation appartient à ce qui précède la boucle, jamais à son corps.

La deuxième erreur est celle d'un tour, dans un sens ou dans l'autre. Pour i de 1 à 10 fait dix tours, pas neuf : les deux bornes sont comprises. Pour i de 0 à 10 en fait onze. Le même décalage guette un TantQue : entre x < 5 et x <= 5, il y a exactement un tour. Le contrôle qui ne trompe jamais consiste à compter les tours pour une petite valeur : Pour i de 1 à 3 doit afficher trois lignes. Si le résultat en donne deux ou quatre, l'erreur est dans les bornes et nulle part ailleurs.

Modifier le compteur à l'intérieur du Pour

Le chapitre sur le pseudo-code l'a montré : un i ← i + 1 ajouté dans un Pour ne change pas le nombre de tours. La figure le vérifie sur dix tours, la ligne étant placée cette fois après l'affichage.

Algorithme
pas 1 / 31
Début
Pour i de 1 à 10
Écrire i
i ← i + 1 // à proscrire
FinPour
Fin

programme principal

i1

Déroulée, elle fait bien ses dix tours et affiche 1 à 10 : à chaque tour, l'en-tête du Pour redonne à i la valeur du tour, et la ligne ajoutée ne vaut que jusqu'à la fin du tour en cours. Python se comporte de même. Seule trace de cette ligne : à la sortie, i vaut 11, une valeur que le Pour ne lui a jamais donnée. En C ou en Java, en revanche, la même ligne fait avancer le compteur de deux à chaque tour, et la boucle n'affiche plus que 1, 3, 5, 7 et 9. Une ligne dont l'effet change d'un langage à l'autre rend l'algorithme illisible : elle est à proscrire. Quand il faut un pas irrégulier, c'est un TantQue qu'il faut écrire, où l'avancement est explicite.

Vérification rapideon peut se reprendre

1.Où placer somme ← 0 dans un algorithme qui additionne des mesures lues une à une ?

2.Ajouter i ← i + 1 dans le corps d'un Pour i de 1 à 10 fait quoi, dans ce cours ?

Mettre en pratique

Le nombre de tours d'une boucle et la valeur qu'elle laisse en sortant se calculent avant de l'exécuter. C'est ce calcul, refait à la main, qui permet de lui faire confiance.

Compter les tours avant de les faire

  • 1.

    Combien de tours fait Pour i de 3 à 12 ?

  • 2.

    Combien de lignes affiche Pour c de 0 à 90 pas 15, qui écrit c à chaque tour ?

  • 3.

    Après x ← 0, une boucle TantQue x < 7 affiche x, puis l'augmente de 2. Combien de valeurs affiche-t-elle ?

  • 4.

    Que vaut x à la sortie de cette boucle ?

  • 5.

    Un bac reçoit des apports de 35 litres tant que son niveau, parti de zéro, reste inférieur à 100 litres. À combien de litres le remplissage s'arrête-t-il ?

  • 6.

    Dans Pour jour de 1 à 7, qui contient Pour releve de 1 à 24, combien de fois s'exécute le corps de la boucle intérieure ?

  • 7.

    Pour comparer chacun de six capteurs à ceux qui le suivent, avec Pour i de 1 à n - 1 puis Pour j de i + 1 à n, combien de comparaisons faut-il ?

Chercher d'abord, ouvrir le corrigé ensuite.

Afficher une table de conversion des températures, de 0 à 100 degrés Celsius, de 20 en 20, en degrés Fahrenheit. La conversion multiplie par 9, divise par 5, puis ajoute 32.
Algorithme
pas 1 / 13
Début
Pour c de 0 à 100 pas 20
Écrire c, " °C = ", c * 9 / 5 + 32, " °F"
FinPour
Fin

programme principal

c0

Ce qui s'affiche :

0 °C = 32 °F
20 °C = 68 °F
40 °C = 104 °F
60 °C = 140 °F
80 °C = 176 °F
100 °C = 212 °F

Le pas de 20 donne six tours, de 0 à 100 compris, et le compteur sert directement au calcul. Sans pas, Pour c de 0 à 100 ferait cent un tours, et la table cent une lignes.

Un contrôleur mesure le diamètre de plusieurs pièces. Lire leur nombre, puis les diamètres, en millimètres, et afficher combien de pièces dépassent 20,5 mm et doivent être rejetées.
Algorithme
pas 1 / 21
séparées par des virgules, décimales au point
Début
Lire n
rejets ← 0
Pour i de 1 à n
Lire diametre
Si diametre > 20.5 Alors
rejets ← rejets + 1
FinSi
FinPour
Écrire "Pièces rejetées : ", rejets, " sur ", n
Fin

programme principal

nsaisi5

Le nombre de pièces est lu avant la boucle : c'est un Pour. rejets compte : c'est un accumulateur qui n'ajoute que des 1, et seulement dans les tours où la condition est vraie ; il se prépare donc à zéro avant la boucle, comme un total. Sur les cinq pièces de la figure, deux sont rejetées, à 20,7 et à 21 mm. La pièce à 20,5 mm ne l'est pas : > est strict, et c'est à la tolérance exacte qu'il faut vérifier que la condition dit bien ce que veut l'énoncé.

Redemander le taux de remplissage d'une cuve, en pourcentage, tant qu'il n'est pas compris entre 0 et 100.
Algorithme
pas 1 / 9
séparées par des virgules, décimales au point
Début
Lire taux
TantQue taux < 0 OU taux > 100
Écrire "Erreur : le taux doit être compris entre 0 et 100."
Lire taux
FinTantQue
Écrire "Taux enregistré : ", taux, " %"
Fin

programme principal

tauxsaisi120

Le déroulement, avec les saisies de la figure, 120, puis -5, puis 40 :

MomentCe qui s'affichetaux après lecturetaux < 0 OU taux > 100
avant la boucle(rien)120vrai : on entre
tour 1message d'erreur-5vrai : un tour de plus
tour 2message d'erreur40faux : on sort
après la boucleTaux enregistré : 40 %40(non testé)

Deux valeurs refusées, deux messages : le compte se vérifie sur la sortie de la figure.

Reste la borne, car une cuve vide est une mesure valide. Écrire taux <= 0 au lieu de taux < 0 refuserait une cuve à 0 % à chaque saisie, et l'opérateur qui relève une cuve vide ne pourrait jamais l'enregistrer. Les bornes sont toujours l'endroit où les conditions se trompent.

Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?

Dans la bibliothèque d'exercices