Skip to content

Commit ad0bd80

Browse files
committed
✨ [S1] conditions: rework switch section placement
1 parent 33f4673 commit ad0bd80

File tree

1 file changed

+140
-138
lines changed

1 file changed

+140
-138
lines changed

content/Lessons/S1/03_ConditionsAndLoops.md

Lines changed: 140 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ int main()
7777
```
7878
:::
7979

80-
### La logique booléenne
80+
### Opérateurs logiques
8181

8282
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**.
8383

@@ -147,11 +147,11 @@ Je ne détaillerai pas dans ce chapitre son utilité mais il est important de le
147147
De même pour l'opérateur **OR** (```||```) différent de <kbd>|</kbd>.
148148
:::
149149
150-
### Des structures de contrôle
150+
## Des structures de contrôle
151151
152152
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 ?
153153
154-
#### Si
154+
### If
155155
Notre première structure de contrôle va s'utiliser avec le mot clé **if**.
156156
De l'anglais, ce mot clé signifiant **"si"**, exécute des instructions si et seulement si la condition donnée est vraie.
157157
@@ -230,7 +230,7 @@ if ( isExpensive )
230230
```
231231
:::
232232

233-
#### Sinon
233+
### Else
234234

235235
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 ?
236236

@@ -322,7 +322,7 @@ int main()
322322

323323
Mais comment tester une succession de conditions différentes avant de faire "tout le reste" ?
324324

325-
#### Sinon si
325+
### Else if
326326

327327
On pourrait très bien chaîner plusieurs ```if``` et ```else``` imbriqués de cette manière:
328328

@@ -389,7 +389,7 @@ int main()
389389
```
390390

391391
:::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.
393393
:::
394394

395395
### Faux-ami
@@ -409,7 +409,7 @@ En **C++**, l'assignation retourne la valeur de la variable assignée. Ici, la c
409409
410410
Les valeurs numériques non nulles sont considérées comme vraies et la valeur 0 est considérée comme fausse.
411411
412-
### Combinaison d'expressions
412+
### Combinaison d'expressions et logique booléenne
413413
414414
Avec tous les opérateurs logiques vu précédemment il est même possible de tester plusieurs conditions dans un même ```if```.
415415
@@ -455,7 +455,7 @@ Cela permet parfois de simplifier le code ou alors d'exprimer la condition sous
455455

456456
Dans mon exemple précédent la condition ```(!isRaining || (isRaining && ownsAnUmbrella))``` est équivalente à écrire ```(!isRaining || ownsAnUmbrella)```.
457457

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.
459459

460460
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.
461461

@@ -471,135 +471,6 @@ On peut s'en convaincre en essayant de traduire ces conditions en phrases:
471471
Vous trouverez des exemples de propriétés et simplifications possibles sur la page Wikipédia suivante:
472472
[Algèbre de Boole](https://fr.wikipedia.org/wiki/Alg%C3%A8bre_de_Boole_(logique))
473473

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-
int main()
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-
int main()
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-
int main()
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-
int main()
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-
603474
## Boucles
604475

605476
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'
671542
int main()
672543
{
673544
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 {};
675548

676549
do {
677550
std::cout << "Entre un nombre: ";
@@ -897,6 +770,135 @@ Ici, l'instruction de ```count--;``` ne sera donc jamais appelée une fois que `
897770
```count``` restera donc égal à 5 indéfiniment: C'est une **boucle infinie**.
898771
:::
899772
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+
900902
## En résumé
901903
902904
- Une valeur booléenne est du type **bool** et peut prendre comme valeur ```true``` ou ```false```.

0 commit comments

Comments
 (0)