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