UnitLeDate;
Interface
Type
TData = record
Giorno,
Mese,
Anno: Integer;
End;
DataErrore = Byte; {0..1}
procedure DataInit (var D: TData; G, M, A: Integer; var E: DataErrore);
procedure DataSplit( D: TData; var G, M, A: Integer );
procedure DataInc (var D: TData; P: Integer);
procedure DataDec (var D: TData; P: Integer);
function DateLen (D1, D2: TData): LongInt;
function DateComp (D1, D2: TData): ShortInt; {-1..1}
function DataDay ( D: TDATA): Byte; {0..6}
Implementation
Uses
Crt;
Const
MaxGiorni: array[1..12, FALSE..TRUE] of Byte = (
(31, 31), (28, 29), (31, 31), (30, 30), (31, 31), (30, 30),
(31, 31), (31, 31), (30, 30), (31, 31), (30, 30), (31, 31)
);
function AnnoBisestile(Anno: Integer): Boolean;
begin
AnnoBisestile:=(Anno Mod 4 = 0) And (Anno Mod 100 <> 0) Or (Anno Mod 400 = 0);
end;
function DataLegale(D: TData): Boolean;
var
G, M, A: Integer;
begin
DataSplit(D, G, M, A);
DataLegale:=(M >= 1) And (M <= 12) And (G >=1) And (G <= MaxGiorni[M, AnnoBisestile(A)]);
end;
procedure DataInit(var D: TData; G, M, A: Integer; var E: Byte);
Var
TempData: TDATA;
begin
TempData.Giorno:=G;
TempData.Mese:=M;
TempData.Anno:=A;
if(DataLegale(TempData)) then
begin
E:=0;
D:=TempData;
end
else
begin
E:=1;
end;
end;
procedure DataSplit(D: TData; var G, M, A: Integer);
begin
G:=D.Giorno;
M:=D.Mese;
A:=D.Anno;
end;
procedure DataInc1(var D: TData);
var
G, M, A: Integer;
E: DataErrore;
begin
DataSplit(D, G, M, A);
Inc(G);
if(G > MaxGiorni[M, AnnoBisestile(A)]) then
begin
G:=1;
Inc(M);
if(M = 13) then
begin
M:=1;
Inc(A);
end;
end;
DataInit(D, G, M, A, E);
end;
procedure DataDec1(var D: TData);
var
G, M, A: Integer;
E: DataErrore;
begin
DataSplit(D, G, M, A);
Dec(G);
if(G = 0) then
begin
Dec(M);
if(M = 0) then
begin
G:=31;
M:=12;
Dec(A);
end
else
G:=MaxGiorni[M, AnnoBisestile(A)];
end;
DataInit(D, G, M, A, E);
end;
procedure DataInc(var D: TData; P: Integer);
var
I: Integer;
begin
for I:=1 to P do
DataInc1(D);
end;
procedure DataDec(var D: TData; P: Integer);
var
I: Integer;
begin
for I:=1 to P do
DataDec1(D);
end;
function DateLen(D1, D2: TData): LongInt;
var
R: LongInt;
begin
R:=0;
case DateComp(D1, D2) of
-1: repeat
DataInc1(D1);
Inc(R);
until(DateComp(D1, D2) = 0);
0: ;
1: repeat
DataDec1(D1);
Dec(R);
until(DateComp(D1, D2) = 0);
end;
DateLen:=R;
end;
function DateComp(D1, D2: TData): ShortInt;
var
G1, M1, A1, G2, M2, A2: Integer;
begin
DataSplit(D1, G1, M1, A1);
DataSplit(D2, G2, M2, A2);
if(A1 < A2) Or
(A1 = A2) And (M1 < M2) Or
(A1 = A2) And (M1 = M2) And (G1 < G2) then
DateComp:=-1
else if (A1 = A2) And (M1 = M2) And (G1 = G2) then
DateComp:=0
else
DateComp:=+1;
end;
{* il 4/1/1998 è DOMENICA, quindi... *}
function DataDay(D: TData): Byte;
Const
DataRif: TData = (giorno: 4; mese: 1; anno: 1998);
var
Len: ShortInt;
begin
Len:=DateLen(DataRif, D) Mod 7;
if(Len < 0) then
Len:=Len+7;
DataDay:=Len;
end;
Begin
writeln('ADT data. Anno 2003');
End. |