TP n°11 - Les tests conditionnels
1ère année maturité
Tout le contenu vu durant les TP fait partie entière de la matière à connaître lors d'évaluation.
Objectifs
- Comprendre et écrire un test conditionnel simple en Python.
- Utiliser les structures
if,if / elseetif / elif / else. - Faire le lien entre un logigramme, du pseudo-code et du code Python.
Jusqu'ici, vos programmes exécutent toujours les mêmes instructions, dans le même ordre. Mais souvent, on aimerait que le programme prenne une décision : afficher un message uniquement si l'utilisateur est majeur, choisir une couleur différente selon une condition, arrêter une boucle quand un seuil est atteint...
Vous avez déjà rencontré cette idée à plusieurs reprises :
- en logique combinatoire avec les portes ET, OU, NON ;
- en logigramme avec le losange de décision ;
- en pseudo-code avec les mots-clés SI ... ALORS ... SINON ;
- dans Excel avec la fonction
SI().
Aujourd'hui, on transpose tout ça en Python.
Un test conditionnel permet à votre programme d'exécuter un bloc d'instructions uniquement si une condition est vraie. Sinon, le programme passe à la suite sans rien faire.
En logigramme, cela correspond au losange de décision avec une seule branche d'action.
En pseudo-code, on écrirait :
SI condition ALORS
bloc d'instructions
FIN SI
En Python, la traduction est presque identique :
if condition :
bloc d'instructions
Remarquez les points suivants :
- le mot-clé est
if(= si en anglais) ; - la condition est suivie de deux-points
:; - les instructions à exécuter sont décalées (indentées) sous le
if, exactement comme dans une bouclewhileoufor.
Une condition est une expression qui vaut soit True (vrai), soit False (faux). Pour la construire, on utilise des opérateurs de comparaison :
| Opérateur | Signification | Exemple vrai |
|---|---|---|
== | égal à | 5 == 5 |
!= | différent de | 3 != 7 |
< | plus petit que | 2 < 10 |
<= | plus petit ou égal à | 4 <= 4 |
> | plus grand que | 9 > 1 |
>= | plus grand ou égal à | 6 >= 6 |
Attention : ne pas confondre = (qui affecte une valeur à une variable) et == (qui compare deux valeurs).
Voici un premier exemple complet à tester :
temperature = 28
if temperature > 25 :
print("Il fait chaud !")
print("Fin du programme")
Testez ce code, puis modifiez la valeur de temperature pour observer ce qui change.
Écrivez un programme Python (sans Turtle) qui réalise les étapes suivantes :
- Demande à l'utilisateur son âge grâce à
input(). Pensez à convertir la réponse avecint(). - Affiche le message "Tu es majeur." uniquement si l'âge est supérieur ou égal à 18.
- Dans tous les cas, affiche à la fin "Au revoir !".
On reprend la spirale carrée de l'exercice 8.4. Voici un rappel du code de base :
from turtle import *
speed(0)
setheading(0)
taille = 10
suppl = 5
i = 0
while i < 50 :
forward(taille)
right(90)
taille = taille + suppl
i = i + 1
Modifiez ce code pour que la spirale arrête de grandir dès que la taille du segment dépasse une limite. Pour cela :
- Définissez une variable
limite = 150au début du script. - À l'intérieur de la boucle, n'exécutez les instructions de dessin que si la taille est inférieure à la limite (utilisez un
if). - La boucle continue à tourner 50 fois, mais visuellement la spirale s'arrête de grossir.
Aller plus loin : que se passe-t-il si vous changez la valeur de limite ? Et si vous augmentez suppl ?
Très souvent, on veut faire une chose si la condition est vraie, et autre chose sinon. C'est le rôle du mot-clé else (= sinon en anglais).
Le logigramme a maintenant deux branches d'action, qui se rejoignent ensuite :
if condition :
bloc 1
else :
bloc 2
Le programme exécute soit le bloc 1, soit le bloc 2, jamais les deux.
Attention : il n'y a pas de condition après else, juste les deux-points.
Voici un exemple :
age = int(input("Quel est ton age ? "))
if age >= 18 :
print("Tu es majeur.")
else :
print("Tu es mineur.")
%
L'opérateur % renvoie le reste de la division entière de deux nombres.
print(10 % 3)
print(8 % 2)
print(15 % 5)
# Résultat# 1
# 0
# 0
Cet opérateur est très utile combiné à un test conditionnel : nb % 2 == 0 est vrai si et seulement si nb est pair. De même, nb % 3 == 0 teste si nb est un multiple de 3.
Cette fois, on va utiliser numinput() du module turtle, qui ouvre une jolie boîte de dialogue pour saisir un nombre.
from turtle import *
nb = numinput("Test", "Donne un nombre entier :")
nb = int(nb)
Écrivez un programme qui :
- demande un nombre entier à l'utilisateur via
numinput(); - affiche dans la console "X est pair." ou "X est impair." selon le cas, en utilisant un test
if / elseet l'opérateur%; - Variante : ajoute un second test pour annoncer si le nombre est un multiple de 3.
À toi de choisir : dans tes prochains scripts, tu pourras utiliser soit input() (saisie dans la console), soit numinput() (boîte de dialogue Turtle), selon le contexte.
On reprend le code-barre aléatoire de l'exercice 10.2. Dans cette version, vous utilisiez probablement la fonction choice() pour tirer une couleur au hasard parmi ["black", "white"].
L'inconvénient de choice() : les deux couleurs ont exactement 50% de chance de sortir. Pas moyen de favoriser le noir par exemple.
Avec un test conditionnel, on peut faire bien mieux :
- Tirez un nombre aléatoire entre 0 et 99 avec
randrange(0, 100). - Définissez une variable
seuil(par exempleseuil = 70). - Avec un
if / else: si le tirage est inférieur au seuil, choisissez"black", sinon"white". - Adaptez le code de l'exercice 10.2 pour utiliser ce nouveau choix de couleur.
seuil = 70 (~70% de noir)Aller plus loin : testez avec seuil = 20, puis seuil = 90. Quel est l'effet visuel ? Vous venez de découvrir comment biaiser un tirage aléatoire — c'est exactement comme cela que fonctionnent beaucoup d'algorithmes de génération de contenu.
Quand on a plus de deux cas à distinguer, on ajoute des branches intermédiaires avec le mot-clé elif (contraction de else if, soit "sinon si").
Le logigramme correspondant teste les conditions les unes après les autres : dès qu'une condition est vraie, le bloc associé est exécuté et toutes les autres branches sont ignorées.
if condition_1 :
bloc 1
elif condition_2 :
bloc 2
elif condition_n :
bloc n
else :
bloc par défaut
- On peut mettre autant de
elifque nécessaire. - Le
elsefinal est optionnel. Il s'exécute uniquement si aucune des conditions précédentes n'était vraie. - Les conditions sont testées dans l'ordre. Dès qu'une est vraie, les autres ne sont même pas évaluées.
Écrivez un programme qui :
- demande à l'utilisateur sa note (un nombre décimal entre 1 et 6) ;
- détermine la mention selon le barème suivant :
- note < 4 → insuffisant
- 4 ≤ note < 4.5 → passable
- 4.5 ≤ note < 5 → bien
- note ≥ 5 → très bien
- affiche la mention dans la console.
Astuce : remarquez que pour le 2ème cas, on n'a pas besoin d'écrire note >= 4 and note < 4.5. Pourquoi ? Parce que si on arrive sur le elif, c'est que la condition précédente (note < 4) était déjà fausse. Le test note >= 4 est donc déjà garanti.
and et or
Parfois, un test simple ne suffit pas. On voudrait par exemple vérifier qu'un nombre est à la fois supérieur à 10 et inférieur à 20. Ou bien qu'une variable vaut soit "rouge" soit "vert".
Vous connaissez déjà ces opérateurs en logique combinatoire sous les noms ET et OU. En Python, ils s'écrivent :
| Opérateur | Logique | Vrai si... |
|---|---|---|
and | ET | les deux conditions sont vraies |
or | OU | au moins une des deux conditions est vraie |
not | NON | la condition est fausse |
Quelques exemples :
age = 16
if age >= 12 and age <= 17 :
print("Tu es adolescent.")
jour = "samedi"
if jour == "samedi" or jour == "dimanche" :
print("C'est le week-end !")
Attention : chaque côté du and ou du or doit être une condition complète. On écrit age >= 12 and age <= 17, et pas age >= 12 and <= 17.
Écrivez un programme qui :
- demande un nombre entier à l'utilisateur ;
- affiche "Le nombre est dans l'intervalle." si le nombre est compris entre 40 et 60 (bornes incluses), "Le nombre est en dehors." sinon.
Variante avec or : modifiez ensuite le programme pour qu'il affiche "Valeur extrême !" si le nombre est plus petit que 0 ou plus grand que 100, et "Valeur normale." dans les autres cas.
Pour mettre en pratique de manière plus concrète, on va créer un petit jeu simple Guess My Number :
Le jeu choisi un nombre aléatoire entre 0 et 100, et le joueur doit trouver le nombre le plus rapidement possible. Le jeu répond uniquement par "plus haut" ou " plus bas".
Marche à suivre - Phase 1
- choisir un nombre aléatoire
- Demander un nombre au joueur avec
int(input()) - Tester la réponse et afficher le message correspondant
Marche à suivre - Phase 2
Cette première phase ne pose qu'une seule fois la question, mais on aimerait la poser TANT QUE le joueur n'a pas trouvé.
- Créé une boucle pour poser la question plusieurs fois
- On arrête la boucle dès que le joueur a gagné ⇒ Introduire une variable
booléennepour savoir quand le joueur à trouver.
Marche à suivre - Phase 3
Améliorer le jeu. Vous pouvez maintenant rendre le jeu plus agréable avec de meilleurs interactions.
- Améliorer les messages, comme "Mon nombre est plus grand que 52". Inspirez vous de cette aide.
- Message d'introduction
- Compter le nombre de coups et l'afficher à la fin.
- Donner une limite de coup et arrêter le jeu SI on le dépasse.
- Détecter les erreurs de saisie : nombre pas dans l'intervalle, saisie de lettres. Aidez-vous de ce tutoriel.
Le meilleur jeu sera présenté durant la journée porte ouverte.
Challenge final !
On reprend le quadrillage de points de l'exercice 10.3 avec les deux boucles for imbriquées. Cette fois, la couleur de chaque point va dépendre de sa position grâce à un if / elif / else.
L'objectif est de produire la mosaïque suivante :
Voici une trame pour démarrer (à compléter !) :
from turtle import *
speed(0); tracer(0); hideturtle()
bgcolor("black")
taille = 11
ecart = 40
diametre = 25
for i in range(taille) :
for j in range(taille) :
x = (i - taille // 2) * ecart
y = (j - taille // 2) * ecart
# A toi de remplir les conditions et les couleurs ci-dessous !
# Tu auras besoin d'au moins 6 branches (centre + axes + 4 quadrants).
# Astuce : teste d'abord le centre, puis les axes, puis les quadrants.
if ... :
couleur = ...
elif ... :
couleur = ...
elif ... :
couleur = ...
elif ... :
couleur = ...
elif ... :
couleur = ...
else :
couleur = ...
penup(); goto(x, y)
dot(diametre, couleur)
update()
Règles à respecter :
- Le point au centre est (0, 0) et
y == 0) doit être gold. - Les points sur les axes doivent être blancs.
- Les 4 quadrants doivent prendre 4 couleurs différentes : salmon en haut-gauche, cyan en haut-droite, violet en bas-gauche, yellow en bas-droite.