TP no 2 1 compilation séparée

publicité
Univ. Lille 1 - Licence Informatique S3H 2ème année
2014-2015
Programmation
TP no 2
1
compilation séparée
Question 1 Télécharger le fichier exemple_separe.tgz Cette archive contient trois fichiers.
Question 2 Extraire les trois fichiers. Lisez les. Le compilateur ocamlc permet de compiler des
morceaux de programmes. Ainsi le fichier outils_tp.ml contient la déclaration d’une fonction
et d’une procédure qui sont utilisées par le fichier prog_princ_tp.ml. Pour réaliser une simple
compilation, sans produire de programme exécutable, on utilise l’option -c du compilateur. Par
exemple si on tape :
make outils_tp.cmo
Cela va lancer l’exécution de la commande :
ocamlc -c outils_tp.ml
et cela a pour effet de produire le fichier outils_tp.cmo
Le Makefile contient les règles permettant de construire l’exécutable prog_princ_tp
Question 3 Construire le programme prog_princ_tp et testez le
Question 4 Réalisez un programme nommé autre_prog_princ.ml qui utilise le même outil mais qui
produit :
*
***
*****
*******
*********
***********
*********
*******
*****
***
*
Question 5 Completez le Makefile afin d’automatiser la compilation de ce nouveau programme. On peut
charger un module déjà compilé dans l’interprète, de deux manières différentes :
– en utilisant la directive #load "nomdumodule"
– ou en précisant le nom du module lors du démarrage de l’interprète.
– le nom caml d’un module est obtenu en mettant la première lettre en majuscule et en retirant
le suffixe .ml. le fichier outils_tp.ml contient donc la déclaration du module caml nommé
Outils_tp
1
– les éléments définis dans le module sont alors utilisables
– soit en utilisant leur nom préfixé par le nom du module suivi d’un point par exemple
Outil_tp.image_ligne
– soit en ouvrant le module. Cela permet de rendre directement disponible les éléments définis
dans le module sans avoir à préciser le nom du module.
Question 6 testez les deux méthodes.
2
la fonction cmp
Question 7 Réaliser une fonction cmp dont la spécification est la suivante :
– cmp a b vaut 1 si et seulement si a > b
– cmp a b vaut 0 si et seulement si a = b
– cmp a b vaut -1 si et seulement si a < b
Question 8 Quel est le type de cette fonction ?
En OCaml cette fonction est déjà prédéfinie et se nomme compare
Question 9 Évaluer les expressions suivantes :
compare
compare
compare
compare
compare
compare
3
’a’ ’b’;;
"Zoe" "arthur";;
infinity 5.0;;
5 -1
(2,3) (2,4);;
false true;;
l’ordre lexicographique
L’ordre lexicographique est l’ordre généralement utilisé par les dictionnaires. Plus formellement,
si a désigne un tableau de taille m et b un tableau de taille n, on dit que a ≤ b dans l’ordre
lexicographique si et seulement si
– appelons i0 le plus grand indice, tel que pour tout 0 ≤ i < i0 on ait : a.(i) = b.(i)
– on a i0 >= m ou bien (i0 < n et a.(i0 ) ≤ b.(i0 ))
Question 10 En utilisant l’opérateur ( <= ) sur les éléments des tableaux, réaliser une fonction nommée
cmptab qui permet de comparer deux tableaux en utilisant l’ordre lexicographique
Question 11 Évaluer les expressions suivantes :
cmptab
cmptab
cmptab
cmptab
cmptab
cmptab
cmptab
[| 1 ; 2 ; 3 |] [| 1;
[| 1 ; 2 ; 3 |] [| 1;
[| 1 ; 2 ; 3 |] [| 1;
[| 1; 2 ; 2 |] [| 1 ;
[| 1; 2 ; 3 |] [| 1 ;
[| 1; 2 |]
[| 1 ;
[||] [||] ;;
2
2
2
2
2
2
; 2 |];;
; 3 |];;
|];;
; 3 |];;
; 3 |];;
; 3 |];;
2
En OCaml, la relation d’ordre sur les tableaux, est l’ordre lexicographique induit par l’ordre sur
les éléments du tableau.
4
trier un tableau
Voici l’algorithme de selection du minimum dans une tranche de tableau :
Algorithme 0.1 Algorithme de sélection du minimum dans une tranche de tableau
Entrée : t un tableau de longueur n, et a et b deux indices tels que 0 ≤ a ≤ b < n.
Sortie : indice d’un élément minimal de la tranche t(a..b)
1: indice_min := a
2: pour i variant de a + 1 à b faire
3:
si t(i) < t(indice_min) alors
4:
indice_min := i
5:
fin si
6: fin pour
7: renvoyer indice_min
Et voilà l’algorithme du tri par sélection du minimum :
Algorithme 0.2 Algorithme de tri par sélection du minimum
Entrée : t un tableau de longueur n.
Sortie : t un tableau trié de longueur n contenant les mêmes éléments.
1: pour i variant de 0 à n − 2 faire
2:
indice_min := sélectionner_min(t, i, n − 1)
3:
échanger t(indice_min) et t(i)
4:
{À ce stade, la tranche t(0..i) est triée
et contient les i + 1 plus petits éléments de t}
5: fin pour
6: {Le tableau t est trié.}
Question 12 Implantez en Caml cet algorithme, en écrivant une procédure de type ’a array -> unit
5
Une transformation de chaîne de caractères
On va maintenant présenter une transformation de chaîne de caractères, connues sous le noms
de transformée de Burrows-Wheeler. Cette transformation possède des propriétés assez étonnantes.
Elle est utilisée dans l’algorithme de compression bzip
Soit s la chaîne à transformer et soit n sa longueur On construit d’abord un tableau de n cases
contenant les chaines obtenues en faisant tourner la chaine s par exemple :
3
Puis on trie ce tableau.
hana aime l’ananas.
ana aime l’ananas.h
na aime l’ananas.ha
a aime l’ananas.han
aime l’ananas.hana
aime l’ananas.hana
ime l’ananas.hana a
me l’ananas.hana ai
e l’ananas.hana aim
l’ananas.hana aime
l’ananas.hana aime
’ananas.hana aime l
ananas.hana aime l’
nanas.hana aime l’a
anas.hana aime l’an
nas.hana aime l’ana
as.hana aime l’anan
s.hana aime l’anana
.hana aime l’ananas
aime l’ananas.hana
l’ananas.hana aime
’ananas.hana aime l
.hana aime l’ananas
a aime l’ananas.han
aime l’ananas.hana
ana aime l’ananas.h
ananas.hana aime l’
anas.hana aime l’an
as.hana aime l’anan
e l’ananas.hana aim
hana aime l’ananas.
ime l’ananas.hana a
l’ananas.hana aime
me l’ananas.hana ai
na aime l’ananas.ha
nanas.hana aime l’a
nas.hana aime l’ana
s.hana aime l’anana
Enfin la transformée de s s’obtient en ne conservant que le dernier caractère pour chaque case.
aelsn h’nnm.a iaaaa
Réalisez une fonction nommée tbw qui associe à une chaîne s la tranformée de Burrows-Wheeler
de cette chaîne.
À suivre ...
4
Téléchargement