Pouknouki

Caml Files

Sep 30th, 2016
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.80 KB | None | 0 0
  1. type 'a file = { mutable debut : 'a list; mutable fin : 'a list};;
  2.  
  3. (* Complexité : O(1) *)
  4. let file_vide () = { debut = []; fin = []};;
  5.  
  6. (* Complexité : O(1) *)
  7. let est_vide {debut = d; fin = f} = match (d, f) with
  8.     | [], [] -> true
  9.     | l1, l2 -> false;;
  10.    
  11. (* Complexité : O(l) *)
  12. let miroir l =
  13.     let rec miroir_aux l acc = match l with
  14.         | [] -> acc
  15.         | t::q -> miroir_aux q (t::acc)
  16.     in miroir_aux l [];;
  17.    
  18. (* Complexité : O(1) ou O(l) *)  
  19. let premier {debut = d; fin = f} = match (d, f) with
  20.     | [], [] -> failwith("Mauvaise file.")
  21.     | [], l -> hd (miroir l)
  22.     | t::q, l -> t;;
  23.    
  24. (* Complexité : O(1) *)
  25. let enfile {debut = d; fin = f} elt =  {debut = d; fin = elt::f};;
  26.  
  27. (* Complexité : O(1) ou O(l) *)
  28. let defile f = match (f.debut, f.fin) with
  29.     | [], [] -> f
  30.     | [], l -> f.debut <- tl(miroir f.fin); f
  31.     | t::q, l -> f.debut <- q; f.fin <- l; f;;
  32.  
  33. let rec al liste = match liste with
  34.     | [] -> ()
  35.     | t::q -> print_int t; al q;;
  36.  
  37. (* EXERCICE 2 *)
  38. type 'a pile = Nil | P of 'a * 'a pile;;
  39.  
  40. (*let pile_vide () = Nil;;
  41.  
  42. let est_vide p = match p with
  43.     | Nil -> true
  44.     | P(a, p2) -> false;;
  45.    
  46. let miroir pile =
  47.     let rec miroir_aux stack acc = match stack with
  48.         | Nil -> acc
  49.         | P(a, p2) -> P(a, (miroir_aux acc p2 ))
  50.     in miroir_aux pile Nil;;
  51.    
  52. let premier stack = match stack with
  53.     | Nil -> failwith("Aucun")
  54.     | P(a, p2) -> a;;
  55.  
  56. let empiler stack elt = P(elt, stack);;
  57.  
  58. let depiler stack = match stack with
  59.     | Nil -> Nil
  60.     | P(a, Nil) -> Nil
  61.     | P(a, p2) -> p2;;
  62.        
  63. let rec ap stack = match stack with
  64.     | Nil -> ()
  65.     | P(a, p2) -> print_int a; ap p2;;
  66.    
  67. *)
  68. type couleur = Bleue | Rouge and assiette == couleur * int;;
  69.  
  70. type 'a enreg  = { mutable sommet : 'a; mutable queue : 'a pile }
  71. and 'a pile = Vide | P of 'a enreg;;
  72.  
  73. let trier (assiettes:assiette pile) =
  74.     let rouges = Vide in
  75.     let bleues = Vide in
  76.     while not est_vide assiettes do
  77.         match assiettes.sommet with
  78.             | (Bleue, a) -> empiler rouges (Bleue, a)
  79.             | (Rouge, a) -> empiler bleues (Rouge, a);
  80.         depiler assiettes;
  81.     done;
  82.     while not est_vide bleues do
  83.         empiler assiettes (depiler bleues)
  84.     done;
  85.     while not est_vide rouges do
  86.         empiler assiettes (depiler rouges)
  87.     done;;
  88.    
  89. (* EXERCICE 3 *)
  90. type 'a file = {mutable suivant: int; mutable debut: int; donnees: 'a vect; mutable est_vide: bool};;
  91.  
  92. (* Est vide est nécessaire car sinon on peut confondre le cas file pleine et file vide.*)
  93.  
  94. let est_vide file = file.est_vide;;
  95.  
  96. let file_vide size x = {suivant = 0; debut = 0; donnees = make_vect size x; est_vide = true};;
  97.  
  98. let premier LFEQ = if LFEQ.est_vide then failwith("Vide") else LFEQ.donnees.(LFEQ.debut);;
  99.  
  100. let defile lafileenquestion =
  101.     if lafileenquestion.est_vide then ()
  102.     else lafileenquestion.debut <- (lafileenquestion.debut + 1) mod (vect_length lafileenquestion.donnees);;
  103.  
  104. let enfile LFEQ x =
  105.     if (not LFEQ.est_vide) &&
  106.         LFEQ.suivant == LFEQ.debut
  107.     then
  108.         failwith("Dépassement de capacité.")
  109.     else (
  110.         print_int (LFEQ.suivant); print_string " / "; print_int LFEQ.debut; print_string("\n");
  111.         LFEQ.est_vide <- false;
  112.         LFEQ.donnees.(LFEQ.suivant) <- x;
  113.         LFEQ.suivant <- (LFEQ.suivant + 1) mod (vect_length LFEQ.donnees);
  114.         (*print_int LFEQ.suivant; print_string " / "; print_int LFEQ.debut; print_string "\n";
  115.         *)());;
  116.    
  117. let test = (file_vide 4 0);;
  118. test;;
  119. enfile test 12;;
  120. enfile test 13;;
  121. enfile test 15;;
  122. enfile test 15;; enfile test 153;;  
  123.  
  124. let print_file LFEQ =
  125.     for i = 0 to vect_length LFEQ.donnees - 1 do
  126.         print_int LFEQ.donnees.(i);
  127.         print_string("\n")
  128.     done;;
  129.    
  130. print_file test;;
Advertisement
Add Comment
Please, Sign In to add comment