Chapitre 5 : Boucles (for, while)
1) Boucle while
2) Boucle do…while
3) Boucle for
1
1) Boucle while
Algo en pseudo-code Démo valise.c
somme ß 0
Afficher "vous avez droit à 23kg
etc…"
Tant que somme≤23:
Demander un poids à ajouter
Ajouter ce poids à somme
Fin tant que
Afficher "Valise trop pleine!"
2
1) Boucle while
Programme en C : valise.c (dans le main par ex.)
float somme=0;
float poids=0; // initialisation par sécurité
printf("Vous avez droit à une valise de 23kg.\n");
printf("Elle est initialement vide.\n");
while (somme<=23){
printf("Il reste %f kg.\n", 23-somme);
printf("Combien de kg à ajouter ? ");
scanf("%f", &poids);
somme=somme+poids;
}
printf("Valise trop pleine!\n");
3
1) Boucle while
• La boucle while en C est l'équivalent de la boucle Tant que
en pseudo-code.
• On l'utilise lorsque le nombre d'itérations (=passages dans la
boucle) n'est pas connu avant de commencer la boucle.
• Syntaxe:
Algo en pseudo-code Programme en C :
Tant que condition: while (condition){
Instructions instructions
Fin tant que }
4
Attention aux boucles infinies!
• Exemple:
int continuer=1; /* booléen valant 1 pour
continuer et 0 pour stop*/
while (continuer){
printf("Coucou!\n");
}
• Si la condition du while ne devient jamais fausse, on entre
dans une boucle infinie!
• Le programme ci-dessus affiche "Coucou" indéfiniment.
→ Démo coucou.c
5
3) Boucle do … while
Démo aimezVous.c
Algo en pseudo-code
Faire
Afficher Aimez-vous la programmation ?
Afficher Répondre 'o' pour oui, ou 'n' pour non.
Demander une réponse (saisie au clavier)
Tant que la réponse n'est ni 'o' ni 'n'
Si la réponse est 'o':
Afficher Super J
Sinon:
Afficher Dommage L 6
3) Boucle do … while
Programme en C : aimezVous.c (dans le main par ex.)
char reponse;
// initialisation inutile (sauf si scanf échoue)
do{
printf("\n Aimez-vous la programmation ? ");
printf("Répondre 'o' pour oui,ou 'n' pour non.");
scanf(" %c", &reponse);
} while ((reponse!='o') && (reponse != 'n'));
if (reponse=='o'){
printf("Super :-) \n");
}
else { // on sait alors que reponse=='n'
printf("Dommage :-( \n");
} 7
3) Boucle do … while
• La boucle do… while en C est l'équivalent de la boucle
Faire... tant que en pseudo-code.
• On l'utilise lorsque l'on veut forcément passer dans la
première itération de la boucle, mais que le nombre total
d'itérations (=passage dans la boucle) n'est pas connu avant
de commencer.
• Syntaxe:
Algo en pseudo-code Programme en C :
Faire: do{
Instructions instructions
Tant que condition } while (condition); 8
Attention: while vs. do … while
• Attention à ne pas confondre la syntaxe du while et du
do…while, même si elles sont proches.
while do…while
while (condition){ do{
instructions instructions
} } while (condition);
• La problème de boucle infinie concerne les deux cas (while
et do…while) : si la condition ne devient jamais fausse, on
ne sort pas de la boucle.
9
QCM Vote électronique
On veut un programme permettant de jouer au nombre mystère.
Exemple 1 Exemple 2
Devinez le nombre mystère entre Devinez le nombre mystère entre
0 et 100. 0 et 100.
Vous avez 5 essais max. Vous avez 5 essais max.
Proposition 1: 50 Proposition 1: 50
C'est plus. C'est plus.
Proposition 2: 75 Proposition 2: 75
C'est plus. C'est plus.
Proposition 3: 82 Proposition 3: 82
C'est gagné! C'est plus.
Proposition 4: 90
C'est moins.
Proposition 5: 85
C'est moins 10
Raté! Le nombre mystère était 83.
QCM Vote électronique
// on suppose les variables déclarées, mystere contient le nb mystere,
et compteur initialisé à 1.
do{
printf("Proposition %d : ", compteur);
scanf("%d", &prop);
compteur++;
if (prop>mystere){
printf("C'est moins.\n");
}
else if (prop<mystere){
printf("C'est plus.\n");
}
Quelle est la condition?
} while (condition) ;
1)prop!=mystere
// Puis afficher résultat
2)prop==mystere && compteur<=5
... 3)prop!=mystere && compteur<=5
4)compteur<=5 11
QCM Vote électronique
// on suppose les variables déclarées, mystere contient le nb mystere,
et compteur initialisé à 1.
do{
printf("Proposition %d : ", compteur);
scanf("%d", &prop);
compteur++;
if (prop>mystere){
printf("C'est moins.\n");
}
else if (prop<mystere){
printf("C'est plus.\n");
}
Quelle est la condition?
} while (condition) ;
1)prop!=mystere
// Puis afficher résultat
2)prop==mystere && compteur<=5
... 3)prop!=mystere && compteur<=5
4)compteur<=5 12
QCM Vote électronique
// on suppose les variables déclarées, mystere contient le nb mystere,
et compteur initialisé à 1.
do{
printf("Proposition %d : ", compteur);
scanf("%d", &prop);
compteur++;
if (prop>mystere){
Erreur très courante: oublier d'incrémenter
le compteur dans une boucle while!
printf("C'est moins.\n");
} (Car on prend l'habitude des boucles for qui
incrémentent automatiquement)
else if (prop<mystere){
printf("C'est plus.\n");
}
Quelle est la condition?
} while (condition) ;
1)prop!=mystere
// Puis afficher résultat
2)prop==mystere && compteur<=5
... 3)prop!=mystere && compteur<=5
4)compteur<=5 13
3) Boucle for
Algo en pseudo-code
Demander "Combien de lignes"
Stoker le résultat dans variable n
Démo ligne.c
Pour i allant de 0 à n-1:
Afficher Ligne numéro i
Fin pour
14
3) Boucle for
Programme en C : ligne.c (dans le main par ex.)
int i;
int n=0;
printf("Combien de lignes voulez-vous? ");
scanf("%d", &n);
for (i=0; i<n; i++){
printf("Ligne numéro %d \n", i);
}
Dans la console: Combien de lignes voulez-vous? 5
Ligne numéro 0
Ligne numéro 1
Ligne numéro 2
Ligne numéro 3
15
Ligne numéro 4
3) Boucle for
• La boucle for en C est l'équivalent de la boucle Pour...
allant de .. à … en pseudo-code.
• On l'utilise lorsque l'on sait combien d'itérations (=passages
dans la boucle) on veut faire dès le début de la boucle.
• Syntaxe: Algo en pseudo-code
Pour indice allant de debut à fin:
Instructions
Fin pour
Programme en C :
int indice; //declaration de l'indice
for (indice=debut; indice<=fin; indice++){
instructions
16
}
Boucle for: raccourci d'un while
• La boucle for est en fait un raccourci d'une certaine forme
de boucle while qui serait très souvent utilisée sinon:
Boucle for:
int i; //declaration de l'indice
for (i=debut; i<=fin; i++){
instructions
}
Boucle while équivalente
int i; //declaration de l'indice
i=debut;
while (i<=fin){
instructions
i++;
17
}
Boucle for: raccourci d'un while
• La boucle for est en fait un raccourci d'une certaine forme
de boucle while qui serait très souvent utilisée sinon:
Boucle for:
declaration indice;
for (instruction de début; condition; modification de l'indice){
instructions
}
Boucle while équivalente
declaration indice;
instruction de debut;
while (condition){
instructions
modification de l'indice;
18
}
Boucle for: variations
• On peut donc utiliser toute une série de variations sur
l'intérieur des parenthèses du for: nom de l'indice de boucle
Boucle for:
int compteur;
for (compteur=0; compteur<5; compteur++){
instructions
L'indice de boucle est seulement une
}
variable, donc il peut prendre
n'importe quel nom, pas forcément i.
Boucle while équivalente Par convention, on utilisera souvent
int compteur; i, j ou compteur.
compteur=0;
while (compteur<5){
instructions
compteur++;
19
}
Boucle for: variations
• On peut donc utiliser toute une série de variations sur
l'intérieur des parenthèses du for: instruction de début
Boucle for:
int i;
for (i=-2; i<5; i++){
instructions
On ne commence pas forcément à 0.
}
On peut commencer à n'importe quel
entier (positif ou négatif).
Boucle while équivalente
int i;
i=-2;
while (i<5){
instructions
i++;
20
}
Boucle for: variations
• On peut donc utiliser toute une série de variations sur
l'intérieur des parenthèses du for: condition
Boucle for:
int i;
for (i=0; i<5; i++){
instructions
Différents choix de condition
}
(mais pas le même comportement!):
i<5
Boucle while équivalente i<=5
int i; i>=5 (si cela a un sens)
i=0; …
while (i<5){
instructions
i++;
21
}
Boucle for: variations
• On peut donc utiliser toute une série de variations sur
l'intérieur des parenthèses du for: modification de l'indice
Boucle for:
int i;
for (i=0; i<5; i=i+2){
instructions
On peut sauter de n'importe quel pas
}
i++ à comme i=i+1à saut de 1
i=i+2 à saut de 2
Boucle while équivalente i=i+5 à saut de 5
int i; ....
i=0;
while (i<5){
instructions
i=i+2;
22
}
Boucle for: variations
• On peut donc utiliser toute une série de variations sur
l'intérieur des parenthèses du for: modification de l'indice
Boucle for:
int i;
for (i=10; i>2; i--){
instructions
On peut même aller en arrière!
}
i-- à comme i=i-1à saut de -1
i=i-2 à saut de -2
Boucle while équivalente i=i-5 à saut de -5
int i; ....
i=10;
while (i>2){ Attention à ce que l'instruction de
instructions début et la condition de fin soit
cohérentes.
i--;
23
}
Attention au nombre d'itérations
Situations courantes : Valeurs de i qui vont
être parcourues:
int i; //declaration de l'indice 0
for (i=0; i<10; i++){ 1
…
instructions 9
} → on passe 10 fois dans
la boucle
Valeurs de i qui vont
int i; //declaration de l'indice être parcourues:
for (i=0; i<=10; i++){ 0
1
instructions …
} 10
→ on passe 11 fois dans
24
la boucle
Attention au nombre d'itérations
Situations courantes : Valeurs de i qui vont
être parcourues:
int i; //declaration de l'indice 1
for (i=1; i<10; i++){ 2
…
instructions 9
} → on passe 9 fois dans
la boucle
Valeurs de i qui vont
int i; //declaration de l'indice être parcourues:
for (i=1; i<=10; i++){ 1
2
instructions …
} 10
→ on passe 10 fois dans
25
la boucle
QCM Vote électronique
char lettre_a='a';
int i;
for (i=0; i<26; i++)
{
printf("%d-ieme lettre: %c \n", i, lettre_a+i);
}
Quel affichage obtient-on à l'exécution?
Affichage 1 Affichage 2 Affichage 3 Affichage 4
1-ieme lettre: a 1-ieme lettre: a 0-ieme lettre: a 0-ieme lettre: a
2-ieme lettre: b 2-ieme lettre: b 1-ieme lettre: b 1-ieme lettre: b
… … … …
26-ieme lettre: z 25-ieme lettre: z 25-ieme lettre: z 26-ieme lettre: z
26
QCM Vote électronique
char lettre_a='a';
int i;
for (i=0; i<26; i++)
{
printf("%d-ieme lettre: %c \n", i, lettre_a+i);
}
Quel affichage obtient-on à l'exécution?
Affichage 1 Affichage 2 Affichage 3 Affichage 4
1-ieme lettre: a 1-ieme lettre: a 0-ieme lettre: a 0-ieme lettre: a
2-ieme lettre: b 2-ieme lettre: b 1-ieme lettre: b 1-ieme lettre: b
… … … …
26-ieme lettre: z 25-ieme lettre: z 25-ieme lettre: z 26-ieme lettre: z
27
Fin chapitre 5
Récapitulatif des notions qui ont été abordées:
§ boucles while
§ nombre d'itérations inconnu au départ
§ boucles do… while
§ nombre d'itérations inconnu au départ, mais on veut passer une
première fois dans la boucle
§ boucles for
§ nombre d'itérations connu à l'avance
28