Ho trovato un algoritmo e te l'ho tradotto in Pascal. L'ho testato e funziona. Penso che per gli anni antecedenti il 1900 l'algoritmo non sia più valido a causa degli anni bisestili e delle riforme gregoriane.
codice:
Program CalcolaGiorno;
Uses Crt;
Type ListaGiorni = ARRAY[0..6] Of String;
Var days: ListaGiorni;
giorno: Integer;
mese: Integer;
meseX: Integer;
anno: Integer;
uno, due, tre, quattro, cinque, sei, sette: Integer;
Begin
ClrScr;
repeat
Write('Introducci giorno (1-31): ');
ReadLn(giorno);
until ((giorno > 0) AND (giorno < 32));
repeat
Write('Introduci mese (1-12): ');
ReadLn(mese);
until ((mese > 0) AND (mese < 13));
repeat
Write('Introduci anno (>1899): ');
ReadLn(anno);
until (anno > 1899);
days[0] := 'Sabato';
days[1] := 'Domenica';
days[2] := 'Lunedì';
days[3] := 'Martedì';
days[4] := 'Mercoledì';
days[5] := 'Giovedì';
days[6] := 'Venerdì';
if (mese = 1) then begin
meseX := 13;
anno := anno-1
end;
if (mese = 2) then begin
meseX := 14;
anno := anno-1
end;
uno := ((meseX + 1) * 3) div 5;
due := anno div 4;
tre := anno div 100;
quattro := anno div 400;
cinque := giorno + (meseX * 2) + uno + anno + due - tre + quattro + 2;
sei := cinque div 7;
sette := cinque - (sei * 7);
Writeln;
Writeln('Il giorno della settimana e'': ', days[sette]);
End.
Attenzione: non è proprio il massimo come programma... infatti è possibile inserire date inesistenti (come, ad esempio, il 31 febbraio) senza che faccia una piega; calcola lo stesso il giorno
E' sufficiente inserire qualche controllo ulteriore...
Ciao.