Projet de Logique et Circuits

 

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

 

 

 

Screen Capture

HUANG Minyu & NGUYEN Quoc Trung

 

 

 

 

Avec 10 immeubles

 

 

 

 

Avec 30 immeubles

 

 

 

 


      

主页 | 上一层 | Immeubles | Imarbres

Copyright © 2004 AppleSpace. All Rights Reserved