Chapitre 323 minDébutant
Si, alors, sinon : les structures conditionnelles
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- écrire un
Si, unSi… Sinonet une cascade deSinonSi; - composer des conditions avec ET, OU et NON sans erreur de logique ;
- choisir entre conditions imbriquées et
Selon(matchen Python) ; - construire un jeu d'essai qui teste chaque branche.
6 exercices corrigés
Une structure conditionnelle exécute un bloc d'instructions seulement si une condition est vraie, et éventuellement un autre bloc si elle est fausse. Ce chapitre présente le Si … Alors … Sinon, les cascades SinonSi, les conditions imbriquées et composées, puis le choix multiple Selon, en pseudo-code et en Python (if, elif, else, match).
Le Si simple
Le Si exécute un bloc quand la condition est vraie, et ne fait rien sinon. Le programme continue ensuite après le FinSi.
Si espace_libre < 10 Alors
Afficher("Alerte : disque presque plein")
FinSi
Afficher("Contrôle terminé")
espace_libre = 7 # en pourcentage
if espace_libre < 10:
print("Alerte : disque presque plein")
print("Contrôle terminé")
Alerte : disque presque plein
Contrôle terminé
En Python, la ligne if se termine par deux-points, et le bloc conditionnel est tout ce qui est indenté dessous. La dernière ligne, revenue à gauche, s'exécute dans tous les cas.
Si… Sinon : l'alternative
Avec Sinon, l'algorithme choisit entre deux blocs. Exactement un des deux est exécuté.
Si note ≥ 10 Alors
Afficher("Admis")
Sinon
Afficher("Ajourné")
FinSi
note = 9.5
if note >= 10:
print("Admis")
else:
print("Ajourné")
La condition n'a pas besoin d'être une comparaison : toute expression booléenne convient. Si admis est un booléen, écris if admis: plutôt que if admis == True:, et if not admis: plutôt que if admis == False:.
SinonSi : plusieurs cas qui s'excluent
Quand il y a plus de deux cas, on enchaîne les tests avec SinonSi (elif en Python). Les conditions sont testées dans l'ordre ; dès qu'une est vraie, son bloc s'exécute et on sort de toute la structure. Le Sinon final attrape tout ce qui reste.
Un script de supervision classe l'espace libre d'un disque, en pourcentage :
Si libre < 10 Alors
etat ← "CRITIQUE"
SinonSi libre < 20 Alors
etat ← "ATTENTION"
Sinon
etat ← "OK"
FinSi
libre = 15
if libre < 10:
etat = "CRITIQUE"
elif libre < 20:
etat = "ATTENTION"
else:
etat = "OK"
print(etat)
ATTENTION
Le deuxième test n'a pas besoin d'écrire libre >= 10 and libre < 20 : si l'on arrive au elif, c'est que libre < 10 était faux. L'ordre des tests fait partie de la logique.
Plusieurs Si ou un SinonSi ? Ce n'est pas la même chose. Trois Si indépendants testent les trois conditions, et plusieurs blocs peuvent s'exécuter. Un Si … SinonSi … Sinon n'en exécute qu'un.
libre = 5
if libre < 10:
print("CRITIQUE")
if libre < 20:
print("ATTENTION")
CRITIQUE
ATTENTION
Ici, les deux messages s'affichent pour le même disque : c'est un bug, sauf si c'était voulu.
Les conditions composées
On combine plusieurs conditions avec ET, OU et NON (chapitre 2). Un mot de passe est accepté s'il fait au moins 12 caractères et n'est pas égal à l'identifiant :
identifiant = "jdupont"
mdp = "Printemps2026!"
if len(mdp) >= 12 and mdp != identifiant:
print("Mot de passe accepté")
else:
print("Mot de passe refusé")
Mot de passe accepté
L'exemple classique est l'année bissextile : une année est bissextile si elle est divisible par 4 mais pas par 100, ou si elle est divisible par 400. 2024 et 2000 le sont, 2026 et 2100 ne le sont pas.
Si (annee MOD 4 = 0 ET annee MOD 100 ≠ 0) OU annee MOD 400 = 0 Alors
Afficher(annee, " est bissextile")
Sinon
Afficher(annee, " n'est pas bissextile")
FinSi
for annee in [2024, 2026, 2000, 2100]:
if (annee % 4 == 0 and annee % 100 != 0) or annee % 400 == 0:
print(annee, "est bissextile")
else:
print(annee, "n'est pas bissextile")
2024 est bissextile
2026 n'est pas bissextile
2000 est bissextile
2100 n'est pas bissextile
La boucle for sert ici à tester quatre valeurs d'un coup ; elle est expliquée au chapitre 4. Remarque les parenthèses : ET est prioritaire sur OU, mais les parenthèses rendent la condition lisible sans connaître la règle.
Les conditions imbriquées
Un Si peut contenir un autre Si. C'est utile quand le second test n'a de sens que si le premier est vrai.
Si age ≥ 18 Alors
Si permis = VRAI Alors
Afficher("Peut louer un véhicule")
Sinon
Afficher("Majeur, mais sans permis")
FinSi
Sinon
Afficher("Mineur")
FinSi
age = 20
permis = False
if age >= 18:
if permis:
print("Peut louer un véhicule")
else:
print("Majeur, mais sans permis")
else:
print("Mineur")
Au-delà de deux niveaux, le code devient difficile à suivre. Deux techniques l'aplatissent :
- remplacer l'imbrication par une condition composée quand un seul cas compte :
if age >= 18 and permis:; - remplacer une suite de
Sinoncontenant chacun unSipar une cascadeSinonSi.
L'imbrication d'un Si dans le Sinon d'un autre est exactement ce qu'un SinonSi évite d'écrire :
libre = 15
# Imbriqué : correct, mais en escalier
if libre < 10:
etat = "CRITIQUE"
else:
if libre < 20:
etat = "ATTENTION"
else:
etat = "OK"
# Équivalent, à plat
if libre < 10:
etat = "CRITIQUE"
elif libre < 20:
etat = "ATTENTION"
else:
etat = "OK"
Selon : le choix multiple
Quand on compare une même variable à une liste de valeurs précises, la structure Selon (aiguillage) est plus lisible qu'une cascade de SinonSi.
Selon priorite Faire
Cas "P1" : delai ← 4 // heures
Cas "P2" : delai ← 8
Cas "P3" : delai ← 24
Autrement : delai ← 72
FinSelon
Depuis la version 3.10, Python a une instruction match qui joue ce rôle. case _ est le cas par défaut, et | regroupe plusieurs valeurs.
priorite = "P2"
match priorite:
case "P1":
delai = 4
case "P2":
delai = 8
case "P3":
delai = 24
case _:
delai = 72
print("Délai de résolution :", delai, "h")
jour = "samedi"
match jour:
case "samedi" | "dimanche":
print("Astreinte week-end")
case _:
print("Support normal")
Délai de résolution : 8 h
Astreinte week-end
Selon ne sait tester que l'égalité avec des valeurs. Pour des intervalles (« entre 10 et 20 »), il faut une cascade SinonSi. Et un if … elif … else fait toujours le même travail : si ton professeur ou ton environnement d'examen utilise une version de Python plus ancienne, c'est la version à écrire.
| Situation | Structure |
|---|---|
| Un seul cas à traiter, rien sinon | Si … FinSi |
| Deux cas exclusifs | Si … Sinon … FinSi |
| Plusieurs intervalles ou conditions différentes | Si … SinonSi … Sinon … FinSi |
| Une variable comparée à des valeurs précises | Selon … FinSelon (match) |
| Un test qui n'a de sens que si un autre est vrai | Si imbriqué, ou condition composée avec ET |
Tester une structure conditionnelle
Une condition mal écrite passe souvent inaperçue sur l'exemple de l'énoncé. Pour la tester, il faut au moins un cas par branche, plus les valeurs frontières : celles où la condition bascule. Pour la cascade des disques (seuils 10 et 20) :
| Valeur testée | Pourquoi | Attendu |
|---|---|---|
| 5 | Branche 1 | CRITIQUE |
| 10 | Frontière : < 10 doit être faux | ATTENTION |
| 15 | Branche 2 | ATTENTION |
| 20 | Frontière : < 20 doit être faux | OK |
| 60 | Branche 3 | OK |
Les frontières attrapent la confusion entre < et ≤, l'erreur la plus fréquente dans les conditions. Le chapitre 5 généralise cette méthode.
Exercices
Exercice 1 sur 6 Le plus grand de trois nombres Réussi À revoir
Écris l'algorithme qui lit trois entiers a, b et c et affiche le plus grand, sans utiliser de fonction max. Traduis-le en Python et donne un jeu d'essai de quatre cas.
Voir la réponseMasquer la réponse de l'exercice 1
On garde le plus grand vu jusqu'ici, puis on le compare au suivant : deux tests suffisent.
Algorithme PlusGrand
Variables
a, b, c, plus_grand : entier
Début
Saisir(a)
Saisir(b)
Saisir(c)
plus_grand ← a
Si b > plus_grand Alors
plus_grand ← b
FinSi
Si c > plus_grand Alors
plus_grand ← c
FinSi
Afficher(plus_grand)
Fin
a = int(input("a ? "))
b = int(input("b ? "))
c = int(input("c ? "))
plus_grand = a
if b > plus_grand:
plus_grand = b
if c > plus_grand:
plus_grand = c
print(plus_grand)
Jeu d'essai : (9, 4, 2) donne 9 (le plus grand en premier) ; (4, 9, 2) donne 9 ; (2, 4, 9) donne 9 ; (5, 5, 5) donne 5 (égalités). Ici, deux Si indépendants sont voulus : chaque test peut améliorer le résultat.
Tu avais trouvé ?
Exercice 2 sur 6 Remise par tranches Réussi À revoir
Un fournisseur de matériel accorde une remise selon le montant HT de la commande : aucune en dessous de 500 €, 5 % de 500 € inclus à 2 000 € exclus, 10 % à partir de 2 000 €. Écris le programme Python qui lit le montant et affiche le montant après remise. Donne les résultats pour 499, 500, 1 999 et 2 000 €.
Voir la réponseMasquer la réponse de l'exercice 2
montant = float(input("Montant HT ? "))
if montant >= 2000:
taux = 10
elif montant >= 500:
taux = 5
else:
taux = 0
net = montant * (1 - taux / 100)
print("Remise :", taux, "% - Net :", round(net, 2))
| Montant | Taux | Net |
|---|---|---|
| 499 | 0 % | 499.0 |
| 500 | 5 % | 475.0 |
| 1 999 | 5 % | 1899.05 |
| 2 000 | 10 % | 1800.0 |
Les quatre valeurs choisies sont les frontières : elles vérifient que « 500 inclus » s'écrit >= et pas >.
Tu avais trouvé ?
Exercice 3 sur 6 Corriger une condition Réussi À revoir
Ce programme doit afficher « Week-end » le samedi et le dimanche. Il affiche « Week-end » pour tous les jours. Explique pourquoi et corrige-le.
jour = input("Jour ? ")
if jour == "samedi" or "dimanche":
print("Week-end")
else:
print("Semaine")
Voir la réponseMasquer la réponse de l'exercice 3
La condition se lit (jour == "samedi") or ("dimanche"). La chaîne "dimanche", non vide, vaut vrai : la condition est toujours vraie. Deux corrections possibles :
if jour == "samedi" or jour == "dimanche":
print("Week-end")
if jour in ("samedi", "dimanche"):
print("Week-end")
Tu avais trouvé ?
Exercice 4 sur 6 Plusieurs Si ou SinonSi ? Réussi À revoir
Qu'affichent ces deux programmes pour note = 15 ? Lequel est correct pour donner une seule appréciation ?
# Programme A
if note >= 10:
print("Passable")
if note >= 12:
print("Assez bien")
if note >= 14:
print("Bien")
# Programme B
if note >= 14:
print("Bien")
elif note >= 12:
print("Assez bien")
elif note >= 10:
print("Passable")
Voir la réponseMasquer la réponse de l'exercice 4
Le programme A affiche trois lignes, Passable, Assez bien et Bien, car les trois conditions sont vraies et les trois if sont indépendants. Le programme B affiche seulement Bien : la cascade s'arrête au premier test vrai, et les seuils sont testés du plus haut au plus bas. B est correct.
Tu avais trouvé ?
Exercice 5 sur 6 Type de triangle Réussi À revoir
Écris un programme qui lit les longueurs entières de trois côtés et affiche « impossible » si l'un des côtés est supérieur ou égal à la somme des deux autres, sinon « équilatéral », « isocèle » ou « quelconque ». Teste avec (3, 3, 3), (3, 3, 5), (3, 4, 5) et (1, 2, 8).
Voir la réponseMasquer la réponse de l'exercice 5
a = int(input("a ? "))
b = int(input("b ? "))
c = int(input("c ? "))
if a >= b + c or b >= a + c or c >= a + b:
print("impossible")
elif a == b and b == c:
print("équilatéral")
elif a == b or b == c or a == c:
print("isocèle")
else:
print("quelconque")
(3, 3, 3) donne équilatéral, (3, 3, 5) isocèle, (3, 4, 5) quelconque et (1, 2, 8) impossible. L'ordre compte : un triangle équilatéral est aussi isocèle, il faut donc tester l'équilatéral avant.
Tu avais trouvé ?
Exercice 6 sur 6 Selon Réussi À revoir
Écris avec match un programme qui lit un code de statut de ticket ("O", "E", "R", "F") et affiche « ouvert », « en cours », « résolu » ou « fermé », et « code inconnu » pour toute autre valeur. Écris ensuite la version if … elif … else.
Voir la réponseMasquer la réponse de l'exercice 6
code = input("Code ? ")
match code:
case "O":
print("ouvert")
case "E":
print("en cours")
case "R":
print("résolu")
case "F":
print("fermé")
case _:
print("code inconnu")
code = input("Code ? ")
if code == "O":
print("ouvert")
elif code == "E":
print("en cours")
elif code == "R":
print("résolu")
elif code == "F":
print("fermé")
else:
print("code inconnu")
Pour accepter aussi les minuscules, convertis la saisie : code = input("Code ? ").upper() (chapitre 9).
Tu avais trouvé ?