Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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, un Si… Sinon et une cascade de SinonSi ;
  • composer des conditions avec ET, OU et NON sans erreur de logique ;
  • choisir entre conditions imbriquées et Selon (match en 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.

text
Si espace_libre < 10 Alors
    Afficher("Alerte : disque presque plein")
FinSi
Afficher("Contrôle terminé")
python
espace_libre = 7   # en pourcentage
if espace_libre < 10:
    print("Alerte : disque presque plein")
print("Contrôle terminé")
text
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é.

text
Si note ≥ 10 Alors
    Afficher("Admis")
Sinon
    Afficher("Ajourné")
FinSi
python
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 :

text
Si libre < 10 Alors
    etat ← "CRITIQUE"
SinonSi libre < 20 Alors
    etat ← "ATTENTION"
Sinon
    etat ← "OK"
FinSi
python
libre = 15
if libre < 10:
    etat = "CRITIQUE"
elif libre < 20:
    etat = "ATTENTION"
else:
    etat = "OK"
print(etat)
text
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.

python
libre = 5
if libre < 10:
    print("CRITIQUE")
if libre < 20:
    print("ATTENTION")
text
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 :

python
identifiant = "jdupont"
mdp = "Printemps2026!"
if len(mdp) >= 12 and mdp != identifiant:
    print("Mot de passe accepté")
else:
    print("Mot de passe refusé")
text
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.

text
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
python
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")
text
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.

text
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
python
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 Sinon contenant chacun un Si par une cascade SinonSi.

L'imbrication d'un Si dans le Sinon d'un autre est exactement ce qu'un SinonSi évite d'écrire :

python
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.

text
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.

python
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")
text
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.

SituationStructure
Un seul cas à traiter, rien sinonSi … FinSi
Deux cas exclusifsSi … Sinon … FinSi
Plusieurs intervalles ou conditions différentesSi … SinonSi … Sinon … FinSi
Une variable comparée à des valeurs précisesSelon … FinSelon (match)
Un test qui n'a de sens que si un autre est vraiSi 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éePourquoiAttendu
5Branche 1CRITIQUE
10Frontière : < 10 doit être fauxATTENTION
15Branche 2ATTENTION
20Frontière : < 20 doit être fauxOK
60Branche 3OK

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.

text
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
python
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
python
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))
MontantTauxNet
4990 %499.0
5005 %475.0
1 9995 %1899.05
2 00010 %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.

python
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 :

python
if jour == "samedi" or jour == "dimanche":
    print("Week-end")
python
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 ?

python
# Programme A
if note >= 10:
    print("Passable")
if note >= 12:
    print("Assez bien")
if note >= 14:
    print("Bien")
python
# 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
python
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
python
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")
python
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é ?

Chapitre terminé !

Fais les 6 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Boucles pour, tant que et répéterRevoir le sommaire du cours