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.

Algorithme et fonction

Paul a rédigé l'algorithme suivant en pseudo-code :

Variables $a, b$ : nombres réels
Début  
  Saisir $a$
  $b$ prend la valeur $a^2 - 3$
  Afficher « L'image du nombre entré est », $b$
Fin  

En Python, cet algorithme s'écrit :

a = float(input("Saisir a : "))
b = a**2 - 3
print("L'image du nombre entré est", b)
  1. Dans cet algorithme, quelle instruction correspond à une entrée ? Quelle instruction correspond à une sortie ?
  2. Paul saisit la valeur 2 pour a. Quel résultat obtient-il en sortie ?
  3. Cet algorithme permet de calculer l'image d'un nombre par une certaine fonction. Quelle est cette fonction ?
  4. Paul a obtenu comme résultat : « L'image du nombre entré est 6 ». Quel nombre a-t-il saisi ?

Corrigé

  1. Instruction d'entrée : saisir a.

    Instruction de sortie : afficher « L'image du nombre entré est », b.
  2. Si on saisit la valeur 2 pour a, b prend la valeur 2²-3=1 et l'algorithme affiche : « L'image du nombre entré est 1 »
  3. La fonction définie par cet algorithme est la fonction $ x \longmapsto x^2 - 3 $
  4. Soit a le nombre saisi par Paul. Pour obtenir 6 comme résultat, il faut que :

    $ a^2 - 3=6 $

    $ a^2=6+3 $

    $ a^2=9 $

    $ a=3 $ ou $ a= - 3 $

    Paul a saisi le nombre 3 ou le nombre -3.

Algorithme : Théorème de Pythagore

Écrire un algorithme qui demande d'entrer les longueurs des deux côtés de l'angle droit dans un triangle rectangle puis calcule et affiche la longueur de l'hypoténuse.

Convertir cet algorithme pour votre calculatrice ou pour Algobox.

Corrigé

Par exemple :

variables a, b, c : nombres
début algorithme

  • afficher « Entrer la longueur du premier côté de l'angle droit »
  • lire a
  • afficher « Entrer la longueur du deuxième côté de l'angle droit »
  • lire b
  • c prend la valeur $\sqrt{a^2+b^2}$
  • afficher « La longueur de l'hypoténuse est », c

fin algorithme

En Python :

from math import sqrt

a = float(input("Entrer la longueur du premier côté de l'angle droit : "))
b = float(input("Entrer la longueur du deuxième côté de l'angle droit : "))
c = sqrt(a**2 + b**2)
print("La longueur de l'hypoténuse est", c)

Programme calculatrice (TI 83) :

Programme calculatrice TI 83

Programme Casio (Graph 85) :

Programme Casio (Graph 85)

Algorithme Algobox :

Algorithme : Coefficient directeur

Écrire un algorithme qui demande les coordonnées de deux points A et B (d'abscisses différentes) et calcule le coefficient directeur de la droite (AB)

Corrigé

Il faut demander quatre coordonnées.

Le coefficient directeur est :

$ a=\dfrac{y_B - y_A}{x_B - x_A} $

Par exemple :

variables xa, ya, xb, yb, coef : nombres
début algorithme

  • écrire « Entrer l'abscisse de A »
  • lire xa
  • écrire « Entrer l'ordonnée de A »
  • lire ya
  • écrire "Entrer l'abscisse de B (différente de l'abscisse de A)"
  • lire xb
  • écrire « Entrer l'ordonnée de B »
  • lire yb
  • coef prend la valeur (yb - ya)/(xb - xa)
  • écrire "Le coefficient directeur de la droite (AB) est : ", coef

fin algorithme

En Python :

xa = float(input("Entrer l'abscisse de A : "))
ya = float(input("Entrer l'ordonnée de A : "))
xb = float(input("Entrer l'abscisse de B (différente de l'abscisse de A) : "))
yb = float(input("Entrer l'ordonnée de B : "))
coef = (yb - ya) / (xb - xa)
print("Le coefficient directeur de la droite (AB) est :", coef)

Remarque : On pourrait améliorer cet algorithme en vérifiant si l'abscisse de B est différente de l'abscisse de A et en affichant un message d'erreur dans le cas contraire.

Programme Casio (Graph 85) :

Algorithme Casio (Graph 85)

Algorithme Algobox :

Algorithme Casio (Graph 85)