13.04.2015 Views

Tutoriels Initiation à la Programmation ENSAE ... - xavierdupre.fr

Tutoriels Initiation à la Programmation ENSAE ... - xavierdupre.fr

Tutoriels Initiation à la Programmation ENSAE ... - xavierdupre.fr

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!