Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 4

By hess © 2006.

1. Objasnite relativnu organizaciju datoteke.


Svaki zapis u datoteci ima svoju adresu, izraženu u broju bajtova od početka datoteke. U
slučaju datoteke s fiksnom veličinom zapisa, adresa pojedinog zapisa predstavlja
umnožak rednog broja zapisa i veličine zapisa. Metode za rad s datotečnim pokazivačem
(seekg,seekp,tellg i tellp) omogućuju prekorednu obradu, odnosno, moguće je odrediti
poziciju u datoteci gdje se može izvršiti operacija čitanja/upisa. Kod relativne
organizacije datoteke pojedini zapis možemo pročitati, ako znamo gdje je u datoteci
upisan, što se postiže tako da se adresa pojedinog zapisa izračuna na temelju vrijednosti
ključa.

2. Objasnite indeksnu organizaciju datoteke.


Indeks je pomoćna struktura koja omogućuje pronalaženje adresa pojedinih zapisa u
matičnoj datoteci na temelju vrijednosti ključa. Za svaki zapis u matičnoj datoteci postoji
odgovarajući zapis u indeksu koji sadrži dva podatka: vrijednost ključa i adresu zapisa u
matičnoj datoteci. Jedna matična datoteka može imati više pridruženih indeksa.
Sortiranjem indeksa omogućuje se primjena binarnog pretraživanja (brže od slijednog
pretraživanja).

3. Koje su sličnosti, odnosno razlike između relativne i indeksne organizacije dat.?


Indeksne se dat sastoje od dava dijela – osnovnog skupa logičkih zapisa i indeksa.
Osnovni skup je zapravo slijedno zapisana datoteke (zapisi se zapisuju jedan do
drugoga), dok je indeks pomočna dat koja se sastoji od niza uređenih parova koji
predstavljaju ključ i adresu zapisa u osnovnom skupu. Indeksnu dat možemo pretraživati
slijedno, ali najčešće se obrađuuje izravno.
Kod relativnih datoteka zapisima pristupamo izravno. Postoji samo osnovni skup zapisa,
koji nije zapisan slijedno, već su svi zapisi raspršeni, a pristupamo im pomoću ključa koji
se pomoću određenog algoritma transformira u adresu. Iako su relativne datoteke brže od
indeksnih, kad je riječ o pronalaženju zapisa, loša im je strana rastrošnost prostora,
pojava zapisa sinonima te nemogućnost slijedne obrade.

4. Objasnite metodu s prim brojevima za izračunavanje adrese zapisa.


Ova metoda se rabi za određivanje adrese zapisa kod relativnih datoteka. Nakon
određivanja limita datoteke, ključevi se modulno dijele s prim brojem koji će dati interval
i raspršenje ostatka dijeljenja (n-1). Ako, npr. želimo kreirati datoteku od 8 zapisa, ostatak
dijeljenja bilo kojeg brojčanog ključa s prim brojem 7 (najbliži) uvećan za jedan može
biti 1,2,3,4,5,6 ili 7, a to su potencijalne adrese. Adresa je ostatak djeljenja uvećan za
jedan jer bi za slučaj djeljivosti ključa bez ostatka adresa bila nula, a nulti zapis ne
postoji.

5. Čemu služi datoteka s "praznim" zapisima?

6. Objasnite postupak binarnog pretraživanja indeksne datoteke.


Moramo definirati ključ prema kojem ćemo izvršiti pretragu po datoteci. Inicijaliziramo
varijablu N, te varijable GORE, DOLJE I POZ koje nam služe za kretanje kroz zapise u
datoteci. Zatim moramo utvrditi koliko zapisa već postoji u datoteci, a ukoliko ona ne
postoji korisniku vračamo „grešku“. Zatim pomoću seekg postavimo pokazivač za čitanje
By hess © 2006.

na kraj zadnjeg zapisa u datoteci te pomoću tellg njegovu vrijednost podijelimo s


veličinom pojedinog zapisa te dobijemo ukupan broj zapisa koji onda spremimo u N.
Varijablu DOLJE postavimo na 0, a GORE na N. Pokrećemo beskonačnu petlju koja se
prekida u slučaju da je POZ jednak polovini sume varijabla GORE i DOLJE. Za to
vrijeme sumu varijabla GORE i DOLJE dijelimo sa 2 te rezultat spremamo u POZ te
njegovim umnoškom s veličinom pojedinog zapisa pomoću seekg postavljamo pokazivač
na mjesto s kojeg ćemo čitati ključ.Provjeravamo da li je ključ zapisan u indeksnoj
datoteci jednak onome kojeg korisnik traži, te u slučaju uspješnog pronalaska vračamo
adresu u matičnoj datoteci. Ukoliko je ključ u indeksnoj datoteci manji od traženog
DOLJE postavljamo u POZ, inače GORE postavljamo u POZ. Ukoliko podatak nije
pronađen vračamo „grešku“ korisniku.

7. Definirajte zapis datoteke robe i zapis odgovarajuće indeksne datoteke.


struct timenik{
int rb_zapisa;
int sifra;
char naziv_robe[35];
int kolicina_na_skladisu;
char datum_proizvodnje[11];
}; //glavna datoteka

struct tindeks{
int rb_zapisa;
int sifra;
};

8. Što se postiže time da matična datoteka ima više pridruženih indeksa?


Time postižemo veće mogućnosti pretrage glavne datoteke. Npr., možemo imati indeksnu
datoteku sortiranu prema matičnom broju studenta i još jednu prema imenima i
prezimenima. Tako nam je omogućeno pretraživanje glavne datoteke, koja ima mnoštvo
atributa za svaki zapis (u ovom slučaju za svakog studenta), pomoću matičnog broja, ili
pak pomoću imana i prezimena, dok bi u soprotnom bili ograničeni na uporabu samo
jednog atributa(ključa) kod pretraživanja.

9. Utvrdite broj zapisa tipa int u datoteci "podaci.dat“.

(slijedeća tri programa su gotovo identična => razlikuju se jedino u par naziva varijabli)
10. Pronađite uz pomoć indeksne datoteke godinu upisa studenata s matičnim
brojem 35000.
struct tstudent {
int mat_br, poz, god_upisa; char ime[35]; //i drugi atributi };
struct tideks {
int mat_br, poz };
void main() {
fstream dat; fstream ind;
tstudent student; tindeks indeks;
By hess © 2006.

bool nadjen=false;
dat.open ("studenti.dat",ios::in|ios::binary);
ind.open ("studenti.ind",ios::in|ios::binary);
while (1) {
ind.read ((char *)&indeks, sizeof(tindeks)); //pretraživanje indeksa
if (ind.eof()) break;
if (indeks.mat_br==35000){ // ako je tel. broj nađen
dat.seekg(indeks.poz);
dat.read ((char *)&student, sizeof(tstudent));
nadjen=true;
cout << "Godina upisa je " << student.god_upisa<< endl;
break;
}//if
}//while
dat.close();
ind.close();
if (!nadjen) cout << "Zapis nije pronadjen!" << endl;
}

11. Pronađite uz pomoć indeksne datoteke naziv robe za šifru robe 32215.
struct troba {
int sifra, poz; char naziv[35]; //i drugi atributi };
struct tideks {
int sifra, poz };
void main() {
fstream dat; fstream ind;
troba roba; tindeks indeks;
bool nadjen=false;
dat.open ("roba.dat",ios::in|ios::binary);
ind.open ("roba.ind",ios::in|ios::binary);
while (1) {
ind.read ((char *)&indeks, sizeof(tindeks)); //pretraživanje indeksa
if (ind.eof()) break;
if (indeks.sifra==32215){ // ako je tel. broj nađen
dat.seekg(indeks.poz);
dat.read ((char *)&roba, sizeof(troba));
nadjen=true;
cout << "Naziv za predmet 32215 je " << roba.naziv << endl;
break;
}//if
}//while
dat.close();
ind.close();
if (!nadjen) cout << "Zapis nije pronadjen!" << endl;
}
By hess © 2006.

12. Pronađite uz pomoć indeksne datoteke naziv predmeta za šifru predmeta 32.
struct tpredmeti {
int sifra, poz; char naziv[35]; //i drugi atributi };
struct tideks {
int sifra, poz };
void main() {
fstream dat; fstream ind;
tpredmeti predmet; tindeks indeks;
bool nadjen=false;
dat.open ("predmeti.dat",ios::in|ios::binary);
ind.open ("predmeti.ind",ios::in|ios::binary);
while (1) {
ind.read ((char *)&indeks, sizeof(tindeks)); //pretraživanje indeksa
if (ind.eof()) break;
if (indeks.sifra==32){ // ako je tel. broj nađen
dat.seekg(indeks.poz);
dat.read ((char *)&predmet, sizeof(tpredmeti));
nadjen=true;
cout << "Naziv za predmet 32 je " << predmet.naziv << endl;
break;
}//if
}//while
dat.close();
ind.close();
if (!nadjen) cout << "Zapis nije pronadjen!" << endl;
}

You might also like