{ File: albergo.pas }

{ Scopo: driver per esercizio di esame }

program Albergo;
{ Esercizio di esame di Fondamenti di Informatica del 15/2/1999.
  Dichiarazioni di tipo, procedure ausiliarie e programma driver. }

const
  LungCodice = 5;
  LungNome   = 10;

type
  TipoCamera = (singola,doppia);
  TipoCodice = packed array [1..LungCodice] of char;
  TipoNome   = packed array [1..LungNome] of char;
  TipoData   = record
                 giorno : 1..31;
                 mese   : 1..12;
                 anno   : 0..MAXINT
               end;     

  TipoPrenotazione = record
                       codice        : TipoCodice;
                       cognome, nome : TipoNome;
                       camera        : TipoCamera;
                       tariffa       : 0..MAXINT;
                       data_arrivo,
                       data_partenza : TipoData
                     end;

  TipoFilePrenotazioni = file of TipoPrenotazione;

  TipoListaPresenze  = ^TipoRecordPresenza;
  TipoRecordPresenza = record
                         prenotazione : TipoPrenotazione;
                         next         : TipoListaPresenze
                       end;           

  TipoSoggiorno = record
                    cognome, nome    : TipoNome;
                    numero_soggiorni : 0..MAXINT
                  end;
  TipoListaSoggiorni  = ^TipoRecordSoggiorno;
  TipoRecordSoggiorno = record
                          soggiorno : TipoSoggiorno;
                          next      : TipoListaSoggiorni
                        end;

  TipoNomeFile = string;

{ Inserire in questo punto la dichiarazione della procedura o funzione che
  risolve il punto 2. }


{ Inserire in questo punto la dichiarazione della procedura o funzione che
  risolve il punto 3. }


{ procedure ausiliarie usate dal programma driver }

  procedure LeggiPresenze (nome_file: TipoNomeFile;
                           var presenze: TipoListaPresenze);
  { Legge dal file di TESTO nome_file i dati relative alle prenotazioni e
    ne costruisce in memoria una lista che restituisce in presenze. }
  var
    f    : text;
    paux : TipoListaPresenze;
    i    : integer;
    ch   : char;
  begin
    assign(f, nome_file);
    reset(f);
    presenze := NIL;
    while not eof(f) do
    begin                         { legge un elemento e lo inserisce in testa }
      new(paux);
      with paux^.prenotazione do
      begin
        for i := 1 to LungCodice do read(f,codice[i]); readln(f);
        for i := 1 to LungNome do read(f,cognome[i]); readln(f);
        for i := 1 to LungNome do read(f,nome[i]); readln(f);
        readln(f,ch);
        if ch = 'S' then
          camera := singola
        else
          camera := doppia;
        readln(f,tariffa);
        with data_arrivo do
          readln(f,giorno, mese, anno);
        with data_partenza do
          readln(f,giorno, mese, anno);
        readln(f)
      end;
      paux^.next := presenze;
      presenze := paux
    end;
    close(f)
  end; { LeggiPresenze }


  procedure ScriviPresenze (nome_file: TipoNomeFile;
                            presenze: TipoListaPresenze);
  { Scrive sul file di RECORD nome_file i dati relative alle prenotazioni
    contenute nella lista presenze. }
  var
    f : TipoFilePrenotazioni;
  begin
    assign(f, nome_file);
    rewrite(f);
    while presenze <> NIL do
    begin
      write(f,presenze^.prenotazione);
      presenze := presenze^.next
    end;
    close(f)
  end; { ScriviPresenze }


  procedure CancellaLista (var l: TipoListaPresenze);
  var
    paux : TipoListaPresenze;
  begin
    while l <> NIL do
    begin
      paux := l;
      l := l^.next;
      dispose(paux)
    end
  end; { CancellaLista }


  procedure StampaSoggiorni (soggiorni: TipoListaSoggiorni);
  begin
    writeln('Cognome   ', 'Nome      ', 'Soggiorni');
    while soggiorni <> NIL do
    begin
      with soggiorni^.soggiorno do
        writeln(cognome, nome, numero_soggiorni);
      soggiorni := soggiorni^.next
    end
  end; { StampaSoggiorni }


{ variabili usate nel programma principale }
var
  nome_file_presenze : TipoNomeFile;
  file_prenotazioni  : TipoFilePrenotazioni;
  file_archivio      : TipoFilePrenotazioni;
  data_odierna       : TipoData;
  lista_presenze     : TipoListaPresenze;
  lista_soggiorni    : TipoListaSoggiorni;

begin { Albergo }
  { genera il file di record PRENOT.DAT a partire dal file di testo
    PRENOT.TXT }
  LeggiPresenze('PRENOT.TXT', lista_presenze);
  ScriviPresenze('PRENOT.DAT', lista_presenze);
  CancellaLista(lista_presenze);

  { genera il file di record ARCHIVIO.DAT a partire dal file di testo
    ARCHIVIO.TXT }
  LeggiPresenze('ARCHIVIO.TXT', lista_presenze);
  ScriviPresenze('ARCHIVIO.DAT', lista_presenze);
  CancellaLista(lista_presenze);

  writeln('Immettere il nome del file di testo contenente le presenze! ');
  readln(nome_file_presenze);
  LeggiPresenze(nome_file_presenze, lista_presenze);
  writeln('Immettere la data odierna (gg mm aaaa)!');
  with data_odierna do
   readln(giorno, mese, anno);
  writeln;

  { Inserire in questo punto una opportuna attivazione della procedura o
    funzione che risolve il punto 2, a cui vengono passati i seguenti parametri
    attuali:
      - la stringa 'PRENOT.DAT' che rappresenta il nome del file delle
        prenotazioni,
      - la variabile data_odierna, che rappresenta la data odierna,
      - la variabile lista_presenze, che rappresenta la lista delle presenze.
  }

  { Inserire in questo punto una opportuna attivazione della procedura o
    funzione che risolve il punto 3, a cui vengono passati i seguenti parametri
    attuali:
      - la stringa 'ARCHIVIO.DAT' che rappresenta il nome del file archivio,
      - la variabile lista_presenze, che rappresenta la lista delle presenze,
    e che restituisce
      - nella variabile lista_soggiorni la lista in uscita.
  }

  { Stub per la procedura che risolve il punto (3)
  new(lista_soggiorni);
  with lista_soggiorni^ do
  begin
    next := NIL;
    soggiorno.cognome := 'Rossi     ';
    soggiorno.nome := 'Mario     ';
    soggiorno.numero_soggiorni := 5
  end;
  }

  StampaSoggiorni(lista_soggiorni)

end. { Albergo }