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