moneysharing
This commit is contained in:
parent
4e99858ad5
commit
df3b14c089
4 changed files with 143 additions and 0 deletions
99
src/MSgfile.ml
Normal file
99
src/MSgfile.ml
Normal file
|
@ -0,0 +1,99 @@
|
|||
open Graph
|
||||
open Printf
|
||||
open MoneySharing
|
||||
|
||||
type path = string
|
||||
|
||||
(* Format of text files:
|
||||
% Welcome to MoneySharing, your favorite tool to ease your reimbursements !
|
||||
|
||||
% Please, type the name of all users of your group:
|
||||
u Gaby
|
||||
u Flo
|
||||
u Macha
|
||||
|
||||
% You can now enter your payements as it follows: p userWhoPaid [forWhichUser1; forWhichUser2 ..] amount
|
||||
p Flo [Gaby; Flo; Macha] 11.0
|
||||
p Gaby [Flo] 8.5
|
||||
|
||||
*)
|
||||
|
||||
|
||||
let write_file path graph l_id=
|
||||
|
||||
(* Open a write-file. *)
|
||||
let ff = open_out path in
|
||||
|
||||
(* Write in this file. *)
|
||||
fprintf ff "%% Here is your MoneySharing graph.\n\n" ;
|
||||
|
||||
(* Write all users *)
|
||||
n_iter_sorted graph (fun id -> fprintf ff "u %s\n" (get_user id l_id)) ;
|
||||
fprintf ff "\n" ;
|
||||
|
||||
fprintf ff "%% Here are the reimbursements to be made.\n\n" ;
|
||||
|
||||
(* Write all arcs *)
|
||||
e_iter graph (fun id1 id2 lbl -> fprintf ff "p %d %d %s\n" (get_user id1 l_id) (get_user id2 l_id) lbl) ;
|
||||
|
||||
fprintf ff "\n%% End of reimbursements\n" ;
|
||||
|
||||
|
||||
|
||||
close_out ff ;
|
||||
()
|
||||
|
||||
let read_comment graph line l_id=
|
||||
try Scanf.sscanf line " %%" (graph, l_id)
|
||||
with _ ->
|
||||
Printf.printf "Unknown line:\n%s\n%!" line ;
|
||||
failwith "from_file"
|
||||
|
||||
(* Reads a line with a user. *)
|
||||
let read_user id graph line l_id=
|
||||
try Scanf.sscanf line "u %s" (fun user l_id-> ((init_node graph user id), l_id) )
|
||||
with e ->
|
||||
Printf.printf "Cannot read node in line - %s:\n%s\n%!" (Printexc.to_string e) line ;
|
||||
failwith "from_file"
|
||||
|
||||
(* Reads a line with a payement. *)
|
||||
let read_payement graph line l_id=
|
||||
try Scanf.sscanf line "p %s %r %f"
|
||||
(fun u l_u label -> ((paiement graph u l_u label), l_id))
|
||||
with e ->
|
||||
Printf.printf "Cannot read arc in line - %s:\n%s\n%!" (Printexc.to_string e) line ;
|
||||
failwith "from_file"
|
||||
|
||||
let from_file path =
|
||||
|
||||
let infile = open_in path in
|
||||
|
||||
(* Read all lines until end of file.
|
||||
* n is the current node counter. *)
|
||||
let rec loop n graph l_id=
|
||||
try
|
||||
let line = input_line infile in
|
||||
|
||||
(* Remove leading and trailing spaces. *)
|
||||
let line = String.trim line in
|
||||
|
||||
let (n2, (graph2, l2)) =
|
||||
(* Ignore empty lines *)
|
||||
if line = "" then (n, (graph, l_id))
|
||||
|
||||
(* The first character of a line determines its content : n or e. *)
|
||||
else match line.[0] with
|
||||
| 'u' -> (n+1, read_node n graph line l_id )
|
||||
| 'p' -> (n, read_arc graph line l_id)
|
||||
|
||||
(* It should be a comment, otherwise we complain. *)
|
||||
| _ -> (n, read_comment graph line l_id)
|
||||
in
|
||||
loop n2 graph2 l2
|
||||
|
||||
with End_of_file -> (graph, l_id) (* Done *)
|
||||
in
|
||||
let final_graph_lid= loop 0 empty_graph [] in
|
||||
|
||||
close_in infile ;
|
||||
final_graph_lid
|
7
src/MSgfile.mli
Normal file
7
src/MSgfile.mli
Normal file
|
@ -0,0 +1,7 @@
|
|||
open Graph
|
||||
|
||||
type path = string
|
||||
|
||||
val from_file: path -> (string graph, (string,id) list)
|
||||
|
||||
val write_file: path -> string graph -> (string,id) list-> unit
|
28
src/moneySharing.ml
Normal file
28
src/moneySharing.ml
Normal file
|
@ -0,0 +1,28 @@
|
|||
open Graph
|
||||
|
||||
|
||||
(*fonction qui créé le noeud associé à un utilisateur et rentre la correspondance dans la table des id*)
|
||||
let init_node g user id l_id=
|
||||
((new_node g id), ((user,id)::l_id))
|
||||
|
||||
|
||||
(*fonction qui renvoie l'id d'un utilisateur*)
|
||||
let get_id utilisateur l_id= match l_id with
|
||||
|[]-> raise Not_found
|
||||
|(a,id1)::b-> if a=utlisateur then id1 else get_id utilisateur b
|
||||
|
||||
(*fonction qui renvoie le nom correspondant à un id*)
|
||||
let get_user id1 l_id= match l_id with
|
||||
|[]-> raise Not_found
|
||||
|(nom,a)::b-> if a=id1 then nom else get_user id1 b
|
||||
|
||||
(*fonction qui rentre les paiements réalisés*)
|
||||
let rec paiement g utilisateur l_utilisateurs montant l_id=
|
||||
let id1=(get_id utilisateur l_id) in
|
||||
match l_utilisateurs with
|
||||
|[]-> (g, l_id)
|
||||
|a::b-> paiement (add_arc g id1 (get_id a l_id) montant) id1 b montant l_id
|
||||
|
||||
|
||||
|
||||
|
9
src/moneySharing.mli
Normal file
9
src/moneySharing.mli
Normal file
|
@ -0,0 +1,9 @@
|
|||
open Graph
|
||||
|
||||
val paiement: int graphe -> string -> string list -> float -> (string,id) list -> (int graphe, (string,id) list)
|
||||
|
||||
val init_node: int graphe -> string ->id -> (string,id) list-> (int graphe, (string,id) list)
|
||||
|
||||
val get_id: string -> (string, id) list -> id
|
||||
|
||||
val get_user: id -> (string, id) list -> string
|
Loading…
Reference in a new issue