You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Maintenant que nous disposons d'un moyen d'obtenir une valeur booléenne (via les opérateurs de comparaison) nous allons pouvoir manipuler ces valeurs avec ce que l'on nomme des **opérateurs logiques**.
83
83
@@ -147,11 +147,11 @@ Je ne détaillerai pas dans ce chapitre son utilité mais il est important de le
147
147
De même pour l'opérateur **OR** (```||```) différent de <kbd>|</kbd>.
148
148
:::
149
149
150
-
### Des structures de contrôle
150
+
## Des structures de contrôle
151
151
152
152
C'est bien beau toutes ces valeurs booléennes mais comment on peut s'en servir pour exécuter une partie d'un code ou un autre en fonction d'une condition ?
153
153
154
-
#### Si
154
+
### If
155
155
Notre première structure de contrôle va s'utiliser avec le mot clé **if**.
156
156
De l'anglais, ce mot clé signifiant **"si"**, exécute des instructions si et seulement si la condition donnée est vraie.
157
157
@@ -230,7 +230,7 @@ if ( isExpensive )
230
230
```
231
231
:::
232
232
233
-
#### Sinon
233
+
###Else
234
234
235
235
C'est très bien de pouvoir effectuer quelque chose si une condition est vérifée mais comment faire si l'on veut effectuer une action A si la condition est vérifée et une autre action B si ce n'est pas le cas ?
236
236
@@ -322,7 +322,7 @@ int main()
322
322
323
323
Mais comment tester une succession de conditions différentes avant de faire "tout le reste" ?
324
324
325
-
#### Sinon si
325
+
###Else if
326
326
327
327
On pourrait très bien chaîner plusieurs ```if``` et ```else``` imbriqués de cette manière:
328
328
@@ -389,7 +389,7 @@ int main()
389
389
```
390
390
391
391
:::note
392
-
Enfin, il existe une dernière syntaxe (le ```switch``` pour les curieux) qui permet de faire quelque chose de similaire au ```else if``` mais il nous manque quelques notions et je vous le présenterai juste après les boucles.
392
+
Enfin, il existe une dernière syntaxe (le ```switch``` pour les curieux) qui permet de faire quelque chose de similaire au ```else if```lorsque nos conditions sont des égalités sur une même variable. mais il nous manque quelques notions avant de pouvoir l'aborder correctement. Nous y reviendrons plus tard dans ce chapitre.
393
393
:::
394
394
395
395
### Faux-ami
@@ -409,7 +409,7 @@ En **C++**, l'assignation retourne la valeur de la variable assignée. Ici, la c
409
409
410
410
Les valeurs numériques non nulles sont considérées comme vraies et la valeur 0 est considérée comme fausse.
411
411
412
-
### Combinaison d'expressions
412
+
### Combinaison d'expressions et logique booléenne
413
413
414
414
Avec tous les opérateurs logiques vu précédemment il est même possible de tester plusieurs conditions dans un même ```if```.
415
415
@@ -455,7 +455,7 @@ Cela permet parfois de simplifier le code ou alors d'exprimer la condition sous
455
455
456
456
Dans mon exemple précédent la condition ```(!isRaining || (isRaining && ownsAnUmbrella))``` est équivalente à écrire ```(!isRaining || ownsAnUmbrella)```.
457
457
458
-
En effet, si il ne **pleut pas**(`!isRaining`) , peu importe si j'ai un parapluie ou non, je peux sortir, Si cependant la première condition est fausse (il pleut) alors inutile de vérifier de nouveau si il pleut (`!isRaining || (isRaining &&...`) c'est impliqué par la première condition et donc il suffit de vérifier si j'ai un parapluie.
458
+
En effet, si il ne **pleut pas**(`!isRaining`) , peu importe si j'ai un parapluie ou non, je peux sortir, Si cependant la première condition est fausse (il pleut) alors inutile de vérifier de nouveau si il pleut (`!isRaining || (isRaining &&...`) c'est implicite par la première condition et donc il suffit de vérifier si j'ai un parapluie.
459
459
460
460
Il existe aussi le **théorème de De Morgan** qui permet d'exprimer la négation d'un **ET** avec un **OU** et inversement.
461
461
@@ -471,135 +471,6 @@ On peut s'en convaincre en essayant de traduire ces conditions en phrases:
471
471
Vous trouverez des exemples de propriétés et simplifications possibles sur la page Wikipédia suivante:
472
472
[Algèbre de Boole](https://fr.wikipedia.org/wiki/Alg%C3%A8bre_de_Boole_(logique))
473
473
474
-
### Switch
475
-
476
-
Maintenant que nous avons toutes les cartes en main revenons brièvement au **switch** dont je vous parlais précédemment.
477
-
478
-
Très souvent on veut seulement tester la valeur d'une variable et effectuer telle ou telle action en fonction. On pourrait très bien écrire cela avec des ```else if```:
479
-
480
-
```cpp
481
-
#include<iostream>
482
-
intmain()
483
-
{
484
-
int value { 42 };
485
-
if ( value == 12 )
486
-
{
487
-
// ...
488
-
}
489
-
else if ( value == 33 )
490
-
{
491
-
// ...
492
-
}
493
-
else if ( value == 52)
494
-
{
495
-
//...
496
-
}
497
-
else
498
-
{
499
-
//...
500
-
}
501
-
return 0;
502
-
}
503
-
```
504
-
505
-
C'est avec le mot clé ```switch``` que l'on va pouvoir faire cela de façon plus lisible:
506
-
507
-
```cpp
508
-
#include<iostream>
509
-
intmain()
510
-
{
511
-
int value { 42 };
512
-
switch (value)
513
-
{
514
-
case 12:
515
-
// ...
516
-
break; // permet de quitter le bloc switch
517
-
case 33:
518
-
// ...
519
-
break;
520
-
case 52:
521
-
// ...
522
-
break;
523
-
default:
524
-
// ...
525
-
break;
526
-
}
527
-
528
-
return 0;
529
-
}
530
-
```
531
-
532
-
Lorsque l'expression testée est égale à une des valeurs listées avec les mots-clés ```case``` la **totalité** des instructions qui suivent sont exécutées.
533
-
Le mot clé ```break``` indique la sortie de la structure de contrôle.
534
-
Le mot clé ```default``` indique quelles instructions exécuter si l'expression n'est jamais égale à une des valeurs.
535
-
536
-
:::danger
537
-
De manière générale, n'oubliez pas d'insérer des instructions ```break``` entre chaque test, ce genre d'oubli est difficile à détecter car aucune erreur n'est signalée...
538
-
En effet la **totalité** des instructions suivant le ```case``` sont exécutées et donc on pourrait se retrouver à exécuter des instructions de manière involontaire.
539
-
540
-
```cpp
541
-
#include<iostream>
542
-
intmain()
543
-
{
544
-
int value { 33 };
545
-
switch (value)
546
-
{
547
-
case 12:
548
-
std::cout << "value est égale à 12" << std::endl;
549
-
case 33:
550
-
std::cout << "value est égale à 33" << std::endl;
551
-
default:
552
-
std::cout << "value est différent de 12 ou 33" << std::endl;
553
-
}
554
-
555
-
return 0;
556
-
}
557
-
```
558
-
qui nous donne:
559
-
560
-
```bash
561
-
value est égale à 33
562
-
value est différent de 12 ou 33
563
-
```
564
-
565
-
Cela peut être parfois voulu mais ici on se rend bien compte qu'il y a un problème et il ne faut donc pas oublier le mot clé ```break```.
566
-
567
-
Voici un exemple où cela peut être utile:
568
-
569
-
```cpp
570
-
#include<iostream>
571
-
intmain()
572
-
{
573
-
char letter { 'e' };
574
-
switch(letter)
575
-
{
576
-
case 'a':
577
-
case 'e':
578
-
case 'i':
579
-
case 'o':
580
-
case 'u':
581
-
case 'y':
582
-
std::cout << "You entered a vowel." << std::endl;
583
-
break;
584
-
default:
585
-
std::cout << "You entered a consonant." << std::endl;
586
-
break;
587
-
}
588
-
589
-
return 0;
590
-
}
591
-
```
592
-
593
-
Certains warnings de compilateur permette d'indiquer ce genre de cas mais c'est mieux d'y faire attention.
594
-
:::
595
-
596
-
:::warning Switch et chaînes de caractères
597
-
598
-
Il est important de noter que le mot clé `switch` ne peut pas être utilisé avec des chaînes de caractères. Il ne peut être utilisé qu'avec des types entiers (`int`, `char`, `short`, `long`, etc...) ou encore les [**énumérations**](/Lessons/S1/Variables/#enum-un-type-supplémentaire).
599
-
600
-
il est possible de faire cela avec des `if` et `else if` mais généralement lors de l'utilisation de switch on connaît à l'avance les valeurs possibles et donc on utilisera de préférence des [**énumérations**](/Lessons/S1/Variables/#enum-un-type-supplémentaire) ou des constantes.
601
-
:::
602
-
603
474
## Boucles
604
475
605
476
Nous avons maintenant la capacité d'exécuter des codes différents en fonction de **conditions**.
@@ -671,7 +542,9 @@ Il est donc parfois utile de faire des boucles de ce type, pour s'assurer que l'
671
542
intmain()
672
543
{
673
544
int sum {0};
674
-
int number;
545
+
// On déclare la variable en dehors de la boucle pour pouvoir l'utiliser après
546
+
// Il n'est pas nécessaire de l'initialiser ici car on va écrire une valeur avant de l'utiliser mais c'est une bonne pratique pour éviter les valeurs indéfinies
547
+
int number {};
675
548
676
549
do {
677
550
std::cout << "Entre un nombre: ";
@@ -897,6 +770,135 @@ Ici, l'instruction de ```count--;``` ne sera donc jamais appelée une fois que `
897
770
```count``` restera donc égal à 5 indéfiniment: C'est une **boucle infinie**.
898
771
:::
899
772
773
+
## Nouvelle structure de contrôle: switch
774
+
775
+
Maintenant que nous avons toutes les cartes en main revenons brièvement au **switch** dont je vous parlais précédemment.
776
+
777
+
Très souvent on veut seulement tester la valeur d'une variable et effectuer telle ou telle action en fonction. On pourrait très bien écrire cela avec des ```else if```:
778
+
779
+
```cpp
780
+
#include <iostream>
781
+
int main()
782
+
{
783
+
int value { 42 };
784
+
if ( value == 12 )
785
+
{
786
+
// ...
787
+
}
788
+
else if ( value == 33 )
789
+
{
790
+
// ...
791
+
}
792
+
else if ( value == 52)
793
+
{
794
+
//...
795
+
}
796
+
else
797
+
{
798
+
//...
799
+
}
800
+
return 0;
801
+
}
802
+
```
803
+
804
+
C'est avec le mot clé ```switch``` que l'on va pouvoir faire cela de façon plus lisible:
805
+
806
+
```cpp
807
+
#include <iostream>
808
+
int main()
809
+
{
810
+
int value { 42 };
811
+
switch (value)
812
+
{
813
+
case 12:
814
+
// ...
815
+
break; // permet de quitter le bloc switch
816
+
case 33:
817
+
// ...
818
+
break;
819
+
case 52:
820
+
// ...
821
+
break;
822
+
default:
823
+
// ...
824
+
break;
825
+
}
826
+
827
+
return 0;
828
+
}
829
+
```
830
+
831
+
Lorsque l'expression testée est égale à une des valeurs listées avec les mots-clés ```case``` la **totalité** des instructions qui suivent sont exécutées.
832
+
Le mot clé ```break``` indique la sortie de la structure de contrôle.
833
+
Le mot clé ```default``` indique quelles instructions exécuter si l'expression n'est jamais égale à une des valeurs.
834
+
835
+
:::danger
836
+
De manière générale, n'oubliez pas d'insérer des instructions ```break``` entre chaque test, ce genre d'oubli est difficile à détecter car aucune erreur n'est signalée...
837
+
En effet la **totalité** des instructions suivant le ```case``` sont exécutées et donc on pourrait se retrouver à exécuter des instructions de manière involontaire.
838
+
839
+
```cpp
840
+
#include <iostream>
841
+
int main()
842
+
{
843
+
int value { 33 };
844
+
switch (value)
845
+
{
846
+
case 12:
847
+
std::cout << "value est égale à 12" << std::endl;
848
+
case 33:
849
+
std::cout << "value est égale à 33" << std::endl;
850
+
default:
851
+
std::cout << "value est différent de 12 ou 33" << std::endl;
852
+
}
853
+
854
+
return 0;
855
+
}
856
+
```
857
+
qui nous donne:
858
+
859
+
```bash
860
+
value est égale à 33
861
+
value est différent de 12 ou 33
862
+
```
863
+
864
+
Cela peut être parfois voulu mais ici on se rend bien compte qu'il y a un problème et il ne faut donc pas oublier le mot clé ```break```.
865
+
866
+
Voici un exemple où cela peut être utile:
867
+
868
+
```cpp
869
+
#include <iostream>
870
+
int main()
871
+
{
872
+
char letter { 'e' };
873
+
switch(letter)
874
+
{
875
+
case 'a':
876
+
case 'e':
877
+
case 'i':
878
+
case 'o':
879
+
case 'u':
880
+
case 'y':
881
+
std::cout << "You entered a vowel." << std::endl;
882
+
break;
883
+
default:
884
+
std::cout << "You entered a consonant." << std::endl;
885
+
break;
886
+
}
887
+
888
+
return 0;
889
+
}
890
+
```
891
+
892
+
Certains warnings de compilateur permette d'indiquer ce genre de cas mais c'est mieux d'y faire attention.
893
+
:::
894
+
895
+
:::warning Switch et chaînes de caractères
896
+
897
+
Il est important de noter que le mot clé `switch` ne peut pas être utilisé avec des chaînes de caractères. Il ne peut être utilisé qu'avec des types entiers (`int`, `char`, `short`, `long`, etc...) ou encore les [**énumérations**](/Lessons/S1/Variables/#enum-un-type-supplémentaire).
898
+
899
+
il est possible de faire cela avec des `if` et `else if` mais généralement lors de l'utilisation de switch on connaît à l'avance les valeurs possibles et donc on utilisera de préférence des [**énumérations**](/Lessons/S1/Variables/#enum-un-type-supplémentaire) ou des constantes.
900
+
:::
901
+
900
902
## En résumé
901
903
902
904
- Une valeur booléenne est du type **bool** et peut prendre comme valeur ```true``` ou ```false```.
0 commit comments