Tutoriels Initiation à la Programmation ENSAE ... - xavierdupre.fr
Tutoriels Initiation à la Programmation ENSAE ... - xavierdupre.fr
Tutoriels Initiation à la Programmation ENSAE ... - xavierdupre.fr
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Tutoriels</strong><br />
<strong>Initiation</strong> à <strong>la</strong> <strong>Programmation</strong><br />
<strong>ENSAE</strong><br />
Xavier Dupré
Table des matières<br />
1. Commencer à programmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
1.1 Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Chapitre 1<br />
Commencer à programmer<br />
1.1 Liste<br />
Ce tutoriel propose des exercices simples pour débuter <strong>la</strong> programmation. Les premières questions ont pour<br />
but de personnaliser l’énoncé pour chaque élève afin que chacun travaille sur des données différentes. La<br />
suite de l’énoncé est identique mais il faudra répondre avec le jeu de données que les premières questions<br />
vous attribueront. Ce tutoriel se propose de manipuler des listes de différentes manières.<br />
Personnalisation des données .<br />
1) Dans l’exemple qui suit, <strong>la</strong> première ligne permet d’ajouter des accents dans le programme. Autrement,<br />
le moindre accent provoque une erreur. Tous les <strong>la</strong>ngages de programmation manipulent les caractères<br />
comme s’ils étaient des nombres. Ainsi, si on crée <strong>la</strong> chaîne de caractères suivante :<br />
# coding : <strong>la</strong>tin-1<br />
nom_prenom = "Xavier Dupré"<br />
On peut récupérer <strong>la</strong> valeur numérique du caractère à <strong>la</strong> position i on écrivant :<br />
i = 3 # i=3 mais on fait référence au 4ème caractère<br />
valeur = ord ( nom_prenom [i] )<br />
En remp<strong>la</strong>çant le nom cité en exemple par votre prénom suivi de votre nom, quel résultat ce<strong>la</strong> vous<br />
donne-t-il ? (0,5 point)<br />
2) La fonction len retourne le nombre d’éléments d’un tableau ou <strong>la</strong> longueur d’une chaîne de caractères<br />
par exemple. En utilisant une boucle for 1 , écrire un mini-programme qui calcule <strong>la</strong> somme des valeurs<br />
des caractères de <strong>la</strong> chaîne de caractères utilisée à <strong>la</strong> question précédente. (1 point)<br />
3) Transformer le mini-programme précédent pour en faire une fonction qui retourne un entier : (1 point)<br />
def somme_caractere (nom_prenom) :<br />
...<br />
return ...<br />
On suppose que <strong>la</strong> variable s contient le résultat de <strong>la</strong> fonction précédente appliquée à votre nom prénom,<br />
les lignes suivantes vous donneront accès aux données à insérer dans votre programme pour <strong>la</strong> suite du<br />
tutoriel :<br />
s = somme_caractere ("Xavier Dupre") % 200<br />
url = "http://www.<strong>xavierdupre</strong>.<strong>fr</strong>/enseignement/tutoriels_data/tutoriel_%d.py" % s<br />
print url<br />
1. On pourra aussi utiliser les fonctions len, range ou xrange.
1. Commencer à programmer 4<br />
On commence maintenant un nouveau programme en <strong>la</strong>issant celui-ci de côté. Le fichier téléchargé sera<br />
copié à côté de ce nouveau programme. En supposant que 99 soit le nombre sur lequel vous soyez tombé,<br />
le nouveau programme commencera par <strong>la</strong> ligne :<br />
<strong>fr</strong>om tutoriel_99.py import *<br />
Cette ligne permettra d’inclure les données utilisées.<br />
4) La fonction sort permet de trier une liste en utilisant le tri quicksort. Elle peut trier tout type d’élément<br />
à condition qu’on puisse les ordonner. C’est le cas de tuple par exemple :<br />
(1, 2) > (0,9)<br />
(1, 2) > (1,1)<br />
(1, 2) == (1, 2)<br />
(1, 2) < (2, 0)<br />
Le premier élément est d’abord utilisé pour <strong>la</strong> comparaison et s’il ne permet pas de conclure, on utilise le<br />
second. On récupère le tableau tri obtenu à <strong>la</strong> question précédente (c’est-à-dire celui inclus dans le fichier<br />
tutoriel_%d.py qui a été téléchargé) pour construire <strong>la</strong> liste de tuple suivante :<br />
[ 4.6,<br />
6.4,<br />
4.3,<br />
7.8 ]<br />
[ (4.6, 1),<br />
(6.4, 2),<br />
(4.3, 3),<br />
(7.8, 4) ]<br />
La seconde colonne contient <strong>la</strong> position de chaque élément. Ecrire une fonction qui construit cette "matrice"<br />
à deux colonnes où <strong>la</strong> seconde contient <strong>la</strong> position de l’élément dans le tableau initial.<br />
def ajoute_position (tableau) :<br />
...<br />
return matrice<br />
5) Que se passe-t-il si on applique <strong>la</strong> fonction sort à <strong>la</strong> matrice précédemment construite. On nomme cette<br />
matrice mat. A quoi correspondent mat[i][0] et mat[i][1] ?<br />
6) Le tableau attribut contient une couleur associée à chaque élément du tableau tri avant qu’il ne soit<br />
trié. A quoi correspond attribut[mat[i][1]] ?<br />
7) Comment utiliser cette information pour réarranger le tableau attribut de sorte que chaque élément<br />
retrouve sa couleur. Si un élément est en position i après tri, l’élément attribut[i] doit correspondre à sa<br />
couleur initiale. Exemple :<br />
Avant tri<br />
[ 4.6, [ "rouge",<br />
6.4, "bleu",<br />
4.3, "rouge",<br />
7.8 ] "bleu" ]<br />
Après tri<br />
[ 4.3, [ "rouge",<br />
4.6, "rouge",<br />
6.4, "bleu",<br />
7.8 ] "bleu" ]<br />
Ecrire une fonction qui crée un nouveau tableau attibut à partir du tableau attribut initial et de <strong>la</strong><br />
matrice mat.<br />
def rearrange_attribut (attribut, mat) :<br />
...<br />
return nouveau_attribut
1. Commencer à programmer 5<br />
8) La seconde colonne de <strong>la</strong> matrice mat peut être comprise comme une permutation. On construit <strong>la</strong> liste<br />
suivante :<br />
permutation = [ m[1] for m in mat ]<br />
nouveau = [ -1 for i in permutation ]<br />
for i in xrange (0, len (permutation)) :<br />
nouveau [ permutation [i] ] = i<br />
Reste-t-il des valeurs −1 dans le tableau nouveau ? A quoi correspond-il ? On pourra par exemple se<br />
demander ce que vaut permutation[nouveau[i]] ou nouveau[permutation[i]] pour chaque i ?<br />
9) On souhaite ajouter un élément au tableau initial. Dans le tableau initial, il aurait été rangé à <strong>la</strong> dernière<br />
position (à savoir 150). Il sera en dixième position dans le tableau trié. Comment modifier les tableaux<br />
permutation et nouveau pour en tenir compte (sans trier à nouveau) ?<br />
10) Quel est l’élément qui occupe <strong>la</strong> position 20 ?<br />
11) On dispose d’une matrice M symétrique. On calcule ses valeurs propres et ses vecteurs propres comme<br />
suit à l’aide du module numpy :<br />
import numpy<br />
# import du module numpy<br />
mat = numpy.array (pmat) # on transforme une liste en liste en matrice format numpy<br />
l, v = numpy.linalg.eig(mat) # calcul des valeurs propres et vecteurs propres<br />
pl = list (l) # on tranforme un vecteur numpy en liste<br />
pv = list (v) # on tranforme une matrice numpy en liste<br />
A partir des astuces suggérées lors des questions précédentes, proposer une méthode pour ordonner les<br />
vecteurs propres de <strong>la</strong> matrice pv selon les valeurs propres pl.<br />
12) La seconde application de ce genre d’astuce est <strong>la</strong> création d’une permutation aléatoire. Le <strong>la</strong>ngage<br />
Python dispose d’une fonction randint incluse dans le module random qui retourne un nombre entier<br />
aléatoire. En utilisant cette fonction ainsi que <strong>la</strong> fonction sort, proposer un moyen de créer une permutation<br />
aléatoire de <strong>la</strong> liste :<br />
l = range (1, 100) # soit <strong>la</strong> liste [ 1, 2, 3, ..., 99 ]<br />
13) Quel est le coût (ou nombre de comparaisons) du tri le plus rapide ? En déduire le coût de cette<br />
permutation aléatoire.<br />
14) Un concepteur de jeux vidéos souhaite, pour un jeu, construire des parties aléatoires de basket-ball.<br />
Pour ce faire, il décide au départ du nombre de paniers, à 1 point, 2 points, 3 points qu’il y aura pour<br />
chaque équipe. Il reste à les répartir de façon aléatoire pour rendre cette fausse partie crédible. Voici <strong>la</strong><br />
liste des paniers présentée de façon ordonnée :<br />
l = [ -3, -3, -3, -3, +3, +3, +3, +3, -2, ... ]<br />
Il faut tirer des milliers de parties et ce<strong>la</strong> prend du temps. Il devient préférable de générer les parties<br />
aléatoires autrement. Il utilise un dictionnaire :<br />
d = { -3:4, +3:4, -2:10, +2:15, ... }<br />
Il choisit le premier élément c au hasard dans <strong>la</strong> liste [−3, +3, −2, +2, −1, +1] puis diminue le nombre<br />
de paniers associé à c. Pour le second élément, il recommence en s’assurant que le compteur associé à<br />
l’élément c est positif.
1. Commencer à programmer 6<br />
Pourquoi cette façon de faire est-elle plus rapide ?<br />
15) Dans une partie, il y a moins de paniers à trois points par rapport aux autres types de paniers et<br />
dans les parties générées par le concepteur de jeux vidéos avec sa nouvelle méthode, il n’y en a quasiment<br />
jamais à <strong>la</strong> fin des parties aléatoires. Pourquoi ?<br />
16) Que proposeriez-vous pour corriger ce défault tout en étant aussi rapide (en terme de nombres de<br />
comparaisons) ? Implémentez-le.<br />
17) Proposez un moyen de vérifier que les parties aléatoires sont correctement tirées. Appliquez-le à votre<br />
solution.
Table des matières<br />
1. Commencer à programmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
1.1 Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3