Nous souhaitons créer un programme qui nous affiche tous les nombres de 1 à 10, donc dont l’exécution serait la suivante :
1 2 3 4 5 6 7 8 9 10
Une façon particulièrement vilaine de procéder serait d’ecrire 10
printf
successifs, avec la lourdeur des copier/coller que
cela impliquerait. Nous allons étudier un moyen de coder ce type
de programme avec un peu plus d’élégance.
Une boucle permet d’exécuter plusieurs fois de suite une même séquence d’instructions. Cette ensemble d’instructions s’appelle le corps de la boucle. Chaque exécution du corps d’une boucle s’appelle une itération, ou plus informellement un passage dans la boucle. Lorsque l’on s’apprête à exécuter la première itération, on dit que l’on rentre dans la boucle, lorsque la dernière itération est terminée, on dit qu’on sort de la boucle. Il existe trois types de boucle :
while
do ... while
for
Chacune de ces boucles a ses avantages et ses inconvénients. Nous les passerons en revue ultérieurement.
while
En C, la boucle
tant que
se code de la façon suivante :
while(<condition>) { <instructions> }
Les instructions du corps de la boucle sont délimitées par des accolades. La condition est évaluée avant chaque passage dans la boucle, à chaque fois qu’elle est vérifiée, on exécute les instructions de la boucle. Un fois que la condition n’est plus vérifiée, l’exécution se poursuit après l’accolade fermante. Affichons par exemple tous les nombres de 1 à 5 dans l’ordre croissant,
#include<stdio.h> int main() { int i = 1; while(i <= 5) { printf("%d ", i); i++; } printf("\n"); return 0; }
Ce programme initialise i à 1 et tant que la valeur de
i n’éxcède pas 5, cette valeur est affichée puis incrémentée. Les
instructions se trouvant dans le corps de la boucle sont donc
exécutées 5 fois de suite. La variable i s’appelle un
compteur, on gère la boucle par incrémentations successives
de i et on sort de la boucle une fois que i a atteint une
certaine valeur. L’initialisation du compteur est très
importante ! Si vous n’initialisez pas i explicitement, alors cette
variable contiendra n’importe quelle valeur et votre programme ne se
comportera pas du tout comme prévu. Notez bien par ailleurs qu’il n’y
a pas de point-virgule après le
while
!
do ... while
Voici la syntaxe de cette boucle :
do { <instructions> } while(<condition>);
La fonctionnement est analogue à celui de la boucle
tant que
à quelques détails près :
En C, la boucle
répéter ... jusqu'à
est en fait une boucle
répéter ... tant que
, c’est-à-dire une boucle
tant que
dans laquelle la condition est évaluée à la fin.
Une boucle
do ... while
est donc exécutée donc
au moins une fois. Reprennons l’exemple précédent avec une
boucle
do ... while
:
#include<stdio.h> int main() { int i = 1; do { printf("%d ", i); i++; } while(i <= 5); printf("\n"); return 0; }
De la même façon que pour la boucle
while
, le compteur est
initialisé avant le premier passage dans la boucle. Un des usages les
plus courant de la boucle
do ... while
est le contrôle
de saisie :
#include<stdio.h> int main() { int i; do { printf("Saisissez un entier positif ou nul : "); scanf("%d", &i); if (i < 0) printf("J'ai dit positif ou nul ! `\n"); } while(i < 0); return 0; }
for
Cette boucle est quelque peu délicate. Commençons par donner sa syntaxe :
for(<initialisation> ; <condition> ; <pas>) { <instructions> }
L’
<initialisation>
est une instruction exécutée avant le
premier passage dans la boucle. La
<condition>
est évaluée
avant chaque passage dans la boucle, si elle n’est pas
vérifiée, on ne passe pas dans la boucle et l’exécution de la boucle
pour est terminée. La
<pas>
est une instruction exécutée
après chaque passage dans la boucle. On peut convertir une
boucle
for
en boucle
while
en procédant de la sorte :
<initialisation> while(<condition>) { <instructions> <pas> }
On re-écrit l’affiche des 5 premiers entiers de la sorte en
utilisant le fait que
<initialisation>
=
i = 1
,
<condition>
=
i <= 5
et
<pas>
=
i++
. On obtient :
#include<stdio.h> int main() { int i; for( i = 1 ; i <= 5 ; i++) printf("%d ", i); printf("\n"); return 0; }
On utilise une boucle
for
lorsque l’on connait en entrant
dans la boucle combien d’itérations devront être faites. Par exemple,
n’utilisez pas une boucle
pour
pour contrôler une saisie !
De la même façon qu’il est possibl de supprimer des accolades autour
d’une instruction d’un bloc
if
, on peut supprimer les
accolades autour du corps d’une boucle si elle ne contient qu’une
seule instruction.