Cours 5.3. Tester des intervalles

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.

if imbriqués

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.

L'erreur à éviter

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

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.

L'autre bonne solution

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 :

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
    // ...
}
Ne mélangez pas les deux solutions avec une écriture du type if ( p>=0 || p<=100 ).
Tous les entiers sont supérieurs à 0 OU inférieurs à 100.

Ce test est toujours vrai.

Exercice 1

É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

Exercice 2

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

Quiz

Qu'affiche le code suivant ?

if ( 0<note<10 )
    printf ("Crac");
else 
    printf ("Boum");
Vérifier Bravo ! Le test ne sert à rien car il sera toujours vrai. Priorité des opérateurs => (0<note)<100. Essaie encore ...

Comment tester si un entier a est compris entre 12 et 52 inclus ?

Vérifier Bravo ! Il faut que 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");
Vérifier Bravo ! Essayez donc de trouver un nombre plus petit que 0 ET plus grand que 100. Essaie encore ...

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) ?

Vérifier Bravo ! La variable 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)
Vérifier Bravo ! En appliquant la loi de De Morgan, on peut revenir à la forme if (x>7 && x<12). Essaie encore ...

Voir aussi


Dernière mise à jour : 14/10/2021