Enunciado
Transcripción
Enunciado
Paradigmas de Programación TGR 1 Fibonacci Clock Basándose en la idea del "Reloj de Fibonacci" descrito en https://www.kickstarter.com/projects/basbrun/fibonacci-clock-an-open-source-clock-for-nerds-wit (véase también la aplicación para Andorid https://play.google.com/store/apps/details?id=com.logikso.fibonacciclock), utilizaremos el tipo de dato clock, definido a continuación, para representar los posibles estados del reloj. type colour = W | B | R | G;; type clock = colour array;; let colour_at clock i = if i >= 1 && i <= 5 then clock.(i-1) else raise (Invalid_argument "colour_at");; let all_white = Array.make 5 W;; type time = {hh:int; mm:int};; let valid_time t = t.hh >= 0 && t.hh < 24 && t.mm >= 0 && t.mm < 60;; let normal_time t = t.hh > 0 && t.hh <= 12 && t.mm >= 0 && t.mm < 60;; let rounded_time t = {t with mm = 5 * (t.mm / 5)};; let time (h,m) = let t = {hh=h;mm=m} in if valid_time t then t else invalid_arg "time";; 1 de 3 Así, si tenemos un valor c:clock, colour_at c i nos daría el color de c en el panel correspondiente al término i de la sucesión de Fibonacci. Por su parte, el valor all_white representaría un reloj con todos sus paneles en blanco (00:00). EJERCICIO 1: (a) Defina una función time_of_clock: clock -> time que indique la hora que corresponde a cada una de las posibles configuraciones del reloj. (b) Defina las funciones all_clocks_for_time: time -> clock list y a_clock_for_time: time -> clock , que den, respectivamente, para cada valor t: time tal que valid_time t = true, la lista de todas las posibles configuraciones del reloj correspondientes a esa hora, y una sola de ellas. Estas funciones deben ser coherentes con la definición de time_of_clock, en el sentido de que si normal_time t = true debe cumplirse time_of_clock (a_clock_for_time t) = rounded_time t time_of_clock (random_clock_for_time t ) = rounded_time t siendo random_clock_for_time la función definida por let random_clock_for_time t = let all = all_clocks_for_time t in let n = List.length all in List.nth all (Random.int n);; EJERCICIO 2: Si la librería graphics de OCaml está operativa en su sistema, puede utilizar el siguiente código para dibujar el reloj en la pantalla (no se olvide de cargar/enlazar con esta librería). La función open_clock : int -> clock -> unit, abre una ventana con un reloj del tamaño indicado (se recomiendan tamaños >= 10) y devuelve una procedimiento que dibuja en esa ventana cualquier configuración de reloj. El procedimiento close_clock: unit -> unit, permite cerrar la ventana creada con open_clock. open Graphics;; let colour = function W -> white | B -> blue | R -> red | G -> green;; type sq = {x:int; y:int; s: int};; let sq = Array.make 5 {x=0;y=0;s=0};; sq.(0) <- {x=2;y=3;s=1}; sq.(1) <- {x=2;y=4;s=1}; 2 de 3 sq.(2) <- {x=0;y=3;s=2}; sq.(3) <- {x=0;y=0;s=3}; sq.(4) <- {x=3;y=0;s=5};; let drawSquareS s i c = set_color c; let sq = sq.(i) in fill_rect (sq.x * s) (sq.y * s) (sq.s * s) (sq.s * s);; let drawlineS s () = let k = s in set_color black; set_line_width 2; for i = 0 to 4 do let sq = sq.(i) in draw_rect (sq.x * k) (sq.y * k) (sq.s * k) (sq.s * k) done;; let draw_clockS s (c:clock) = for i = 0 to 4 do drawSquareS s i (colour c.(i)) done; drawlineS s ();; let open_clock size = let st = " " ^ string_of_int (8 * size) ^ "x" ^ string_of_int (5 * size) in open_graph st; set_window_title "Fibonacci Clock"; drawlineS size (); draw_clockS size;; let close_clock () = close_graph ();; Utilizando este código, elabore un "reloj de escritorio" que muestre la hora y se actualice indefinidamente en una ventana X11. 3 de 3