QCM : Structures if, elif, else en Python

[enonce]
Ce QCM porte sur les structures conditionnelles Python : if, elif, else, indentation et prédiction de sortie. Choisissez la bonne réponse parmi les quatre propositions.
[/enonce]

[etape]
On exécute le programme Python ci-dessous :

x = -3
if x > 0 :
    print("positif")
else :
    print("négatif ou nul")

Que s'affiche-t-il ?
[qcm]
[option]positif[/option]
[option correct="true"]négatif ou nul[/option]
[option]positif puis négatif ou nul[/option]
[option]Rien ne s'affiche[/option]
[reponse statut="correct"]Exact !
Comme $x = -3$, la condition x > 0 est fausse. Python exécute donc le bloc du else, qui affiche négatif ou nul.[/reponse]
[reponse motif="positif"]Non.
La condition x > 0 n'est pas vérifiée pour $x = -3$. C'est donc le bloc du else qui est exécuté, pas celui du if.[/reponse]
[reponse motif="positif puis négatif ou nul"]Non.
Seul l'un des deux blocs s'exécute : if si la condition est vraie, else sinon. Jamais les deux à la fois.[/reponse]
[reponse motif="Rien ne s'affiche"]Non.
Dans une structure if/else, l'un des deux blocs s'exécute toujours : soit le if, soit le else.[/reponse]
[reponse statut="incorrect"]Non.
Tester la condition du if pour $x = -3$. Si elle est fausse, c'est le else qui est exécuté.[/reponse]
[/qcm]
[/etape]

[etape]
On exécute le programme Python ci-dessous :

note = 12
if note >= 16 :
    print("Très bien")
elif note >= 12 :
    print("Bien")
elif note >= 10 :
    print("Passable")
else :
    print("Insuffisant")

Que s'affiche-t-il ?
[qcm]
[option]Très bien[/option]
[option correct="true"]Bien[/option]
[option]Passable[/option]
[option]Bien puis Passable[/option]
[reponse statut="correct"]Bonne réponse !
Python teste les conditions dans l'ordre et s'arrête à la première qui est vraie. La première (note >= 16) est fausse, la seconde (note >= 12) est vraie : Python affiche Bien puis sort de la structure.[/reponse]
[reponse motif="Très bien"]Non.
La première condition (note >= 16) est fausse car $12 < 16$. Python passe alors à la suivante.[/reponse]
[reponse motif="Passable"]Non.
Bien que $12 \geqslant 10$ soit vrai, Python s'arrête à la première condition vraie qu'il rencontre. Vérifier si une condition précédente n'est pas déjà vraie.[/reponse]
[reponse motif="Bien puis Passable"]Non.
Dans une structure if/elif/elif/else, une seule branche s'exécute : celle dont la condition est la première à être vraie.[/reponse]
[reponse statut="incorrect"]Non.
Tester les conditions dans l'ordre. S'arrêter à la première vraie.[/reponse]
[/qcm]
[/etape]

[etape]
Avec x = 1 et y = 2, que vaut l'expression x == 1 and y == 3 en Python ?
[qcm]
[option]True[/option]
[option correct="true"]False[/option]
[option]1[/option]
[option]Une erreur est provoquée[/option]
[reponse statut="correct"]Bravo !
L'opérateur and exige les deux conditions vraies. La première (x == 1) est vraie, mais la seconde (y == 3) est fausse puisque $y = 2$. Le résultat est donc False.[/reponse]
[reponse motif="True"]Non.
Avec and, il ne suffit pas qu'une seule des deux conditions soit vraie. Il faut que les deux le soient. Tester la seconde condition.[/reponse]
[reponse motif="1"]Non.
Une expression avec and, or ou not renvoie un booléen, jamais un entier.[/reponse]
[reponse motif="Une erreur est provoquée"]Non.
Une telle expression combinant deux comparaisons avec and est parfaitement valide.[/reponse]
[reponse statut="incorrect"]Non.
Évaluer chaque condition séparément, puis combiner avec la règle du and.[/reponse]
[/qcm]
[/etape]

[etape]
On souhaite tester si la variable x est égale à $5$. Laquelle des instructions ci-dessous est correcte en Python ?
[qcm]
[option]if x = 5 :[/option]
[option]if x == 5[/option]
[option correct="true"]if x == 5 :[/option]
[option]if x := 5 :[/option]
[reponse statut="correct"]Parfait !
Pour un test d'égalité, on utilise == (double signe égal) et on termine la ligne par : (deux-points) qui introduit le bloc conditionnel.[/reponse]
[reponse motif="if x = 5 :"]Non.
= simple est l'opérateur d'affectation, pas d'égalité. Pour un test, il faut ==.[/reponse]
[reponse motif="if x == 5"]Non.
L'opérateur == est correct, mais il manque les deux-points à la fin de la ligne. Le : introduit le bloc d'instructions conditionnelles.[/reponse]
[reponse motif="if x := 5 :"]Non.
:= n'est pas l'opérateur d'égalité étudié au lycée. Pour un test classique d'égalité, utiliser ==.[/reponse]
[reponse statut="incorrect"]Non.
Syntaxe à retenir : if, puis condition avec ==, puis : à la fin, puis bloc indenté.[/reponse]
[/qcm]
[/etape]

[etape]
On exécute le programme Python ci-dessous :

def f(x) :
    if x <= 0 :
        return -x + 1
    else :
        return 3*x + 1

print(f(-2))

Que s'affiche-t-il ?
[qcm]
[option]$-5$[/option]
[option correct="true"]$3$[/option]
[option]$-1$[/option]
[option]$7$[/option]
[reponse statut="correct"]Exactement !
Comme $-2 \leqslant 0$, c'est la première branche qui s'exécute : la fonction renvoie $-x + 1 = -(-2) + 1 = 2 + 1 = 3$.[/reponse]
[reponse motif="$-5$"]Non.
$-5 = 3 \times (-2) + 1$ : c'est la formule de la branche else. Mais pour $x = -2$, la condition x <= 0 est vraie, donc on utilise l'autre branche.[/reponse]
[reponse motif="$-1$"]Non.
Attention au signe : $-(-2) = +2$, pas $-2$. Recalculer $-x + 1$ pour $x = -2$.[/reponse]
[reponse motif="$7$"]Non.
Erreur de branche et de signe. Commencer par identifier quelle condition est vraie pour $x = -2$, puis appliquer la formule correspondante.[/reponse]
[reponse statut="incorrect"]Non.
Étape 1 : évaluer la condition pour savoir quelle branche s'exécute. Étape 2 : appliquer la formule de cette branche.[/reponse]
[/qcm]
[/etape]

[etape]
On exécute le programme Python ci-dessous :

x = 7
est_positif = (x > 0)
if est_positif :
    print("A")
else :
    print("B")

Que s'affiche-t-il ?
[qcm]
[option]B[/option]
[option]True[/option]
[option correct="true"]A[/option]
[option]Une erreur est provoquée[/option]
[reponse statut="correct"]C'est bien ça !
La comparaison x > 0 renvoie un booléen qui est stocké dans est_positif. Comme $x = 7 > 0$, est_positif vaut True. La condition if est_positif : est donc vraie : le bloc if s'exécute et affiche A.[/reponse]
[reponse motif="B"]Non.
La variable est_positif stocke le résultat de x > 0. Pour $x = 7$, ce résultat est True, donc le bloc if s'exécute (et pas le else).[/reponse]
[reponse motif="True"]Non.
True est la valeur de est_positif, mais ce n'est pas ce qui est affiché à l'écran. Seules les instructions print affichent quelque chose.[/reponse]
[reponse motif="Une erreur est provoquée"]Non.
On peut parfaitement stocker un booléen dans une variable et l'utiliser comme condition : c'est une pratique très courante.[/reponse]
[reponse statut="incorrect"]Non.
Une variable booléenne peut servir directement de condition dans un if. Évaluer sa valeur puis déterminer quelle branche s'exécute.[/reponse]
[/qcm]
[/etape]

Vrai/Faux : Structures if, else, elif (niveau 2)

[enonce]
Pour chaque affirmation suivante sur les structures if, else et elif en Python, indiquez si elle est Vraie ou Fausse.
[/enonce]

[etape]
On exécute le programme Python ci-dessous :

x = 4
if x > 0 :
    print("positif")
else :
    print("négatif ou nul")

Affirmation : Ce programme affiche positif.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Bonne réponse !
La condition x > 0 est vraie (car $4 > 0$), donc le bloc du if est exécuté.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : dans un if…else, un seul des deux blocs est exécuté selon la valeur de la condition.
Ici, $4 > 0$ est True, donc le bloc du if s'exécute : le programme affiche positif.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. $4 > 0$ est True, donc le programme exécute le bloc if et affiche positif.
[/solution]
[/etape]

[etape]
Affirmation : En Python, le mot-clé elif est une abréviation de else if.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Exactement !
elif permet de tester une nouvelle condition uniquement si les précédentes étaient fausses.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
elif (contraction de else if) sert à enchaîner plusieurs conditions.
Python teste les conditions dans l'ordre et s'arrête à la première qui est vraie.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. elif signifie « sinon si » : on teste une nouvelle condition quand la précédente est fausse.
[/solution]
[/etape]

[etape]
On exécute le programme Python ci-dessous :

n = 5
if n > 0 :
    print("A")
if n > 3 :
    print("B")
else :
    print("C")

Affirmation : Ce programme affiche A puis B.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Bravo !
Il y a ici deux tests indépendants (deux if séparés).
$5 > 0$ est vrai, donc A s'affiche. $5 > 3$ est vrai aussi, donc B s'affiche (et pas C).[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Attention : les deux if ne sont pas reliés par elif — ils sont indépendants.
Les deux conditions sont vraies, donc les blocs A et B s'exécutent ; C ne s'exécute pas car il est associé au second if.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. Les deux if sont indépendants : chacun est évalué. A et B s'affichent, C non.
[/solution]
[/etape]

[etape]
On exécute le programme Python ci-dessous :

n = 5
if n > 0 :
    print("A")
elif n > 3 :
    print("B")
else :
    print("C")

Affirmation : Ce programme affiche A puis B.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]C'est bien ça !
Dans une cascade if…elif…else, un seul bloc est exécuté (le premier dont la condition est vraie).
Ici, $n > 0$ est vraie, donc A s'affiche et le programme saute le reste.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Le piège est de croire que plusieurs branches s'exécutent.
Avec if…elif…else, Python s'arrête dès qu'une condition est vraie : seul A s'affiche.[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. Dans un if…elif…else, Python exécute un seul bloc : ici, A seulement.
[/solution]
[/etape]

[etape]
Affirmation : En Python, l'instruction if x = 5 : provoque une erreur.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Tu as raison !
Dans une condition, il faut utiliser == (test d'égalité) et non = (affectation).
if x = 5 : produit une erreur de syntaxe.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : dans une condition, on utilise l'opérateur de comparaison ==, pas =.
Écrire if x = 5 : provoque une SyntaxError en Python.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. La bonne syntaxe est if x == 5 :. Avec = simple, Python renvoie une erreur.
[/solution]
[/etape]

[etape]
Affirmation : En Python, une condition après if doit obligatoirement être écrite entre parenthèses.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Correct !
Contrairement à d'autres langages (C, Java), Python n'impose pas les parenthèses autour de la condition.
On peut écrire if x > 0 : sans parenthèses.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Le piège vient d'autres langages (C, Java) qui imposent if (x > 0) {...}.
En Python, les parenthèses sont facultatives : if x > 0 : est tout à fait correct.[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. Les parenthèses autour de la condition sont facultatives en Python. En revanche, les deux-points : sont obligatoires.
[/solution]
[/etape]

Python : Facture d’électricité à tranches

Un fournisseur d'électricité applique un tarif progressif par tranches selon la consommation annuelle $ x $ (en kWh) :

  • chaque kWh est facturé $ 0{,}20 $ € jusqu'à $ 100 $ kWh ;
  • au-delà de $ 100 $ kWh et jusqu'à $ 500 $ kWh, chaque kWh supplémentaire est facturé $ 0{,}15 $ € ;
  • au-delà de $ 500 $ kWh, chaque kWh supplémentaire est facturé $ 0{,}10 $ €.
  1. Calculer « à la main » le montant de la facture pour une consommation de $ 80 $ kWh, puis de $ 300 $ kWh et enfin de $ 800 $ kWh.
  2. Écrire une fonction Python facture qui prend en argument la consommation $ x $ (en kWh) et renvoie le montant à payer (en euros).
  3. Vérifier à l'aide de la fonction les résultats de la question 1.

Corrigé

    1. Pour $ x = 80 $ kWh, on est dans la première tranche : $ 80 \times 0{,}20 = \mathbf{16 \text{ €}} $.
    2. Pour $ x = 300 $ kWh, on paye les $ 100 $ premiers kWh au tarif plein, puis $ 300 - 100 = 200 $ kWh au deuxième tarif :
      $ 100 \times 0{,}20 + 200 \times 0{,}15 = 20 + 30 = \mathbf{50 \text{ €}} $.
    3. Pour $ x = 800 $ kWh, on paye les trois tranches :
      $ 100 \times 0{,}20 + 400 \times 0{,}15 + 300 \times 0{,}10 = 20 + 60 + 30 = \mathbf{110 \text{ €}} $.
  1. On distingue les trois cas avec if, elif et else :

    def facture(x):
        if x <= 100:
            return 0.20 * x
        elif x <= 500:
            return 20 + 0.15 * (x - 100)
        else:
            return 80 + 0.10 * (x - 500)

    Dans la deuxième branche, les $ 100 $ premiers kWh coûtent $ 100 \times 0{,}20 = 20 $ €, puis on ajoute $ 0{,}15 $ € par kWh supplémentaire.
    Dans la troisième branche, les $ 500 $ premiers kWh coûtent $ 20 + 400 \times 0{,}15 = 80 $ €, puis on ajoute $ 0{,}10 $ € par kWh supplémentaire.

  2. On teste :

    >>> facture(80)
    16.0
    >>> facture(300)
    50.0
    >>> facture(800)
    110.0

    Les résultats correspondent bien à ceux calculés à la question 1.

Python : Appréciation d’un bulletin scolaire

Un professeur souhaite automatiser la saisie des appréciations sur les bulletins de ses élèves. Pour chaque note $ n $ sur $ 20 $, il souhaite afficher :

  • « Insuffisant » si $ n < 8 $ ;
  • « Passable » si $ 8 \leqslant n < 12 $ ;
  • « Bien » si $ 12 \leqslant n < 16 $ ;
  • « Excellent » si $ n \geqslant 16 $.
  1. Écrire une fonction Python nommée appreciation qui prend en argument une note $ n $ et renvoie la chaîne de caractères correspondante.
  2. Tester la fonction avec les notes suivantes : $ 5 $, $ 8 $, $ 11{,}5 $, $ 16 $ et $ 19 $.

Corrigé

  1. On enchaîne les conditions avec if, elif et else. L'ordre est important : on teste d'abord les valeurs les plus petites.

    def appreciation(n):
        if n < 8:
            return "Insuffisant"
        elif n < 12:
            return "Passable"
        elif n < 16:
            return "Bien"
        else:
            return "Excellent"
  2. On applique la fonction pour chaque note :

    • $ \text{appreciation}(5) $ renvoie « Insuffisant » car $ 5 < 8 $.
    • $ \text{appreciation}(8) $ renvoie « Passable » car $ 8 \geqslant 8 $ et $ 8 < 12 $.
    • $ \text{appreciation}(11{,}5) $ renvoie « Passable » car $ 11{,}5 < 12 $.
    • $ \text{appreciation}(16) $ renvoie « Excellent » car $ 16 \geqslant 16 $.
    • $ \text{appreciation}(19) $ renvoie « Excellent » car $ 19 \geqslant 16 $.

Remarque
Dans la branche elif n < 12, on n'a pas besoin d'écrire n >= 8 and n < 12 : la première branche a déjà traité le cas $ n < 8 $, donc lorsqu'on arrive à la deuxième branche, on sait que $ n \geqslant 8 $.

Python : Fonction définie par morceaux

On considère la fonction $ f $ définie sur $ \mathbb{R} $ par :

$ f(x) = \left\{ \begin{matrix} x & \texttt{si} & x < 0\\ x^2 - 1 &\texttt{si} & 0 \leqslant x<1 \\ x+5 & \texttt{si} & x \geqslant 1 \end{matrix} \right. $
  1. Compléter le tableau de valeurs suivant :

    $ x $ - 2 - 1 0 0,5 1 2 3
    $ f (x) $              
  2. Écrire un programme Python qui demande à l'utilisateur d'entrer une valeur de $ x $ et qui calcule l'image de $ x $ par la fonction $ f $.
    À l'aide de ce programme, vérifier les résultats de la question précédente.

Corrigé

    • comme $ - 2<0 $, $ f ( - 2) = - 2 $
    • comme $ - 1 < 0 $, $ f ( - 1) = - 1 $
    • comme $ 0 \leqslant 0 < 1 $, $ f (0) =0^2 - 1= - 1 $
    • comme $0 \leqslant 0{,}5 < 1$, $f(0{,}5) = 0{,}5^2 - 1 = -0{,}75$
    • comme $ 1 \geqslant 1 $, $ f (1) =1+5=6 $
    • comme $ 2 \geqslant 1 $, $ f (2) =2+5=7 $
    • comme $ 3 \geqslant 1 $, $ f (3) =3+5=8 $

    On obtient donc le tableau de valeurs suivant :

    $ x $ - 2 - 1 0 0,5 1 2 3
    $ f (x) $ - 2 - 1 - 1 - 0,75 6 7 8
  1. Le programme Python devra exécuter les tâches suivantes :

    • demander à l'utilisateur d'entrer en nombre décimal (penser à convertir en float)
    • calculer l'image de $ x $ par la fonction $ f $ en distinguant les différents cas à l'aide d'une instruction if - elif - else
    • afficher le résultat trouvé pour $ f (x) $.

    Voici un exemple possible :

    x=float(input("Entrer une valeur de x :"))
    if x<0 :
       resultat = x
    elif x<1 :
        resultat = x**2-1
    else :
        resultat = x+5
    print(resultat)

Remarque
En ligne 4., on aurait pu écrire également « elif x>=0 and x<1 », toutefois comme la condition « x<0 » a déjà été traité en ligne 2. on est sûr, lorsque l'on arrive en ligne 4, que « x>=0 » et il n'y a donc pas besoin de faire figurer alors la condition « x>=0 ».

Python : tarifs et pourcentage

Un cinéma propose des places à 9 € l'unité pour un adulte. Par ailleurs, il offre une réduction de 40 % pour les moins de 13 ans et une réduction de 30 % pour les seniors âgés de 65 ans ou plus.

  1. Écrire un programme en Python qui demande l'âge de la personne et affiche le prix de la place correspondante.
  2. Un groupe comprend plusieurs adultes, plusieurs enfants de moins de 13 ans et plusieurs seniors âgés de 65 ans ou plus.
    Écrire un programme en Python qui demande le nombre d'adultes, le nombre d'enfants et le nombre de seniors et qui affiche le prix total que devra régler le groupe.

Corrigé

  1. Le prix d'une place pour un enfant de moins de 13 ans est :
    $P_{1}=9 - \dfrac{40}{100} \times 9 = 9 - 3{,}6 = 5{,}4$ euros.

    Le prix d'une place pour un senior âgé de 65 ans ou plus est :
    $P_{2}=9 - \dfrac{30}{100} \times 9 = 9 - 2{,}7 = 6{,}3$ euros.

    On peut écrire le programme python correspondant en utilisant la structure « if - elif - else » :

    age = int(input(" Entrez l'âge de la personne : "))
    if age < 13 :
        print(" Le prix de la place est 5,4 euros")
    elif age >= 65 :
        print(" Le prix de la place est 6,3 euros")
    else : 
        print(" Le prix de la place est 9 euros")

    Remarque :
    On aurait également pu laisser le programme Python effectuer les calculs ; par exemple de la manière suivante :

    age = int(input("Entrez l'âge de la personne : "))
    if age < 13 :
        prix = 9 - 40 / 100 * 9
    elif age >= 65 :
        prix = 9 - 30 / 100 * 9
    else :
        prix = 9
    print("Le prix de la place est" , prix, "euros")
  2. Pour chacune des catégories d'âge, il suffit de multiplier les effectifs par le prix correspondant puis d'effectuer le total.

    adultes = int(input("Entrez le nombre d'adultes ne bénéficiant pas de réduction : "))
    enfants = int(input( "Entrez le nombre d'enfants de moins de 13 ans : "))
    seniors = int(input( "Entrez le nombre de seniors de 65 ans ou plus : "))
    prix = 9*adultes + 5.4*enfants + 6.3*seniors
    print(" Le prix total à payer pour le groupe est :", prix)

    Attention :
    Pour les prix décimaux, utilisez le point et non la virgule comme séparateur !