Enoncé - DI ENS

publicité
Eléments de Programmation - TME 1
© Equipe enseignants 1i-001
UPMC – Licence 1 – 2014/2015
Table des matières
Prise en main de l’environnement idle
1
Dessins avec le module Turtle
5
Prise en main de l’environnement idle
Avant propos
1. Allez sur le site web annuel de l’UE 1I001 dont l’adresse est http ://www-licence.ufr-infop6.jussieu.fr/lmd/licence/2014/ue/1I001-2014oct
2. Ajoutez cette page dans vos favoris. Vous aurez à y venir souvent pour vous informer,
récupérer les morceaux de documents ou de programmes, ou soumettre vos travaux à la
fin de chaque séance de TME.
Premier pas en Python avec l’environnement idle
IDLE est un «ide» environnement de développement intégré (en anglais « Integrated DeveLopment Environment ») pour le langage Python. Il est entièrement écrit en python et utilise
l’environnemnt d’interface graphique tkinter. Pour lancer l’application idle :
1. avec le bouton droit de la souris, cliquez sur le fond de l’écran et choisissez «Terminal»
ou «Konsole» pour ouvrir une fenêtre shell (de commandes) vous permettant de taper
des commandes (du système d’exploitation Linux) et de les exécuter.
2. taper la commande idle suivi de la touche «Entrée» (ou «Return» selon votre clavier).
Vous voyez apparaître une fenêtre, qu’on appellera fenêtre de l’interpréteur, permettant d’exécuter
des instructions Python :
1
Cette fenêtre se distingue notamment par la présence de 3 chevrons >>> qui constituent l’invite
(ou prompt en anglais). Ils indiquent l’endroit où écrire les instructions que l’on veut donner à
l’interprète Python.
Question 1
À la suite de l’invite, tapez les expressions suivantes et étudiez la réaction de l’interpréteur :
42
type(42)
2.3
type(2.3)
True
type(True)
"chaine de caractères"
type("chaine de caractères")
3+2
6*2
6**2
2
10 > 23
Question 2
Tapez successivement dans l’interpréteur Python les lignes suivantes :
"essai" == "essai"
"essai" == "essai "
"3" == 3
4 == 5
4 == 4
4 == 2*2
Expliquez chacun des résultats obtenus.
Question 3
Écrivez les expressions qui permettent de :
—
—
—
—
—
—
—
calculer la division (réelle) de 42 par 5
calculer le quotient de la division euclidienne de 42 par 5
calculer le reste de la division euclidienne de 42 par 5
tester l’égalité entre 6 et 2 ∗ 3
3
calculer la valeur de l’expression arithmétique 2∗3
5−2
tester le type de la valeur calculée précédemment (est-ce le résultat que vous attendiez ?)
calculer le maximum entre cette valeur et le nombre 10 (se servir de la carte de référence)
Question 4
Comme vous avez pu vous en apercevoir, la fenêtre précédente est très pratique pour tester
de façon réactive des instructions Python. Par contre, elle n’est pas idéale pour écrire des
programmes plus conséquents. Elle ne permet notamment pas de sauvegarder ce qui a été
tapé dans l’interpréteur, ni les résultats obtenus. Pour cela, on utilise alors une fenêtre d’édition.
1) Commencez par ouvrir une fenêtre d’édition. Pour ouvrir une fenêtre d’édition, il suffit
de passer par le menu de la fenêtre de l’interpréteur :
— «File» → «New Window» (ou bien «File» → «New File», ou alors utilisez la combinaison
des 2 touches du clavier <CTRL> N)
3
Ceci a pour effet d’ouvrir une nouvelle fenêtre, sans invite, dans laquelle on peut écrire un
programme complet :
Fenêtre d’édition
Dans cette fenêtre, recopiez la fonction perimetre vue en cours qui calcule le périmètre d’un
rectangle :
def perimetre(largeur, longueur):
"""int * int -> int
hypothèse : (largeur >= 0) and (longueur >= 0)
hypothèse : longueur >= largeur
retourne le périmètre du rectangle défini par sa largeur et sa longueur."""
return 2 * (largeur + longueur)
2) Enregistrez le programme dans un fichier en vous aidant du menu de la fenêtre d’édition :
— «File» → «Save» (ou la combinaison des 2 touches du clavier <CTRL> S)
— ou «File» → «Save As. . . » (ou la combinaison des 3 touches <CTRL> <MAJ> S)
Cette étape est importante et réclamée avant toute exécution du programme. ATTENTION :
Pensez à sauvegarder régulièrement vos programmes.
3) Exécutez votre programme en utilisant le menu :
— «Run» → «Run Module» (ou utilisez la touche F5)
Vous aurez peut-être remarqué que l’interpréteur a repris la main. Celui-ci dispose désormais de
la fonction nouvellement définie perimetre. À la suite de l’invite, écrivez une expression qui
calcule le périmètre d’un rectange de largeur 4 unités et de longueur 5 unités.
Question 5
A la suite de la fonction précédente, dans la fenêtre d’édition, rajoutez la définition de la fonction
surface qui calcule la surface d’un rectangle de largueur l et longueur L. Vous n’oublierez pas
de fourni un jeu de tests pour votre fonction.
Vérifiez ensuite le résultat de ce que renvoie votre fonction sur les exemples suivants :
>>> surface(1,4)
>>> surface(2,0)
>>> surface(3,4)
Attention : n’oubliez pas de sauvegarder votre fichier avant d’exécuter le programme.
4
# jeu de tests :
assert surface(0,0) == 0
assert surface(0,10) == 0
assert surface(10,0) == 0
assert surface(1,1) == 1
assert surface(10,20) == 200
Dessins avec le module Turtle
Premiers dessins 2D avec turtle
Dans cet exercice, nous proposons de dessiner avec quelques outils du module turtle.
Module graphique Turtle
Avant toute utilisation et comme tout autre module, il faut d’abord l’importer avec la déclaration
suivante :
import turtle
On peut par exemple écrire ensuite turtle.home(), etc.
Le module turtle utilise l’algorithme du peintre pour peindre : toute nouvelle couche de dessin
couvre les anciennes.
Par défaut, les angles sont en degrés avec le sens trigonométrique (sens inverse d’une horloge) et
l’origine (0, 0) est placée au centre de la fenêtre d’affichage.
Au début, la pointe du crayon (présentée par la tête d’une flèche de couleur noire par défaut)
est placée à l’origine et orientée à 0 degré.
Opérations du module Turtle
Voici une sélection de quelques fonctions choisies du module turtle (turtle methods en anglais).
— turtle.home : -> NoneType
turtle.home() permet de déplacer la pointe du crayon à l’origine (0, 0) et réoriente le crayon à
0 degré.
Attention : si le crayon est baissé, home() dessine un trait partant du point courant si ce
dernier n’est pas à (0, 0) vers le point (0, 0).
— turtle.pos : -> tup[Number, Number]
turtle.pos() rend le couple correspondant à la position du point courant.
— turtle.up : -> NoneType
5
turtle.up() soulève le crayon.
— turtle.down : -> NoneType
turtle.down() baisse le crayon.
— turtle.goto : Number * Number -> NoneType
Sans changer l’orientation (angle) de la tête du crayon, turtle.goto(x, y) dépose un chemin
ou contour (path ou shape en anglais) droit entre la dernière position courante et la position
(x, y). Cette dernière devient la nouvelle position courante.
Si le crayon est baissé, le chemin sera déposé et dessiné avec la couleur courante du crayon.
— turtle.circle : Number * Number -> NoneType
turtle.circle(r, a) dépose (et dessine si la tête du crayon est baissé) un chemin correspondant
à un arc de cercle de rayon r et d’un angle a donné. L’arc commence au point courant et le centre
de l’arc de cercle se situe à gauche de la tête du crayon, perpendiculairement à sa direction et
d’une distance r.
— turtle.circle : Number -> NoneType
turtle.circle(r) dépose (et dessine si la tête du crayon est baissé) un chemin correspondant
à un cercle de rayon r et d’un angle de 360°. Comme précédemment, l’arc commence au point
courant et le centre de l’arc de cercle se situe à gauche de la tête du crayon, perpendiculairement
à sa direction et d’une distance r
Si on veut par exemple dessiner un cercle de rayon 200 ayant comme centre l’origine (0,0), on
pourra écrire :
turtle.up()
turtle.home()
turtle.goto(0, -200)
turtle.down()
turtle.circle(200)
#
#
#
#
#
on soulève le crayon pour ne pas dessiner le rayon
comme au début : origine = (0,0) et tête pointée vers la droite
on se déplace vers (0, -200)
on baisse le crayon pour dessiner
on dépose (et dessine si le crayon est baissé) le cercle
— turtle.begin_fill : -> NoneType
turtle.begin_fill() doit être appelée avant de commencer et déposer les chemins (contigus)
de remplissage qui commencent à partir du point courant.
— turtle.end_fill : -> NoneType
Avec la couleur courante du pinceau, turtle.end_fill() peint l’intérieur fermé des chemins
commencés après turtle.begin_fill(). Si les chemins ne sont pas fermés (c’est-à-dire le point
de départ ne correspond pas à la fin des chemins, un chemin droit est ajouté implicitement pour
relier ces deux bouts.
Dans le programme ci-dessous le chemin est implicitement fermé entre l’origine (0,0) et le bout
final de l’arc de 180°. On verra donc un demi-disque droit peint.
turtle.up()
turtle.home()
turtle.goto(0, -200)
turtle.begin_fill()
# on soulève le crayon pour ne pas dessiner le rayon
# (0,0) et tête vers la droite
# on se déplace vers (0, -200)
6
turtle.circle(200, 180) # on dépose (et dessine si le crayon est baissé)
# le demi-cercle droit de 180°
turtle.end_fill()
— turtle.clear : -> NoneType
turtle.clear() efface tous les dessins sans changer entre autre le point courant et l’orientation
courante du crayon.
— turtle.reset : -> NoneType
turtle.reset() efface tous les dessins et remet le crayon comme au début.
Un premier exemple
À titre d’exemple, si nous voulons écrire une fonction qui dessine un segment de droite entre les
points de coordonnées (x1 , y1 ) et (x2 , y2 ), nous pourrions définir la fonction segment suivante :
import turtle
def dessiner_segment (x1, y1, x2, y2) :
"""
Number ^ 4 -> NoneType
dessine le segment de droite entre les points (x1,y1) et (x2,y2)
"""
turtle.up()
# on
turtle.goto(x1, y1) # on
turtle.down()
# on
turtle.goto(x2, y2) # on
lève le crayon
se déplace jusqu'au point (x1,y1)
baisse le crayon
se déplace jusqu'au point (x2,y2)
Question 1
Écrivez cette fonction dans votre fenêtre d’édition et testez-la pour dessiner le segment de droite
défini par les points (0, 0) et (100, 200).
dessiner_segment(0, 0, 100, 200)
Question 2
Ouvrez une nouvelle fenêtre d’édition et écrivez la fonction dessiner_carre(x,y,c) qui permet
de dessiner un carré dont le point bas-gauche est à (x,y) et dont le côté est c.
7
Question 2
Ecrivez la fonction image_1(x,y,c) qui permet de dessiner l’image 1 ci-dessous dont le point
bas-gauche du carré est aux coordonnées (x,y) et son côté c.
De même, écrivez les fonctions image_2(x,y,c), image_3(x,y,c), . . . et image_9(x,y,c) qui
permettent de dessiner les images 2, 3, . . . et 9.
Testez chaque fonction avec les coordonnées et les côtés de votre choix (judicieux).
Figure 1 – Images à réaliser en Turtle
8
Téléchargement