Essayer de coder ← Retour aux sujets

for, while, do…while, for-each

répéter

Les mêmes boucles qu'en C, plus la boucle for-each qui parcourt un tableau ou une collection sans manipuler d'indice.

for (int i = 0; i < n; i++) { … }
n tours : initialisation ; condition ; pas
while (cond) { … }
Teste avant chaque tour
do { … } while (cond);
Teste après : au moins un tour
for (int x : tableau) { … }
for-each : x prend chaque valeur du tableau
break; continue;
Sortir de la boucle / passer au tour suivant
Compteur.java
public class Compteur {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
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.java
public class Somme {
    public static void main(String[] args) {
        int somme = 0;

        for (int i = 1; i <= 100; i++) {
            somme += i;
        }
        System.out.println("1 + 2 + ... + 100 = " + somme);
    }
}
Affichage
1 + 2 + ... + 100 = 5050

📘 Le cours : répéter en Java

Une boucle répète un bloc d'instructions. Pour qu'elle soit correcte, elle a besoin de trois ingrédients : un départ, une condition d'arrêt et un pas qui rapproche de cet arrêt. Il manque l'un des trois et la boucle ne s'arrête jamais ou ne démarre pas.

La boucle for

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

Table7.java
public class Table7 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            System.out.println("7 x " + i + " = " + (7 * i));
        }
    }
}
Affichage
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35

Le pas peut être n'importe quoi : i += 2, ou i -= 3 pour compter à rebours.

Rebours.java
public class Rebours {
    public static void main(String[] args) {
        for (int i = 10; i > 0; i -= 3) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
Affichage
10 7 4 1
Convention

Pour parcourir un tableau t, écris for (int i = 0; i < t.length; i++) : les indices vont de 0 à t.length - 1, donc la condition est < et jamais <=.

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 en prenant le dernier (n % 10) puis en le retirant (n /= 10).

Chiffres.java
public class Chiffres {
    public static void main(String[] args) {
        int n = 2845;
        int somme = 0;

        while (n > 0) {
            somme += n % 10;     // dernier chiffre
            n /= 10;             // on le retire
        }
        System.out.println(somme);   // 5 + 4 + 8 + 2
    }
}
Affichage
19

do … while : au moins un tour

Le test est fait après le bloc, ce qui convient pour redemander une saisie tant qu'elle est invalide. N'oublie pas le ; final.

SaisieValide.java
import java.util.Scanner;

public class SaisieValide {
    public static void main(String[] args) {
        Scanner clavier = new Scanner(System.in);
        int n;

        do {
            System.out.print("Un nombre entre 1 et 10 : ");
            n = clavier.nextInt();
        } while (n < 1 || n > 10);

        System.out.println("Merci : " + n);
    }
}
Si tu tapes 42 puis 7
Un nombre entre 1 et 10 : 42
Un nombre entre 1 et 10 : 7
Merci : 7

La boucle for-each

Pour parcourir tous les éléments d'un tableau (ou d'une collection), la boucle for (Type x : structure) est plus lisible : pas d'indice à gérer, donc pas d'erreur d'un cran. Elle ne convient pas quand tu as besoin de l'indice ou de modifier les éléments d'un tableau de nombres.

ForEach.java
public class ForEach {
    public static void main(String[] args) {
        int[] notes = {12, 15, 9, 18};
        int somme = 0;

        for (int note : notes) {
            somme += note;
        }
        System.out.println("somme = " + somme);
        System.out.println("moyenne = " + (double) somme / notes.length);
    }
}
Affichage
somme = 54
moyenne = 13.5

break et continue

break quitte la boucle ; continue abandonne le tour en cours et passe au suivant. while (true) crée une boucle sans fin que l'on arrête de l'intérieur avec break.

Interruption.java
public class Interruption {
    public static void main(String[] args) {
        int somme = 0;
        for (int i = 1; i <= 10; i++) {
            if (i % 2 == 0) {
                continue;          // on saute les pairs
            }
            somme += i;
        }
        System.out.println("somme des impairs : " + somme);

        int n = 51;
        while (true) {
            if (n % 7 == 0) {
                break;             // on arrête la boucle
            }
            n++;
        }
        System.out.println("premier multiple de 7 apres 50 : " + n);
    }
}
Affichage
somme des impairs : 25
premier multiple de 7 apres 50 : 56

Boucles imbriquées

Pour chaque tour de la boucle extérieure, la boucle intérieure recommence depuis le début.

Triangle.java
public class Triangle {
    public static void main(String[] args) {
        for (int ligne = 1; ligne <= 4; ligne++) {
            String etoiles = "";
            for (int k = 0; k < ligne; k++) {
                etoiles += "*";
            }
            System.out.println(etoiles);
        }
    }
}
Affichage
*
**
***
****

Avec n lignes, la boucle intérieure s'exécute 1 + 2 + … + n fois : le coût croît comme n², la complexité quadratique de T(n) et O(). Depuis Java 11, "*".repeat(ligne) remplace la boucle intérieure.

⚠️ Erreurs fréquentes

L'erreur d'un cran sur un tableau

À éviter
Faux.java
int[] t = {4, 8, 15, 16, 23};
for (int i = 0; i <= t.length; i++) {   // i vaut 5 au dernier tour
    System.out.println(t[i]);           // exception
}
Correct
Correct.java
int[] t = {4, 8, 15, 16, 23};
for (int i = 0; i < t.length; i++) {
    System.out.println(t[i]);
}

Contrairement au C, Java vérifie les bornes : l'accès à t[5] lève une ArrayIndexOutOfBoundsException qui arrête le programme avec un message clair. C'est une aide, pas une raison de laisser l'erreur.

Oublier le pas : la boucle infinie

À éviter
Faux.java
int i = 0;
while (i < 10) {
    System.out.println(i);   // i ne change jamais
}
Correct
Correct.java
int i = 0;
while (i < 10) {
    System.out.println(i);
    i++;                     // le pas qui mène à l'arrêt
}

Si un programme semble figé, arrête-le avec Ctrl + C dans le terminal, puis cherche quelle variable aurait dû changer.

Un point-virgule après le for

for (int i = 0; i < 3; i++); a un corps vide : le bloc qui suit ne s'exécute qu'une seule fois, après la boucle.

Un compteur réel

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

Modifier la variable du for-each

Dans for (int note : notes), note est une copie de chaque élément : lui donner une nouvelle valeur ne change pas le tableau. Pour modifier le tableau, utilise un for classique avec l'indice.

Utiliser la variable de boucle après la boucle

i déclaré dans for (int i = …) n'existe que dans la boucle. Pour la garder après, déclare-la avant le for.

📋 Aide-mémoire

  • for (init; cond; pas) : nombre de tours connu ; while : tant que ; do … while (…); : au moins un tour.
  • Parcourir un tableau : for (int i = 0; i < t.length; i++) ou for (int x : t).
  • break quitte la boucle ; continue passe au tour suivant ; while (true) + break pour une boucle sans fin arrêtée de l'intérieur.
  • Trois ingrédients d'une boucle : départ, condition d'arrêt, pas qui y mène.
  • Boucles imbriquées : n × m tours, donc coût quadratique ; Java lève une exception si l'indice sort du tableau.