Analisi
…
Unità
Unit LeDate; 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)]); Rnd; 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 Eegin 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.
Test
Program DATE_TEST; Uses Crt, LEDATE; Procedure DataLeggi(var D: TData); Var G, M, A: Integer; E: DataErrore; Begin Repeat Readln(G); Readln(M); Readln(A); DataInit(D, G, M, A, E); Until(E = 0); End; Procedure DataScrivi(D: TData); Var G, M, A: Integer; Begin DataSplit(D, G, M, A); Write(G, '/', M, '/', A); End; Const GG: Integer = 1; MM: Integer = 1; AA: Integer = 1990; PP: Integer = 10; Var D1, D2: TDATA; EE : DataErrore; SCELTA: Integer; Begin DataInit(D1, GG, MM, AA, EE); DataInit(D2, GG, MM, AA, EE); Repeat ClrScr; Write ('D1: '); DataScrivi(D1); Writeln; Write ('D2: '); DataScrivi(D2); Writeln; Writeln('EE: ', EE); Writeln; Writeln(' 0: Uscita'); Writeln; Writeln('1/11: DataInit(D1/2, GG, MM, AA)'); Writeln('2/22: DataLeggi(D1/2) '); Writeln('3/33: DataScrivi(D1/2) '); Writeln('4/44: DataIncrementaPeriodo(D1/2, PP)'); Writeln('5/55: DataDecrementaPeriodo(D1/2, PP)'); Writeln; Writeln(' 6: DateDistanza(D1, D2)'); Writeln(' 7: DateConfronta(D1, D2) '); Writeln(' 10: DataDay(D1)'); Writeln; Writeln(' 81: GG=', GG, ' 82: MM=', MM, ' 83: AA=', AA, ' 84: PP=', PP); Writeln; Write ('Scegli '); Readln(SCELTA); Case SCELTA Of 1: DataInit(D1, GG, MM, AA, EE); 11: DataInit(D2, GG, MM, AA, EE); 2: DataLeggi(D1); 22: DataLeggi(D2); 3: DataScrivi(D1); 33: DataScrivi(D2); 4: DataInc(D1, PP); 44: DataInc(D2, PP); 5: DataDec(D1, PP); 55: DataDec(D2, PP); 6: write(DateLen(D1, D2)); 7: write(DateComp(D1, D2)); 10: Case DataDay(D1) of 0: Write('Domenica'); 1: Write('Lunedì'); 2: Write('Martedì'); 3: Write('Mercoledì'); 4: Write('Giovedì'); 5: Write('Venerdì'); 6: Write('Sabato'); Else Write('Boh!'); End; 81: Readln(GG); 82: Radln(MM); 83: Readln(AA); 84: Readln(PP); End; Gotoxy(25, 25); Write('Invio...'); Readln; Until(SCELTA = 0); End.