Les boucles en C++
Une boucle est un mécanisme qui vous permet d'exécuter une instruction ou un bloc d'instructions de manière répétée jusqu'à ce qu'une condition particulière soit remplie.
Deux éléments essentiels composent une boucle :
- Le corps de la boucle (instructions à répéter)
- Une condition qui détermine quand arrêter
Une seule exécution du corps d'une boucle est appelée une itération.
Types de conditions de boucle
Une condition de boucle peut prendre différentes formes :
- Exécuter une boucle un nombre donné de fois
- Exécuter une boucle jusqu'à ce qu'une valeur donnée dépasse une autre valeur
- Exécuter une boucle jusqu'à ce qu'un caractère particulier soit saisi au clavier
- Exécuter une boucle pour chaque élément d'une collection d'éléments
Les quatre variétés de boucles en C++
for
Principalement pour exécuter la boucle un nombre prescrit de fois, mais offre une grande flexibilité.
for basée sur collection
Exécute une itération pour chaque élément d'une collection (foreach).
while
Continue tant qu'une condition spécifiée est vraie. La condition est vérifiée au début de l'itération.
do-while
Continue tant qu'une condition est vraie, mais vérifie la condition à la fin. Au moins une itération est toujours exécutée.
1. La boucle for
La boucle for exécute généralement un bloc d'instructions un nombre prédéterminé de fois, mais peut être utilisée d'autres manières.
for (initialisation; condition; itération) {
// corps de la boucle
}
// instructions suivantesVous pouvez omettre tout ou partie des expressions, mais vous devez toujours inclure les points-virgules.
Fonctionnement
- L'expression d'initialisation est évaluée une seule fois, au début de la boucle.
- La condition est vérifiée. Si elle est vraie, le corps est exécuté. Si elle est fausse, la boucle se termine.
- Après chaque exécution du corps, l'expression d'itération est évaluée.
- Retour à l'étape 2.
Exemple 1 : Boucle for classique
for (int i = 0; i < 10; i++) {
cout << i;
}Explication :
int i = 0: initialisation (compteur à 0)i < 10: condition (continue tant que i est inférieur à 10)i++: itération (incrémente i après chaque boucle)- Affiche : 0123456789
Exemple 2 : Accolades optionnelles
for (int i = 0; i < 10; i++)
cout << i; // une seule instruction, accolades facultativesPortée de la variable de contrôle
Une boucle définit une portée. Les variables déclarées dans l'initialisation sont locales à la boucle.
Exemple 3 : Variable locale à la boucle
for (int i = 0; i < 10; i++) {
cout << i;
}
// cout << i; // ERREUR : i n'existe plus iciExemple 4 : Variable accessible après la boucle
int i;
for (i = 0; i < 10; i++) {
cout << i;
}
cout << "\nValeur finale de i : " << i; // 10Variantes de la boucle for
Exemple 5 : Utilisation de l'opérateur virgule
for (int k = 0, m = 0; k < 5; ++k, m--) {
cout << k + m << " ";
}
// Affiche : 0 0 0 0 0 (car m décroît en même temps que k croît)L'opérateur virgule combine deux expressions en une seule. Partout où vous pouvez mettre une expression, vous pouvez mettre une série d'expressions séparées par des virgules.
Exemple 6 : Omission de paramètres
// Boucle infinie
for (;;) {
// attention : ne s'arrête jamais sans break
}
// Incrémentation dans le corps
for (int i = 0; i < 10; ) {
cout << i++;
}
// Variable définie avant la boucle
int cpt = 0;
for (; cpt < 10; ++cpt) {
// ...
}
// cpt est accessible iciBoucle for avec des valeurs à virgule flottante
Vous pouvez utiliser n'importe quel type pour contrôler une boucle, y compris des nombres à virgule flottante.
Exemple 7 : Boucle avec double
#include <iostream>
using namespace std;
int main(void){
for (double r {2.5}; r <= 20.0; r += 2.5) {
cout << r << '\t';
}
return 0;
}2.5 5 7.5 10 12.5 15 17.5 20
Soyez prudent avec les valeurs fractionnaires : elles peuvent ne pas être représentées exactement en binaire, ce qui peut causer des problèmes de précision dans les conditions de fin de boucle.
2. La boucle for basée sur les collections (C++11 et ultérieur)
La boucle for basée sur collection itère sur toutes les valeurs d'une collection (tableau, chaîne, conteneur STL).
for (coll_déclaration : coll_expression)
corps de la boucle;Exemple 8 : Parcours d'un tableau
#include <iostream>
using namespace std;
int main(void){
int T[4] = {1, 7, 13, 17};
for (int elem : T) {
cout << elem << '\t';
}
return 0;
}1 7 13 17
Exemple 9 : Utilisation de auto
int T[4] = {1, 7, 13, 17};
for (auto elem : T) { // auto déduit le type (int)
cout << elem << '\t';
}Exemple 10 : Modification des éléments avec référence
int T[4] = {1, 7, 13, 17};
// Modification avec référence
for (auto &elem : T) {
elem = 5;
}
// Affichage
for (auto elem : T) {
cout << elem << '\t'; // 5 5 5 5
}Explication :
- Sans
&,elemest une copie de l'élément : modifier elem ne change pas le tableau. - Avec
&,elemest une référence : les modifications affectent directement le tableau.
Nouveauté C++20 : initialisation dans la boucle for
for ([initialisation;] coll_déclaration : coll_expression)
corps de la boucle;Exemple 11 : Initialisation dans la boucle (C++20)
for (int T[4] = {1, 7, 13, 17}; int elem : T) {
cout << elem << '\t';
}3. La boucle while
La boucle while parcourt le bloc de code tant que sa condition est vraie. La condition est vérifiée au début de chaque itération.
while (condition) {
// corps de la boucle
}
// instructions après la boucleExemple 12 : Boucle while classique
int i = 0;
while (i < 10) {
cout << i << '\t';
i++;
}Équivalence for / while
Toute boucle for peut être écrite comme une boucle while équivalente :
// Boucle for
for (initialisation; condition; itération)
corps
// Équivalent en while
{
initialisation;
while (condition) {
corps
itération;
}
}Les accolades supplémentaires autour du while créent une portée simulant celle de la boucle for.
4. La boucle do-while
La boucle do-while est similaire à while, mais la condition est vérifiée à la fin. Le corps est donc toujours exécuté au moins une fois.
do {
// corps de la boucle...
} while (condition); // <-- point-virgule obligatoire !Le point-virgule après la condition est obligatoire. Si vous l'omettez, le programme ne compilera pas.
Exemple 13 : Saisie de notes jusqu'à demande d'arrêt
#include <iostream>
using namespace std;
int main(void){
char rep {};
int nb {};
double note {};
double somme {};
do {
cout << "Saisir une note : ";
cin >> note;
somme += note;
++nb;
cout << "Voulez-vous en saisir une autre ? (o/n) : ";
cin >> rep;
} while (rep == 'o');
cout << "La moyenne est : " << somme/nb << '\n';
return 0;
}Saisir une note : 12 Voulez-vous en saisir une autre ? (o/n) : o Saisir une note : 14 Voulez-vous en saisir une autre ? (o/n) : o Saisir une note : 10 Voulez-vous en saisir une autre ? (o/n) : o Saisir une note : 17 Voulez-vous en saisir une autre ? (o/n) : n La moyenne est : 13.25
Ce programme est idéal pour ce type de situation car on veut toujours saisir au moins une note.
Instructions break et continue
continue
L'instruction continue permet d'ignorer le reste de l'itération en cours et de passer à la suivante.
continue; // passe à l'itération suivanteExemple 14 : Utilisation de continue
#include <iostream>
using namespace std;
int main(void){
for(int i=0 ; i < 5 ; i++){
if(i==3){
continue; // saute l'itération i=3
}
cout << "Itération : " << i << '\n';
}
return 0;
}Itération : 0 Itération : 1 Itération : 2 Itération : 4
L'itération i=3 est complètement ignorée.
break
L'instruction break met fin immédiatement à la boucle, sans exécuter le reste des itérations.
break; // termine la boucle immédiatementExemple 15 : Utilisation de break
#include <iostream>
using namespace std;
int main(void){
for(int i=0; i < 5; i++){
if(i==3){
break; // arrête la boucle quand i atteint 3
}
cout << "Itération : " << i << '\n';
}
return 0;
}Itération : 0 Itération : 1 Itération : 2
En général, les boucles infinies ou les instructions break à l'intérieur des boucles doivent être utilisées judicieusement. Placez autant que possible les conditions de fin dans l'en-tête de la boucle (for ou while) pour améliorer la lisibilité. Les break supplémentaires sont plus faciles à manquer et peuvent rendre le code plus difficile à comprendre.
Boucles imbriquées
Vous pouvez placer une boucle à l'intérieur d'une autre boucle. Vous pouvez imbriquer des boucles à la profondeur dont vous avez besoin, et elles peuvent être de types différents.
Exemple : une boucle for dans une boucle while dans une boucle do-while dans une boucle for basée sur collection, si nécessaire.
Récapitulatif des boucles
| Type | Syntaxe | Quand l'utiliser |
|---|---|---|
| for | for (init; cond; ité) | Nombre d'itérations connu à l'avance |
| for basée collection | for (décl : coll) | Parcourir tous les éléments d'une collection |
| while | while (cond) | Nombre d'itérations inconnu, condition au début |
| do-while | do {...} while (cond); | Nombre d'itérations inconnu, au moins une exécution |
Choisir la bonne boucle
Pour chaque situation, indiquez quel type de boucle serait le plus approprié :
- Afficher les nombres de 0 à 9.
- Demander une note à l'utilisateur, puis demander s'il veut continuer, au moins une fois.
- Lire un fichier jusqu'à la fin (nombre d'éléments inconnu).
- Multiplier chaque élément d'un tableau par 2.
- Attendre que l'utilisateur saisisse un nombre valide (entre 0 et 100).
- Afficher 0 à 9 : for (nombre d'itérations connu)
- Demander une note avec confirmation : do-while (au moins une saisie)
- Lire fichier jusqu'à la fin : while (condition de fin d'fichier)
- Multiplier chaque élément : for basée collection avec référence (
for (auto &elem : tab)) - Attendre saisie valide : do-while (au moins une saisie, répéter tant que non valide)
- Les boucles permettent de répéter l'exécution d'un bloc d'instructions.
- Le C++ propose quatre types de boucles : for, for basée collection, while, do-while.
- La boucle for est idéale quand le nombre d'itérations est connu à l'avance.
- La boucle for basée collection (C++11) simplifie le parcours de tableaux et conteneurs.
- La boucle while vérifie la condition au début ; le corps peut ne pas être exécuté.
- La boucle do-while vérifie la condition à la fin ; le corps est exécuté au moins une fois.
- break termine immédiatement la boucle.
- continue passe à l'itération suivante (ignore le reste du corps).
- Les boucles peuvent être imbriquées les unes dans les autres.
- Préférez placer les conditions de fin dans l'en-tête de la boucle pour une meilleure lisibilité.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.