Univ. Lille1 - Licence Informatique 2ème année 2011-2012 Algorithmes et Programmation Impérative 2 TP : Les les Objectifs : Travailler sur les les. 1 Le module Queue Le module Queue de la bibliothèque standard d'Objective Caml, dénit un type le nommé permettant de manipuler des les contenant tout type de valeurs. Le tableau 1 donne les correspondances entre les noms des fonctions de ce module et le nom des opérations primitives décrites en cours et réalisées dans notre module File. Queue.t File type ’a file exception File_vide val creer : unit -> ’a pile val enfiler : ’a -> ’a file -> unit val defiler : ’a file -> ’a val sommet : ’a file -> ’a val est_vide : ’a file -> bool Queue type ’a t exception Empty val create : unit -> ’a t val add : ’a -> ’a t -> unit val take : ’a t -> ’a val top : ’a t -> ’a val is_empty : ’a t -> bool Table 1 Correspondances entre module File et module Queue La documentation complète de ce module se trouve ici. Question 1 Reprenez l'exercice 1 de la feuille d'exercices no 5 en l'adaptant aux fonctions du module Queue. Question 2 Réalisez une procédure d'impression des les d'entiers. Cette procédure se nommera imprimer_file. Elle ne doit pas modier le contenu de la le. 2 Retour sur le coloriage On revient maintenant sur le problème du coloriage abordé dans un TP précédent. L'algorithme récursif présenté dans ce TP peut être présenté en version itérative (on dit qu'on le dérécursive ) en utilisant une le. On remplace les appels récursifs par des enlements de points à colorier (la le est alors une le de couples d'entier). Question 3 Réalisez une procédure de coloriage suivant cet algorithme. Question 4 Étudiez l'inuence de l'ordre dans lequel vous enler les voisins à colorier. Y a-t-il un ordre avec lequel le coloriage s'eectue comme pour la version récursive ? 1 Algorithme 0.1 Coloriage avec le Entrée : un point (i, j) intérieur à une région à colorier Sortie : colorie la région créer une le f enler le point (i, j) dans f tant que f n'est pas vide faire colorier le point en tête de la le f déler la le f enler les voisins non coloriés dans f n tant que 3 Inondation d'une région On souhaite simuler l'inondation d'un terrain à partir d'un point donné de ce terrain. Un terrain est constitué de parcelles à des altitudes diérentes (entre 0 et 255). En versant de l'eau en un point du paysage on suhaite observer la propagation de celle-ci. Il est possible de réaliser la simulation des écoulements de l'eau grâce à un algorithme qui utilise des les. Il y a autant de les qu'il y a d'altitudes possibles (donc 256), notons fi ces les. L'algorithme procède en phases successives. Chaque le contient les parcelles qui vont être inondées au tour suivant. Supposons avoir le paysage suivant constitué de deux cuvettes et d'une colline les séparant. Plus le niveau de gris est élevé et plus l'altitude est faible. On a donc ici trois niveaux d'altitude, le noir représentant l'altitude la plus faible. On choisit d'inonder la cuvette de gauche. La cuvette se remplira puis une fois remplie inondera la cuvette de droite. L'algorithme se déroule de la manière suivante si l'inondation débute à partir d'une parcelle d'altitude a : 1. ajouter la parcelle à la le fa , noter fa comme étant une parcelle inondée, 2. pour toute les altitudes a considérées dans l'ordre croissant pour chaque parcelle de la le fa inonder la parcelle pour chaque parcelle voisine, l'ajouter à la le correspondant à son altitude si elle est plus grande que a, à la le fa sinon 2 3.1 A votre disposition An de visualiser la simulation d'inondation, nous vous proposons une interface graphique qui permet de dessiner une région. Ce sera à vous de colorier les cases inondées. On donne trois modules : 1. Le module Parcelle permet de représenter une parcelle (voir la documentation ici). 2. Le module Terrain permet de représenter un terrain et notamment d'en créer un de manière aléatoire (voir la documentation ici). 3. Le module Dessin qui fournit une procédure de dessin d'un terrain (voir la documentation ici). Question 5 Récupérez le chier materiel.zip et décompressez-le dans votre répertoire de travail. Vous devez obtenir 6 chiers et un dossier. Question 6 Compilez les 6 chiers sources dans l'ordre des dépendances. Pour utiliser un interpréteur avec ces modules, tapez la commande > ocaml graphics.cma parcelle.cmo terrain.cmo dessin.cmo Pour compiler un chier source utilisant ces modules an de produire un programme exécutable, tapez la commande > ocamlc graphics.cma parcelle.cmo terrain.cmo dessin.cmo \ -o <nom_executable> <fichier_source> Question 7 Testez les modules Terrain et Dessin en dessinant un terrain de taille 257 × 257. Essayez une colline, puis une cuvette, puis un terrain au relief aléatoire. 3.2 Le travail à faire Question 8 Créez une fonction permettant de lister les voisins non encore inondés d'une parcelle d'un terrain. Question 9 Créez un tableau de les et ajoutez une parcelle tirée au hasard dans la le correspondante. Question 10 Réalisez une fonction inonder de type Terrain.terrain → int → int → unit qui inonde un terrain depuis le point dont les coordonnées sont passées en paramètre. 3