Les structures de contrôle conditionnelles
Certains problèmes ne peuvent pas être résolus avec seulement une séquence d'instructions simples. Parfois, nous devons tester une condition. Si le résultat du test est vrai, nous suivons une séquence d'instructions ; s'il est faux, nous suivons une séquence d'instructions différente.
C'est ce qu'on appelle la construction conditionnelle (ou décisionnelle).
1. Structure de contrôle if-else
L'instruction if ne s'exécutera que si l'expression entre parenthèses est évaluée comme étant true.
En C++, il n'est pas nécessaire que ce soit une expression booléenne. Il peut s'agir de n'importe quelle expression qui évalue un nombre :
- zéro (0) est considéré comme
false - tous les autres nombres sont considérés comme
true
Syntaxe de base
if (/* expression */) {
/* Exécuté uniquement si l'expression est vraie */
}Exemple 1 : if simple
if (x > 1) {
cout << x << " > 1";
}Extension avec else if
Pour tester d'autres conditions, l'instruction if peut être étendue par n'importe quel nombre d'instructions else if.
Exemple 2 : else if
else if (x < 1) {
cout << x << " < 1";
}Clause else finale
L'instruction if peut avoir une instruction else facultative à la fin, qui s'exécutera si toutes les conditions précédentes sont fausses.
Exemple 3 : else
else {
cout << x << " = 1";
}Syntaxe complète
if (condition-1) {
// Exécuté seulement si condition-1 est vraie
} else if (condition-2) { // optionnel
// Exécuté seulement si condition-2 est vraie
}
// ... autant de "else if" que souhaité
} else { // optionnel
// Exécuté seulement si aucune condition n'est vraie
}Exemple 4 : Structure complète
if (x < 1)
cout << x << " < 1";
else if (x > 1)
cout << x << " > 1";
else
cout << x << " == 1";Les accolades peuvent être omises si une seule instruction doit être exécutée de manière conditionnelle. Cependant, il est considéré comme une bonne pratique de les inclure car elles améliorent la lisibilité du code et évitent les erreurs.
Nouveauté C++17 : if avec initialiseur
Avec la norme C++17, la syntaxe de if a été modifiée par l'introduction de l'instruction init. Vous pouvez lier la portée d'un objet à une instruction if en ajoutant une instruction init.
if (init; condition-1) {
// Exécuté seulement si condition-1 est vraie
} else if (init; condition-2) {
// Exécuté seulement si condition-2 est vraie
}La partie init est facultative. Si elle est manquante, nous avons la forme traditionnelle.
Exemple 5 : Avant C++17
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
srand(time(NULL));
int nombre_alea = rand();
if (nombre_alea % 2 == 0) {
cout << nombre_alea << " est pair\n";
} else {
cout << nombre_alea << " est impair\n";
}
return 0;
}Dans cet exemple, la variable nombre_alea est accessible en dehors de la portée if-else.
Exemple 6 : Avec C++17
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
srand(time(NULL));
if (int nombre_alea = rand(); nombre_alea % 2 == 0) {
cout << nombre_alea << " est pair\n";
} else {
cout << nombre_alea << " est impair\n";
}
return 0;
}La variable nombre_alea est maintenant confinée à la portée de l'instruction if.
Explication :
Une déclaration de la forme if(init; condition) est équivalente à :
init;
if(condition)
instructions;Les variables déclarées dans init sont disponibles dans l'instruction if et dans toutes les instructions else-if qui en découlent.
Exemple 7 : Variables dans else-if
if (int a = val1(); a > 0)
cout << "a > 0 \n";
else if (float b = val2(); b > 0)
cout << "b > 0 \n";où val1() et val2() sont deux fonctions qui renvoient respectivement un int et un float.
Exemple 8 : Équivalent transformé
int a = val1();
if (a > 0)
cout << "a > 0 \n";
else {
float b = val2();
if (b > 0)
cout << "b > 0 \n";
}Pour vous entraîner davantage sur if-else : Voir des exercices corrigés
2. Structure de contrôle switch
L'instruction switch vérifie l'égalité entre un entier et une série d'étiquettes de cas (case), puis passe l'exécution au cas correspondant.
Contrairement à if-else qui n'a que deux alternatives (vrai/faux), switch peut gérer plusieurs alternatives.
L'expression testée dans l'instruction switch peut être :
- de type int (un nombre entier)
- de type char (un caractère)
Syntaxe de switch
switch(expression)
{
case val1:
instruction1;
instruction2;
...
break;
case val2:
instruction3;
instruction4;
...
break;
default:
instruction7;
...
break;
}Fonctionnement
- L'expression dans
switch()est évaluée une fois. - Sa valeur est comparée aux valeurs de chaque
case. - Si une correspondance est trouvée, l'exécution commence à ce
case. - L'exécution continue jusqu'à ce qu'un
breaksoit rencontré. - Si aucun
casene correspond, ledefault(optionnel) est exécuté.
Exemple 9 : Expressions valides et invalides
int addition(int x, int y){
return x + y;
}
int a;
float b;
char c;
switch(a){ // valide (int)
}
switch(c){ // valide (char)
}
switch(b){ // invalide (float - nombre réel)
}
switch(2+3){ // valide (résultat int)
}
switch(a+c){ // valide (promotion de char vers int)
}
switch("nom"){ // invalide (chaîne de caractères)
}
switch(addition(a,2)){ // valide (retourne int)
}Exemple 10 : Jours de la semaine
#include <iostream>
using namespace std;
int main(void){
int jour;
cin >> jour;
switch(jour){
case 1 : cout << "Lundi \n"; break;
case 2 : cout << "Mardi \n"; break;
case 3 : cout << "Mercredi \n"; break;
case 4 : cout << "Jeudi \n"; break;
case 5 : cout << "Vendredi \n"; break;
case 6 : cout << "Samedi \n"; break;
case 7 : cout << "Dimanche \n"; break;
default: cout << "Jour invalide \n"; break;
}
return 0;
}Entrée : 3 Sortie : Mercredi Entrée : 8 Sortie : Jour invalide
Sans l'instruction break, l'exécution continue dans le case suivant ("fall-through"). Cela peut être intentionnel, mais c'est souvent une erreur.
Nouveauté C++17 : switch avec initialiseur
Comme pour l'instruction if-else, l'instruction switch peut également avoir un initialiseur à partir de la norme C++17.
switch (init; variable) {
// cas...
}Exemple 11 : switch avec initialiseur
#include <iostream>
using namespace std;
int lireValeur(){
int a;
cin >> a;
return a;
}
int main(void){
switch(int a = lireValeur(); a){
case 1 : cout << "Lundi \n"; break;
case 2 : cout << "Mardi \n"; break;
case 3 : cout << "Mercredi \n"; break;
case 4 : cout << "Jeudi \n"; break;
case 5 : cout << "Vendredi \n"; break;
case 6 : cout << "Samedi \n"; break;
case 7 : cout << "Dimanche \n"; break;
default: cout << "Jour invalide \n"; break;
}
return 0;
}La variable a est déclarée et initialisée dans l'en-tête du switch, et sa portée est limitée au switch lui-même.
Pour vous entraîner davantage sur switch-case : Voir des exercices corrigés
Comparaison if-else vs switch
| Caractéristique | if-else | switch |
|---|---|---|
| Type de condition | Expression booléenne (ou convertible) | Égalité avec des constantes entières/char |
| Nombre de branches | Plusieurs (else if) | Plusieurs (case) |
| Complexité des conditions | Conditions complexes (>, <, &&, ||, etc.) | Uniquement égalité (==) |
| Types supportés | Tous types (convertibles en bool) | int, char, enum (types intégraux) |
| Performance | Évaluations séquentielles | Peut utiliser une table de saut (plus rapide) |
Calculatrice simple
Écrire un programme qui demande deux nombres et un opérateur (+, -, *, /) et affiche le résultat de l'opération.
Contraintes :
- Utiliser une structure
switchpour choisir l'opération. - Si l'opérateur n'est pas valide, afficher un message d'erreur.
- Si l'utilisateur demande une division par zéro, afficher une erreur.
#include <iostream>
using namespace std;
int main() {
double a, b;
char op;
cout << "Entrez un premier nombre : ";
cin >> a;
cout << "Entrez un opérateur (+, -, *, /) : ";
cin >> op;
cout << "Entrez un deuxième nombre : ";
cin >> b;
switch(op) {
case '+':
cout << a << " + " << b << " = " << a + b << endl;
break;
case '-':
cout << a << " - " << b << " = " << a - b << endl;
break;
case '*':
cout << a << " * " << b << " = " << a * b << endl;
break;
case '/':
if (b == 0) {
cout << "Erreur : division par zéro !" << endl;
} else {
cout << a << " / " << b << " = " << a / b << endl;
}
break;
default:
cout << "Erreur : opérateur invalide !" << endl;
}
return 0;
}Entrez un premier nombre : 15 Entrez un opérateur (+, -, *, /) : / Entrez un deuxième nombre : 4 15 / 4 = 3.75
- Les structures conditionnelles permettent d'exécuter différents blocs selon une condition.
- if-else : idéal pour des conditions complexes (comparaisons, combinaisons logiques).
- switch : idéal pour tester une expression contre plusieurs valeurs constantes (int/char).
- En C++, zéro est
false, toute autre valeur numérique esttrue. - En C++17, if et switch peuvent avoir un initialiseur, limitant la portée des variables.
- Dans
switch, ne pas oublierbreakpour éviter le "fall-through" accidentel. - Le cas
defaultdans switch est optionnel mais recommandé pour traiter les valeurs inattendues. - Les accolades pour if/else sont optionnelles pour une seule instruction, mais les inclure améliore la lisibilité et la maintenabilité.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.