{ File: camera.pas }

{ Scopo: uso di tipi intervallo e tipi enumerati }

program PrezzoCamera;
{ Legge una data e determina il prezzo di una camera stabilito in base alla
  stagione. }

type
  TipoGiorno   = 1..31;
  TipoMese     = 1..12;
  TipoStagione = (Primavera, Estate, Autunno, Inverno);

var
  giorno   : TipoGiorno;
  mese     : TipoMese;
  stagione : TipoStagione;

  function InStagione (g: TipoGiorno; m: TipoMese): TipoStagione;
  { Restituisce la stagione in cui ci si trova nella data g,m. }

    function PrecedeData (g1: TipoGiorno; m1: TipoMese;
                          g2: TipoGiorno; m2: TipoMese) : 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: TipoStagione);
  begin
    case s of
      Primavera : write('primavera');
      Estate    : write('estate');
      Autunno   : write('autunno');
      Inverno   : write('inverno');
    end { case }
  end; { StampaStagione }

  function Prezzo (s: TipoStagione): integer;
  begin
    case s of
      Primavera, Autunno : Prezzo := 150;
      Estate             : Prezzo := 200;
      Inverno            : Prezzo := 100;
    end { case }
  end; { Prezzo }

begin { PrezzoCamera }
  write('Data (giorno, mese) ? ');
  readln(giorno, mese);
  stagione := InStagione(giorno, mese);
  write('E'' in ');
  StampaStagione(stagione);
  writeln;
  writeln('Prezzo camera: ', Prezzo(stagione))
end. { PrezzoCamera }