program Bosco;
const
MaxCoordX = 19;
MaxCoordY = 29;
type
TipoCoordinataX = 0..MaxCoordX;
TipoCoordinataY = 0..MaxCoordY;
TipoCoordinate = record
x : TipoCoordinataX;
y : TipoCoordinataY
end;
TipoRegione = record
coordinate : TipoCoordinate;
volpi, scoiattoli : 0..MAXINT
end;
TipoListaRegioni = ^TipoRecordLista;
TipoRecordLista = record
regione : TipoRegione;
next : TipoListaRegioni
end;
procedure SommaNumTaneArea (lista_regioni : TipoListaRegioni;
inferiore, superiore : TipoCoordinate;
var tot_volpi, tot_scoiattoli : integer);
function InArea (inf, sup, reg : TipoCoordinate): boolean;
begin
InArea := (inf.x <= reg.x) and (reg.x <= sup.x) and
(inf.y <= reg.y) and (reg.y <= sup.y)
end;
begin
tot_volpi := 0;
tot_scoiattoli := 0;
while lista_regioni <> NIL do
begin
if InArea(inferiore, superiore, lista_regioni^.regione.coordinate) then
begin
tot_volpi := tot_volpi + lista_regioni^.regione.volpi;
tot_scoiattoli := tot_scoiattoli + lista_regioni^.regione.scoiattoli
end;
lista_regioni := lista_regioni^.next
end
end;
procedure RegioniConTaneAnimale (lista_regioni : TipoListaRegioni;
animale : char;
var lista_sol : TipoListaRegioni);
var
paux : TipoListaRegioni;
num_tane : 0..MAXINT;
begin
lista_sol := NIL;
while lista_regioni <> NIL do
begin
if animale = 'V' then
num_tane := lista_regioni^.regione.volpi
else
num_tane := lista_regioni^.regione.scoiattoli;
if num_tane > 0 then
begin
new(paux);
paux^.regione := lista_regioni^.regione;
paux^.next := lista_sol;
lista_sol := paux
end;
lista_regioni := lista_regioni^.next
end
end;
procedure LeggiListaRegioni (nomefile : string; var lista: TipoListaRegioni);
var
f : text;
paux : TipoListaRegioni;
begin
assign(f, nomefile);
reset(f);
lista := NIL;
while not eof(f) do
begin
new(paux);
with paux^.regione do
readln(f, coordinate.x, coordinate.y, volpi, scoiattoli);
paux^.next := lista;
lista := paux
end;
close(f)
end;
procedure StampaListaRegioni (lista: TipoListaRegioni);
begin
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;
var
regioni, volpi_o_scoiattoli : TipoListaRegioni;
nomefile : string;
punto1, punto2 : TipoCoordinate;
num_volpi, num_scoiattoli : integer;
scelta : char;
begin
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);
StampaListaregioni(regioni);
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);
SommaNumTaneArea(regioni, punto1, punto2, num_volpi, num_scoiattoli);
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);
RegioniConTaneAnimale(regioni, scelta, volpi_o_scoiattoli);
writeln;
if scelta = 'V' then
writeln('Regioni con volpi:')
else
writeln('Regioni con scoiattoli:');
StampaListaRegioni(volpi_o_scoiattoli)
end.