program CalendarioPerpetuo;
(* Calendario perpetuo.
* Calcola il giorno della settimana di una data.
* Nota: la data deve essere successiva al 1/01/1900
*)
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
{$IFDEF WINDOWS}{$R CalendarioPerpetuo.rc}{$ENDIF}
var g,m,a:integer;
giorni:longint; (*Usa longint perche' ha un intervallo di
rappresentabilita' maggiore di integer *)
i:integer;
bis:boolean;
(* Restituisce true se anno e' bisestile *)
function bisestile(anno:integer):boolean;
begin
bisestile := ((anno mod 4 = 0) and not (anno mod 100 = 0))
or (anno mod 400 = 0);
end;
(* Restituisce il numero di giorni in un mese.
* Il parametro bis indica se l'anno e' bisestile
*)
function giorniMese(mese:integer; bis:boolean):integer;
begin
case mese of
1: giorniMese:=31;
2: if bis then
giorniMese:=29
else
giorniMese:=28;
3: giorniMese:=31;
4: giorniMese:=30;
5: giorniMese:=31;
6: giorniMese:=30;
7: giorniMese:=31;
8: giorniMese:=31;
9: giorniMese:=30;
10: giorniMese:=31;
11: giorniMese:=30;
12: giorniMese:=31;
else
begin
writeln('ERRORE in giorniMese: mese=', mese);
end
end;
end;
function domanda(testo:string; l1,l2:integer):integer;
var x:integer;
ch:boolean;
begin
repeat
write(testo);
{$I-}
readln(x);
{$I+}
if IoResult<>0 then
begin
ch:=false;
writeln('Sono ammessi solo numeri interi');
end
else
begin
ch:=(x>=l1) and (x<=l2);
if not ch then writeln('I limiti ammessi vanno da ',l1,' a ',l2);
end;
until ch;
domanda:=x;
end;
(* Parte esecutiva del programma principale *)
begin
write('Inserisci la data (giorno mese anno): ');
writeln;
g:=domanda('Giorno ', 1, 31);
m:=domanda('Mese ', 1, 12);
a:=domanda('Anno ', 1900, 2500);
giorni:=0;
for i:=1900 to a-1 do
begin
giorni:=giorni+365;
if bisestile(i) then
giorni:=giorni+1;
end;
bis:=bisestile(a);
for i:=1 to m-1 do
giorni:=giorni + giorniMese(i, bis);
giorni := giorni + g-1;
write('Il gioeno e'': ');
case giorni mod 7 of
0: writeln('Lunedi''');
1: writeln('Martedi''');
2: writeln('Mercoledi''');
3: writeln('Giovedi''');
4: writeln('Venerdi''');
5: writeln('Sabato');
6: writeln('Domenica');
end;
readln;
end.