← (précédent) A.6 La classe String
A.8 Les structures de contrôle (2) : if - if...else - else if - switch
Accueil S O M M A I R E

A.7 Les structures de contrôle (1) :
For - While - Do...While

Il arrive parfois que dans un programme, une même action se produise un certain nombre de fois. On dit alors que le programme boucle. Pour mettre en oeuvre le principe de boucle, on utilise les boucles for, while ou do...while. La boucle for est utilisée lorsqu' on connaît le nombre exact de fois où l' action doit se répéter.
Les boucles while et do...while sont utilisées lorsqu' on ne connaît pas ce nombre.
 EXEMPLE 1 : 

1.     public class Boucles1
2.     {
3.          public static void main (String [] args)
4.          {
5.               for(int i = 0; i < 5; i++)
6.               {
7.                    System.out.println("Java");
8.               }
9.          }
10.    }
compilez puis exécutez, il sera affiché :

java
java
java
java
java

ligne 5 :déclaration de la boucle for. Cette boucle permet d' accomplir une tâche un certain nombre de fois. La tâche ici c' est d' afficher le mot java puis de placer le curseur à la ligne suivante. Et ceci, 5 fois de suite. Comment ?
Entre les parenthèses qui suivent for, on a 3 instructions. La première (int i = 0) est l' initialisation. La deuxième (i < 5) est la condition booléenne. La troisième (i++) est l' incrémentation.
Traduction par le langage humain :
à partir d' un nombre de fois commençant par zéro (int i = o) jusqu' à un nombre de fois strictement inférieur à 5, autrement dit, 4 (i < 5), et ce, en comptant de 1 en 1 (i++), afficher le mot java puis placer le curseur à la ligne suivante.

Pour i = 0, affichage de java
Pour i = 1, affichage de java
Pour i = 2, affichage de java
Pour i = 3, affichage de java
Pour i = 4, affichage de java

En principe, un nombre de fois n' est jamais égal à zéro. Mais nous ne sommes pas en mathématiques. Et en informatique, les programmes commencent toujours à compter à patir de 0. C' est comme ça. Cela dit, sachez que vous pouvez commencer le décompte à partir de n' importe quel nombre. L' important c' est de vérifier que le nombre de fois où la boucle est éxécutée correspond à ce que vous voulez. Mais la plupart des programmeurs commencent par zéro et c' est conseillé. Sauf cas particulier où on est obligé.

Entrons un peu plus en détail dans le fonctionnement de la boucle. Lorsque le programme arrive sur une boucle, comme celle de la ligne 5. la valeur 0 est affectéé à la variable i. Puis le programme vérifie la condition booléenne. Il trouve que cette condition est vérifiée, puisque 0 < 5. Dans ce cas, il exécute les instructions de la boucle. Ici, il y en a qu' une. c' est la ligne 7: affichage de java. Puis le programme exécute l' instruction d' incrémentation. A ce moment là, i = 1. Parce que i++; correspond à i = i + 1; et i = 0 + 1 = 1. Puis le programme vérifie la condition booléenne. i est bien strictement inférieur à 5. Dans ce cas, l' instruction de la boucle est exécutée. Affichage du mot java. Ainsi de suite... Jusqu' à i = 4. Puis il y a incrémentation. i++ <=> i = i +1; Donc i = 4 + 1 = 5. Puis il vérifie la condition booléenne. Et là, elle n' est plus bonne. i n' est plus strictement inférieur à 5. A ce moment là, le programme sort de la boucle pour exécuter (si elles existent) les instructions suivantes. Et ici, il n' y en a pas.

Le fait d' exécuter plusieurs fois la même instruction signifie que le programme tourne en boucle. D' où la terminologie "boucle".
 EXEMPLE 2 : 

1.     public class Boucles2
2.     {
3.          public static void main (String [] args)
4.          {
5.               int i;
6.               for(i = 0; i < 5; i++)
7.               {
8.                    System.out.println("Java");
9.               }
10.                   System.out.println("la valeur de i en sortie de boucle = " + i);
11.          }
12.    }
compilez puis exécutez, il sera affiché :

java
java
java
java
java
la nouvelle valeur de i = 5

Qu' est-ce que je vous disais ? la valeur de i en sortie de boucle est bel et bien = 5.
Quelque chose de neuf apparaît. J' ai déclaré la variable i avant la boucle avant de l' utiliser. Pourquoi ? D' abord, sachez que cette variable (qu' on peut appeler i ou autrement) qui permet de compter le nombre de fois de la boucle for peut se déclarer avant. On le déclare forcément avant dans le cas où l' on compte utiliser la variable (ou même seulement l' afficher) après la boucle. Pourquoi ? A cause de la visibilité des variables. Toute variable déclarée à l' intérieur d' une boucle disparaît dès que le programme sort de la boucle. Voilà une notion nouvelle sur les variables. Une notion sur laquelle il faudra compter en concevant des programmes. Si j' avais déclaré la variable i à l' intérieur de la boucle (plus précisément dans les parenthèses qui suivent for) comme dans l' exemple 1, je n' aurais pas pu l' afficher. Essayons dans l' exemple suivant.
 EXEMPLE 3 : 

1.     public class Boucles3
2.     {
3.          public static void main (String [] args)
4.          {
5.               
6.               for(int i = 0; i < 5; i++)
7.               {
8.                    System.out.println("Java");
9.               }
10.                   System.out.println("la valeur de i en sortie de boucle = " + i);
11.          }
12.    }
Après compilation, un message d' erreur s' affiche :cannot find symbol symbol : variable i

Ce qui, naturellement veut dire : Je ne trouve pas la variable i. Qu' est-ce que je vous disais ? A la sortie de la boucle, la variable i a disparue de la mémoire. C' est une façon pour java de gérer l' espace mémoire. Une variable qui ne sera pas utilisée dans la suite du programme doit disparaître afin de ne pas saturer l' espace mémoire.

Cet exemple montre qu' il ne faut pas déclarer une variable n' importe où. Nous y reviendrons à un moment où nous parlerons de variable locale et variable globale
 EXEMPLE 4 : 

1.     public class Boucles4
2.     {
3.          public static void main (String [] args)
4.          {
5.               
6.               for(int i = 0; i > - 5; i--)
7.               {
8.                    System.out.println("Java");
9.               }
10.              
11.          }
12.    }
compilez puis exécutez, il sera affiché :

java
java
java
java
java

Même raisonnement que dans l' exemple 1. Sauf qu' ici, i varie de zéro à -4 ( i = nombre entier strictement supérieur à -5 ). i-- <=> i = i - 1

Pour i = 0, affichage de java
Pour i = -1, affichage de java
Pour i = -2, affichage de java
Pour i = -3, affichage de java
Pour i = -4, affichage de java
 EXEMPLE 5 : 

1.     public class Boucles5
2.     {
3.          public static void main (String [] args)
4.          {
5.               
6.               for(int i = 0; i < 6; i += 2)
7.               {
8.                    System.out.println("Java");
9.               }
10.              
11.          }
12.    }
Compilez puis exécutez, il sera affiché :

java
java
java
ici, l' incrémentation se fait de 2 en 2. Ce n' est plus i++; mais i+=2; Et vous savez que : i +=2; veut dire i = i +2; autrement dit, la nouvelle valeur de i = ancienne valeur de i + 2. On aura alors :

Pour i = 0, affichage de java
Pour i = 2, affichage de java
Pour i = 4, affichage de java

D' où l' affichage de seulement 3 fois java. Si on prenait i = 6, la condition booléenne (i < 6) ne serait plus vérifiée.

Il peut arriver que la variable i (qu' on peut appeler autrement) permettant de compter le nombre de fois de la boucle, soit utilisée dans les instructions de la boucle. Exemple suivant :
 EXEMPLE 6 : 

1.     public class Boucles6
2.     {
3.          public static void main (String [] args)
4.          {
5.               
6.               for(int i = 0; i <=5 ; i++)
7.               {
8.                    System.out.println("2 fois " + i + " = " +  2 * i);
9.               }
10.              
11.          }
12.    }
Compilez puis exécutez ce programme, il sera affiché :

2 fois 0 = 0
2 fois 1 = 2
2 fois 2 = 4
2 fois 3 = 6
2 fois 4 = 8
2 fois 5 = 10


La boucle est une notion vraiment très puissante en programmation. A aprtir d' une seule ligne de code, on peut avoir un nombre infiniment grand de lignes.

Ici, pour i = 0, affichage de 2 fois parce c' est entre doubles crochets. Ensuite, affichage de i, donc affichage du contenu de la variable i puisque i n' est pas entre crochets. Puis affichage d' un espace, suivi du signe =, suivi d' une autre espace. Parce que ces 3 caractères se trouvent entre crochets. Puis affichage l' opération 2 * i est effectuée. Donc la multiplication de 2 par zéro. Ce qui donne 0. D' où l' affichage de 0. Même explication pour les autres lignes. Ce qui change, c' est affichage de i et du produit de i par 2.

Enseigner la notion de boucle sans parler d' une erreur fréquente chez les débutants ne seait pas sérieux. Alors, l' exemple suivant vous parlera d' une erreur à éviter. Tout bon débutant en programmation la commet au moins une fois dans sa vie de programmeur.
 EXEMPLE 7 : 

1.     public class Boucles7
2.     {
3.          public static void main (String [] args)
4.          {
5.               
6.               for(int i = 0; i <= 5 ; i--)
7.               {
8.                    System.out.println("java");
9.               }
10.              
11.          }
12.    }
compilez puis exécutez, il sera affiché un nombre incroyable de ligne qui contiennent le mot java. Et l' affichage s' effectue sans discontinuer. Et pour cause, on fait varier i de zéro à 4 en décrémentant de 1. 0 - 1 - 1 - 1 - 1 - 1 - 1.... ainsi de suite, on n' atteindra jamais le nombre 4 puisqu' on va plutôt vers moins l' infini. On a affaire à une boucle infinie. Dangéreux lorsque certaines instructions se trouvent dans la boucle.

Lorsqu' on ne connaît pas le nombre exact de fois où une action doit être répétée, on utilise la boucle while ou la boucle do...while.

 EXEMPLE 8 : 

1.     public class Boucles8
2.     {
3.          public static void main (String [] args)
4.          {
5.               int a = 0;
6.               while(a < 5)
7.               {
8.                    System.out.println("java");
9.                    a++;
10.              }
11.              
12.          }
13.    }
compilez puis exécutez, il sera affiché :

java
java
java
java
java

ligne 5 : valeur initiale de a = 0. Ensuite, ligne 6 veut dire, tant que a < 5. Cette condition booléenne est vérifie puisque a = 0. ligne 8 : afficher le mot java puis placer le curseur sur la ligne suivante. ligne 9 : incrémenter la variable a de 1 (a++ <=> a = a + 1). Puisque a = 0 + 1 donc a = 1, on voit que la condition booléenne (a < 5) est encore vérifiée. On retourne dans la boucle. on affiche le mot java. Puis on incrémente a. Donc nouvelle valeur de a = 2. Ainsi de suite. Pour i = 5. La condition n' est plus vérifiée. Alors, on sort de la boucle.
 EXEMPLE 9 : 

1.     public class Boucles9
2.     {
3.          public static void main (String [] args)
4.          {
5.               int a = 0;
6.               while(a < 5)
7.               {
8.                    System.out.println("java");
9.                    a++;
10.              }
11.              System.out.println("valeur de a en sortie de boucle = " + a);
12.          }
13.    }
compilez puis exécutez, il sera affiché :

java
java
java
java
java
valeur de a en sortie de boucle = 5

Et voilà !
Une autre différence entre for et while. Dans les parenthèses de for, c' est toujours une condition booléenne. Il n' y a jamais d' affectation de variable. Lorsque la condition booléenne repose sur une valeur de variable, celle-ci aura été déclarée et affectée auparavant.
 EXEMPLE 10 : 

1.     public class Boucles10
2.     {
3.          public static void main (String [] args)
4.          {
5.               int a = 0;
6.               do 
7.               {
8.                    System.out.println("java");
9.                    a++;
10.              }
11.              while(a < 5);
12.          }
13.    }
compilez puis exécutez, il sera affiché :

java
java
java
java
java


a = 0; on exécute les instructions de la boucle. Affichage du mot java puis incrémentation de a dont la valeur est maintenant = 1. Puis on vérifie la condition booléenne. a = 1 donc a < 5. Condition vérifiée. Puis on exécute à nouveau les instructions de la boucle. Ainsi de suite. D' où l' affichage.

Attention, il y a forcément un point-virgule à la fin du while(a < 5); de la boucle do...while alors qu' il n' y avait pas de point-virgule lorsque c' était la boucle while. Pensez-y !

La boucle do...while se démarque surtout de la boucle while en ce sens qu' on commence d' abord par exécuter les instructions de la boucle. Ce n' est qu' ensuite qu' on vérifie la condition booléenne. Avce while, il est possible que l' action ne soit pas effectuée une seule fois. Alors qu' avec do...while, l' action est effectuée au moins une fois. Vérifions ce fait par l' exemple ci-dessous.
 EXEMPLE 11 : 

1.     public class Boucles11
2.     {
3.          public static void main (String [] args)
4.          {



5.               int a = 0;
6.               do 
7.               {
8.                    System.out.println("java");
9.                    a++;
10.              }
11.              while(a < 5);
12.              System.out.println("valeur de a en sortie de boucle = " + a);
13.              System.out.println();
14.              int b = 0;
15.              do 
16.              {
17.                   System.out.println("java");
18.                   b++;
19.              }
20.              while(a < -1);
21.              System.out.println("valeur de b en sortie de boucle = " + b);
22.              System.out.println();
23.              int c = 0;
24.              while(c < 0)
25.              {
26.                   System.out.println("java");
27.                   c++;
27.              }
28.              System.out.println("valeur de c en sortie de boucle = " + c);   
29.          }
30.    }
compilez puis exécutez, il sera affiché :

java
java
java
java
java
valeur de a en sortie de boucle = 5

java
valeur de b en sortie de boucle = 1

valeur de c en sortie de boucle = 0


Le premier do...while s' explique comme les autres avec en plus la valeur de a en sortie de boucle. Puis affichage d' une ligne vide.

Le deuxième do...while permet d' afficher java une seule fois. Pourquoi ? Parce qu' après la première fois, on tombe sur la condition booléenne qui n' est plus vérifiée. Cette condition n' était déjà pas vérifiée avant la première fois puisque b = 0 qui n' est pas inférieur à 1. Malgré cela, les instruction de la boucle furent quand même exécutées. affichage du mot java et incrémentation de b puisque sa valeur en sortie de boucle = 1. Puis affichage d' une ligne vide.

Ensuite, pas d' affichage du mot java pour la boucle while. Pourquoi ? Parce qu' avec la boucle while ici ligne 24, la condition booléenne est d' emblée non vérifié. Alors, le programme n' entre pas dans la boucle. C' est pourquoi la valeur de c esn sortie de boucle est égale à zéro. Donc le programme n' est pas entré dans cette boucle.
← (précédent) A.6 La classe String
A.8 Les structures de contrôle (2) : if - if...else - else if - switch
Accueil S O M M A I R E

A.7 Les structures de contrôle (1) : For - While - Do...While