14. Instruction if ▲
Nous avons appris que ce que fait le programme est effectué par des expressions. Toutes les expressions de tous les programmes que nous avons vus jusqu'à maintenant ont commencé avec la fonction main et étaient exécutées jusqu'à la fin de main.
Les instructions, d'un autre côté, sont des éléments qui affectent l'exécution des expressions. Les instructions ne produisent pas de valeurs et n'ont pas d'effets de bord en elles-mêmes. Elles déterminent si et dans quel ordre les expressions sont exécutées. Les instructions utilisent parfois des expressions logiques pour prendre de telles décisions.
Certains langages de programmation peuvent avoir des définitions différentes pour les expressions et les instructions, et d'autres peuvent ne pas faire de distinction du tout.
14-1. Le bloc if et sa portée▲
L'instruction if détermine si une ou plusieurs expressions doivent être exécutées. Elle prend cette décision en évaluant une expression logique. Elle a le même sens que le mot français « si » dans la phrase « s'il y a du café alors je boirai du café ».
if prend une expression logique entre parenthèses. Si la valeur de cette expression logique est true, alors les expressions qui se trouvent entre les accolades qui suivent sont exécutées. À l'inverse, si l'expression logique est false, les expressions placées entre les accolades ne seront pas exécutées.
Le code situé entre les accolades est appelé bloc.
Voici la syntaxe de l'instruction if :jlliagre 2018-02-11T20:43:08jJe n'arrive pas à avoir if comme mot clef suivi d'une espace insécable.
if
(
une_expression_logique)
{
// ... La ou les expressions à exécuter si l'expression logique est vraie
}
Par exemple, la construction qui représente « s'il y a du café alors boire le café et laver la tasse » peut être écrite comme suit :
import
std.stdio;
void
main
(
)
{
bool ilyaDuCafé =
true
;
if
(
ilyaDuCafé) {
writeln
(
"Boire le café"
);
writeln
(
"Laver la tasse"
);
}
}
Si la valeur de ilyaDuCafé était false, alors les expressions qui sont dans le bloc seraient ignorées et le programme n'afficherait rien.
Notez également qu'ouvrir les accolades sur la même ligne que le mot clé if est un style de codage répandu.
14-2. Le bloc else et sa portée▲
Il y a parfois des opérations à exécuter quand l'expression logique de l'instruction if est fausse. Par exemple, il y a toujours une opération à exécuter dans une décision du type « s'il y a du café, je boirai du café, sinon je boirai du thé ».
Les opérations à exécuter dans le cas false sont placées dans un bloc après le mot clé else :
if
(
une_expression_logique)
{
// ... expression(s) à exécuter si vrai
}
else
{
// ... expression(s) à exécuter si faux
}
Par exemple, en supposant qu'il y a toujours du thé :
if
(
ilyaDuCafé) {
writeln
(
"Boire du café"
);
}
else
{
writeln
(
"Boire du thé"
);
}
Dans cet exemple, soit la première, soit la deuxième chaîne de caractères sera affichée selon la valeur de ilyaDuCafé.
Notez également de quelle façon les accolades sont placées autour de else ; c'est aussi un style de codage répandu.
else lui-même n'est pas une instruction, mais une clause optionnelle de l'instruction if ; elle ne peut pas être utilisée toute seule.
14-3. Utilisez toujours des accolades pour entourer les blocs▲
Ce n'est pas recommandé, mais il est possible d'omettre les accolades s'il n'y a qu'une instruction dans un bloc. Comme les blocs if et else qui précèdent ne contiennent qu'une instruction, ce code peut être écrit comme suit :
if
(
ilyaDuCafé)
writeln
(
"Boire du café"
);
else
writeln
(
"Boire du thé"
);
Les programmeurs les plus expérimentés utilisent des accolades même pour une seule instruction (l'un des exercices de ce chapitre est relatif à leur omission). J'insiste sur cette règle de toujours utiliser des accolades, mais je vais maintenant vous montrer le seul cas où il est préférable de les omettre.
14-4. La chaîne « if, else if, else »▲
Une des forces des instructions et des expressions est la possibilité de les utiliser de manière plus complexe. En plus des expressions, les blocs peuvent contenir d'autres instructions. Par exemple, un bloc else peut contenir une instruction if. Combiner les instructions et les expressions nous permet de réaliser des programmes qui se comportent conformément à ce pour quoi ils sont conçus.
Ce qui suit est un code plus complexe écrit à partir de la supposition qu'aller dans un bon troquet à vélo est préférable à marcher vers un mauvais troquet :
if
(
ilyaDuCafé) {
writeln
(
"Boire du café à la maison"
);
}
else
{
if
(
ilyaUnVélo) {
writeln
(
"Aller au bon endroit"
);
}
else
{
writeln
(
"Marcher vers le mauvais endroit"
);
}
}
Le code ci-dessus représente la phrase : « s'il y a du café, boire à la maison ; sinon, s'il y a un vélo, aller au bon endroit ; sinon marcher vers le mauvais endroit ».
Complexifions un peu ce processus de décision : au lieu de devoir marcher vers le mauvais endroit, essayer d'abord le voisin :
if
(
ilyaDuCafé) {
writeln
(
"Boire du café à la maison"
);
}
else
{
if
(
ilyaUnVélo) {
writeln
(
"Aller au bon endroit"
);
}
else
{
if
(
voisinEstChezLui) {
writeln
(
"Prendre le café chez le voisin"
);
}
else
{
writeln
(
"Marcher vers le mauvais endroit"
);
}
}
}
Des décisions comme « si ce cas, sinon si cet autre cas, sinon si cet autre autre cas, etc. » sont courantes dans les programmes. Malheureusement, quand la règle de toujours utiliser des accolades est suivie aveuglément, le code fini par occuper trop d'espace horizontal et vertical : en ignorant les lignes vides, les trois instructions if et les quatre expressions writeln ci-dessus occupent un total de treize lignes.
Pour écrire de telles constructions d'une façon plus compacte, quand un bloc else contient une seule instruction if, les accolades de ce bloc else sont exceptionnellement omises.
Je laisse intentionnellement le code suivant mal écrit en tant qu'étape intermédiaire avant de le montrer plus loin sous une meilleure forme. Aucun code ne devrait être écrit comme cela. (Je le laisse également non coloré pour indiquer qu'il est inacceptable écrit de cette manière).
Ce qui suit est ce à quoi le code ressemble après avoir supprimé les accolades des deux blocs else qui ne contiennent qu'une instruction if :
if
(
ilyaDuCafé) {
writeln
(
"Boire du café à la maison"
);
}
else
if
(
ilyaUnVélo) {
writeln
(
"Aller à vélo au bon endroit"
);
}
else
if
(
voisinEstChezLui) {
writeln
(
"Prendre le café chez le voisin"
);
}
else
{
writeln
(
"Marcher jusqu'au mauvais endroit"
);
}
Si maintenant nous déplaçons ces instructions if sur la même ligne que le else qui les précède et que nous nettoyons le code, nous finissons par avoir quelque chose de plus lisible :
if
(
ilyaDuCafé) {
writeln
(
"Boire du café à la maison"
);
}
else
if
(
ilyaUnVélo) {
writeln
(
"Aller à vélo au bon endroit"
);
}
else
if
(
voisinEstChezLui) {
writeln
(
"Prendre le café chez le voisin"
);
}
else
{
writeln
(
"Marcher jusqu'au mauvais endroit"
);
}
Supprimer les accolades permet au code d'être plus compact et de regrouper les expressions pour une meilleure lisibilité. Les expressions logiques, l'ordre dans lequel elles sont évaluées, et les opérations qui sont exécutées quand elles sont vraies sont maintenant plus faciles à voir d'un coup d'œil.
Cette structure de programmation courante est appelée la chaîne « if, else if, else ».
14-5. Exercices▲
- Puisque l'expression logique ci-dessous est vraie, nous pourrions nous attendre à ce que le programme boive de la limonade et lave le verre.
import
std.stdio;
void
main
(
)
{
bool ilyaDeLaLimonade =
true
;
if
(
ilyaDeLaLimonade) {
writeln
(
"Boire de la limonade"
);
writeln
(
"Laver le verre"
);
}
else
writeln
(
"Manger de la tarte"
);
writeln
(
"Laver l'assiette"
);
}
-
Mais si vous lancez ce programme, vous verrez qu'il lave aussi l'assiette :
SélectionnezBoire de la limonade Laver le verre Laver l
'assiette
-
Pourquoi ? Corrigez le programme pour ne laver l'assiette que lorsque l'expression logique est fausse.
Valeur du dé
Sortie du programme
1
Vous gagnez
2
Vous gagnez
3
Vous gagnez
4
Je gagne
5
Je gagne
6
Je gagne
N'importe quelle autre valeur
ERREUR : Valeur non valide
- Bonus : faire en sorte que ce programme mentionne aussi la valeur quand celle-ci est invalide. Par exemple :
- Changez le jeu pour que l'utilisateur entre une valeur entre 1 et 1000. Maintenant, l'utilisateur gagne quand la valeur se trouve dans l'intervalle 1 à 500 et l'ordinateur gagne quand la valeur se trouve dans l'intervalle 501 à 1000. Est-ce que le programme précédent peut être facilement modifié pour fonctionner de cette manière ?