Introduction au langage C/Structures conditionnelles
Introduction
modifierLes structures de contrôle sont basées sur des tests logiques qui permettent :
- d'aiguiller le déroulement du programme vers un groupe d'instruction;
- de répéter un groupe d'instructions.
Elles sont composées de tests basés sur l'évaluation d'expressions logiques.
Conseils de codage à respecter : c_lis_13, c_lis_14, c_rec_11, c_rob_2.
Les expressions logiques
modifierExemple en français :
Si la pression dépasse 200 kPa alors faire ... sinon faire ... fin de la condition.
- En C, on utilise beaucoup l’algèbre de Boole; les variables logiques (vrai, faux) sont nommées booléennes. La norme C99 a introduit type _Bool pour définir un booléen[1]. Auparavant, il n'existait pas de type spécifique. On utilisait des variables entières de type int.
- Une variable est considérée comme contenant une valeur fausse si elle vaut 0 ou NUL. Pour toutes les autres valeurs, elle est considérée comme contenant une valeur vraie.
- Une expression logique peut inclure des affectations de variables, des appels de fonctions, des comparaisons, des opérations logiques et arithmétiques...
Il est important de bien parenthéser ces expressions et de ne pas en abuser pour préserver la lisibilité du programme.
La confusion entre l'opérateur d'affectation = et l'opérateur de comparaison == est aussi une source fréquente d'erreurs.
Tests logiques
modifierif ... else ...
modifierCette structure de contrôle permet de réaliser ou non une action, en fonction de la valeur d'une expression logique.
Un exemple :
#include <stdio.h>
#include <stdlib.h>
int main(int argv, char *argv[])
{
int age = 0; //declaration de la variable age.
(void)printf("Quel age avez vous ? ");
(void)scanf("%d", &age); //saisie de l'âge de l'utilisateur
if (age < 18) // Si age inférieur a 18
{
// Partie entre { et } exécutée si (age<18) est vrai
(void)puts("Vous etes mineur !");
}
else //sinon
{
// Partie entre { et } exécutee dans le cas contraire
(void)puts("Vous etes majeur !");
}
return EXIT_SUCCESS;
}
Tout d’abord, dans ce code, il faut déclarer une variable, ici age, qui sera utilisée dans l’expression conditionnelle. Le programme demandera ensuite d'entrer un entier stocké dans cette variable.
La partie intéressante :
- On commence à tester la condition (age<18) avec l'instruction
if
. - Si le résultat du test est vrai, on exécute le bloc d'instruction (entre {}) situé immédiatement après l'instruction
if
. - Sinon on exécute le bloc précédé du mot-clé
else
. Ce blocelse
est facultatif.
switch ... case ... default
modifierL'instruction switch permet de se brancher vers un endroit parmi plusieurs autres, en fonction de la valeur d'une expression.
exemple :
switch (a)
{
case 'h':
printHelp();
break;
case 'f':
findWord();
break;
case 'q':
exit(0);
break;
default:
(void)printf("Opération inconnue %c\n", a);
}
Remarques :
- L'instruction de contrôle (dans l'exemple, la variable
a
), doit être pouvoir être représentée par un entier (character, short integer, integer contenant des bits, pour tous signés ou non, ou une valeur définies dans une instructionenum
); la conversion en entier donnera unint
ou ununsigned int
. - L'instruction
break
garantit que l'exécution ne passera pas au case ou default suivant. Son oubli est une source d'erreur fréquente. - La clause
default
sera exécutée si aucune constante des autres (case) précédent ne correspondait à la valeur de l’expression de contrôle; Si vous ne prévoyez pas de clausedefault
, rien ne sera alors exécuté par l'instruction switch.
Conditions ternaires
modifierLa structure if ... else
peut paraître longue pour des conditions très simple.
Il existe en C des conditions ternaires dites condensées.
Format : (expression) ? expr₁ : expr₂
- expression est évaluée à l'exécution;
- si vraie (différente de 0), alors l’expression ternaire vaut expr₁
- sinon, elle vaut expr₂
Voici deux exemples d’utilisation :
char *str;
double pression;
// ...
str = ( age < 18 ) ? "mineur" : "majeur";
pression = (vide) ? 0.0 : pression;
Explications :
- La chaine str vaut "mineur" si la condition age < 18 est vraie, "majeur" sinon.
- La variable pression est affectée à 0.0 si la variable vide est vraie (différente de 0), sinon sa valeur est inchangée.
Remarques qualités
modifierBlocs d'instructions
modifierDans une instruction de test if ou dans une structure itérative, si une seule instruction doit être exécutée, on pourrait ne pas la placer dans un bloc. Cependant cette pratique est déconseillée :
Programme d'origine (extrait) déconseillé :
if (age < 18) // Si age inférieur a 18
(void)puts("Vous etes mineur !");
else //sinon
(void)puts("Vous etes majeur !");
Programme modifié par la suite :
if (age < 18) // Si age inférieur a 18
(void)puts("Vous etes mineur !");
else //sinon
(void)puts("Vous etes majeur !");
(void)puts("Vous pouvez donc passer votre permis de conduire en France.");
Le programmeur a ajouté une instruction à la clause else, mais cette dernière sera exécutée que le test soit vrai ou faux et ce n’est pas ce qu’il souhaite !
Programme plus sûr :
if (age < 18) // Si age inférieur a 18
{
(void)puts("Vous etes mineur !");
}
else //sinon
{
(void)puts("Vous etes majeur !");
}
instruction switch
modifier- Toute suite d'instruction d'une clause case devrait se terminer par un break.
- Toute instruction switch devrait se terminer par une clause default.
TP
modifierRéférences
modifier