{ File: bosco.pas }

{ Scopo: driver per esercizio sull'uso di liste collegate }

program Bosco;
{ Esercizio di esame di Fondamenti di Informatica del 19/2/1997.
  Dichiarazioni di tipo, procedure ausiliarie e programma driver. }

const
  MaxCoordX = 19;
  MaxCoordY = 29;

type
  TipoCoordinataX  = 0..MaxCoordX;
  TipoCoordinataY  = 0..MaxCoordY;
  TipoCoordinate   = record
                       x : TipoCoordinataX;
                       y : TipoCoordinataY
                     end;
  TipoRegione      = record
                       coordinate        : TipoCoordinate;   { della regione }
                       volpi, scoiattoli : 0..MAXINT  { numero di tane di volpi
                                                        e di scoiattoli }
                     end;

  TipoListaRegioni = ^TipoRecordLista;
  TipoRecordLista  = record
                       regione : TipoRegione;
                       next    : TipoListaRegioni
                     end;


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


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


{ procedure ausialiarie usate dal programma driver }

  procedure LeggiListaRegioni (nomefile : string; var lista: TipoListaRegioni);
  { Legge dal file di testo nomefile le informazioni riguardo al numero di tane
    nelle regioni del bosco.
    Assume che il file termini con l'ultima cifra del numero di tane di
    scoiattolo nell'ultima regione del bosco che e` stata censita. }
  var
    f    : text;
    paux : TipoListaRegioni;

  begin { LeggiListaTane }
    assign(f, nomefile);
    reset(f);
    lista := NIL;
    while not eof(f) do
    begin                { esegue l'inserimento in testa di un nuovo elemento }
      new(paux);
      with paux^.regione do      { lettura delle informazioni per una regione }
        readln(f, coordinate.x, coordinate.y, volpi, scoiattoli);
      paux^.next := lista;
      lista := paux
    end;
    close(f)
  end; { LeggiListaRegioni }


  procedure StampaListaregioni (lista: TipoListaRegioni);
  { Stampa su video le informazioni riguardo al numero di tane in lista. }
  begin { StampaListaTane }
    writeln('X':4, 'Y':4, 'volpi':7, 'scoiattoli':12);
    while lista <> NIL do
    begin
      with lista^.regione do
        writeln(coordinate.x:4, coordinate.y:4, volpi:7, scoiattoli:12);
      lista := lista^.next
    end
  end; { StampaListaregioni }


{ variabili usate nel programma principale }
var
  regioni, volpi_o_scoiattoli : TipoListaRegioni;
  nomefile : string;         { nome del file contenente le informazioni sulle
                               regioni censite del bosco }
  punto1, punto2 : TipoCoordinate;        { coordinate dei due punti che
                                            identificano un'area di bosco }
  num_volpi, num_scoiattoli : integer;    { numero totale di tane di volpi e di
                                            scoiattoli nell'area di bosco }
  scelta : char;       { carattere usato per scegliere tra volpi e scoiattoli }


begin { Bosco }

  { Lettura delle informazioni sul numero di tane da file. }
  writeln('Immetti il nome del file dal quale leggere le informazioni sulle regioni!');
  writeln('(N.B. Il file deve gia'' esitere)');
  readln(nomefile);
  LeggiListaRegioni(nomefile, regioni);          { lettura da file }
  StampaListaregioni(regioni);                   { stampa di conferma }


  { Lettura delle coordinate dei punti che identificano una regione. }
  writeln('Immettere le coordinate del punto in alto a sinistra della regione!');
  writeln('(prima coordinata tra 0 e ', MaxCoordX,
          ' e seconda coordinata tra 0 e ', MaxCoordY, ')');
  readln(punto1.x, punto1.y);

  writeln('Immettere le coordinate del punto in basso a destra della regione!');
  writeln('(prima coordinata tra 0 e ', MaxCoordX,
          ' e seconda coordinata tra 0 e ', MaxCoordY, ')');
  readln(punto2.x, punto2.y);

  { Inserire in questo punto una opportuna attivazione della procedura o
    funzione che risolve il punto 1,
    - prendendo in ingresso la lista regioni e le due coppie di coordinate in
      punto1 e punto2 che identificano un'area di bosco e
    - restituendo il risultato nelle variabili num_volpi e num_scoiattoli }

  { le seguenti istruzioni sono state usate per testare il driver: }
{ num_volpi := 20;
  num_scoiattoli := 30; }

  { stampa del risultato dell'attivazione della procedura o funzione 1 }
  writeln;
  writeln('Nella regione (', punto1.x, ',', punto1.y, ') - (', punto2.x, ',',
          punto2.y, ') ci sono ', num_volpi, ' volpi e ', num_scoiattoli,
          ' scoiattoli');

  writeln;
  writeln('Costruzione della lista di regioni con tane di volpi o di scoiattoli?');
  write('Digitare ''V'' per volpi e ''S'' per scoiattoli! ');
  readln(scelta);

  { Inserire in questo punto una opportuna attivazione della procedura o
    funzione che risolve il punto 2,
    - prendendo in ingresso la lista regioni e il carattere scelta e
    - restituendo il risultato nella variabile volpi_o_scoiattoli }

  { la seguente istruzione e` stata usata per testare il driver: }
{ volpi_o_scoiattoli := regioni; }

  { stampa del risultato dell'attivazione della procedura o funzione 2 }
  writeln;
  if scelta = 'V' then
    writeln('Regioni con volpi:')
  else
    writeln('Regioni con scoiattoli:');
  StampaListaTane(volpi_o_scoiattoli)

end. { Bosco }