Python : Devoirs pour le 19 Octobre.
Transcription
Python : Devoirs pour le 19 Octobre.
Python : Devoirs pour le 19 Octobre. N’hésiter surtout pas à m’envoyer des questions par mail si vous êtes bloqués. Les Tris : – Coder l’algorithme de tri lent : Tri par insertion. – Coder l’algorithme de tri fusion (Diviser pour régner). Vous pouvez aussi coder le tri rapide : La méthode consiste à placer un élément du tableau (appelé pivot) à sa place définitive, en permutant tous les éléments de telle sorte que tous ceux qui lui sont inférieurs soient à sa gauche et que tous ceux qui lui sont supérieurs soient à sa droite. Cette opération s’appelle le partitionnement. Pour chacun des sous-tableaux, on définit un nouveau pivot et on répète l’opération de partitionnement. Ce processus est répété récursivement, jusqu’à ce que l’ensemble des éléments soit trié. (source Wikipedia) Diviser pour régner : Le sous tableau (liste) de somme maximale Imaginez que vous pouvez voir dans la futur. Vous voulez utiliser ce pouvoir pour gagner de l’argent. Et un maximum d’argent. Pour cela vous consultez les cours de la bourse et vous vous posez la question. Sur une période donnée à quel moment dois-je investir et à quel moment dois-je tirer mes bénéfices ? Imaginons que l’on vous présente le cours d’une action de la bourse pour les n prochains jours sous la forme d’un tableau où chaque élément du tableau donne jour après jour le la hausse ou la baisse de l’action. Par exemple, [1, −5, 7] vous dit que l’action est montée de 1 euro le premier jour puis a baissé de 5 le second et est remontée de 7 le troisième. La question du meilleur investissement revient donc à trouver dans un tel tableau le sous tableau (d’un seul tenant) de somme maximale. On considère ici des tableaux dont les éléments peuvent être des nombres négatifs (Sinon on somme tout). Et d’ailleurs si il n’y a que des nombres négatifs on n’investit pas et la solution est une liste vide. L’approche gloutonne (naı̈ve) est d’énumérer tous les sous tableau possibles. Pas besoin de le coder. L’approche diviser pour régner : On découpe le tableau en deux. On cherche le sous tableau de somme maximale sur ces deux sous tableaux (appels récursifs). Et puis on combine les deux. Le véritable plus gros sous tableau étant soit celui de gauche, soit celui de droite soit un qui est à cheval (réfléchissez à sa forme... avec la connaissance de celui de gauche et de celui de droite, cette recherche peut se faire en temps linéaire). Pour finir la solution optimale est autre, et elle est de complexité linéaire ! (n log(n) pour D&C). Imaginons qu’à chaque étape nous connaissons le meilleur sous tableau dans le tableau [0 : i], comment déterminer le meilleur sous tableau dans le tableau [0 : i + 1] en 1 temps fini ? Casse Brique : Finir le casse-brique commencé en cours. On peut s’aider de l’exemple de balle qui rebondit du Swinnen p.88. Un casse brique c’est ca : lien Vous pourrez faire déplacer, par exemple, la raquette avec les flèches gauches et droites du clavier. Leurs noms de code c’est “<Left>” et “<Right>” et mieux vaut les lier (bind ) à la fenêtre principale. Pour tester la collision de la balle avec les briques ou la raquette on peut utiliser la fonction find overlapping de la classe Canvas (ex : can.find overlaping(x1,x2,x2,y2)) qui retourne un tuple (une sorte de liste) d’élement du canevas qui chevauchent le rectangle (x1,x2,x2,y2). on peut alors tester raquette in can.find overlaping(x1,x2,x2,y2) avec (x1,x2,x2,y2) le rectangle qui entoure la balle. Mais on peut tout aussi bien se passer de cette astuce et écrire soit meme la serie de tests à vérifier pour détecter les collisions. Exercice facile : Compteur Ecrire un programme counter qui affiche une fenêtre graphique permettant à l’utilisateur de contrôler un compteur numérique dans un intervalle [-1000, 1000] par une série de sept boutons de commande. Les trois boutons ”| <”, ”0” et ”> |” permettent d’aller directement à la valeur minimale, la valeur nulle ou la valeur maximale du compteur. Les quatre boutons ”<<”, ”<”, ”>” et ”>>” permettent de modifier la valeur courante du compteur par pas de −10, −1, 1 et 10. A tout moment, il faut vérifier que la valeur du compteur se trouve bien dans l’intervalle autorisé. Un résultat graphique possible est représenté dans l’image ci-dessous. Figure 1 – Le compteur 2 Exercice difficile : Memo Écrire un programme Memo qui affiche une fenêtre graphique permettant à l’utilisateur de jouer au jeu classique de la séquence à répéter. L’objectif pour le joueur est de mémoriser et reproduire une séquence ordonnée de cases d’un damier. A chaque tour de jeu, le programme visualise les cases sélectionnées dans l’ordre de la séquence, en modifiant leur icône durant un temps limité. Le joueur doit ensuite cliquer sur ces cases dans le même ordre. En cas de succès, le programme allonge la séquence en y ajoutant une case aléatoire, et le processus continue tant que le joueur reproduit la séquence sans erreur. Le résultat graphique souhaité est représenté dans l’image ci-dessous. On peut avoir des boutons avec des images (icônes) en écrivant : but = Button( fen , image=smile , command= badaboum ) Où smile est une variable contenant une image en gif (utilisez PhotoImage pour importer une image) Pour modifier l’image d’un bouton, on peut directement utiliser : but[’image’]=smile2 enfin il sera sûrement nécessaire de pouvoir mettre des paramètres aux fonctions liées aux boutons : but = Button( fen , . . . , command= badaboum(a,b) ) est interdit. On peut le remplacer par : but = Button( fen , . . . , command= lambda a=2,b=3 : badaboum(a,b) ), si on veut lancer badaboum(2,3) ou but = Button( fen ,. . ., command= lambda a=i,b=j : badaboum(a,b) ), si on veut lancer badaboum(i,j). Pour cet exercice je vous ai mis 2 images de smiley en gif sur le site (mais vous pouvez utiliser les votres) Attention : – Commentez bien votre code. – Incorporer une chaı̂ne explicative dans toutes vos définitions de fonctions comme expliqué p.60-61 du Swinnen. – Utilisez des noms de variables explicites. – Respectez les conventions d’écriture des variables et des fonctions c’est à dire : la première lettre est une minuscule et on utilise les majuscules pour différencier deux mots. Exemples : monTriangle, affichageListe... 3 Figure 2 – Suggestion de présentation pour le Memo 4