Gestione di un archivio Hash di una libreria

Materie:Appunti
Categoria:Informatica
Download:117
Data:11.01.2001
Numero di pagine:5
Formato di file:.doc (Microsoft Word)
Download   Anteprima
gestione-archivio-hash-libreria_1.zip (Dimensione: 39.32 Kb)
trucheck.it_gestione-di-un-archivio-hash-di-una-libreria.doc     61.5 Kb
readme.txt     59 Bytes


Testo

Relazione d’Informatica
Programma per la gestione di un archivio Hash di una libreria

Descrizione del problema: dopo aver richiesto all’utente di inserire i dati d’alcuni libri, questi devono essere memorizzati in un file su disco e successivamente visualizzati. Per la gestione dei dati si utilizza l’indicizzazione hash e non quella sequenziale.

Obiettivi da raggiungere: l’obiettivo di questo programma è di creare, diversamente da quanto effettuato fino ad ora, un archivio permanente su disco e non in memoria centrale: in questo modo è possibile modificare le informazioni memorizzate successivamente senza la perdita di dati dovuta alla volatilità della memoria Ram. Inoltre i dati non sono memorizzati sequenzialmente ma attraverso l’indicizzazione effettuata tramite il codice hash.

Specifiche hardware: l’utilizzo del metodo hash per la memorizzazione delle informazioni è molto utile poiché non è più necessario percorrere tutte le informazioni per ricercare il dato desiderato bensì, grazie ad un indice, il dato è immediatamente reperibile. Il file ha la capacità di contenere 30 libri suddivisi in 23 nell’area primaria e 7 nell’area d’overflow. In questo modo possiamo gestire al meglio l’area primaria ma, soprattutto, l’area dei sinonimi.
Infatti la funzione hash consiste nel dividere il codice del libro per 23 (numero primo per cui limita l’apparire dei sinonimi) ed il resto della divisione è utilizzato come indice nel file. La struttura dati è formata da un record composto dal campo codice (integer di 2 bytes che può variare nel nostro caso da 1 a 500) e dal titolo del libro formato da una stringa di 50 caratteri (che occupa 50 bytes per i caratteri ed 1 byte per la lunghezza). Il record occupa totalmente 53 bytes ed il file, essendo di 30 posizioni occupa 1590 bytes.

Tracciato record:

Funzioni utilizzate: il programma è composto da alcune procedure e funzioni oltre al main. La funzione hash fa ritornare l’indice in cui dovrà essere memorizzato il libro (l’indice è dato dal resto della divisione del codice per 23); la procedura carica ha il compito solamente di caricare i dati del libro nella variabile temp2 per essere poi utilizzati successivamente; la funzione test ritorna vera se la posizione puntata dall’indice è vuota (altrimenti bisognerà utilizzare la zona d’overflow).

Limiti del programma: il programma è in grado di gestire al massimo 30 libri ed un minimo di 8 libri:se per esempio viene inserito un libro nell’area primaria ed i 7 libri successivi sono tutti sinonimi (caso molto raro), il file potrà contenere soltanto 8 libri. Il programma non controlla se effettivamente non è più possibile inserire libri ma si limita ad aspettare che l’utente termini l’inserimento dei libri. Questo programma non è in grado di effettuare la cancellazione e la ricerca di un determinato libro: per queste due procedure bisognerebbe mettere un menù alla partenza del programma in modo da favorire l'utente nelle varie procedure.

Listato del programma:

Program libri;
uses crt,dos;
type libro=record
codice:integer; {1-500}
titolo:string[50];
end;
var archivio:file of libro;
temp2,temp:libro;
risp:char;
i:integer;

function hash(temp2:libro):integer;
begin
hash:=temp2.codice mod 23; {Il valore ritornante di hash sarà il puntatore alla posizione}
end;

procedure carica(var temp2:libro);
begin
with temp2 do
begin
write('Inserisci il codice = ');
readln(codice);
write('Inserisci il titolo = ');
readln(titolo);
end;
end;

function test(temp2:libro):boolean;
begin
seek(archivio,hash(temp2)); {Se la posizione puntata da hash è libera il dato verrà poi scritto qui}
read(archivio,temp); {altrimenti andrà nella zona di overflow}
if temp.codice=0 then test:=true
else test:=false;
end;

begin
clrscr;
assign(archivio,'c:\libridir.dat'); {Assegno una variabile logica ad un file fisico su hard-disk. Ora}
rewrite(archivio); {utilizzerò solamente la variabile. Soprascriviamo il file e portiamo}
with temp do {il filepos a 0}
begin
codice:=0;
titolo:='';
end; {Devo creare le 30 posizioni altrimenti non posso spostarmi nel file}
for i:=0 to 29 do
begin
write(archivio,temp);
end;
repeat
carica(temp2);
if test(temp2)=true then
begin
seek(archivio,hash(temp2)); {Se la posizione è libera scrivo il dato}
write(archivio,temp2);
end
else
begin
i:=23; {Altrimenti controllo la prima posizione libera nell’area}
repeat {d’overflow (accesso sequenziale) che parte dalla posizione 23}
seek(archivio,i);
read(archivio,temp);
if temp.codice=0 then
begin
seek(archivio,i); {Devo sempre eseguire il seek perchè il read mi}
write(archivio,temp2); {modifica il filepos}
end
else i:=i+1;
until temp.codice=0;
end;
write('Vuoi inserire ancora ? ');
readln(risp);
until (risp='n') or (risp='N');
for i:=0 to 29 do
begin {Visualizzo l’intero file}
seek(archivio,i);
read(archivio,temp);
writeln(' ');
writeln('Posizione = ',i);
writeln('Codice = ',temp.codice);
writeln('Titolo = ',temp.titolo);
readln;
end;
close(archivio); {Chiudo e salvo il file}
end.

Manuale utente: per l’utilizzo del programma l’utente dovrà solamente inserire i dati relativi ai libri. Successivamente il programma effettuerà una stampa di tutti i libri inseriti. L'utente non dovrà eseguire altri comandi ma si limiterà semplicemente a fare questo.

Michele Saldini

Esempio