Les tests
Principe
Un programme doit pouvoir s'adapter à des différentes situations grâce à des tests.
Par exemple : si la température extérieure est inférieure à 16 degrés alors il faut démarrer le chauffage.
En informatique, un test s'appelle aussi une structure conditionnelle.
Test Si ... alors ...
Voici un exemple de script utilisant un test :
a = 3
b = 5
if a < b:
print("a est le plus petit")
Le test commence par un if, suivi d’une condition, puis d’un : puis, à la ligne suivante, commence(nt) une ou des instructions.
Ici : si (if en anglais) la condition (ici a < b) est vraie, alors exécuter le bloc d’instructions qui suit (ici une seule instruction, à savoir afficher le texte "a est le plus petit").
À retenir
La syntaxe générale est :
début du programme
if condition:
bloc d’instructions à exécuter si le test est réussi
suite du programme
graph LR
A[début]-->C{si condition}
C-->|vraie| D[bloc instructions dans test]
C-->|fausse| E[suite]
D-->E
Remarquez :
- le
:indispensable à la fin de la ligne duif; - que le bloc d’instructions à exécuter est défini par l'indentation ;
- que le bloc d’instructions soit exécuté ou pas, le déroulement du programme continue après le test (suite du programme) ;
- le mot alors n’existe pas en Python (dans certains langages, il se traduit par then) ;
- la condition est en fait un booléen.
Exercice 1
- Exécutez ce script :
a = 3
b = 5
if a < b:
print("a est le plus petit")
print("autrement dit b est le plus grand")
- Modifiez le script ainsi :
a = 5
b = 1
if a < b:
print("a est le plus petit")
print("autrement dit b est le plus grand")
et observez la différence.
Les conditions
Conditions d’égalité
a == b est vrai quand la valeur de a est égale à celle de b ;
a != b est vrai quand la valeur de a est différente de celle de b.
Attention
Il faut bien faire attention à distinguer l'affectation a = b et le test d'égalité a == b.
Égalité des flottants
Le test d'égalité == est bien adapté pour un test entre deux entiers ou entre deux chaînes de caractères.
Mais, du fait de la représentation des nombres en machine, il est mal adapté à la comparaison de deux flottants.
Exécutez le code ci-dessous pour vous en convaincre :
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Conditions de comparaison
Les comparaisons se font à l'aide d'un des quatre opérateurs : > ou < ou >= ou <=
(par exemple : if moyenne > 10:).
Exercice 2
Comparez des chaînes de caractères à l'aide de < par exemple.
Comment sont classées les chaînes de caractères ?
Conditions d’appartenance
Il est possible de tester si une valeur est dans un ensemble ou si une lettre est dans une chaîne de caractères avec l'opérateur in (dans) :
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Il existe aussi l'opérateur not in (pas dans).
On peut même tester si un mot est dans un autre : print("SI" in "NSI").
Test Si ... alors ... sinon...
En voici un exemple :
lettre = "u"
if lettre in "aeiouy":
print("C’est une voyelle")
else:
print("Ce n’est pas une voyelle")
- si la condition est vraie (si
lettrefait partie de "aeiouy") alors le premier bloc d’instruction est exécutée ; - sinon (ELSE en anglais), c’est-à-dire si la condition est fausse (si
lettrene fait pas partie de "aeiouy") alors c’est l’autre bloc d’instructions qui est exécuté et le premier bloc est ignoré.
Le couple if et else agit comme un aiguillage.
À retenir
La syntaxe générale est :
début du programme
if condition:
bloc d’instructions 1 à exécuter si la condition est vérifiée
else:
bloc d’instructions 2 à exécuter si la condition n'est pas vérifiée
suite du programme
graph LR
A[début]-->C{si condition}
C-->|vraie| D[bloc instructions 1]
C-->|fausse| E[bloc instructions 2]
D-->F[suite]
E-->F
Exercice 3
Sans utiliser l'éditeur, indiquez la valeur de la variable s à la fin de ce script :
e = 4
f = 2
if f != e:
f = f - e + 1
s = e + f + 5
else:
s = 2 + e + f
Exercices
- Exercice 4 : le code PIN de Marc.
- Exercice 5 : pair ou impair ?
- Exercice 6 : tarifs de photocopies.
- Exercice 7 : le maximum.
Test Si ... alors ... sinonsi ...
Parfois, pour déterminer dans quel cas on se trouve, il faut effectuer plusieurs tests.
Exercice 8
Prenez le temps de lire le script ci-dessous qui doit nous dire quel sera notre mention au bac.
Exécutez-le plusieurs fois en changeant la valeur de ma_note dans la première ligne et observez.
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Explications
Ce script ne fonctionne pas comme prévu. Normalement, il ne devrait y avoir qu'un message d'affiché. C'est parce que les tests sont tous indépendants. Même si le premier test est réussi, les autres tests sont également effectués et potentiellement validés (si ma note est supérieure à 16 alors elle est aussi supérieure à 14 et à 12), alors qu'ils ne devraient l'être que si les précédents ont échoués. Il faut donc imbriquer les tests.
Exercice 9
Modifiez maintenant le programme ainsi (pas de copier-coller svp) puis testez son bon fonctionnement :
ma_note = 13
if ma_note >= 16:
print("Mention TB")
else:
if ma_note >= 14:
print("Mention B")
else:
if ma_note >= 12:
print("Mention AB")
else:
print("Pas de mention")
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Mais... s'il y a 20 cas possibles ??
Si la note est supérieure ou égale à 16 alors le programme affiche "Mention TB", sinon il envisage le cas où la note est inférieure à 16, ce qui se sépare en plusieurs cas…
Ce script fonctionne bien mais "à cause" du système d'indentation, sa lecture n'est pas si simple.
C'est pourquoi il existe une syntaxe permettant de simplifier la rédaction des études de cas, en utilisant le mot clé elif (contraction de else if).
À retenir
Ce script
if condition1:
bloc d’instructions 1
else:
if condition2:
bloc d’instructions 2
else:
bloc d’instructions 3
# suite du programme
peut aussi s’écrire ainsi :
if condition1:
bloc d’instructions 1
elif condition2:
bloc d’instructions 2
else:
bloc d’instructions 3
# suite du programme
graph LR
A[début]-->B{si condition1}
B-->|vraie| C[bloc instructions 1]
B-->|fausse| D{si condition2}
D-->|vraie| E[bloc instructions 2]
D-->|fausse| F[bloc instructions 3]
C-->G[suite]
E-->G
F-->G
Exercice 10
Modifiez le programme ainsi puis testez son bon fonctionnement :
ma_note = 13
if ma_note >= 16:
print("Mention TB")
elif ma_note >= 14:
print("Mention B")
elif ma_note >= 12:
print("Mention AB")
else:
print("Pas de mention")
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 11
Exercice 12
Écrivez un programme dans lequel la machine demande à un utilisateur son âge et dit si l’utilisateur est un enfant (moins de 12 ans) ou un adolescent (entre 12 et 18 ans) ou un adulte (à partir de 18 ans).
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 13
Le professeur Zarb met des notes sur 72 points, qu'il convertit ensuite en pourcentage de réussite puis il les transforme en appréciations suivant ce tableau :
| Note N | Appréciation |
|---|---|
| N ≥ 80 % | A |
| 80 % > N ≥ 60 % | B |
| 60 % > N ≥ 50 % | C |
| 50 % > N ≥ 40 % | D |
| N < 40 % | E |
Écrivez une fonction conv qui s'occupe de la conversion en appréciation d'une note N entrée par l’utilisateur sous forme de points. Voici un exemple d'utilisation de cette fonction :
>>> conv(39)
'C'
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
À retenir
- les trois mots clés pour effectuer des tests sont :
if,elseetelif; - les conditions sont des booléens ;
- n'oubliez pas les
:et l'indentation pour définir des blocs.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)