• Aucun résultat trouvé

La logique booléenne

Dans le document La programmation en C++ moderne (Page 72-75)

Contenu masqué n°5

II.5.7. La logique booléenne

Nous avons vu les différents moyens de tester des conditions, ainsi que différents opérateurs de comparaisons qui retournent des booléens. Mais ce ne sont pas les seuls. Cette section va introduire l’algèbre booléenne , et rassurez-vous, c’est simple à comprendre, puissant et bien utile.

II.5.7.1. AND — Tester si deux conditions sont vraies

Imaginons un instant que vous souhaitiez faire l’acquisition d’une voiture. Pour cela, il vous faut remplir deux conditions: avoir le permis et suffisamment d’argent. Si l’une des deux conditions n’est pas remplie, ou les deux, vous continuerez à prendre le bus. Le seul moyen de faire hurler le moteur sur l’autoroute, c’est d’avoir assez d’argent ET d’avoir le permis.

C++ nous fournit deux moyens d’exprimer cet opérateur logique «ET»: &&et and. Les deux sont parfaitement valables et interchangeables. Le deuxième était notamment prévu à l’époque où tous les claviers ne possédaient pas le symbole & .

!

Ancienne spécificité Microsoft

Si and ne marche pas avec Visual Studio, il faut inclure le fichier <ciso646>. Avec une version à jour, ce n’est cependant plus nécessaire.

1 #include <iostream>

2

3 int main() 4 {

5 int const prix_voiture { 5000 };

6 int const argent { 2000 };

7 bool const a_le_permis { true };

8

9 if (argent >= prix_voiture && a_le_permis)

10 {

11 std::cout << "Voici les clés, bonne route." << std::endl;

12 }

13 else

14 {

15 std::cout << "Désolé, vous allez devoir prendre le bus." <<

std::endl;

16 }

17

18 return 0;

19 }

Testez donc ce programme en modifiant le prix de la voiture, l’argent disponible ou la possession ou non du permis. Comme écrit plus haut, il n’y a que si a_le_permis est à true et qu’il y a plus d’argent que le prix de la voiture que vous serez en mesure d’avoir les clés.

Voici ce qu’on appelle la table de vérité de l’opérateur AND, qui formalise les entrées et les sorties de cet opérateur. N’hésitez pas à en lire plus sur le sujet s’il vous intéresse.

Première condition Seconde condition Résultat de l’opérateur «AND»

false false false

false true false

true false false

true true true

II.5.7.2. OR — Tester si au moins une condition est vraie

Maintenant, nous allons aller visiter un musée. Quand on arrive devant l’entrée, bonne surprise, l’entrée est gratuite si l’on a moins de 26 ans OUsi l’on est professeur (peu importe la matière).

Il suffit de remplir l’une des deux conditions pour être admis gratuitement à l’intérieur. Bien sûr, si vous remplissez les deux, l’offre reste valable.

Cet exemple va servir de base pour l’introduction de l’opérateur C++ «OU»: au choix, || (qui se tape sur un AZERTY français en faisant Alt Gr + - (le numéro 6) ou or, présent pour la même raison que précédemment.

!

Ancienne spécificité Microsoft

Si or ne marche pas avec Visual Studio, il faut inclure le fichier <ciso646>. Avec une version à jour, ce n’est cependant plus nécessaire.

1 #include <iostream>

23 int main() 4 {

5 int const age { 25 };

6 bool const est_professeur { true };

7

8 if (age <= 26 || est_professeur)

9 {

10 std::cout << "Bonne visite." << std::endl;

11 }

12 else

13 {

14 std::cout << "Désolé, il va falloir payer." << std::endl;

15 }

16

17 return 0;

18 }

Encore une fois, faites vôtre ce programme et modifiez-le. Voyez dans quelles circonstances l’entrée est gratuite et à quels moments il faut payer. Vous allez obtenir des résultats identiques à la table de vérité ci-dessous.

Première condition Seconde condition Résultat de l’opérateur «OR»

false false false

false true true

true false true

true true true

II.5.7.3. NOT — Tester la négation

Il fait chaud, vous allez à la piscine vous rafraichir. En arrivant, vous jetez un œil au règlement et vous voyez qu’il est interdit de nager si l’on a un short de bain et non un maillot de bain.

Vous raisonnez donc ainsi: «Si j’ai un maillot de bain, alors tout va bien, l’entrée m’est autorisée, je peux nager. Si j’ai un short de bain, alors l’entrée m’est interdite et je dois en acheter un avant de nager.» Comment exprimeriez-vous ça en C++? Peut-être avec le code ci-dessous?

1 int main() 2 {

3 bool const ai_je_un_maillot { true };

4 if (ai_je_un_maillot)

10 // Je dois aller acheter un maillot.

11 }

1213 // Je nage et je suis heureux.

14 return 0;

15 }

Ce code fonctionne, mais il nous pose un problème: on a un if vide et c’est moche. L’idéal

serait de ne traiter que le cas «Pas de maillot de bain». C++ nous permet justement cela avec l’opérateur de négation ! ou not. Celui-ci renvoie la valeur inverse de l’expression testée. Si l’expression vaut true, alors cet opérateur renverra false; si, au contraire, elle valait false, sa négation donnera true.

!

Ancienne spécificité Microsoft

Si not ne marche pas avec Visual Studio, il faut inclure le fichier <ciso646>. Avec une version à jour, ce n’est cependant plus nécessaire.

1 int main() 2 {

3 bool const ai_je_un_maillot { true };

4 if (!ai_je_un_maillot)

5 {

6 // Je dois aller acheter un maillot.

7 }

89 // Je nage et je suis heureux.

10 return 0;

11 }

Notre code devient plus court, plus concis et plus agréable à lire, il gagne en qualité. Je vous mets en dessous la table de vérité, bien plus courte cette fois.

Valeur de la condition Résultat de l’opérateur «NOT»

true false

false true

?

Il y a juste quelque chose que je ne comprends pas. Pourquoi ne pas créer tout simplement un booléen inverse, genrepas_de_maillot? Pourquoi se casser la tête à tester la négation d’une condition et ne pas tester la condition inverse tout de suite?

C’est une très bonne question. Dans un exemple aussi simpliste que celui-ci, monté de toute pièce, on aurait pu, c’est vrai. Mais d’autres fois nous n’avons pas le choix, car nous utilisons du code qui a été programmé d’une certaine façon.

Dans le document La programmation en C++ moderne (Page 72-75)