• Aucun résultat trouvé

La boucle while 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

//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 .

Cette façon de faire permet d'économiser une variable et donc de la mémoire ! Ici sc.nextLine() renvoie un String sur lequel on applique tout de suite la méthode qui retourne le premier caractère de la chaîne

(charAt(0)), nous pouvons donc, sans crainte, initialiser une variable de type char avec le résultat obtenu.

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

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

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

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)

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 !

Vous avez dû remarquer aussi que notre instruction n'affiche plus "coucou 1 fois !!". Cela à cause de l'incrément dans la condition. Au premier tour de boucle, on entre dans la condition et, quelque soit l'ordre d'incrémentation, à la fin du premier test de condition, a vaut 2.

Donc réfléchissez bien à vos

conditions de boucles

!

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().