TDs - Nicolas Bourgeois

Transcription

TDs - Nicolas Bourgeois
Feuilles de TD Informatique MIASHS L2S3
Nicolas Bourgeois
— les exercices sont à rédiger dans des fichiers au nom explicite (par exemple
LouiseMichelTD1Exo1.py s’il s’agit d’un script et JulesVallesTD3Exo2.txt
s’il ne s’agit pas de programmation).
— seuls les exercices de la première section de chaque séance peuvent (en
plus de questions de cours) donner lieu à évaluation, aussi bien en contrôle
continu que pour le partiel.
— les problèmes constituent en revanche la partie la plus intéressante de ce
cours. Bien qu’ils ne soient pas évalués, il est fortement recommandé aux
élèves souhaitant apprendre à programmer de les travailler tous.
1
1.1
Séance 1 - Introduction au langage
Rappels de syntaxe
En python 3, on utilise la fonction print() pour l’affichage console et input()
pour poser une question. type() permet d’obtenir le type d’une variable et eval()
de transtyper une chaîne en nombre. La division euclidienne s’effectue avec
"//" et le modulo avec "%". La fonction max() renvoie le maximum d’un uple
d’entiers mais n’a pas le comportement attendu pour des caractères.
1.2
Exercices notés
Exercice 1 Affichez les nombres de 1 à 40.
Exercice 2 Affichez les nombres de 1 à 40 divisibles par 3 ou 5.
Exercice 3 Demandez la saisie d’un nombre. Testez si ce nombre est premier
(c’est-à-dire n’ayant d’autre diviseur que 1 et lui-même).
Exercice 4 Affichez les nombres premiers de 1 à 40.
Exercice 5 Demandez la saisie de deux mots. Si ce sont des nombres, affichez
leur maximum ; sinon le premier dans l’ordre lexicographique.
1.3
Exercices libres
Problème 1 (Exponentiation rapide)
a) implémentez une méthode naïve permettant de calculer 1.0574145 en utilisant 144 multiplications.
b) décomposez 145 en une somme de puissances de 2.
c) utilisez la décomposition binaire vue ci-dessus pour calculer 1.0574145 en
utilisant seulement 9 multiplications.
1
d) généralisez au calcul de ab . Indice : on pourra commencer par calculer un
i
tableau des a2 pour i < log2 (b)
Problème 2 (Ensembles)
a) Considérons un ensemble à X éléments, par exemple toutes les lettres
de l’alphabet. Proposez une façon de coder chaque sous-ensemble en utilisant
simplement un entier. Par exemple {A, F, G} pourra être codé par 20 +25 +26 =
97.
b) Prouvez que ce codage est bien bijectif (exactement un entier par ensemble)
et écrivez un programme qui demande un entier et affiche les lettres associées.
c) Proposez des programmes permettant de calculer l’union, l’intersection, la
différence symétrique de deux sous-ensembles.
2
2.1
Séance 2 - Fonctions et listes
Rappels de syntaxe
Une fonction est déclarée par l’instruction def et son retour par return(). Les
listes peuvent être définies par une fonction en utilisant une boucle for. len()
permet de connaître la taille et enumerate() d’itérer les éléments.
2.2
Exercices notés
Exercice 6 Créez une fonction factorielle(n) sans utiliser la librairie math.
Exercice 7 Utilisez votrefonction factorielle pour créer une fonction combin!
.
naison(n,p) qui renvoie np = p!(n−p)!
Exercice 8 Créez la liste des valeurs de la fonction 2n pour n variant de 0 à
40.
Exercice 9 Créez la matrice des valeurs de la fonction combinaison(n,p) pour
n variant de 0 à 40 et p variant de 0 à n.
Exercice 10 Créez (à la main, sans utiliser max) une fonction maximum(l)
qui renvoie le maximum d’une liste d’entiers. Utilisez-là pour trier une liste.
2.3
Exercices libres
Problème 3 a) créez une fonction fib(n) qui renvoie le n-ieme terme de la
suite de Fibonacci définie par la récurrence fib(0)=fib(1)=1 et ∀n fib(n+2) =
fib(n+1) + fib(n).
b) à l’aide des fonctions fib(n) et combinaison(n,p),vérifiez que pour les entiers
de 0 à 40, dans le triangle de Pascal, les trois
suivantes sont vraies :
P affirmations
— la somme des nombres d’une ligne 0≤i≤n ni vaut 2n .
P
— la somme partielle des premiers nombres d’une colonne i≤j≤n ji vaut
n+1
i+1 .
P
— la somme des nombres d’une diagonale 0≤i≤n/2 n−i
est égale au ni
ième terme de la suite de Fibonacci.
2
1
1
1
1
1
1
1
1
2
3
4
5
6
1
3
6
10
15
φ6 = 13
1
4 1
10 5 1
20 15 6 1
Figure 1 – Triangle de Pascal et nombres de Fibonacci
Problème 4 (Sac à dos)
Prenez en entrée une liste de 20 items définis par un couple (poids,valeur),
par exemple stock = ((2, 5), (3, 7), (8, 4), . . .).
a) calculez le poids total de l’ensemble des items W.
Supposons que nous avons un sac à dos de capacité W/2 que nous voulons
remplir avec des items de valeur la plus grande possible. Maintenant nous allons
implémenter une méthode qui renvoie une sous-liste x de stock dont le poids est
inférieur à W/2 mais tel qu’il n’est plus possible de rajouter un autre item sans
que le poids ne dépasse W/2. Une telle liste est dite maximale.
b) proposez une fonction (naïve) qui construit x en ajoutant les éléments
dans l’ordre de la liste tant que c’est possible.
c) proposez une fonction (gloutonne) qui construit x en ajoutant les éléments
par ordre décroissant de valeur tant que c’est possible.
d) proposez une fonction (exhaustive) qui construit toutes les sous-listes
maximales possibles et renvoie celle dont la valeur totale est la plus grande.
e) comparez les valeurs totales des sous-listes construites en b, c et d.
f ) réfléchissez à une méthode qui permette d’obtenir la sous-liste maximale
de plus grande valeur totale sans avoir à explorer toutes les possibilités.
3
Séance 3 - Rappels
Reprise d’exercices et de problèmes des séances 1 et 2
4
4.1
Séance 4 - Analyse d’algorithmes
Rappels de cours
Pour mesurer des temps de calcul effectifs on peut utiliser time (ou préférentiellement perf_counter si la version de python est récente) de la librairie
time.
Sauf précision opposée, c’est la complexité asymptotique au pire des cas qui
est demandée, pas le temps expérimental.
On utilise la notation O() pour signifier un comportement asymptotique.
O(n4 ) signifie que la complexité de l’algorithme peut être majorée par une
constante multipliée par n4 .
3
4.2
Exercices notés
Exercice 11 Calculez la complexité d’une multiplication matricielle.
Exercice 12 Calculez la complexité de l’algorithme de tri que vous avez réalisé
lors du TD2.
Exercice 13 Calculez la complexité respective de l’exponentiation naïve et de
l’exponentiation rapide définies dans le premier problème du TD1.
Exercice 14 Réalisez un algorithme qui à partir d’une liste d’entiers de somme
N détermine s’il existe une sous-liste de somme N/2. Donnez sa complexité.
Exercice 15 Utlisez un timer pour comparer le temps d’exécution pratique des
algorithmes mentionnés dans les 4 exos précédents sur une instance de taille
200.
4.3
Exercices libres
2
3
1
4
Figure 2 – Le graphe ((1,2),(2,3),(3,4),(1,4))
Problème 5 (Graphes et connexité)
On modélise un graphe par une liste de couples qui forment ses arêtes (non
orientées). Par exemple g1 = ((1, 2), (2, 3), (3, 4), (1, 4)) représente un carré
de sommets 1,2,3 et 4. On appelle chemin entre deux sommets un ensemble
d’arêtes incidentes (c’est-à-dire consécutives) qui les relient. Par exemple, dans
g1, ((1, 2), (2, 3)) est un chemin entre 1 et 3. On peut aussi représenter ce même
chemin en donnant la liste des sommets consécutifs au lieu des arêtes - ici
(1, 2, 3) - c’est équivalent. Notre but est de déterminer si un graphe est connexe
ou s’il est composé de plusieurs composantes distinctes.
a) proposez une fonction voisins(u,g) qui renvoie la liste des voisins d’un
sommet u dans un graphe g. Donnez sa complexité.
b) proposez une fonction voisinsliste(l,g) qui à partir d’une liste (sans doublon) de sommets l renvoie la liste (sans doublon) contenant les sommets qui
sont, soit dans l, soit voisins d’au moins un sommet de l. Donnez sa complexité.
c) proposez un algorithme utilisant voisinsliste(l,g) et permettant de déterminer si un graphe est connexe.
d) réfléchissez à une méthode plus rapide pour déterminer si un graphe est
connexe.
Problème 6 (Chemin hamiltonien)
Dans un graphe, un chemin hamiltonien est un chemin qui passe une et une
seule fois par tous les points d’un graphe. Autrement dit, c’est une permutation
4
2
3
1
4
5
2
3
1
4
5
Figure 3 – Un graphe hamiltonien et un graphe non hamiltonien
de l’ensemble des sommets. Notre but est de déterminer si un graphe contient
un chemin hamiltonien.
a) Les graphes ((1, 2), (2, 3), (2, 4), (3, 5)) et ((1, 2), (2, 3), (2, 4), (3, 5), (4, 5))
contiennent-ils des chemins hamiltoniens ?
b) proposez une fonction valide(l,g) qui vérifie que la liste de sommets l
constitue bien un chemin valide dans g. Par exemple (1, 5, 4) est un chemin
valide dans g2 = ((1, 5), (2, 3), (4, 5)).
c) proposez une fonction permutations(n) qui génère sous forme de listes
toutes les permutations de n sommets.
d) à partir de permutations(n) et valide(l,g), proposez un algorithme qui
teste s’il existe un chemin hamiltonien dans un graphe g de taille n. Quelle est
sa complexité ?
e) [difficile] On remarque qu’il existe un chemin hamiltonien dans un graphe
g de taille n terminant par un sommet donné u si et seulement si il existe un
chemin hamiltonien dans le graphe g privé de u terminant par v et une arrête
(v,u) dans g. Réfléchissez à utiliser cette récurrence pour trouver un algorithme
de complexité 3n .
5
5.1
Séance 5 - Structures de données
Rappels de syntaxe
Sur une liste, on peut utiliser append() ou insert() pour ajouter des éléments.
split() permet de séparer dans une liste des parties d’une chaîne et join() de
rejoindre dans une chaîne les éléments d’une liste, à chaque fois en précisant un
séparateur.
Les éléments des dictionnaires peuvent être ajoutés directement en associant
une valeur à une clef, et supprimés avec la fonction del(). Les sets ont une
méthode add() et une méthode remove().
5.2
Exercices notés
Exercice 16 Proposez une fonction lettres(s) qui renvoie la liste des lettres
d’une chaîne de caractères s.
Exercice 17 Proposez une fonction phrase(l) qui à partir d’une liste l de mots
renvoie une unique chaîne de caractères concaténant ces mots séparés par des
espaces.
Exercice 18 Proposez une fonction comptage(l) qui à partir d’une liste de mots
renvoie un dictionnaire associant chaque mot à son nombre de lettres.
5
Exercice 19 Proposez une fonction successeurs(l) qui à partir d’un graphe
donné sous forme d’une liste d’arêtes l renvoie un graphe donné sous la forme
d’un dictionnaire associant à chaque sommet la liste de ses voisins.
Exercice 20 Soient un graphe g1 donné sous forme de liste d’arêtes et un
graphe g2 donné sous forme de dictionnaire de successeurs. Dans chacun des
cas proposez une fonction permettant de vérifier si un sommet fait partie d’un
triangle.
5.3
Exercices libres
1
2
4
3
5
6
Figure 4 – Un arbre binaire
Problème 7 (Arbres binaires)
Un arbre est un graphe sans cycle. On peut aussi se le représenter de la façon
suivante : un nœud initial, appelé racine, ayant des enfants, eux même ayant
des enfants, jusqu’aux sommets terminaux appelés feuilles. On peut donc définir
des lignes (ou niveaux de profondeur) : la racine est la ligne 0, ses enfants la
ligne 1, etc.
Un arbre binaire est un arbre tel que tout sommet sauf les feuilles ait exactement deux enfants.
a) Combien y a-t-il de sommets au maximum par ligne dans un arbre binaire ? Prouvez qu’il est toujours possible d’attribuer le numéro 2i + (j − 1) au
j-eme sommet de la i-eme ligne.
b) Écrivez un exemple d’arbre binaire d’une dizaine de sommets sous forme
de dictionnaire de successeurs. Quelle relation mathématique relie nécessairement le numéro d’un sommet à celui de ses enfants ?
c) Déduisez des questions précédentes une façon de représenter un arbre
binaire sous forme d’une simple liste de 0 et de 1.
d) Proposez deux méthodes descendants(u) permettant de calculer le nombre
de sommets dans le sous-arbre de racine u, la première en donnant l’arbre initial
sous forme de dictionnaire, la seconde en utilisant la représentation proposée en
c). Comparez leur complexité.
6
Séance 6 - Interro
Examen de contrôle continu, à la charge du/de la chargé-e de TD.
6
7
7.1
Séance 7 - Expressions régulières
Rappels de syntaxe
La bibliothèque des expressions rationnelles est re. On y trouve en particulier search/findall (trouver un/tous les motifs) et sub (extraire et remplacer un
motif).
Quelques expressions rationnelles :
n’importe quel caractère
.
[A-F] une lettre comprise entre A et F
[ˆ4]
tout sauf un 4
\s
un caractère blanc (espace, tabulation)
*
répété plusieurs fois
répété 0 ou 1 fois
?
{2,7} répété entre 2 et 7 fois
début / fin de ligne
ˆ/$
()
groupe
7.2
Exercices notés
Exercice 21 En utilisant un affichage formaté, proposez un programme qui
affiche l’heure (mise à jour) au format "Il est X heures Y minutes Z secondes
" cent fois de suite, où X,Y sont des entiers et Z un décimal à 2 chiffres après
la virgule.
Exercice 22 Proposez une fonction hascap(s) qui renvoie tous les mots de la
chaîne s contenant une majuscule.
Exercice 23 Proposez une fonction inflation(s) qui dans la chaîne s double la
valeur de tous les nombres. Par exemple "Le prix est de 27 euros" devient "Le
prix est de 54 euros".
Exercice 24 Proposez une fonction lines(s) qui à partir d’une longue chaîne s
(>100 caractères) renvoie un tableau de chaînes de caractères contenant chacune
24 caractères maximum et terminant par un espace (la chaîne initiale doit rester
la concaténation exacte de toutes chaînes tu tableau : ne rajoutez pas d’espace
artificiel !). Affichez ces chaînes ligne par ligne.
Exercice 25 Proposez une fonction qui trie les éléments d’une liste de caractères et une autre qui trie les éléments d’une chaîne. Comparez leur temps d’exécution.
7.3
Exercices libres
Problème 8 (Fouille de données)
Dans cet exercice on appelle balise tout bloc de caractères compris entre les
caractères < et >.
a) Proposez une fonction balises2dico(t) qui renvoie un dictionnaire des balises issues d’une chaîne de caractères t, indexées par le numéro du caractère les
précédant dans la chaîne expurgée des balises. Par exemple balises2dico("Bonjour
chers <strong>camarades</strong> et amis") renvoie (13 => "<strong>",22
=> "</strong>).
7
b) Proposez une fonction translate(t) qui supprime les balises d’un texte mais,
lorsqu’un bloc de texte est compris entre une balise <h*> et </h*> où l’étoile
est un chiffre (par exemple <h2>), fait passer ce bloc en capitales.
c) Proposez une méthode xml2csv(t) qui prenne un argument un texte avec
des balises xml et renvoie un tableau de données sous format csv avec des titres
de colonnes. Par exemple, le texte :
<individu><taille>173</taille><poids>68</poids></individu>
<individu><taille>186</taille><poids>91</poids></individu>
<individu><taille>159</taille><poids>57</poids></individu>
deviendrait :
taille,poids ;
173,68 ;
186,91 ;
159,57 ;
Problème 9 (Automates)
On appelle automate fini la donnée d’un ensemble d’états et de transitions
conditionnelles entre ces états. On dit qu’un mot est reconnu par un automate
si la suite de transitions définies par les lettres successives du mot amène à un
état final. Ceci est très abstrait, mieux vaut donc regarder un exemple :
non A
e0
A
e1
A
e2
non A
Figure 5 – Automate reconnaissant .*AA.*
Par exemple, l’automate de la figure 5 effectue l’action suivante :
1. je commence à l’état 0.
2. si je lis A je passe à l’état 1 sinon je reste.
3. si je suis à l’état 1 et que je lis encore A je passe à l’état 2 sinon je
retourne à l’état 0.
4. si j’atteins l’état 2 je reste dessus. L’état 2 est l’unique état final.
Cet automate reconnaît n’importe quel mot contenant deux fois consécutives
la lettre A.
a) quels mots permet de détecter l’automate de la figure 6 ?
b) Trouvez l’expression régulière qui permet de détecter exactement tous les
mots sur l’alphabet à 4 lettres {a, b, c, d}contenant le sous-mot "acab".
c) Trouvez l’automate fini (à 5 états) qui permet de détecter exactement tous
les mots sur l’alphabet à 4 lettres {a, b, c, d}contenant le sous-mot "acab".
8
A
e0
A
e1
B
B
e2
B
e3
A
Figure 6 – Exercice (l’alphabet est {A,B})
8
8.1
Séance 8 - Fouille de données
Rappels de syntaxe
On peut ouvrir un fichier avec la fonction open(), en lire le contenu avec la
méthode read(), écrire avec write() et fermer avec close().
Dans la librairie os, la fonction getcwd() récupère le répertoire courant.
8.2
Exercices notés
Exercice 26 Proposez une fonction extraction(adr) qui à partir d’une adresse
adr récupère le contenu d’un fichier dans une chaîne de caractères.
Exercice 27 Proposez une fonction getdots(adr) qui à partir d’un fichier de
coordonnées contenant du texte sous format "(1,3) ;(-2,0) ;(6,-5). . . " remplit une
liste de couples.
Exercice 28 Proposez une fonction plot(adr) qui à partir d’un fichier de coordonnées contenant du texte sous format "(1,3) ;(-2,0) ;(6,-5). . . " trace les points
correspondants.
Exercice 29 Proposez une fonction write(s,adr) qui enregistre le contenu de la
chaine s dans un fichier situé à l’adresse adr
Exercice 30 Proposez une fonction merge(adr1,adr2,adr3) qui crée un fichier
à l’adresse adr3 concaténant le contenu des fichiers d’adresses adr1 et adr2 puis
supprime ces deux fichiers.
8.3
Exercices libres
Problème 10 (Localisation)
a) Créez deux fichiers french.txt et english.txt contenant chacun une dizaine
de mots courants du langage concerné.
b) Proposez une fonction tolist(adr) qui à partir de l’adresse d’un fichier adr
extrait le contenu et le stocke dans une liste de mots.
c) Proposez une fonction score(s,adr) qui détermine le nombre de mots de
la chaine de caractères s présents dans le fichier situé à l’adresse adr.
d) Proposez une fonction loc(adr2) qui détermine le langage le plus probable
d’un texte stocké à l’adresse adr2.
e) Proposez un programme checkspelling(adr2) qui liste les mots d’un texte
stocké à l’adresse adr2 qui n’appartiennent pas au langage reconnu.
9
f ) Proposez un programme suggestions(adr2) qui suggère s’il existe des termes
dans le texte stocké à l’adr2 qui ne diffèrent du dictionnaire du langage reconnu
que par une ou deux lettres.
Problème 11 (Versioning)
a) Proposez une méthode check(adr,s) qui vérifie si le fichier à l’adresse adr
contient la chaîne de caractère s.
b) Proposez une méthode parse(rep,s) qui liste les fichiers d’un répertoire à
l’adresse rep contenant la chaîne de caractère s.
c) Proposez une méthode checkdiff(rep1,rep2) qui renvoie la liste des fichiers
des répertoires rep1 et rep2 qui portent le même nom mais dont le contenu est
différent.
d) Proposez une méthode applychange(repdiff,rep2) qui remplace les fichiers
de rep2 ayant le même nom que ceux de repdiff et laisse inchangés les autres
fichiers de rep2.
e) Proposez une méthode version(rep,reparchive) qui :
— récupère dans le répertoire reparchive le sous-répertoire de numéro le plus
élevé (appelons-le i, auquel cas son adresse est reparchive/i)
— construit la différence entre rep et reparchive/i
— stocke cette différence dans un nouveau répertoire à l’adresse reparchive/i+1.
9
Séance 9 - Rappels
10
Séance 10 - Introduction aux Bases de Données
NB : Cette séance s’effectue intégralement avec un SGBD via une interface
graphique et/ou console, au choix du/de la chargé-e de TD. Les fonctions python
permettant d’interagir avec ces systèmes seront introduites à la séance suivante.
10.1
Rappels de syntaxe
Exemples de commandes SQL :
CREATE TABLE "Pokemon" (
"ID" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"nom" varchar(100) NOT NULL,
"dresseur" varchar(100),
"type" varchar(100),
"age" integer) ;
INSERT INTO Pokemon (ID, nom, dresseur, type, age)
VALUES(”, ’Pikachu’,’Yasmine’, ’Feu’, 5) ;
SELECT * FROM Pokemon
WHERE dresseur=’Julie’
OR age < 15 ;
10
UPDATE Pokemon SET dresseur = ’Julie’
WHERE dresseur =’Yasmine’
AND type=’Glace’ ;
10.2
Exercices notés
Exercice 31 Créez une base de données pokemon contenant deux tables appelées respectivement bestioles et dresseurs. La première possède les champs id,
nom et type. La seconde possède les champs id, nom et age.
Exercice 32 Utilisez des requêtes INSERT pour ajouter une dizaine de lignes
de votre choix dans chacune des tables.
Exercice 33 Utilisez une requête SELECT pour afficher toutes les bestioles de
type ’Feu’.
Exercice 34 Ajoutez dans cette base une table appelée collaboration possédant
les champs id, id_dresseur et id_bestiole. Remplissez-la.
Exercice 35 Utilisez une requête SELECT pour afficher toutes les bestioles
ayant collaboré avec un dresseur d’âge 12 ans ou moins.
10.3
Exercices libres
Problème 12 a) Modélisez puis implémentez une table de données permettant
de lister des salles informatiques, avec leur parc d’ordinateurs et leurs horaires
d’ouverture.
b) Modélisez puis implémentez une table de données permettant de lister des
cours avec des horaires et un nombre d’élèves. Cette table contiendra un champ
salle_attribuee, pour le moment vide.
c) Proposez une requête permettant de trouver la liste des salles dans laquelle
un cours est possible (horaires compatibles et un ordinateur par élève)
d) Proposez une série de requêtes permettant d’attribuer une salle à un cours
(celle qui est compatible mais contient le moins d’ordinateur en trop possible)
et de mettre à jour les disponibilités de la salle en conséquence.
Problème 13 Proposez (et testez) des requêtes ou séries de requêtes permettant
d’effectuer les filtres suivants (les formulations sont similaires mais les solutions
peuvent être très différentes les unes des autres) :
a) toutes les personnes dont le nom contient ACAB,
b) toutes les personnes dont le nom contient ACAB et BAC,
c) toutes les personnes dont le nom contient ACAB puis BAC,
d) toutes les personnes dont le nom contient ACAB mais pas BAC,
e) toutes les personnes dont le nom contient ACAB mais pas BAC ensuite
(il peut cependant apparaître avant).
11
11.1
Séance 11 - Bases de données avec Python
Rappels de syntaxe
La connexion s’effectue avec connect(). Il faut ensuite créer un cursor, et
appeler sur lui des méthode execute() prenant en argument des requêtes.
11
11.2
Exercices notés
Exercice 36 Proposez une fonction connect(adr,login,pwd,base) qui tente de se
connecter à une base de données à partir des identifiants en argument et affiche
TRUE si elle y parvient et FALSE en cas d’échec.
Exercice 37 Utilisez la fonction précédente pour refaire en python les exercices
31 et 32 du TD précédent.
Exercice 38 De façon similaire, faites exécuter via python la requête SELECT
de l’exercice 33 puis provoquez un affichage console du résultat.
Exercice 39 De même, mais au lieu de provoquer un affichage console, stockez
le résultat dans un dictionnaire dont les clefs sont les ids et les valeurs des
couples (nom,type).
Exercice 40 Proposez une fonction qui permet d’afficher tous les pokemon dont
le type n’est pas Feu.
11.3
Exercices libres
Problème 14 (Data Management)
a) Créez un fichier xml contenant quelques lignes sur le modèle suivant :
<individu><nom>Boris</nom><age>24</age></individu>
<individu><nom>Gabrielle</nom><age>23</age></individu>
...
b) Créez une fonction readvariables(adr) qui ouvre un fichier xml et renvoie la liste des champs de données. Dans l’exemple précédent, le résultat serait
("nom","age").
c) Créez une fonction readdata(adr) qui ouvre un fichier xml et renvoie la
liste des données, chaque ligne elle-même sous forme de listes. Dans l’exemple
précédent, le résultat serait ((Boris,24),(Gabrielle,23)).
d) Créez une fonction xml2table(adrxml,adrhost,login,pwd,base) qui à partir d’un fichier xml crée une table dans une base de données reproduisant sa
structure.
e) Créez la fonction réciproque table2xml.
f ) Proposez des fonctions jouant le rôle des requêtes INSERT et SELECT
pour des fichiers xml, sans passer par des bases de données. Pensez à gérer les
conditions WHERE et les jonctions entre les tables.
Problème 15 (Memory)
a) Créez une base de données qui modélise un jeu de memory, c’est-à-dire
une liste de 8 paires de 2 cartes identiques et un plateau de 4×4 cases identifiées
par leurs coordonnées et l’id de la carte qu’elle contienne.
b) Proposez une fonction setup() qui initialise la position des cartes, fixe une
variable score à 100, et crée une liste vide dejatrouvees.
c) Proposez une fonction draw(i,j) qui permet de renvoyer le nom de la carte
de coordonnées (x=i,y=j).
d) Proposez une fonction play(i,j,k,l) qui révèle deux cartes et :
— affiche leur valeur
12
— si elles sont différentes, diminue score de 1.
— si elles sont identiques et ne figurent pas dans dejatrouvee, les ajoutent
à dejatrouvee
— si la taille de dejatrouvee atteint 16, termine la partie et affiche le score.
e) Créez un jeu de memory en python.
12
Séance 12 - Interro
Examen de contrôle continu, à la charge du/de la chargé-e de TD.
13