Module LI213 – Types et Structures de donn´ees ann´ee 2004–2005
Examen de septembre du module LI213
Dur´ee : 2 heures
Seuls documents autoris´es :
le manuel de r´ef´erence d’OCaml et vos notes manuscrites de cours et de TD
Note importante : Si vous ne savez pas r´epondre `a une question, supposez d´efinie la
fonction demand´ee pour les questions suivantes.
Exercice 1 (6 points)
Q 1.1 (1 point) ´
Ecrivez une fonction mem : ’a -> ’a list -> bool telle que mem
e liste renvoie un bool´een indiquant si eappartient `a la liste.
Q 1.2 (1 point) ´
Ecrivez une fonction unique : ’a list -> ’a list telle que
unique l supprime les occurrences multiples de la liste let retourne la liste r´esultante.
L’ordre des ´el´ements dans la liste retourn´ee n’a aucune importance. Par exemple, unique
[3 ; 4 ; 5 ; 4 ; 2 ; 3 ; 1] pourra retourner [5 ; 4 ; 2 ; 3 ; 1].
Q 1.3 (1 point) ´
Ecrivez une fonction intersect : ’a list -> ’a list -> ’a list
telle que intersect l1 l2 renvoie la liste constitu´ee uniquement des ´el´ements apparte-
nant `a la fois `a l1 et l2. Ces ´el´ements ne doivent apparaˆıtre qu’une fois dans la liste re-
page 2 Module LI213 – Types et Structures de donn´ees
tourn´ee. Par exemple, intersect [1 ;3 ;2 ;3 ;4] [2 ;3 ;5 ;2] renverra la liste [2 ;3]
ou [3 ;2]. L’ordre des ´el´ements dans la liste retourn´ee n’a aucune importance.
Q 1.4 (1 point) ´
Ecrivez une fonction union : ’a list -> ’a list -> ’a list
qui renvoie l’union de deux listes, c’est-`a-dire les ´el´ements apparaissant dans au moins une
des deux listes. Ceux-ci ne doivent apparaˆıtre qu’une fois dans la liste retourn´ee et leur
ordre dans cette liste n’a aucune importance.
Q 1.5 (2 point) ´
Ecrivez une fonction elts : ’a list list -> ’a list qui prend
en argument une liste de listes et qui renvoie la liste des ´el´ements qui composent ces listes.
Ceux-ci ne doivent apparaˆıtre qu’une fois dans la liste retourn´ee et leur ordre dans cette
liste n’a aucune importance.
Par exemple, elts [[1 ;3 ;3 ;2] ; [2 ;4 ;5] ; [5]] pourra renvoyer [1 ; 3 ; 2 ; 4 ;
5].
Exercice 2 (6 points)
On repr´esente des polynˆomes par la liste de leurs coefficients (ordonn´es selon les puissances
croissantes dans le polynˆome). Attention : tout au long de l’exercice, les listes sont telles
que leur dernier entier (le coefficient de la plus grande puissance) est diff´erent de 0. Ainsi,
la liste [3 ;0 ;5 ;0 ;4 ;6] repr´esente-t-elle le polynˆome 3 + 5x2+ 4x4+ 6x5et la liste []
le polynˆome 0.
Module LI213 – Types et Structures de donn´ees page 3
Q 2.1 (3 points) ´
Ecrivez une fonction add : int list -> int list -> int list
telle que add p1 p2 renvoie la liste correspondant au polynˆome p1 + p2. Rappelez-vous
que les derniers ´el´ements de la liste correspondant `a p1 + p2 doivent ˆetre diff´erents de 0.
Ainsi add [1 ; 0 ; 3] [-1 ; 2 ; -3] renverra la liste [0 ; 2].
Q 2.2 (1 point) ´
Ecrivez une fonction scalar : int -> int list -> int list
telle que scalar n p renvoie le produit du polynˆome ppar le scalaire n, autrement dit
les coeffcients de psont multipli´es par n. N’oubliez pas que les derniers entiers de la liste
retourn´ee doivent ˆetre diff´erents de 0.
Q 2.3 (2 points) ´
Ecrivez une fonction valeur : int list -> int -> int telle
que valeur p x renvoie la valeur du polynˆome pau point x, c’est-`a-dire p(x).
Exercice 3 (8 points)
Dans cet exercice, on utilise une structure d’arbre n-aire pour manipuler des intervalles.
Chaque nœud de l’arbre repr´esente un intervalle [x, y] o`u xet ysont des entiers. Les fils
d’un nœud correspondent `a des intervalles inclus dans celui-ci. De plus, l’arbre est construit
de telle sorte que tous les fils d’un nœud repr´esentent des intervalles disjoints deux `a deux.
La figure 1 repr´esente un tel arbre.
Pour repr´esenter cet arbre en ocaml, on utilise les types nœud et arbre ci-dessous :
type noeud = { intervalle : int * int; children : noeud list }
and arbre = Nil | Elt of noeud;;
page 4 Module LI213 – Types et Structures de donn´ees
[10,30]
b
e f
[16,30] [10,15]
[40,50]
c[60,61]
d
[0,100]
a
Fig. 1 – L’arbre d’intervalles emboit´es.
Ainsi l’arbre de la figure 1 sera-t-il repr´esent´e de la mani`ere suivante :
let arbre =
let noeud_c = {intervalle = (40,50); children = []}
and noeud_d = {intervalle = (60,61); children = []}
and noeud_e = {intervalle = (16,30); children = []}
and noeud_f = {intervalle = (10,15); children = []} in
let noeud_b = {intervalle = (10,30); children =
[noeud_e; noeud_f]} in
let noeud_a = {intervalle = (0,100); children =
[noeud_b; noeud_c; noeud_d]} in
Elt noeud_a;;
Module LI213 – Types et Structures de donn´ees page 5
Q 3.1 (2 point) Soit la d´eclaration : type intersection = EMPTYSET | SUBSET
| SUPSET | INTERSECT ; ; ´
Ecrivez une fonction :
inter : ’a * ’a -> ’a * ’a -> intersection telle que inter (x,y) (z,t) ren-
voie :
EMPTYSET si [x, y][z, t] = ,
SUBSET si [x, y][z, t],
SUPSET si [x, y][z, t],
INTERSECT sinon.
Q 3.2 (2 points) ´
Ecrivez une fonction find list container : int * int ->
noeud list -> arbre prenant en argument un intervalle [x, y] ainsi qu’une liste de
nœuds/intervalles disjoints. S’il existe un nœud contenant l’intervalle [x, y] dans la liste, la
fonction renvoie un arbre dont la racine est ce nœud. Sinon s’il existe un nœud repr´esentant
un intervalle [z, t] d’intersection non vide avec [x, y] et tel qu’aucun des deux intervalles
[x, y] et [z, t] n’est inclus dans l’autre, alors la fonction l`eve une exception Intervalle error.
Dans tous les autres cas, elle renvoie Nil. Ainsi :
find list container (45,46) [noeud b ; noeud c ; noeud d] renverra Elt noeud c,
find list container (30,46) [noeud b ; noeud c ; noeud d] l`evera l’exception :
Intervalle error et l’application :
find list container (55, 58) [noeud b ; noeud c ; noeud d] renverra Nil.
Q 3.3 (4 points) Dans cette question, on recherche le nœud de l’arbre en dessous duquel
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !