En C, il n'est pas rare de devoir vérifier si une variable est comprise dans un intervalle donné. Par exemple, entre 0 et 100 pour un pourcentage.
Il existe plusieurs solutions, on peut évidemment imbriquer des if
pour obtenir un code du type :
if (p>=0) {
if (p<=100) {
// Pourcentage valide
// ...
}
}
Imaginons que l'on souhaite aussi exécuter un bloc d'instructions quand le pourcentage n'est pas valide.
Vous allez rapidement vous apercevoir que cette solution ne permet pas d'insérer proprement un else
.
Les développeurs débutants seraient tenter d'écrire le code suivant :
if ( 0 <= p <= 100 ) {
// Pourcentage valide
// ...
}
Cette solution compile mais n'aura pas le comportement espéré. En effet, pour analyser ce code,
il faut se référer au tableau de priorité des opérateurs.
L'opérateur <=
à une associativité de la gauche vers la droite, cela revient à écrire :
if ( (0 <= p) <= 100 ) {
Le test (0 <= p)
ne peut retourner que 0 ou 1. Dans les deux cas, ce sera toujours
inférieur à 100. Le test sera toujours vrai, autant le supprimer, ça ne changera rien.
La bonne solution pour tester un intervalle consiste à utiliser un opérateur logique pour combiner les deux tests :
if ( p>=0 && p<=100 ) {
// Pourcentage valide
// ...
}
Cette fois-ci, cette solution fonctionnera. Le test sera vrai si p
est supérieur à 0 et
p
est inférieur à 100.
Il existe une autre solution qui est liée à la précédente par la loi de De Morgan. Nous allons en faire la démonstration. Si vous n'êtes pas familier avec la logique booléenne, ça ne devrait pas vous empêcher de comprendre la solution finale.
Dans le test if ( p>=0 && p<=100 )
, nous allons poser les variables booléennes suivante :
p>=0
p<=100
Notre condition devient if ( A && B )
, ce qui se représente par l'équation logique :
$$ A.B $$
En appliquant la loi de De Morgan, on peut maintenant écrire :
$$ A.B = \overline { \overline{A} + \overline{B}} $$
Si l'on replace A et B respectivement par p>=0
et p<=100
, on peut également écrire :
$$ \overline{A} = \overline{(p>=0)} = p<0 $$ $$ \overline{B} = \overline{(p<=100)} = p>100 $$
Ce qui nous donne le code alternatif suivant :
if (!( p<0 || p>100 )) {
// Pourcentage valide
// ...
}
if ( p>=0 || p<=100 )
.Écrire un programme qui demande à l'utilisateur de saisir une note. Si la note
est comprise entre 0 et 20, le programme affiche Note enregistrée
, sinon il affiche
Note non valide
.
float note;
// Saisie de la note
// COMPLETEZ ICI
// Vérifie si la note est valide [0;20]
// COMPLETEZ ICI
Voici l'affichage attendu :
Entrez votre note : 23
Note non valide
En testant les intervalles, écrire un programme qui affiche la mention associée à une note saisie par l'utilisateur:
Intervalle | Message |
---|---|
[0 ; 10[ | Refusé |
[10 ; 12[ | Passable |
[12 ; 14[ | Mention assez bien |
[14 ; 16[ | Mention bien |
[16 ; 20] | Mention très bien |
Voici l'affichage attendu :
Entrez votre note : 13.8
Mention assez bien
Qu'affiche le code suivant ?
if ( 0<x<10 )
printf ("Crac");
else
printf ("Boum");
(0<note)<100
.
Essaie encore ...
Comment tester si un entier a
est compris entre 12 et 52 inclus ?
a
soit supérieur ou égal à 12 ET inférieur ou égal à 52.
Essaie encore ...
Qu'affiche le code suivant ?
if ( x<0 && x>100 )
printf ("Crac");
else
printf ("Boum");
Comment tester si un entier a
n'est pas compris dans l'intervalle [12 ; 52] (en d'autres termes si a
vaut 12, le test est faux) ?
a
doit être strictement inférieure à 12 OU strictement supérieure à 52.
Essaie encore ...
Que fait le test suivant ?
if ((x<=7 || x>=12) == 0)
if (x>7 && x<12)
.
Essaie encore ...