Décortiquons précisément ce qui se passe dans une boucle.
Pour cela, nous allons voir comment elle se forme.
Une boucle commence par une
déclaration. Ici :
while qui veut dire, à peu de chose près,
TANT QUE.

Ensuite, nous avons une
condition. C'est elle qui permet à la boucle de s'arrêter. Une boucle n'est pratique que si nous pouvons la contrôler, et donc lui faire répéter une instruction un certain nombre de fois. C'est à ça que servent les conditions.
Puis nous avons
l'instruction. C'est ce que va répéter notre boucle ! Dans une boucle, il peut y avoir une ou plusieurs instructions.
Remarque : il peut même y avoir des boucles, dans une boucle...
À ce stade, la boucle va tester la condition, et en fonction de celle-ci, va recommencer ou s'arrêter.
Un exemple concret est toujours le bienvenu... Voici comment une boucle de type
while se fait en Java.
D'abord, réfléchissons au "comment notre boucle va travailler". Pour cela, il faut déterminer notre exemple.
Nous allons afficher "bonjour", <un prénom> que vous allez taper à l'écran, puis vous demanderez si vous voulez recommencer. Pour réussir ceci, il nous faut
une variable pour recevoir le prénom, donc de type
String, et
une variable pour récupérer votre réponse et là, plusieurs choix s'offrent à nous : soit un caractère, soit une chaîne de caractères, soit un entier. Ici, nous prendrons une variable de type
char.
Et c'est parti !
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | //Une variable vide
String prenom;
// On initialise celle-ci à O pour oui !
char reponse = 'O';
//Notre objet Scanner, n'oubliez pas l'import de java.util.Scanner
Scanner sc = new Scanner(System.in);
//Tant que la réponse donnée est égale à oui
while (reponse == 'O')
{
//On affiche une instruction
System.out.println("Donnez un prénom : ");
//On récupère le prénom saisi
prenom = sc.nextLine();
// On affiche notre phrase avec le prénom
System.out.println("Bonjour " +prenom+ " comment vas-tu ?");
//On demande si la personne veut faire un autre essai
System.out.println("Voulez-vous réessayer ?(O/N)");
//On récupère la réponse de l'utilisateur
reponse = sc.nextLine().charAt(0);
}
System.out.println("Au revoir...");
//Fin de la boucle
|
Avant tout, vous avez dû cligner des yeux sur cette ligne "
reponse = sc.nextLine().charAt(0);". Rappelez-vous comment on récupère un
char avec l'objet
Scanner. Nous devons récupérer un objet
String et ensuite prendre le premier caractère de celui-ci ! Eh bien cette syntaxe est une contraction de ce que je vous avais fait voir auparavant

.
Détaillons un peu ce qui ce passe.
Dans un premier temps, nous avons
déclaré et initialisé nos variables.
Ensuite, la boucle
teste la condition qui nous dit :
"Tant que la variable reponse contient OUI, on exécute la boucle". Celle-ci contient bien la chaîne OUI, donc nous entrons dans la boucle. Rappelez-vous qu'on teste l'égalité des conditions avec un double égal
==.
Puis c'est l'
exécution des instructions, dans l'ordre où elles apparaissent dans la boucle.
Et à la fin, c'est-à-dire à l'accolade fermante de la boucle, le compilateur retourne au début de la boucle.
Cette boucle n'est exécutée que lorsque la condition est remplie : ici, nous avons initialisé la variable "reponse" à 'O' pour que la boucle se fasse. Si nous ne l'avions pas fait, nous n'y serions jamais rentrés. Normal, puisque nous testons la condition avant de rentrer dans la boucle !
Voilà. C'est pas mal, mais il y a un petit problème, dans ce programme...

Vous ne voyez pas ? Oh ! Je suis sûr qu'il y a des petits malins qui se sont amusés à mettre autre chose que '
O' ou '
N' en "
reponse". Ces petits filous-là ont dû remarquer que nous sortons de la boucle si on tape autre chose que '
O'... Essayez de trouver comment pallier à ce problème....
Il faudrait forcer les utilisateurs à ne tapez que 'OUI' ou 'NON'... Mais non, pas en leur mettant un couteau sous la gorge, bande de barbares !
Avec une boucle !
Comment faire ? C'est très simple, vous allez voir ! Il suffit, comme je l'ai dit plus haut, de forcer les utilisateurs à rentrer soit '
NON'soit '
OUI' ! Avec un
while ! Mais cela sous-entend de réinitialiser notre variable
reponse à ' ' (caractère vide).
Nous allons utiliser ici la méthode. Occupons-nous de la condition de notre boucle, maintenant. Il faut répéter la phase "Voulez-vous réessayer ?" tant que la "
reponse" donnée n'est pas '
OUI' et '
NON' : voilà, tout y est.
On appelle ce genre de condition des
conditions multiples. Vous avez vu les opérateurs logiques au chapitre 2, normalement... (et
== &&) Nous en reparlerons dans le prochain chapitre...
Voici notre programme dans son intégralité :
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | //Une variable vide
String prenom;
// On initialise celle-ci à O pour oui !
char reponse = 'O';
//Notre objet Scanner, n'oubliez pas l' import de java.util.Scanner
Scanner sc = new Scanner(System.in);
//Tant que la réponse donnée est égale à oui
while (reponse == 'O')
{
//On affiche une instruction
System.out.println("Donnez un prénom: ");
//On récupère le prénom saisi
prenom = sc.nextLine();
// On affiche notre phrase avec le prénom
System.out.println("Bonjour " +prenom+ " comment vas-tu ?");
//réinitialisation de la variable réponse.
//Sans ça, nous n' entrions pas dans la deuxième boucle
reponse = ' ';
//tant que la réponse n'est pas O ou N, on repose la question
while(reponse != 'O' && reponse != 'N')
{
//On demande si la personne veut faire un autre essai
System.out.println("Voulez-vous réessayer ?(O/N)");
//On récupère la réponse de l'utilisateur
reponse = sc.nextLine().charAt(0);
}
}
//Fin de la boucle
System.out.println("Au revoir...");
|
Je vous le répète une dernière fois : PENSEZ A L'INDENTATION !
Vous pouvez tester ce code (c'est d'ailleurs vivement conseillé) : vous verrez que si vous ne rentrez pas la bonne lettre, le programme vous demandera sans cesse votre réponse !
Attention à bien écrire vos conditions, et à bien vérifier vos variables dans vos while, et dans toutes vos boucles en général. Sinon c'est le drame ! Essayez le programme précédent sans la réinitialisation de la variable reponse, et vous verrez le résultat... on ne rentre jamais dans la 2° boucle, car "reponse" = 'O' (initialisé au début du programme). Là, vous ne pourrez jamais changer sa valeur... donc le programme ne s'arrêtera jamais ! On appelle ça une boucle infinie.
Voilà un autre exemple de boucle infinie, encore plus flagrante :
Code : Java | int a = 1, b = 15;
while (a < b)
{
System.out.println("coucou " +a+ " fois !!");
}
|
Si vous lancez ce programme, vous allez voir une quantité astronomique de
coucou 1 fois !!, car, dans cette condition,
a sera
toujours inférieur à
b.
Si nous voulions faire en sorte que ce programme fonctionne comme il faut, nous aurions dû rajouter une
instruction dans le
bloc d'instructions de notre
while, pour changer la valeur de
a à chaque tour de boucle...
Comme ceci :
Code : Java | int a = 1, b = 15;
while (a < b)
{
System.out.println("coucou " +a+ " fois !!");
a++;
}
|
Ce qui nous donnerait cela :
Notre
a a bien augmenté de 1 à chaque tour. Et si vous me dites que vous n'avez jamais vu
a++; je vous renvoie illico au second chapitre ==> sous chapitre 3 !
Qu'en dites-vous ? Pas trop mal, non ? Je dirais même bien !
Une petite astuce : lorsque vous n'avez qu'une instruction dans votre boucle, vous pouvez enlever les accolades { }, celles-ci deviennent superflues, tout comme les instructions if, else if ou else.
Vous auriez pu aussi utiliser cette syntaxe :
Code : Java | int a = 1, b = 15;
while (a++ < b)
System.out.println("coucou " +a+ " fois !!");
|
Ici, l'opérateur '++' n'agit qu'après avoir évalué 'a'. Ce qui veut dire que l'effet de l'opérateur '++' (qui est une incrémentation) n'est perçu qu'une instruction après. Par contre, testez ce code :
Code : Java | int a = 1, b = 15;
while (++a < b)
System.out.println("coucou " +a+ " fois !!");
|
Vous devez remarquer qu'il y a un tour de boucle en moins !
Eh bien, avec cette syntaxe, l'incrémentation est immédiate. C'est-à-dire que la boucle incrémente la variable
a et, seulement après avoir fait cela, elle teste la condition !
Avant d'aller voir un autre type de boucle, j'insiste sur le fait que vous devez
bien réfléchir à vos conditions, ainsi qu'à vos variables, avant de lancer une boucle, sous peine de ne jamais y rentrer, ou comme on l'a vu, de faire une boucle infinie !
Bon, continuons avec la boucle
do{...}while().