Guest User

testtp1

a guest
Feb 7th, 2013
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.68 KB | None | 0 0
  1. open Facturesetcheques
  2. open Tris
  3.  
  4. let cpt = ref 0
  5.  
  6. let cmp x y =
  7.   incr cpt;
  8.   if x < y then
  9.     -1
  10.   else if x = y then
  11.     0
  12.   else
  13.     1
  14.  
  15. let cmp_cheques c1 c2 =
  16.   cmp (numero_facture_cheque c1) (numero_facture_cheque c2)
  17.  
  18. let cmp_factures f1 f2 =
  19.   cmp (numero_facture f1) (numero_facture f2)
  20.  
  21. (**
  22.     algorithme 1, on s'interdit tout pretraitement sur les factures et
  23.     les cheques
  24. *)
  25. let liste_des_factures_impayees_1 f c =
  26.     let liste = ref []
  27.     and estpaye = ref false in
  28.     for i=0 to (Array.length f)-1 do (
  29.         estpaye := false;
  30.         for j=0 to (Array.length c)-1 do (
  31.             if (cmp (numero_facture (f.(i))) (numero_facture_cheque (c.(j))) = 0) then (
  32.                 estpaye := true;
  33.             );
  34.            
  35.         )
  36.         done;
  37.         if not(!estpaye) then
  38.             liste := (f.(i)):: !liste;
  39.     )
  40.     done;
  41.     !cpt
  42.  
  43.  
  44. (**
  45.     algorithme 2, on s'autorise de pretraiter soit les factures, soit
  46.     les cheques mais pas les deux
  47. *)
  48. let liste_des_factures_impayees_2 f ch =
  49.     (*Tableau des chèques trié*) 
  50.     let c = (trier ch cmp_cheques)
  51.     (*Liste des factures impayées*)   
  52.     and liste = ref []
  53.     (*La facture est impayée*)
  54.     and payee = ref false
  55.     (*Indices*)
  56.     and debut = ref 0
  57.     and fin = ref ((Array.length ch)-1)
  58.     in
  59.     let milieu = ref ((!debut + !fin)/2)
  60.     in
  61.     for i=0 to ((Array.length f)-1) do (
  62.         incr cpt;
  63.         payee := false;
  64.         debut := 0;
  65.         fin := ((Array.length c)-1);
  66.         milieu := (!debut + !fin)/2;
  67.         while (not(!payee) && (!milieu <> !debut) && (!milieu <> !fin) && (!debut <= !fin)) do (
  68.             if (
  69.                 ((cmp (numero_facture f.(i)) (numero_facture_cheque c.(!milieu)))) = 0 ||
  70.                 ((numero_facture f.(i)) = (numero_facture_cheque c.(!debut))) ||
  71.                 ((numero_facture f.(i)) = (numero_facture_cheque c.(!fin))))
  72.             then (
  73.                 payee := true;
  74.             )
  75.             else (
  76.                 if ((numero_facture f.(i)) > (numero_facture_cheque c.(!milieu))) then (
  77.                     debut := !milieu
  78.                 )
  79.                 else (
  80.                     fin := !milieu
  81.                 );
  82.                 if (((!debut + !fin) mod 2)=0) then (
  83.                     milieu := ((!debut + !fin)/2)
  84.                 )
  85.                 else (
  86.                     milieu := (((!debut + !fin)/2)+1)
  87.                 );
  88.             );
  89.         )done;
  90.         if (not(!payee)) then (
  91.             liste := (f.(i)):: !liste;
  92.         );
  93.     )done;
  94.     !cpt
  95.  
  96.  
  97. (**
  98.     algorithme 3, on s'autorise de pretraiter à la fois les factures et
  99.     les cheques
  100. *)
  101. let liste_des_factures_impayees_3 fact ch =
  102.     (*Tableau des chèques trié*) 
  103.     let c = (trier ch cmp_cheques)
  104.     (*Tableau des factures trié*) 
  105.     and f = (trier fact cmp_factures)
  106.     (*Liste des factures impayées*)   
  107.     and liste = ref []
  108.     (*La facture est impayée*)
  109.     and payee = ref false
  110.     (*Indices*)
  111.     and compt = ref 0
  112.     in
  113.     for i=0 to (Array.length(f)-1) do (
  114.         payee := false;
  115.         if !compt > (Array.length c)-1 then
  116.             payee := false
  117.         else (
  118.             if ((cmp (numero_facture f.(i)) (numero_facture_cheque c.(!compt))) = 0) then (
  119.                 payee := true;
  120.                 incr compt;
  121.  
  122.             );
  123.         );
  124.         if (not(!payee)) then (
  125.             liste := (f.(i)):: !liste;
  126.         );
  127.     )
  128.     done;
  129.     !cpt
  130.            
  131.            
  132. (**
  133.    [imprimer_liste_factures l] imprime les numeros de facture de la liste l
  134. *)
  135. let rec imprimer_liste_factures l =
  136.   match l with
  137.     | [] ->
  138.       Printf.printf "\n"
  139.     | f::r ->
  140.       Printf.printf "%d " (numero_facture f);
  141.       imprimer_liste_factures r
  142.  
  143. let _ =
  144.   let n = int_of_string Sys.argv.(1)
  145.   in
  146.   let ftab = factures n
  147.   in
  148.   for i=1 to n do (
  149.     let ctab = cheques i ftab in
  150.     Printf.printf "%d %d " n i;
  151.     (* test methode 1 *)
  152.     cpt := 0;
  153.     Printf.printf "%d " (liste_des_factures_impayees_1 ftab ctab);
  154.     (* test methode 2 *)
  155.     cpt := 0;
  156.     Printf.printf "%d " (liste_des_factures_impayees_2 ftab ctab);
  157.     (* test methode 3 *)
  158.     cpt :=0;
  159.     Printf.printf "%d \n" (liste_des_factures_impayees_3 ftab ctab);
  160.   )
  161.   done;
Advertisement
Add Comment
Please, Sign In to add comment