Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Date: unità

Precedente
SUPERIORE
Successiva

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)]);
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.

Date: unità - ApPuNtIdIuNiNfOrMaTiCo

Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Precedente
SUPERIORE
Successiva