{ File: stagioni.pas }

{ Scopo: uso di tipi intervallo e tipi enumerati }

program DeterminaStagione;
{ Legge una data e determina la stagione. }

type
  Giorni   = 1..31;
  Mesi     = 1..12;
  Stagioni = (Primavera, Estate, Autunno, Inverno);

var
  giorno   : Giorni;
  mese     : Mesi;

  function InStagione (g: Giorni; m: Mesi) : Stagioni;
  { Restituisce la stagione in cui ci si trova nella data g,m. }

    function PrecedeData (g1: Giorni; m1: Mesi;
                          g2: Giorni; m2: Mesi) : boolean;
    { Restituisce TRUE se la data g1,m1 precede la data g2,m2
      e FALSE altrimenti. }
    begin
      PrecedeData := (m1 < m2) or ((m1 = m2) and (g1 < g2))
    end; { PrecedeData }

  begin { InStagione }
    if PrecedeData(g,m,21,3) or PrecedeData(20,12,g,m) then
      InStagione := Inverno
    else if PrecedeData(g,m,21,6) then
      InStagione := Primavera
    else if PrecedeData(g,m,21,9) then
      InStagione := Estate
    else
      InStagione := Autunno
  end; { InStagione }

  procedure StampaStagione (s: Stagioni);
  begin
    case s of
      Primavera : write('primavera');
      Estate    : write('estate');
      Autunno   : write('autunno');
      Inverno   : write('inverno');
    end { case }
  end; { StampaStagione }

begin { DeterminaStagione }
  write('Data (giorno, mese) ? ');
  readln(giorno, mese);
  write('E'' in ');
  StampaStagione(InStagione(giorno, mese));
  writeln
end. { DeterminaStagione }