Université Pierre & Marie CURIE
U.F.R d'infomatique
Maîtrise -- 2000-01
Programmation Objet et Distribution
Tavaux dirigés n° 1
Exercice I Mise en jambes.
Question (I.1) Écrire une fonction find
de type
('a -> bool) -> 'a array -> int
telle que find p t
donne
le plus petit indice i
dans t
tel que p t.(i)
valle true
ou déclanche l'exception Not_found
si un
tel indice n'existe pas.
Question (I.2) Écrire une fonction find_max
de type (pour simplifier)
int array -> int
qui donne le plus petit indice de
l'élément maximal d'un tableau.
Question (I.3) Généralisez la fonction find_max
en une fonction
find2
de type
('a -> 'a -> bool) -> 'a array -> int
.
Exercice II
Un tri par arbre.
Question (II.1) Définir un type de données 'a btree
représentant les
arbres binaires.
Question (II.2) Écrire une fonction ins_btree
de type
('a -> 'a -> bool) -> 'a -> 'a btree -> 'a btree
qui insére
un élément dans un arbre selon la disciple des arbres binaires de
recherche en prenant comme relation d'ordre le premier argument.
Question (II.3) Écrire une fonction btree_of_list
de type
('a -> 'a -> bool) -> 'a list -> 'a btree
qui construit un
arbre binaire de recherche à partir des éléments du tableau
selon l'ordre donné par le premier argument.
Question (II.4) Écrire la fonction inverse list_of_btree
de type
'a btree -> 'a list
qui construit la liste des
éléments contenus dans l'arbre en effectuant un parcours
gauche-droite.
Question (II.5) Déduire de btree_of_list
et list_of_btree
une fonction
de tri.
Exercice III Des modules pour les piles.
La distribution d'Objective Caml fournit un module Stack
dont
le fichier d'interface stack.mli
contient les déclarations
suivantes :
type 'a t |
exception Empty |
val create: unit -> 'a t |
val push: 'a -> 'a t -> unit |
val pop: 'a t -> 'a |
val clear : 'a t -> unit |
val length: 'a t -> int |
val iter: ('a -> unit) -> 'a t -> unit |
Question (III.1) Définir une signature STACK
à partir de ces déclarations.
Question (III.2) Pour représenter une pile, on utilisera le type suivant :
{ mutable sp : int; mutable c : 'a array }
Définir une structure implantant cette signature pour fabriquer un
module Stack
.
Vous avez deux petits problèmes à résoudre : créer une pile
polymorphe et ne pas casser lorsque le tableau est plein.
Question (III.3) Discutons de la façon d'obtenir un module FStack
pour les
piles de taille fixe. La taille est fixée par la fonction
create
qui devient de type int -> Stack
. On pourra alors
déclencher une exception Stack_overflow
.
Exercice IV Différentes vue d'un module.
Question (IV.1) En utilisant les fonctions du module List
, définissez un
module Alist
de gestion des listes d'associations.
Question (IV.2) On veut obtenir deux modules de gestion des listes
d'associations :
- Adm_alist
- destiné aux administrateurs des listes. Ils
auront la possiblité de consulter et modifier la liste.
- User_alist
- destiné aux utilisateurs des listes. Ils
auront seulement la possibilité de consulter la liste.
Comment faire ?
Exercice V Variation sur les modules : un module de tri.
Question (V.1)
Reprendre la fonction de tri de l'exercice 2 pour en faire
un module.
Question (V.2) Proposez une solution pour obtenir un module de tri paramétré par
une fonction d'ordre et qui utilise le module définit à la
question 1
This document was translated from LATEX by HEVEA.