Avec des « si », notre programme serait mieux !

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Superman

V
Ancien staff
Dec 2, 2009
2,489
0
596
La condition « if ... then ... else ... »

Les conditions servent à tester les variables. On peut par exemple dire : « si telle variable est égale à telle chose, fait cela... ». Mais on peut ne pas tester que l'égalité... On peut aussi vérifier si la variable est supérieure, inférieure, inférieure ou égale, supérieure ou égale, ...

On pourra aussi tester les booléens, mais on verra ça plus tard, dans la prochaine sous-partie.

Avant de pouvoir traiter des conditions, il va vous falloir connaître quelques symboles.

Quelques symboles à connaître



Voici les symboles et leurs significations à connaître par coeur.

= est égal à
< est plus petit que
<= est plus petit ou égal à
> est plus grand que
>= est plus grand ou égal à
<> est plus petit ou plus grand que (n'est pas égal à).

Commençons par « if... then... »



Attaquons maintenant sans plus tarder !
Nous allons faire un test simple, qui va dire à l'ordinateur :

Si la variable vaut ceci
Alors fais ceci

En anglais, le mot « if » se traduit par « si » et « then » par « alors ». C'est ça qu'on utilise en pascal. Écrivez donc « if », ensuite, vous devrez écrire vos conditions.

Ensuite, il faut marquer "then" (pour ALORS) : une fois cela fait, on va marquer 'begin' puis 'end' (sans point après). Tout ce qui se trouve entre 'begin' et 'end' sera exécuté uniquement si la condition est vérifiée.

Ce que nous devrons écrire sera donc :

Code : Pascal1
2
3
4
5
6if { Les conditions }
then
begin
{ Ici, vos instructions à exécuter SI LES CONDITIONS SONT REMPLIES }

end




A la place de mon commentaire "Les conditions", on va écrire une condition pour tester une variable.
Par exemple, on pourrait tester une variable "point" qui contient les points d'un QCM. Tenez : pour s'entraîner, on va vérifier si vous avez réussi les QCM, c'est-à-dire si vos points sont supérieurs ou égaux à 15 :

Code : Pascal1
2
3
4
5
6if points >= 15
then
begin
writeln('Vous avez réussi le QCM ! Bravo !');

end




Le symbole >= signifie "supérieur ou égal", comme on l'a vu tout à l'heure.

Pour un code plus propre...



La façon dont vous écrivez 'begin' et 'end' n'est pas importante, votre programme fonctionnera aussi bien si vous écrivez tout sur une même ligne. Par exemple :
Code : Pascal1if points >= 15 then begin writeln('Vous avez réussi le QCM ! Bravo !'); end



Ça marche. Mais je vous le déconseille fortement !

En effet, tout écrire sur une même ligne rend votre code difficilement lisible. Si vous ne prenez pas dès maintenant l'habitude d'aérer votre code, plus tard, quand vous écrirez de plus gros programmes, vous ne vous y retrouverez plus !

Essayez donc de présenter votre code source de la même façon que moi : if et vos instructions sur une ligne, then à la ligne suivante, puis begin sur une autre ligne, décalé vers la droite, vos instructions sur la ligne suivante, à la même hauteur que 'begin', et, toujours à la même hauteur, mais à la ligne suivante, 'end'.

'else' pour 'sinon'



Maintenant que nous savons faire un test simple, allons un peu plus loin : si le test n'est pas réussi (il est faux), on va dire à l'ordinateur d'exécuter d'autres instructions.

En français, nous allons donc écrire quelque chose qui ressemble à cela :

Si la variable vaut ça
Alors fais ceci
Sinon fais cela

Il suffit de rajouter le mot else après le 'end'.
Petit exemple :

Code : Pascal 1
2
3
4
5
6
7
8
9
10
11if points >= 15
then
begin
writeln('Vous avez réussi le QCM ! Bravo !');

end
else
begin
writeln('Dommage, vous avez raté le QCM');

end;




Erreur fréquente chez les débutants : ce qu'il faut mettre après le 'end'. Sachez que le 'end' d'un 'if' ne précède rien, celui d'un 'else', est suivi d'un point-virgule. Logique, car il sépare le 'if... then... else...' de l'instruction suivante.


Que fait-on ?
Si la variable points est supérieure ou égale à 15, on affiche le message "Vous avez réussi le QCM ! Bravo !", sinon on affiche "Dommage, vous avez raté le QCM" (c'est vrai que c'est assez sévère pour la notation
langue.png
).

Insérer un bloc 'if' dans un 'else'



Revenons à notre exemple : pour l'instant, s'il avait plus que 15, il avait réussi, SINON, il a raté. Mais maintenant, imaginons que le gars a moins de 2, il l'a complètement loupé. Ce qui donne :
S'IL a plus que 15, il a réussi.
SINON, SI il a plus que 2, il a moyennement raté.
SINON, il a complètement raté.

On devrait pouvoir faire ça, dans nos programmes.

Mais ne vous inquiétez pas, le Pascal a tout prévu !
On peut imbriquer des 'if... then... else... ' dans un 'else... ' !
Mais, comme un dessin vaut toujours mieux qu'un long discours :

Code : Pascal 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18if points >= 15
then
begin
writeln('Vous avez réussi le QCM ! Bravo !');

end
else
if points > 2
then
begin
writeln('Dommage, vous avez raté le QCM');

end
else
begin
writeln('Vous n''êtes vraiment pas doué !');

end;




L'ordinateur fait les tests dans l'ordre.

D'abord il teste le premier if : si la condition est vraie, alors il exécute ce qui se trouve entre 'begin ... end'.
Sinon, il va au "si" et fait à nouveau un test : si ce test est vrai, alors il exécute les instructions correspondantes entre 'begin ... end'.
Enfin, si aucun des tests précédents n'a abouti, il exécute les instructions du "sinon".

Le "else" et le "else if" ne sont pas obligatoires. Pour faire une condition, il faut juste au moins un "if".
Notez qu'on peut imbriquer autant de 'if ... then ... else ... ' dans des 'else ... '. On peut donc écrire :

SI la variable vaut ça
ALORS fais ceci
SINON SI la variable vaut ça ALORS fais ça
SINON SI la variable vaut ça ALORS fais ça
.
.
.
SINON fais cela.
Les booléens

On va commencer tout de suite par tester un petit programme :

Code : Pascal 1
2
3
4
5
6
7
8
9
10if true
begin
write('vrai');

end
else
begin
write('faux');

end;




Allez-y, testez !

Voilà ce que ça donne :

Code : Console
vrai



Ouais, mais notre programme il est incomplet, on n'a pas mis de valeur à la variable 'true' (Quel nom, pour une variable !). Alors comment veux-tu que ça marche, et puis, même, ça n'a pas de sens, on ne met pas de conditions !


Bien sûr que si ! Ça a du sens !
Faites un autre test maintenant0 en remplaçant le 'true' par 'false' :

Code : Pascal 1
2
3
4
5
6
7
8
9
10if false
begin
write('vrai');

end
else
begin
write('faux');

end;




Résultat :

Code : Console
faux



Notons nos observations :

Si on mets 'true', le test est considéré comme vrai. Sinon, avec un 'false', le test est considéré comme faux.

Quelques explications



En fait, à chaque fois que vous faites un test dans un if, ce test renvoie la valeur true s'il est vrai, et false s'il est faux.

Par exemple :

Code : Pascal1if points>=15




Ici, le test que vous faites est "points>=15".

Supposons que points vaille 18. Alors le test est vrai, et l'ordinateur "remplace" en quelque sorte "points>=15" par true.
Ensuite, l'ordinateur obtient (dans sa tête) un "if true". Quand c'est 'true', comme on l'a vu, l'ordinateur dit que la condition est vraie, donc il affiche "vrai" !

De même, si la condition est fausse, il remplace "points>=15" par 'false', et du coup la condition est fausse : l'ordinateur va lire les instructions du "else".

Testons une variable



Testez maintenant un autre truc : envoyez le résultat de votre condition dans une variable, comme si c'était une opération, mais attention, ce n'est pas une opération : c'est une fonction toute faite, qui renverra soit TRUE si la condition est vraie, et FALSE, si elle fausse.

Code : Pascal1
2
3
4
5
6
7
8
9program testvar(output);
var score:integer ; reussi:boolean ;

begin
score:=18;
reussi:=score>=15;
writeln(reussi);
readln;
end.




Comme vous le voyez, la condition score>=15 a renvoyé 'TRUE' car elle est vraie. Du coup, notre variable reussi vaut 'TRUE' ; on vérifie d'ailleurs ça en faisant un writeln qui montre bien qu'elle a changé de valeur.

Faites le même test en mettant score:=10, par exemple. Cette fois, reussi vaudra 'FALSE'.

Les booléens dans nos conditions



On testera souvent des booléens, dans nos conditions, retenez bien ça !

Ce qui peut donner :

Code : Pascal1
2
3
4
5
6
7
8
9if reussi
then
begin
writeln('Vous avez réussi !');
end
else
begin
writeln('Dommage...');
end;




Les points importants de cette partie, sûrement la plus importante de ce chapitre



On va résumer ça dans une mini-condition :

Code : Pascal1
2
3
4
5if expression qui retourne un booleen
then
begin
blablabla
end




Donc là, le blablabla ne sera exécuté SI ET SEULEMENT SI l'expression qui retourne un booleen retourne TRUE ; si elle renvoie FALSE, le programme passera au else.

En résumé, sachez donc que les booléens servent à exprimer si quelque chose est vrai ou faux.
"case ... of ... end"

La condition "if... then... else" que l'on vient de voir est le type de condition le plus souvent utilisé.
En fait, il n'y a pas 36 façons de faire une condition en Pascal. Le "if... then... else" permet de gérer tous les cas.

Toutefois, cette condition peut s'avérer quelque peu... répétitive. Prenons cet exemple :

Code : Pascal 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24if score==0
then
begin
writeln('T''es nul !');
end
else if score==1
then
begin
writeln('Seulement 1 !?');
end
else if score<=10
then
begin
writeln('Tu n''as pas assez travaillé !');
end
else if score<=15
then
begin
writeln('Continue, tu passeras peut-être la barre des 15 !');
end
else
begin
writeln('Bravo !');
end;




(Aïe ! Mes doigts !)

"Case... of... end"



Les informaticiens détestent faire des choses répétitives, on a eu l'occasion de le vérifier plus tôt.
clin.png


Alors, pour éviter d'avoir à faire des répétitions comme ça quand on teste la valeur d'une seule et même variable, ils ont inventé une autre structure que le "if... then... else".
Cette structure particulière s'appelle "case... of... end". En voici un, basé sur l'exemple qu'on vient de voir :

Code : Pascal1
2
3
4
5
6
7Case score of
0 : writeln('T''es nul !');
1 : writeln('Seulement 1 !?');
2..10 : writeln('Tu n''as pas assez travaillé !');
11..15 : writeln('Continue, tu passeras peut-être la barre des 15 !');
else writeln('Bravo !');
end;




On voit tout de suite la différence, c'est moins de la moitié !
Alors, souvenez-vous de mon exemple.
Il faut en fait marquer Case nom_de_la_variable of puis, marquer la condition, et là il y a plusieurs manières :

On ne marque qu'un nombre.
Dans ce cas, la condition est :
SI la variable testée = le nombre en question, on fait la condition.
SINON, on passe à la suite.

On marque un nombre, 2 points et un autre nombre.
Dans ce cas, la condition est :
SI la variable testée >= au 1er nombre ET <= au 2e nombre, on fait la condition.
SINON, on passe à la suite.

Pour finir, le 'ELSE'.
Si jamais aucune des conditions n'a été remplie, l'ordinateur exécutera celle-là.

Un menu



Le "case ... of ... end" est souvent utilisé pour faire des menus.
Oh ! Une idée est parvenue à mon cerveau ! Un exercice, pour s'entraîner ! Vous allez faire ... un menu en "case ... of ... end".

Au travail



En console, pour faire un menu, on fait des write(ln) qui affichent les différentes options possibles. Chaque option est numérotée, et l'utilisateur doit rentrer le numéro du menu qui l'intéresse.
Voici par exemple ce que la console devra afficher :

Code : Console
=== Armurerie ===



1. Maverick

2. Ak47

3. Glock

4. Couteau



Que voulez-vous ?_



(Vous pouvez bien entendu mettre les choix que vous voulez : si vous n'êtes pas un féru des jeux vidéos, faites, par exemple, des titres de livres, de musiques, ...)

Reproduisez maintenant ce menu à l'aide de write(ln), ajoutez un read(ln) pour enregistrer le choix de l'utilisateur dans une variable choix_arme, et enfin faites un case... of... end pour dire à l'utilisateur : "vous avez choisi le couteau", par exemple.

Allez, au boulot.
diable.png


Correction



Voilà la correction, mais j'espère que vous avez tous trouvé !

Code : Pascal 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25program armurerie(output)
var choix_arme:integer;

begin
writeln('=== Armurerie ===');
writeln;
writeln('1. Maverick');
writeln('2. Ak47');
writeln('3. Glock');
writeln('4. Couteau');
writeln;
writeln('Que voulez-vous ?');
readln(choix_arme);
writeln;

case choix_arme of
1 : writeln('Vous avez pris une Maverick, mettez le silencieux ;)');
2 : writeln('Vous avez pris une AK47, mon arme préférée (ce tuto vous aura au moins appris ça)');
3 : writeln('Vous avez pris un Glock, et vous croyez vous en sortir ?');
4 : writeln('Vous avez pris un couteau !?');
else writeln('Vous n''avez pas rentré un bon nombre, vous combatterez à main nues !');
end;

readln;
end.




Et voilà !

J'espère que vous n'avez pas oublié le "else" à la fin du "case ... of ... end" !
En effet, quand vous programmez, vous devez toujours penser à tous les cas. Vous avez beau dire de taper un nombre entre 1 et 4, vous trouverez toujours un imbécile qui ira taper "10" ou encore "Salut", alors que ce n'est pas ce que vous attendez.

Bref, soyez toujours vigilants de ce côté-ci : ne faites pas confiance à l'utilisateur, il peut parfois rentrer n'importe quoi. Prévoyez toujours un cas "else".

Je vous conseille de vous familiariser avec le fonctionnement des menus en console, car on en fait souvent dans des programmes console, et vous en aurez sûrement besoin.
smile.png


Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!