Essayer de coder ← Retour aux sujets

for, while, do…while

répéter

Une boucle répète un bloc tant qu'une condition est vraie. Prends for quand le nombre de tours est connu, while sinon.

for (int i = 0; i < n; i++) { … }
Initialisation ; condition ; pas : n tours
while (cond) { … }
Teste avant chaque tour (peut ne jamais s'exécuter)
do { … } while (cond);
Teste après : au moins un tour
break;
Sort immédiatement de la boucle
continue;
Passe directement au tour suivant
compteur.c
#include <stdio.h>

int main(void) {
    for (int i = 0; i < 5; i++) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}
Affichage
0 1 2 3 4

Schémas à connaître

accumuler

Quatre schémas reviennent dans presque tous les programmes.

somme += t[i];
Accumuler : somme, produit, compteur
if (x > max) max = x;
Chercher un maximum ou un minimum
while (n > 0) { n /= 10; }
Découper un nombre chiffre par chiffre
for (…) { for (…) { … } }
Boucles imbriquées : n × m tours
somme.c
#include <stdio.h>

int main(void) {
    int somme = 0;

    for (int i = 1; i <= 100; i++) {
        somme += i;
    }
    printf("1 + 2 + ... + 100 = %d\n", somme);
    return 0;
}
Affichage
1 + 2 + ... + 100 = 5050

📘 Le cours : répéter en C

Répéter une action est la raison d'être d'un ordinateur. Une boucle bien écrite a toujours trois ingrédients : un départ, une condition d'arrêt et un pas qui fait progresser vers cet arrêt. Si l'un des trois manque, la boucle ne s'arrête jamais ou ne démarre pas.

La boucle for

for (init; condition; pas) : l'initialisation est faite une seule fois, la condition est testée avant chaque tour, le pas est exécuté après chaque tour.

table7.c
#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 5; i++) {
        printf("7 x %d = %d\n", i, 7 * i);
    }
    return 0;
}
Affichage
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35

Le pas n'est pas forcément i++ : i += 2 avance de deux en deux, i-- ou i -= 3 compte à rebours.

rebours.c
#include <stdio.h>

int main(void) {
    for (int i = 10; i > 0; i -= 3) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}
Affichage
10 7 4 1
Convention

Pour parcourir n éléments, on écrit for (int i = 0; i < n; i++) : les indices vont de 0 à n−1, donc la condition est i < n et jamais i <= n.

La boucle while

while (condition) convient quand on ne sait pas à l'avance combien de tours seront nécessaires. Ici, on additionne les chiffres de 2845 : tant qu'il reste un chiffre, on prend le dernier (n % 10) puis on le retire (n /= 10).

chiffres.c
#include <stdio.h>

int main(void) {
    int n = 2845;
    int somme = 0;

    while (n > 0) {
        somme += n % 10;   /* dernier chiffre */
        n /= 10;           /* on le retire */
    }
    printf("%d\n", somme);   /* 5 + 4 + 8 + 2 */
    return 0;
}
Affichage
19

do … while : au moins un tour

Le test est fait à la fin du bloc : c'est idéal pour redemander une saisie tant qu'elle est invalide. Remarque le ; obligatoire après le while (…).

saisie.c
#include <stdio.h>

int main(void) {
    int n;

    do {
        printf("Un nombre entre 1 et 10 : ");
        scanf("%d", &n);
    } while (n < 1 || n > 10);

    printf("Merci : %d\n", n);
    return 0;
}
Si tu tapes 42 puis 7
Un nombre entre 1 et 10 : 42
Un nombre entre 1 et 10 : 7
Merci : 7

break et continue

break quitte la boucle ; continue abandonne le tour en cours et passe au suivant (dans un for, le pas est quand même exécuté).

continue.c
#include <stdio.h>

int main(void) {
    int somme = 0;

    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;      /* on saute les nombres pairs */
        }
        somme += i;
    }
    printf("somme des impairs : %d\n", somme);
    return 0;
}
Affichage
somme des impairs : 25
break.c
#include <stdio.h>

int main(void) {
    int n = 51;

    while (1) {              /* boucle sans fin... */
        if (n % 7 == 0) {
            break;           /* ...arrêtée de l'intérieur */
        }
        n++;
    }
    printf("premier multiple de 7 apres 50 : %d\n", n);
    return 0;
}
Affichage
premier multiple de 7 apres 50 : 56

Boucles imbriquées

Une boucle peut en contenir une autre : pour chaque tour de la boucle extérieure, la boucle intérieure recommence depuis le début.

triangle.c
#include <stdio.h>

int main(void) {
    for (int ligne = 1; ligne <= 4; ligne++) {
        for (int k = 0; k < ligne; k++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
Affichage
*
**
***
****

Le corps de la boucle intérieure s'exécute 1 + 2 + 3 + 4 = 10 fois. Avec n lignes, le nombre de tours croît comme n² : c'est la complexité quadratique étudiée dans T(n) et O().

⚠️ Erreurs fréquentes

L'erreur d'un cran (off-by-one)

À éviter
faux.c
int t[5] = {4, 8, 15, 16, 23};
int somme = 0;
for (int i = 0; i <= 5; i++) {   /* i vaut 5 au dernier tour */
    somme += t[i];               /* t[5] n'existe pas ! */
}
Correct
correct.c
int t[5] = {4, 8, 15, 16, 23};
int somme = 0;
for (int i = 0; i < 5; i++) {    /* i va de 0 à 4 */
    somme += t[i];
}

Lire t[5] dans un tableau de 5 cases est un comportement indéfini : le programme peut afficher n'importe quoi ou planter, sans message d'erreur.

Oublier le pas : la boucle infinie

À éviter
faux.c
int i = 0;
while (i < 10) {
    printf("%d\n", i);   /* i ne change jamais */
}
Correct
correct.c
int i = 0;
while (i < 10) {
    printf("%d\n", i);
    i++;                 /* le pas qui mène à l'arrêt */
}

Si un programme « tourne dans le vide », appuie sur Ctrl + C dans le terminal pour l'arrêter, puis cherche la variable qui devrait changer.

Un point-virgule après le for ou le while

À éviter
faux.c
for (int i = 0; i < 3; i++);   /* corps vide */
{
    printf("bonjour\n");        /* affiché une seule fois */
}
Correct
correct.c
for (int i = 0; i < 3; i++) {
    printf("bonjour\n");        /* affiché trois fois */
}

Un compteur réel

for (double x = 0; x != 1; x += 0.1) ne s'arrête jamais : 0,1 n'est pas représentable exactement en binaire, donc x ne vaut jamais exactement 1. Compte avec un entier (i de 0 à 10) et calcule x = i / 10.0.

Modifier le compteur dans le corps du for

Écrire i++ dans le corps d'un for (…; …; i++) fait avancer le compteur deux fois par tour. Si tu as besoin d'un pas irrégulier, utilise plutôt un while.

📋 Aide-mémoire

  • for (init; cond; pas) : nombre de tours connu ; while : tant que ; do … while (…); : au moins un tour.
  • Parcourir n éléments : for (int i = 0; i < n; i++).
  • break quitte la boucle ; continue passe au tour suivant.
  • Trois ingrédients d'une boucle correcte : un départ, une condition d'arrêt, un pas qui y mène.
  • Boucles imbriquées : les tours se multiplient (n × m), d'où le coût quadratique.