1ère partie : Les immeubles - Rapport projet - - Codage du Projet - - Graphiques -
|
|
Rapport projet : Immeubles et Profil HUANG Minyu & NGUYEN Quoc Trung
Problème : Calculer et aficher le profil vu de loin d’un ensemble d’immeubles qui se trouve dans plusieurs rues paralleles.
Résoudre le problème : On fait une fonction qui prend comme argument un entier et envoye une liste d’immeuble aléatoire (* genere_immeubles* ) , puis on affiche tous les immeubles dans la liste . Pour calcul le profil , on prend une liste d’immeubles , la simplifie et on ne garde que les immeubles qui ne peuvent plus etre simplifiés. Puis on les transforme en liste de profils et on les affiche. Les fonctions sont ci-desous :
Fonction : cons_im Type : int -> int -> int -> immeuble Role : Prendre 3 entiers comme argument et construire un immeuble et verifier que l’immeuble créé est correct , sinon le corriger
Fonction : test_im Type : immeuble -> bool Role : Vérifier si un immeuble est créé correctement : la hauteur est valide et son adresse est constituée de deux numéros valides dans l’ordre croissant
Fonction : adresse_im Type : immeuble -> adresse Role : Prendre un immeuble comme argument et retourner son adresse
Fonction : hauteur_im Type : immeuble -> hauteur Role : Prendre un immeuble comme argument et retourner son hauteur
Fonction : genere_immeubles Type : int -> immeuble list Role : Générer aléatoirement une liste d’immeubles
Fonction : compare Type : immeuble -> immeuble -> int Role : Prendre 2 immeubles comme argument et renvoyer un entier ; utilisée dans la fonction List.sort
Fonction : calcul_profil Type : immeuble list -> immeuble list Role : Simplifier un ensemble d’immeubles et renvoyer une liste d’immeubles qui contient des immeuble plus large , plus haut ou ne se touchent pas pour trouver le profil
Fonction : profil_1im Type : immeuble -> profil list Role : Transformer un immeuble à une liste de profils
Fonction : profil_list_im Type : immeuble list -> profil list Role : Transformer un ensemble d’immeubles à une liste de profils
Fonction : cons_list_profil Type : profil list -> profil list Role : Supprimmer dans une liste de profils, les profils qui sont les memes
Fonction : affiche_un_im Type : immeuble -> unit Role : Tracer un immeuble dans Caml graphics
Fonction : affiche_list_im Type : immeuble list -> unit Role : Tracer un ensemble d’immeuble dans Caml graphics
Fonction : affiche_profil Type : profil list -> unit list Role : Tracer uen liste de profils dans Caml graphics
Fonction : tester_abi Type : int -> unit list Role : Générer aléatoirement une liste d’immebles, puis les afficher ; en suite calculer son profil, puis l’afficher
Fonction : tester Type : immeuble list -> unit list Role : Prendre une liste d’immeubles existante comme argument, calculer son profil, puis l’afficher
FIN du rapport
|
|
Codage du Projet : Immeubles et Profil HUANG Minyu & NGUYEN Quoc Trung
Commands *UNIX* > ocamlmktop -o topGraphics graphics.cma > ./topGraphics
*WINDOWS* # #load "graphics.cma";; # Graphics.open_graph " 400*400";; - : unit = () # #use "A:/floppy/projet_immeuble.ml";;
Types # type adresse = Adresse of int*int;; # type hauteur = Hauteur of int;; # type immeuble = Immeuble of adresse*hauteur;; # type profil=Profil of int*int;;
Fonctions de Construction
# let rec cons_im a1 a2 h= if a1>a2 then cons_im a2 a1 h else if a1=a2 then cons_im (a1+2) a2 h else if a1 mod 2=0 & a2 mod 2=0 then Immeuble(Adresse(a1,a2),Hauteur h) else if a1 mod 2<>0 & a2 mod 2=0 then cons_im (a1+1) a2 h else cons_im a1 (a2+1) h;; val cons_im : int -> int -> int -> immeuble = <fun>
Fonctions de Test
# let test_im im = match im with Immeuble(Adresse(a1,a2),Hauteur h) -> if a1>0 & a1<=200 & a1 mod 2=0 & a2>0 & a2<=200 & a2 mod 2 = 0 & a1<a2 & h>0 & h<=23 then true else false;; val test_im : immeuble -> bool = <fun>
Fonctions d'Acces
# let adresse_im im = match im with Immeuble (Adresse (a1, a2), Hauteur h)->Adresse(a1,a2);; val adresse_im : immeuble -> adresse = <fun>
# let hauteur_im im = match im with Immeuble (Adresse (a1, a2), Hauteur h)->Hauteur h;; val hauteur_im : immeuble -> hauteur = <fun>
Fonctions Algotithmique
(*** Fonctions de Generer Immeubles Aleatoires ***) # let rec genere_immeubles n = if n==0 then [] else if n>0 then (cons_im (2*(Random.int 100)) (2+2*(Random.int 100)) (1+(Random.int 23))) :: (genere_immeubles (n-1)) else failwith "err genere_immeuble";; val genere_immeubles : int -> immeuble list = <fun>
(*** Fonctions de Calculer Profil ***) # let compare im1 im2=match im1 with Immeuble(Adresse(a1,a2),Hauteur(h1))->match im2 with Immeuble(Adresse(a3,a4),Hauteur(h2))-> if a1>a3 then 1 else if a1<a3 then -1 else 0;; val compare : immeuble -> immeuble -> int = <fun>
# let rec calcul_profil liste_im=let l = List.sort compare liste_im in match l with [ ]-> [ ] |Immeuble(Adresse(x1,y1),Hauteur z1)::[ ] -> Immeuble(Adresse(x1,y1),Hauteur z1)::[] |Immeuble(Adresse(x1,y1),Hauteur z1) ::Immeuble(Adresse(x2,y2),Hauteur z2)::reste-> (* immeubles decales avec 1 plus haut que 2 *) if (x2<y1 & y1<y2 & z1>z2) then calcul_profil ((Immeuble(Adresse(x1,y1),Hauteur z1))::(Immeuble(Adresse(y1,y2),Hauteur z2))::reste)
(* immeubles decales avec 2 plus haut que 1 *) else if (x1<x2 & x2<y1 & y1<=y2 & z1<z2) then calcul_profil ((Immeuble(Adresse(x1,x2),Hauteur z1))::( Immeuble(Adresse(x2,y2),Hauteur z2))::reste)
(* immeubles decales ont la meme hauteur *) else if (x2<=y1 & y1<y2 & z1=z2) then calcul_profil (Immeuble(Adresse(x1,y2),Hauteur z1)::reste)
( * immeuble 1 englobe immeuble 2 *) else if (y1>=y2 & z1>=z2) then calcul_profil ((Immeuble(Adresse(x1,y1),Hauteur z1))::reste)
(* immeuble 1 est plus large mais moins haut que immeuble 2 *) else if (x1<x2 & y1>y2 & z1<z2 ) then calcul_profil ((Immeuble(Adresse(x1,x2),Hauteur z1))::(Immeuble(Adresse(x2,y2),Hauteur z2))::(Immeuble(Adresse(y2,y1),Hauteur z1))::reste)
(* immeuble 2 englobe immeuble 1 *) else if (x1=x2 & y1<=y2 & z1<z2) then calcul_profil ((Immeuble(Adresse(x2,y2),Hauteur z2))::reste)
(* immeuble 2 est plus large mais moins haut que immeuble 1 *) else if (x1=x2 & y1>y2 & z2>z1 ) then calcul_profil ((Immeuble(Adresse(x2,y2),Hauteur z2))::(Immeuble(Adresse(y2,y1),Hauteur z1))::reste)
(* les 2 immeubles ne se touchent pas *) else if (y1<=x2) then Immeuble(Adresse(x1,y1),Hauteur z1)::(calcul_profil ((Immeuble(Adresse(x2,y2),Hauteur z2))::reste)) else failwith "err calcul_profil";;
val calcul_profil : immeuble list -> immeuble list = <fun>
(*** Fonctions de Transformation Liste_immeuble -> Liste_profil ***) # let profil_1im im1=match im1 with Immeuble(Adresse(a1,a2),Hauteur h)->[Profil(a1,0);Profil(a1,h);Profil(a2,h);Profil(a2,0)];; val profil_1im : immeuble -> profil list = <fun>
# let rec profil_list_im l_im=match l_im with [ ]->[ ] |im1::reste->(profil_1im im1)@(profil_list_im reste);; val profil_list_im : immeuble list -> profil list = <fun>
# let rec cons_list_profil l_p=match l_p with [ ]->[ ] |Profil (a, b)::[ ] -> Profil (a, b)::Profil (800, 0)::[ ] |p1::p2::reste-> if p1=p2 then (cons_list_profil reste) else p1::(cons_list_profil (p2::reste));; val cons_list_profil : profil list -> profil list = <fun>
Fonctions d'affichage
# let affiche_un_im imbl=match imbl with Immeuble(Adresse(a1,a2), Hauteur(h))-> Graphics.set_color Graphics.black; Graphics.moveto (a1*2) 0; Graphics.lineto (a1*2) (h*4); Graphics.lineto (a2*2) (h*4); Graphics.lineto (a2*2) 0;; val affiche_un_im : immeuble -> unit = <fun>
# let rec affiche_list_im l=match l with [ ]->( ) |im1::l1->affiche_un_im(im1);affiche_list_im l1;; val affiche_list_im : immeuble list -> unit = <fun>
# let affiche_profil l_p= Graphics.moveto 0 160; let fonction_aux (Profil (a, b))=Graphics.set_color Graphics.blue;Graphics.lineto (a*2) (4*(b+40)) in List.map fonction_aux l_p;; val affiche_profil : profil list -> unit list = <fun>
Teste Programme
# let tester_abi n= let l1=genere_immeubles n in let l2=calcul_profil l1 in let lp1=profil_list_im l2 in let lp2=cons_list_profil lp1 in Graphics.clear_graph ();affiche_list_im l1; affiche_profil lp2;; val tester_abi : int -> unit list = <fun>
# let tester l_im= let l=calcul_profil l_im in let lp1=profil_list_im l in let lp2=cons_list_profil lp1 in Graphics.clear_graph ();affiche_list_im l; affiche_profil lp2;; val tester : immeuble list -> unit list = <fun>
Fin du Programme
|
|
HUANG Minyu & NGUYEN Quoc Trung
Avec 10 immeubles
Avec 30 immeubles
|
Copyright © 2004 AppleSpace. All Rights Reserved
|