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

Documentos relacionados