Prendre une décision
Faire réagir le programme selon la situation.
Après cette fiche, vous saurez :
- écrire une condition avec if
- prévoir le cas contraire avec else
- utiliser les opérateurs de comparaison
- reconnaître le losange dans un ordinogramme
1Le chemin qui se sépare
Souvenez-vous de la fiche 1 : l'ordinateur suit un chemin, et ce chemin ne descend pas toujours tout droit.
Voici la première façon de le faire dévier : la condition. Le programme regarde une situation, et choisit ce qu'il fait ensuite.
int age = 20; if (age >= 18) { Console.WriteLine("Vous êtes majeur."); }
Vous êtes majeur.
| Morceau | Rôle |
|---|---|
if | « si » en anglais |
(age >= 18) | La condition à tester, entre parenthèses |
{ … } | Ce qu'on fait si c'est vrai |
Si la condition est fausse, le bloc entre accolades est sauté. Le programme continue en dessous.
Attention
Pas de point-virgule après la parenthèse du if.
if (age >= 18); // FAUX { Console.WriteLine("Vous êtes majeur."); }
Ce programme compile, mais le message s'affiche toujours, même pour un mineur.
Le point-virgule ferme le if immédiatement : la condition ne commande
plus rien, et le bloc s'exécute tout seul. C'est une erreur difficile à voir, parce
qu'il n'y a aucun message d'alerte.
2Les opérateurs de comparaison
| Opérateur | Signifie | Exemple |
|---|---|---|
== | est égal à | if (age == 18) |
!= | est différent de | if (age != 18) |
> | est plus grand que | if (hp > 0) |
< | est plus petit que | if (hp < 10) |
>= | est plus grand ou égal | if (age >= 18) |
<= | est plus petit ou égal | if (age <= 12) |
Attention
Un signe égal, ou deux ? La confusion classique.
| Écriture | Veut dire | Où on l'utilise |
|---|---|---|
= | reçoit | age = 18; — on remplit la boîte |
== | est égal à | if (age == 18) — on compare |
Souvenez-vous de la fiche 4 : le simple = est une flèche qui range
une valeur. Il ne pose aucune question.
Pour demander si deux choses sont égales, il en faut deux :
==.
Si vous écrivez if (age = 18), le compilateur refuse. C'est une bonne
nouvelle : il vous attrape.
3else : et sinon ?
int age = 15; if (age >= 18) { Console.WriteLine("Vous êtes majeur."); } else { Console.WriteLine("Vous êtes mineur."); }
Vous êtes mineur.
else veut dire « sinon ». Le bloc s'exécute quand la condition est
fausse.
À retenir
Un seul des deux blocs s'exécute. Jamais les deux, jamais aucun.
C'est la garantie du if / else : le chemin se sépare en deux, et le
programme en prend exactement un.
Un exemple complet
Console.Write("Quel âge avez-vous ? "); int age = int.Parse(Console.ReadLine()); if (age >= 18) { Console.WriteLine("Bienvenue, vous pouvez entrer."); } else { Console.WriteLine("Désolé, réservé aux majeurs."); Console.WriteLine($"Revenez dans {18 - age} an(s)."); } Console.WriteLine("Au revoir !"); Console.ReadKey();
Quel âge avez-vous ? 15
Désolé, réservé aux majeurs.
Revenez dans 3 an(s).
Au revoir !Remarquez la dernière ligne : « Au revoir ! » s'affiche dans tous les cas, parce qu'elle est en dehors des accolades. Les deux chemins se rejoignent.
4Les accolades
Les accolades délimitent ce qui appartient au if. Elles sont
facultatives quand il n'y a qu'une seule ligne, mais mettez-les toujours.
Attention
Pourquoi toujours les mettre.
if (hp <= 0) Console.WriteLine("Vous êtes mort."); Console.WriteLine("Fin de la partie.");
La deuxième ligne s'affiche toujours, même si le joueur est vivant. Seule
la première appartient au if.
L'indentation trompe l'œil : elle suggère que les deux lignes vont ensemble, alors que le compilateur ne regarde que les accolades.
Avec les accolades, aucune ambiguïté :
if (hp <= 0) { Console.WriteLine("Vous êtes mort."); Console.WriteLine("Fin de la partie."); }
5L'ordinogramme : le losange
Voici la cinquième et dernière forme de base, annoncée à la fiche 6.
| Forme | Ce qu'elle veut dire |
|---|---|
| Ovale | Début ou fin |
| Rectangle | Un traitement, un calcul |
| Trapèze | Afficher |
| Parallélogramme | Demander une saisie |
| Losange | Une question, avec deux sorties : oui et non |
Le losange est la seule forme qui a deux flèches de sortie. C'est justement là que le chemin se sépare.
Et le programme correspondant :
Console.Write("Quel âge avez-vous ? "); int age = int.Parse(Console.ReadLine()); if (age >= 18) { Console.WriteLine("majeur"); } else { Console.WriteLine("mineur"); }
Comme à la fiche 6, la saisie prend deux formes : le trapèze pour la question
affichée, le parallélogramme pour la réponse récupérée dans age.
À retenir
Quatre choses à observer sur ce dessin.
- La question et la récupération de la réponse sont deux formes distinctes : trapèze, puis parallélogramme.
- Le losange contient une question, pas une action.
- Il a deux flèches de sortie, étiquetées oui et non.
- Les deux chemins se rejoignent avant la fin. C'est la ligne « Au revoir » de l'exemple précédent.
Si vos deux branches ne se rejoignent jamais, relisez votre schéma : c'est généralement une erreur.
→Exercices
Recopiez ce programme et testez-le avec 15, puis avec 18, puis avec 42.
Console.Write("Quel âge avez-vous ? "); int age = int.Parse(Console.ReadLine()); if (age >= 18) { Console.WriteLine("Vous êtes majeur."); } else { Console.WriteLine("Vous êtes mineur."); } Console.WriteLine("Merci de votre visite."); Console.ReadKey();
Puis répondez : que se passe-t-il exactement avec 18 ? Et si on avait écrit
> au lieu de >= ?
Solution
Quel âge avez-vous ? 18
Vous êtes majeur.
Merci de votre visite.Avec 18 : « majeur », parce que >= inclut la valeur 18
elle-même.
Avec > seul : une personne de 18 ans serait déclarée
mineure. C'est faux, et c'est une erreur qui passe facilement inaperçue — il
faut penser à tester exactement la valeur limite.
La leçon : testez toujours vos programmes avec la valeur frontière. Ici, 17, 18 et 19. C'est là que se cachent les erreurs.
Et « Merci de votre visite » s'affiche dans les deux cas, parce qu'elle est en dehors des accolades.
Reprenez l'aventure de Radakass de la fiche 5.
- Après chaque évènement, testez si
hpest tombé à zéro ou en dessous. - Si oui, affichez « Radakass est mort ! ».
- Si non, affichez ses points de vie normalement.
- Rendez les dégâts plus violents pour qu'il meure vraiment : −20, puis −35.
Solution
int hp = 50; Console.WriteLine("=== AVENTURE DE RADAKASS ==="); Console.WriteLine(); Console.WriteLine($"Radakass a {hp} HP"); Console.WriteLine("Radakass tombe dans un piège..."); hp = hp - 20; if (hp <= 0) { Console.WriteLine("Radakass est mort !"); } else { Console.WriteLine($"Radakass a {hp} HP"); } Console.WriteLine("Radakass affronte un dragon..."); hp = hp - 35; if (hp <= 0) { Console.WriteLine("Radakass est mort !"); } else { Console.WriteLine($"Radakass a {hp} HP"); } Console.ReadKey();
=== AVENTURE DE RADAKASS === Radakass a 50 HP Radakass tombe dans un piège... Radakass a 30 HP Radakass affronte un dragon... Radakass est mort !
Pourquoi <= 0 et non == 0 ?
Parce que les points de vie ne s'arrêtent pas pile sur zéro. Ici 30 − 35
donne −5. Avec == 0, le test échouerait et Radakass serait
déclaré vivant avec −5 HP.
C'est une erreur très fréquente. Testez toujours <= 0 pour
une jauge qui descend.
Un défaut du programme : même mort, Radakass continue à affronter le dragon. Les lignes suivantes s'exécutent quand même. Pour l'arrêter vraiment, il faudrait des outils que nous verrons plus tard.
Écrivez un programme pour un radar.
- Demandez la vitesse limite de la route.
- Demandez la vitesse mesurée du véhicule.
- Si la vitesse dépasse la limite, affichez « INFRACTION », le nombre de km/h de dépassement, et une amende de 50 euros par km/h.
- Sinon, affichez « Vitesse correcte ».
- Dans tous les cas, terminez par « Contrôle terminé. »
Avant de coder, dessinez l'ordinogramme avec son losange.
Solution
Console.Write("Vitesse limite (km/h) : "); int limite = int.Parse(Console.ReadLine()); Console.Write("Vitesse mesurée (km/h) : "); int mesuree = int.Parse(Console.ReadLine()); Console.WriteLine(); if (mesuree > limite) { int depassement = mesuree - limite; double amende = depassement * 50.0; Console.WriteLine("*** INFRACTION ***"); Console.WriteLine($"Dépassement : {depassement} km/h"); Console.WriteLine($"Amende : {amende:F2} euros"); } else { Console.WriteLine("Vitesse correcte."); } Console.WriteLine(); Console.WriteLine("Contrôle terminé."); Console.ReadKey();
Vitesse limite (km/h) : 50 Vitesse mesurée (km/h) : 68 *** INFRACTION *** Dépassement : 18 km/h Amende : 900,00 euros Contrôle terminé.
Trois points à observer.
1. Les variables depassement et amende sont créées
à l'intérieur du bloc if. C'est logique : elles ne servent que là.
Attention cependant, elles n'existent plus une fois l'accolade fermée — on ne
pourrait pas les afficher après.
2. depassement * 50.0 avec un point-zéro. Sans lui, le calcul
resterait entier. Ici cela ne changerait rien, mais c'est le bon réflexe.
3. « Contrôle terminé » est en dehors des accolades, donc dans les deux cas. C'est la ligne où les deux chemins de l'ordinogramme se rejoignent.
Je sais faire
- Je sais écrire un if simple.
- Je sais ajouter un else.
- Je connais les six opérateurs de comparaison.
- Je sais que == et = ne sont pas la même chose.
- Je reconnais le losange dans un ordinogramme.
Une case qui coince ? Relisez la partie concernée avant de passer à la fiche suivante.