TP 2 Structures alternatives 2.1 Types et transtypages

publicité
TP 2 Structures alternatives
TP 2
6
Structures alternatives
Liens utiles pour les structures alternatives :
Tutoriel : https://docs.python.org/2/tutorial/controlflow.html#if-statements
Documentation : https://docs.python.org/2/reference/compound_stmts.html
Créez un nouveau répertoire de travail Z:\Prog\TP2 pour les scripts de ce TP.
2.1
2.1.1
Types et transtypages
Type
Le contenu d’une variable n’est pas de la même nature lorsqu’il est saisi comme un nombre ou comme une
chaine de caractères. La fonction type(variable) retourne le type de la valeur contenue dans une variable. Dans
un interpréteur Python (onglet ”Console Python”), testez les instructions suivantes :
>>>
>>>
>>>
>>>
>>>
>>>
2.1.2
a = 1
type ( a )
a = "1"
type ( a )
a = 1.0
type ( a )
Transtypage
En Python, le typage des données est dynamique puisqu’une variable peut changer de type. La conversion de
type (transtypage) est réalisée par les fonctions :
I int(variable) pour convertir une variable en int ;
I float(variable) pour la convertir en flottant ;
I str(variable) pour la convertir en chaine de caractères, ...
A↵ectez à une variable b le résultat du transtypage de di↵érentes valeurs de a ; indiquez dans chaque cas la
valeur de b et d’éventuelles erreurs.
a
1.0
"1"
"1.0"
"1A"
"AB"
b=int(a)
b=float(a)
b=str(a)
Un typage fort implique que les conversions implicites de types sont interdites et que les erreurs de typage peuvent
être détectées. A↵ectez aux trois variables entier, flottant, chaine les trois valeurs 1, 1.0, "1" respectivement.
Observez le résultat des opérations entier+flottant , flottant+chaine et entier+chaine. Quels messages d’erreur
apparaissent, et si oui, pourquoi ?
2.1.3
Saisie clavier et type
La lecture (ou saisie) au clavier de données fournies de manière interactive par l’utilisateur est réalisée par :
— la commande variable = input("message de saisie affichee dans la console") lorsque l’on souhaite
obtenir la saisie d’un nombre. Le type du nombre (int ou float) est décidé par Python en fonction de la
saisie ;
— la commande variable = raw_input("message de saisie") lorsqu’on souhaite obtenir une chaine de caractères de type str 2 .
Dans les deux cas, la saisie s’arrête dès que l’on presse la touche entrée .
Répétez la suite d’instructions suivantes (avec un interpréteur Python), en saisissant tour à tour à l’invite du
prompt les valeurs 123 puis 456.789 :
2. Une alternative pour saisir un nombre est d’utiliser raw_input() qui ne renvoie que la suite de caractères saisis sans
interprétation, le type étant ensuite décidé par le programmeur via un transtypage explicite.
TP 2 Structures alternatives
7
>>> var = input ( " Entrez une valeur : " )
>>> print " valeur : " , var , " - type : " , type ( var )
Testez maintenant la suite d’instructions suivantes en saisissant tour à tour à l’invite du prompt les trois valeurs :
bonjour, 123 puis 456.789 :
>>> var = raw_input ( " Entrez une valeur : " )
>>> print " valeur : " , var , " - type : " , type ( var )
Quelles di↵érences apparaissent entre les deux suites d’instruction ? On veillera donc à bien choisir la fonction de
saisie en fonction du type des données sur lesquelles le programme devra travailler.
2.2
Structures alternatives
Programme tri2.py : Écrivez un script nommé tri2.py qui demande à l’utilisateur deux nombres. Ces
nombres seront stockés dans deux variables var1 et var2. Le programme classe les valeurs de telle sorte que var1
contienne la valeur la plus petite et var2 la plus grande. Pour finir, le programme affiche les valeurs var1 et var2.
Indication : Dans ce cas simple, il faut permuter les valeurs contenues dans var1 et var2 si var1 est supérieure à
var2 et ne rien faire sinon.
Programme convert.py : Écrivez un script nommé convert.py qui demande à l’utilisateur quelle
conversion il souhaite e↵ectuer parmi les choix du menu suivant : choix 1) conversion de degré Celsius vers degré
Fahrenheit ; choix 2) conversion de degré Fahrenheit vers degré Celsius ; choix 3) conversion de degré Celsius vers
degré Kelvin.
En fonction du choix fait par l’utilisateur, le script demande à l’utilisateur de saisir les données à convertir et affiche
sur la console le résultat de la conversion. Par exemple :
1
2
3
4
5
6
7
Bienvenue dans le programme de conversion . Voici les conversions possibles :
(1) degr é Celsius vers degr é Fahrenheit
(2) degr é Fahrenheit vers degr é Celsius
(3) degr é Celsius vers degr é Kelvin
Entrez votre choix ( entier 1 , 2 ou 3) : 2
Entrez les degr é s Fahrenheit : 50
Voici les degr é s Celsius : 10 C
On rappelle que la relation entre la température en Fahrenheit TF et celle en Celsius TC est : TF = TC ⇤ 1, 8 + 32.
Des informations sur le Kelvin sont disponibles sur http://fr.wikipedia.org/wiki/Kelvin.
Programme plusTard.py : Écrivez un script nommé plusTard.py qui affiche quelle sera l’heure dans x
minutes. Pour cela, le script récupère l’heure courante dans les variables heure et minute par les instructions :
1
2
3
import time
heure = int ( time . strftime ( " % H " ) )
minute = int ( time . strftime ( " % M " ) )
Le script demande ensuite la saisie-clavier d’un nombre de minutes puis affiche l’heure qu’il sera. Par exemple :
1
2
3
Il est 23:42
Entrez les x minutes à ajouter : 90
Dans 90 mn , il sera 01:12
Indications : utilisez la division euclidienne et le modulo pour connaitre l’incrément sur les heures (base 24) et les
minutes (base 60). Pensez également au formatage %d pour l’affichage du résultat.
Programme tri3.py : Écrivez un script nommé tri3.py en reprenant l’exercice précédent avec cette fois
trois variables var1, var2 et var3. Le problème se résout aisément en 3 tests.
Indication : Si l’on classe var1 et var2, puis var2 et var3, on remarque que var3 contient alors le plus grand nombres
des trois...
TP 2 Structures alternatives
2.3
8
Le module Turtle
Python propose une grande diversité de modules qui étendent les fonctionnalités de base du langage. Citons le
module math qui fournit toute une bibliothèque de constantes (par exemple pi défini dans ce module comme un
flottant de valeur 3.14159...) et de fonctions pour le calcul.
2.3.1
Import d’un module
Pour que Python charge un module il faut l’importer avec la commande import nom_module. Dans ce cas, les
constantes et les fonctions seront accessibles par la syntaxe nom_module.[nom_constante|nom_fonction] 3 .
Dans un interpréteur Python, importez le module math. Remarquez que la documentation 4 des entités du
module est disponible directement par une info-bulle, par exemple lors de la saisie de math.sin. Une aide plus complète
à propos du module math est accessible sur http://docs.python.org/library/math.html.
⇣⇡⌘
p
Calculez les expressions suivantes : | 1|, 2, sin
en utilisant les fonctions fabs, sin et sqrt.
2
2.3.2
Le module Turtle
Le module turtle propose nombre de méthodes pour réaliser des graphiques. Il s’inspire du langage logo,
très populaire il y a quelques décennies, et met à disposition un espace graphique (la fenêtre) et un pointeur
(représentée par défaut par une flèche) qui reçoit des ordres pour réaliser des dessins.
Dans l’interpréteur, testez les exemples d’instructions suivantes :
1
2
3
4
5
6
7
8
9
import turtle
# import du module turtle
turtle . clear ()
# cr é ation d ’ une fen ^
e tre vide
turtle . shape ( ’ turtle ’) # modification de la forme du pointeur
turtle . forward (50)
# trac é d ’ une ligne droite de longueur 50
turtle . left (90)
# rotation à gauche de 90 degr é s
turtle . circle (100 , 180) # trac é d ’ un demi - cercle de rayon 100
turtle . circle ( -100 , 180) # trac é d ’ un demi - cercle de rayon 100
# dans le sens horaire
turtle . exitonclick ()
# laisse la fen ^
e tre visible jusqu ’à ce que l ’ on clique dessus
Une aide très utile sur le module est disponible sur https://docs.python.org/2/library/turtle.html#
turtle-methods.
Programme triangle.py : Écrivez un script nommé triangle.py qui change l’allure du pointeur en
tortue et dessine un triangle de taille 200 dans une fenêtre turtle.
Programme yin-yang.py : Écrivez un script nommé yin-yang.py qui
réalise la figure du yin-yang.
Indications :
I Réfléchissez à la suite d’actions à e↵ectuer pour tracer les formes sans
remplissage (faites un dessin sur un papier !)
I Écrivez une première version du script sans vous préoccuper des couleurs
I Pour déplacer la tortue sans laisser de trace, il faut la lever avec la méthode
up(), puis l’abaisser avec la méthode down()
I Pour colorer une zone du dessin, utilisez les méthodes color(), begin_fill
(), end_fill()
I Pour que la tortue fasse un mouvement circulaire dans le sens horaire, il
suffit d’indiquer un rayon négatif à la méthode circle().
3. Cette commande d’import permet de segmenter l’espace des noms de variables, c’est à dire de ne pas créer de conflits entre
deux entités (fonctions par exemple) de même nom appartenant à deux modules distincts.
4. L’aide en ligne est aussi accessible avec la commande help(math). Cette aide est présentée comme une page de man unix.
On peut y faire une recherche par la commande / puis naviguer dans la page par n (next) ou p (previous). On quitte l’aide par q.
TP 2 Structures alternatives
2.4
9
Prolongations
Programme racine.py : Écrivez un programme nommé racine.py qui demande à l’utilisateur de saisir les
coefficients réels a, b et c définissant le polynôme de degré 2 P (X) = aX 2 + bX + c. Le programme affiche ensuite
les valeurs de X qui annulent le polynôme, en prévoyant les cas de figure suivants :
— il n’y a pas de solution (si a = b = 0 et c est un réel quelconque non nul)
— il n’existe qu’une solution réelle (par exemple si a = 0 )
— il y a deux racines réelles (par exemple si a = 1, b = 1 et c = 0)
— il y a une racine réelle double (par exemple si a = 1, b = 2 et c = 1)
— il y a deux racines complexes (par exemple si a = b = c = 1)
En Python, un nombre complexe comporte deux flottants (partie réelle et partie imaginaire) où la partie imaginaire
est dotée du suffixe j. Attention, l’imaginaire pur j s’écrit 1j (et non j tout court). Les deux parties d’un nombre
complexe z sont accessibles comme suit : z.real pour la partie réelle et z.imag pour la partie imaginaire.
Le calcul sur les nombres complexes est facilité par le module cmath. Une information complète sur ce module est
disponible sur https://docs.python.org/2.7/library/cmath.html. Pour cet exercice, nous utiliserons cmath.
sqrt qui renvoie la racine complexe d’un nombre. Par exemple cmath.sqrt(-1) renvoie la valeur 1j (i.e. 1 ⇥ j) et
p
p
cmath.sqrt(1j) vaut 0.7071067811865476+0.7071067811865475j (i.e. 2/2 + j 2/2).
Autre commodité : la fonction abs, intégrée au langage, renvoie la valeur absolue d’un nombre. (par exemple abs(-1)
vaut 1)
2.4.1
L’opérateur ternaire
L’expression valeur1 if condition_booleenne else valeur2 utilisant l’écriture ternaire de la structure if
/else permet d’alléger l’écriture de structures alternatives simples. Avec cette écriture, l’expression s’évalue à
la valeur valeur1 si la condition_booleenne est vraie ou à la valeur valeur2 si la condition_booleenne est fausse.
Voici un exemple qui calcule la valeur absolue d’un nombre a et l’a↵ecte à b :
1
b = a if a >=0 else -a
Cet exemple est équivalent à :
1
2
3
4
if a >= 0 :
b = a
else :
b = -a
Programme maxTernaire.py : Écrivez un script qui demande à l’utilisateur de saisir deux nombres
et affiche le maximum des deux (c’est à dire le plus grand des deux) en utilisant l’écriture ternaire de la structure
if/else.
Programme affichageNombre.py : Écrivez un script qui demande un nombre à l’utilisateur puis
l’affiche avec 2 chi↵res après la virgule si c’est un flottant, l’affiche naturellement si c’est un entier et n’affiche rien
dans les autres cas.
Programme affichagePolynome.py : Écrivez un programme nommé affichagePolynome.py, qui saisit
les 4 coefficients définissant le polynôme de degré 3 a3 X 3 + a2 X 2 + a1 X + a0 et affiche, en s’aidant de l’opérateur
ternaire, le polynôme avec les conventions mathématiques usuelles :
— lorsque a3=1 ; a2=0 ; a1=2 et a0=3, l’affichage est X^3 + 2 X + 3
— lorsque a3=a2=0 ; a1=2 et a0=3, l’affichage est 2 X + 3
— lorsque a3=-1 ; a2=0 ; a1=-1 et a0=0 l’affichage est - X^3 - X
— lorsque a3=a2=a1=a0=0, l’affichage est 0.
On se limitera au cas des coefficients entiers (les flottants ne sont pas pris en compte).
Programme divisionPolynomiale.py : On souhaite écrire un programme qui réalise (lorsque cela est
possible) la division euclidienne polynomiale d’un polynôme de degré 3 de la forme P (X) = a3 X 3 + a2 X 2 + a1 X + a0
TP 2 Structures alternatives
10
(à coefficients entiers) par un polynôme de la forme D(X) = X r où r est une racine du polynôme puis affiche le
résultat sous la forme Q(X) = b2 X 2 + b1 X + b0 .
— Quelques questions mathématiques préliminaires : à quelle condition r est-elle une racine de P (X) ? Calculez
à la main les relations donnant les coefficients b2 , b1 et b0 en fonction des coefficients a3 , a2 , a1 , a0 et de la
racine r.
— Ecrire un programme qui demande à l’utilisateur de saisir les coefficients a3 , a2 , a1 , a0 du polynôme P ; puis
demande de saisir une valeur r. Le programme teste si r est une racine de P et si oui, calcule les coefficients b2 ,
b1 et b0 du polynôme Q. Le programme affiche finalement le polynôme Q de la même façon qu’à l’exercice 16.
Indication : On pourra tester le programme avec le polynôme X 3 6X 2 + 11X 6 dont les racines sont 1,
2 et 3 où avec le polynôme X 3 2X 2 X + 2 dont les racines sont 1, 1 et 2.
Téléchargement