QCM : Transtypage et entrées/sorties en Python

[enonce]
Ce QCM porte sur les entrées/sorties en Python (input, print) et le transtypage entre int, float et str. Choisissez la bonne réponse parmi les quatre propositions.
[/enonce]

[etape]
On exécute le programme Python ci-dessous et l'utilisateur saisit 7 au clavier :

x = input("Saisir un nombre : ")
print(type(x))

Que s'affiche-t-il ?
[qcm]
[option]class 'int'[/option]
[option]class 'float'[/option]
[option correct="true"]class 'str'[/option]
[option]class 'bool'[/option]
[reponse statut="correct"]Exact !
La fonction input renvoie toujours une chaîne de caractères, quel que soit ce que l'utilisateur saisit. Pour obtenir un entier, il faut transtyper avec int(input(...)).[/reponse]
[reponse motif="class 'int'"]Non.
Piège classique : même si l'utilisateur saisit des chiffres, input renvoie toujours une chaîne. Pour obtenir un entier, il faut explicitement transtyper.[/reponse]
[reponse motif="class 'float'"]Non.
input ne renvoie jamais directement un décimal. Le résultat brut est toujours une chaîne de caractères.[/reponse]
[reponse motif="class 'bool'"]Non.
input ne renvoie jamais un booléen. Le résultat brut d'une saisie est toujours une chaîne de caractères.[/reponse]
[reponse statut="incorrect"]Non.
Règle essentielle : input(...) renvoie toujours une chaîne (str), même si on a tapé un nombre.[/reponse]
[/qcm]
[/etape]

[etape]
Pour que la variable n contienne un entier saisi par l'utilisateur, quelle instruction est correcte ?
[qcm]
[option]n = input("n = ")[/option]
[option]n = int("n = ")[/option]
[option correct="true"]n = int(input("n = "))[/option]
[option]n = input(int("n = "))[/option]
[reponse statut="correct"]Bonne réponse !
On lit d'abord la saisie avec input(...) (qui renvoie une chaîne), puis on la convertit en entier avec int(...). L'ordre des fonctions est essentiel : int(input(...)).[/reponse]
[reponse motif="n = input(\"n = \")"]Non.
input renvoie une chaîne, donc n serait de type str et non int. Il faut ajouter int(...) autour de input pour transtyper.[/reponse]
[reponse motif="n = int(\"n = \")"]Non.
Cette instruction essaierait de convertir la chaîne de prompt 'n = ' en entier, ce qui provoque une erreur. De plus, il n'y a plus de saisie utilisateur.[/reponse]
[reponse motif="n = input(int(\"n = \"))"]Non.
L'ordre est inversé : c'est la chaîne renvoyée par input qu'il faut transtyper, pas le prompt. L'ordre correct est int(input(...)).[/reponse]
[reponse statut="incorrect"]Non.
Schéma à retenir : saisie → chaîne → conversion. La fonction int doit entourer le résultat d'input.[/reponse]
[/qcm]
[/etape]

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

n = "5"
print(n + n)

Que s'affiche-t-il ?
[qcm]
[option]$10$[/option]
[option correct="true"]$55$[/option]
[option]5 5[/option]
[option]Une erreur est provoquée[/option]
[reponse statut="correct"]Parfait !
La variable n est une chaîne de caractères (entre guillemets). L'opérateur + entre deux chaînes effectue une concaténation : « 5 » + « 5 » donne « 55 ».[/reponse]
[reponse motif="$10$"]Non.
$10$ serait le résultat de $5 + 5$ si n était un entier. Ici n est une chaîne (« 5 », entre guillemets), donc + ne fait pas d'addition arithmétique.[/reponse]
[reponse motif="5 5"]Non.
La concaténation ne met pas d'espace entre les deux chaînes : les caractères sont mis bout à bout sans séparateur.[/reponse]
[reponse motif="Une erreur est provoquée"]Non.
L'addition de deux chaînes est autorisée en Python : c'est la concaténation. Il n'y a donc pas d'erreur.[/reponse]
[reponse statut="incorrect"]Non.
Les guillemets autour de $5$ changent tout : « 5 » est une chaîne, et + entre deux chaînes les colle bout à bout.[/reponse]
[/qcm]
[/etape]

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

print(5 ** 2, 5 % 3)

Que s'affiche-t-il ?
[qcm]
[option]25 1[/option]
[option]10 2[/option]
[option correct="true"]25 2[/option]
[option]10 1[/option]
[reponse statut="correct"]Tu as raison !
5 ** 2 vaut $5^2 = 25$ (puissance).
5 % 3 vaut $2$ car $5 = 3 \times 1 + 2$ (reste de la division euclidienne).
La fonction print affiche les deux valeurs séparées par une espace.[/reponse]
[reponse motif="25 1"]Non.
$5^2 = 25$ est correct, mais le reste de $5$ par $3$ n'est pas $1$. Écrire $5 = 3 \times q + r$ avec $0 \leqslant r < 3$ : quel est $r$ ?[/reponse]
[reponse motif="10 2"]Non.
$10 = 5 \times 2$ : vous avez confondu ** (puissance) avec * (multiplication). $5^2$ vaut $25$, pas $10$.[/reponse]
[reponse motif="10 1"]Non.
Deux erreurs : ** est la puissance ($5^2 = 25$, pas $10$) et le reste de $5$ par $3$ est $2$, pas $1$.[/reponse]
[reponse statut="incorrect"]Non.
Calculer séparément 5 ** 2 (puissance) et 5 % 3 (reste de division euclidienne).[/reponse]
[/qcm]
[/etape]

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

a = 12 // 5
b = 12 % 5
print(a, b)

Que s'affiche-t-il ?
[qcm]
[option]2 4[/option]
[option]2.4 0[/option]
[option correct="true"]2 2[/option]
[option]60 2[/option]
[reponse statut="correct"]Exactement !
$12 = 5 \times 2 + 2$ : le quotient entier est $2$ (variable a) et le reste est $2$ (variable b).
Les deux valeurs sont bien distinctes conceptuellement (quotient et reste), elles sont numériquement égales ici par coïncidence.[/reponse]
[reponse motif="2 4"]Non.
Le reste de $12$ par $5$ n'est pas $4$. Écrire $12 = 5q + r$ avec $0 \leqslant r < 5$ : quel couple $(q, r)$ convient ?[/reponse]
[reponse motif="2.4 0"]Non.
L'opérateur // renvoie un entier (quotient euclidien), pas un décimal. C'est / qui donnerait $2{,}4$.[/reponse]
[reponse motif="60 2"]Non.
$60 = 12 \times 5$ : vous avez multiplié. L'opérateur // est une division, pas une multiplication.[/reponse]
[reponse statut="incorrect"]Non.
Effectuer la division euclidienne de $12$ par $5$ : $12 = 5 \times 2 + 2$. Quotient et reste.[/reponse]
[/qcm]
[/etape]

[etape]
Parmi les instructions Python suivantes, laquelle affecte à x la valeur décimale saisie par l'utilisateur ?
[qcm]
[option]x = input("Saisir x : ")[/option]
[option]x = int(input("Saisir x : "))[/option]
[option correct="true"]x = float(input("Saisir x : "))[/option]
[option]x = str(input("Saisir x : "))[/option]
[reponse statut="correct"]Correct !
Pour convertir une saisie en nombre décimal, on utilise la fonction float(...) autour de input(...).[/reponse]
[reponse motif="x = input(\"Saisir x : \")"]Non.
Sans transtypage, x serait une chaîne de caractères (str) et non un décimal. Il manque une conversion.[/reponse]
[reponse motif="x = int(input(\"Saisir x : \"))"]Non.
La fonction int(...) convertit en entier, pas en décimal. Si l'utilisateur saisit 2.5, ce programme produira même une erreur.[/reponse]
[reponse motif="x = str(input(\"Saisir x : \"))"]Non.
str(...) convertit en chaîne, et input renvoie déjà une chaîne : cette conversion ne change rien. Il faut float pour obtenir un décimal.[/reponse]
[reponse statut="incorrect"]Non.
Pour convertir en décimal : float(...) autour de la saisie.[/reponse]
[/qcm]
[/etape]

Vrai/Faux : Transtypage et saisie Python (niveau 3)

[enonce]
Pour chaque affirmation suivante sur le transtypage, la saisie et les types dynamiques en Python, indiquez si elle est Vraie ou Fausse.
[/enonce]

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

a = 1
a = 'Bonjour'

Affirmation : Ce programme provoque une erreur car on change le type de a.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Excellent !
En Python, le typage est dynamique : une variable peut changer de type au cours du programme.
Après la seconde ligne, a est de type str et vaut 'Bonjour', sans aucune erreur.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Contrairement à certains langages (C, Java), Python ne fige pas le type d'une variable.
Le typage est dynamique : réaffecter une variable avec une valeur d'un autre type est parfaitement valide.[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. Python a un typage dynamique : a passe de int à str sans erreur.
[/solution]
[/etape]

[etape]
L'utilisateur exécute le programme Python suivant et saisit $42$ au clavier :

a = input("Saisir une valeur : ")

Affirmation : Après cette instruction, a contient le nombre entier $42$.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Bonne réponse !
La fonction input renvoie toujours une chaîne de caractères (type str), quelle que soit la saisie.
a contient donc la chaîne « 42 », pas l'entier $42$.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Attention : input renvoie toujours un str, même si l'utilisateur tape un nombre.
Pour obtenir un entier, il faut écrire a = int(input(...)).[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. input renvoie toujours une chaîne : a contient la chaîne « 42 », pas le nombre $42$.
[/solution]
[/etape]

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

print("Total :", 3 + 4)

Affirmation : Ce programme affiche Total : 7.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Bravo !
La fonction print affiche plusieurs valeurs séparées par des espaces (en présence de virgules).
$3+4$ est calculé avant l'affichage, donc le programme affiche bien Total : 7.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : les virgules dans print séparent des valeurs distinctes, chacune étant évaluée.
$3+4$ est calculé avant d'être affiché : le résultat affiché est Total : 7.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. print affiche les valeurs séparées par un espace et évalue les expressions : on obtient Total : 7.
[/solution]
[/etape]

[etape]
L'utilisateur exécute le programme Python suivant et saisit $3.5$ au clavier :

n = int(input("n = "))

Affirmation : Cette instruction permet à l'utilisateur de saisir le nombre décimal $3{,}5$.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Tu as raison !
La fonction int attend une chaîne représentant un entier.
Si l'utilisateur saisit 3.5, Python déclenche une erreur de conversion. Pour saisir un décimal, il faudrait utiliser float(input(...)).[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Le piège est de croire que int arrondit ou tronque automatiquement.
int(input(...)) n'accepte que des chaînes représentant un entier : « 3.5 » provoque une erreur. Pour un décimal, utiliser float(input(...)).[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. int(input(...)) accepte uniquement des entiers. Pour un décimal, il faut écrire float(input(...)).
[/solution]
[/etape]

[etape]
Affirmation : En Python, l'opérateur ** calcule la puissance d'un nombre.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Exactement !
En Python, la puissance s'écrit bien avec ** (deux étoiles). Par exemple : 2 ** 3 vaut $8$.
Le symbole ^ existe mais désigne un autre opérateur (le « ou exclusif » sur les entiers), rarement utilisé au lycée.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Le piège ici vient de la notation mathématique ($2^3$) ou de la calculatrice (touche ^).
En Python, la puissance s'écrit exclusivement avec **. Par exemple 2 ** 3 donne $8$.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. En Python, la puissance s'écrit ** (deux étoiles). C'est ^ qui désigne un opérateur logique, pas la puissance.
[/solution]
[/etape]

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

a = "ab"
print(3 * a)

Affirmation : Ce programme affiche ababab.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Correct !
Sur une chaîne de caractères, l'opérateur * (précédé d'un entier) répète la chaîne.
3 * « ab » donne donc « ababab ».[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : * appliqué à une chaîne et un entier effectue une répétition (pas un produit mathématique).
3 * « ab » répète trois fois la chaîne « ab », ce qui donne « ababab ».[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. L'opérateur * entre un entier et une chaîne répète la chaîne : 3 * « ab » donne « ababab ».
[/solution]
[/etape]

Python : Attention aux types de données !

Clara a saisi le programme suivant dans son éditeur Python :

a=input('Entrez la valeur de a : ')
b=input('Entrez la valeur de b : ')
c=5*a+3*b
print(c)

Elle exécute ensuite ce programme en entrant 10 comme valeur pour a et 5 comme valeur pour b.
Elle s'attend à obtenir 65 comme résultat.

  1. Quel est, en réalité, le résultat affiché par le programme ?
    Expliquez ce résultat.
  2. Corrigez ce programme afin qu'il affiche le résultat 65 prévu par Clara.

Corrigé

  1. Lorsque l'on exécute le programme de Clara on obtient '1010101010555' comme résultat.

    En effet les valeurs entrées par Clara sont considérées comme étant des chaînes de caractères.

    On a donc a='10' et 5*a='1010101010' (répétition de 10 cinq fois) ;
    b='5' et 3*b='555' (répétition de 5 trois fois) ;
    et 5*a+3*b='1010101010555' (concaténation).
  2. Pour que le programme fonctionne comme Clara le souhaiterait, il faut convertir a et b en un type numérique : int ou float.

    Par exemple :

    a=input('Entrez la valeur de a : ')
    b=input('Entrez la valeur de b : ')
    a=int(a)
    b=int(b)
    c=5*a+3*b
    print(c)

    ou plus simplement :

    a=int(input('Entrez la valeur de a : '))
    b=int(input('Entrez la valeur de b : '))
    c=5*a+3*b
    print(c)

Python : Calcul du volume d’une sphère

Écrire un programme Python qui demande, en entrée, le rayon d'une sphère en cm et affiche, en sortie, le volume de la sphère en cm$ ^3 $.

Indication : Pour utiliser le nombre $ \pi $, on pourra faire appel au module math qui donne accès à différentes fonctions mathématiques comme cosinus (cos), sinus (sin), racine carrée (sqrt), et à certaine constantes mathématiques comme $ \pi $ (pi).
Pour cela, il suffit d'inclure, en tête du programme, la ligne suivante :

from math import pi

Il suffira ensuite de faire appel à la constante pi à chaque fois que l'on souhaitera utiliser la valeur de $ \pi $.

Corrigé

Le volume d'une sphère de rayon $ r $ est donné par la formule :

$ V=\dfrac{4}{3}\pi r^3 $

Voici un programme possible :

from math import pi
r=float(input('Quel est le rayon de la sphere en cm : '))
v=4/3*pi*r**3
print('Le volume de la sphere est ', v, 'cm3')

Remarques :

  • La ligne :

    from math import pi

    permet d'importer la valeur de $ \pi $.
    À la place, on peut également utiliser la ligne :

    from math import *

    pour importer toutes les constantes et toutes les fonctions du module math.

  • Il ne faut pas oublier de convertir le rayon en float sinon, il sera considéré comme étant une chaine de caractères et Python déclenchera une erreur lors du calcul du volume.