Les conditions imbriquées
Parfois, une décision en entraîne une autre : « s'il pleut, alors : si j'ai un parapluie, je sors ; sinon, je reste ». On place alors un si à l'intérieur d'un autre. On parle de conditions imbriquées.
Un si dans un si
pluie est un booléen vaut vrai
parapluie est un booléen vaut faux
si pluie alors
si parapluie alors
affiche 'Je sors avec mon parapluie.'
sinon
affiche 'Je reste à la maison.'
fin si
sinon
affiche 'Je sors, il fait beau !'
fin si
Le si parapluie n'est examiné que s'il pleut. Chaque si a son propre fin si : l'indentation montre clairement lequel ferme lequel.
Un arbre de décision
Les conditions imbriquées dessinent un arbre : à chaque question, on part sur une branche. Exemple avec le tarif d'un cinéma :
- moins de 12 ans : 5 € ;
- 12 ans ou plus : 9 € en semaine, 11 € le week-end, avec 2 € de réduction pour les étudiants.
age est un nombre
demande 'Ton âge ? ' dans age
prix est un nombre
jour est un nombre
statut est un nombre
si age < 12 alors
prix vaut 5
sinon
choisir ['En semaine', 'Le week-end'] dans jour
si jour = 1 alors
prix vaut 9
sinon
prix vaut 11
fin si
choisir ['Étudiant', 'Autre'] dans statut
si statut = 1 alors
prix soustrait 2
fin si
fin si
affiche 'Prix de la place : ' + prix + ' €'
Remarque : les questions sur le jour et le statut ne sont posées qu'aux plus de 12 ans. L'imbrication évite de poser des questions inutiles.
Question : Un étudiant de 20 ans va au cinéma le week-end. Combien paie-t-il ? — 9 €. 20 ans : branche « sinon ». Week-end : 11 €. Étudiant : 11 - 2 = 9 €.
Imbriquer ou combiner ?
Deux si imbriqués sans sinon peuvent souvent s'écrire en un seul, avec et :
age est un nombre vaut 15
accord est un booléen vaut vrai
// version imbriquée
si age >= 13 alors
si accord alors
affiche 'Inscription acceptée.'
fin si
fin si
// version combinée : exactement le même résultat
si age >= 13 et accord alors
affiche 'Inscription acceptée.'
fin si
La seconde version est plus courte et plus lisible. En revanche, quand chaque branche a son propre sinon, l'imbrication reste nécessaire.
Classer un triangle
Un exemple où l'ordre des questions compte :
cote1 est un nombre vaut 5
cote2 est un nombre vaut 5
cote3 est un nombre vaut 8
si cote1 = cote2 et cote2 = cote3 alors
affiche 'Triangle équilatéral'
sinon
si cote1 = cote2 ou cote2 = cote3 ou cote1 = cote3 alors
affiche 'Triangle isocèle'
sinon
affiche 'Triangle quelconque'
fin si
fin si
On teste d'abord le cas le plus précis (trois côtés égaux), puis le cas plus large (deux côtés égaux). Dans l'autre ordre, un triangle équilatéral serait annoncé « isocèle ».
Au-delà de trois niveaux d'imbrication, un programme devient difficile à lire. C'est le signe qu'il faut combiner des conditions avec et / ou, utiliser sinon si, ou ranger une partie dans une fonction.
En résumé
- Un
si peut contenir un autre si : la seconde question n'est posée que si la première le demande. - Chaque
si a son fin si ; l'indentation montre la structure. - Deux
si imbriqués sans sinon se combinent avec et. - On teste toujours le cas le plus précis en premier.