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