Les boucles en C++ (C++17 et C++20)

19 Mar 2022 19 Mar 2022 6243 vues ESSADDOUKI Mostafa 11 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

Les boucles en C++

Qu'est-ce qu'une boucle ?

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++

Boucle 1

for

Principalement pour exécuter la boucle un nombre prescrit de fois, mais offre une grande flexibilité.

Boucle 2

for basée sur collection

Exécute une itération pour chaque élément d'une collection (foreach).

Boucle 3

while

Continue tant qu'une condition spécifiée est vraie. La condition est vérifiée au début de l'itération.

Boucle 4

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

Syntaxe

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.

   
Syntaxe de la boucle for C++
for (initialisation; condition; itération) {
    // corps de la boucle
}
// instructions suivantes

Vous pouvez omettre tout ou partie des expressions, mais vous devez toujours inclure les points-virgules.

Fonctionnement

  1. L'expression d'initialisation est évaluée une seule fois, au début de la boucle.
  2. La condition est vérifiée. Si elle est vraie, le corps est exécuté. Si elle est fausse, la boucle se termine.
  3. Après chaque exécution du corps, l'expression d'itération est évaluée.
  4. 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 facultatives

Porté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 ici

Exemple 4 : Variable accessible après la boucle

int i;
for (i = 0; i < 10; i++) {
    cout << i;
}
cout << "\nValeur finale de i : " << i;  // 10

Variantes 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 ici

Boucle 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;
}
Sortie
2.5     5       7.5     10      12.5    15      17.5    20
Attention

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)

Syntaxe (C++11)

La boucle for basée sur collection itère sur toutes les valeurs d'une collection (tableau, chaîne, conteneur STL).

   
Syntaxe de base (C++11) C++
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;
}
Sortie
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 &, elem est une copie de l'élément : modifier elem ne change pas le tableau.
  • Avec &, elem est une référence : les modifications affectent directement le tableau.

Nouveauté C++20 : initialisation dans la boucle for

   
Syntaxe C++20 C++
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

Syntaxe

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.

   
Syntaxe de la boucle while C++
while (condition) {
    // corps de la boucle
}
// instructions après la boucle

Exemple 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

Syntaxe

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.

   
Syntaxe de la boucle do-while C++
do {
    // corps de la boucle...
} while (condition);  // <-- point-virgule obligatoire !
Attention

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;
}
Exemple d'exécution
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.

   
Syntaxe de continue C++
continue;  // passe à l'itération suivante

Exemple 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;
}
Sortie
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.

   
Syntaxe de break C++
break;  // termine la boucle immédiatement

Exemple 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;
}
Sortie
Itération : 0
Itération : 1
Itération : 2
Bonne pratique

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

N'importe quelle boucle peut en contenir d'autres

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

TypeSyntaxeQuand l'utiliser
forfor (init; cond; ité)Nombre d'itérations connu à l'avance
for basée collectionfor (décl : coll)Parcourir tous les éléments d'une collection
whilewhile (cond)Nombre d'itérations inconnu, condition au début
do-whiledo {...} while (cond);Nombre d'itérations inconnu, au moins une exécution
 Exercice pratique

Choisir la bonne boucle

 Niveau : Débutant

Pour chaque situation, indiquez quel type de boucle serait le plus approprié :

  1. Afficher les nombres de 0 à 9.
  2. Demander une note à l'utilisateur, puis demander s'il veut continuer, au moins une fois.
  3. Lire un fichier jusqu'à la fin (nombre d'éléments inconnu).
  4. Multiplier chaque élément d'un tableau par 2.
  5. Attendre que l'utilisateur saisisse un nombre valide (entre 0 et 100).
Points clés à retenir
  • 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.