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

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 datoteke?

Sličnost: kod obje organizacije datoteke, ne treba se čitati zapis po zapis da bi se došlo do
željenog zapisa, već kod relativne organizacije adresu zapisa dobivamo i na nju se
pozicioniramo metodama seekg, seekp, tellg i tellp, te se na pojedini zapisa pozicioniramo na
način da pomnožimo redni broj zapisa sa veličinom pojedinog zapisa, a kod indeksne
organizacije, direktno uzimamo adresu zapisa koja se nalazi pored njegovog ključa, npr.
matičnog broja.
Razlike: Moguće je brže pretraživanje indeksno organiziranih datoteka u odnosu na relativno
organizirane. To je moguće zbog toga što se u datoteci nalaze samo ključevi zapisa i njihove
adrese te se njihovim sortiranjem omogućuje binarno pretraživanje datoteke koje je brže u
odnosu na slijedno pretraživanje koje se koristi kod relativno organiziranih datoteka.

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

Izračunavanje rednog broja zapisa (RBZ) na temelju vrijednosti ključa (K) i veličine datoteke
(u broju zapisa;VD):
– pronađe se prvi manji prim broj od veličine datoteke (PVD)
– RBZ = K % PVD
– upotreba prim broja reducira broj duplikata (zbog “okruglih” brojeva gdje bi
se neke vrijednosti često pojavljivale)
– ako je zapis na poziciji RBZ “zauzet” (duplikat), tada se traži prva prazna
pozicija u datoteci za upis
5. Čemu služi datoteka s „praznim“ zapisima?

6. Objasnite postupak binarnog pretraživanja indeksne datoteke.

Postupak: G
• utvrditi koliko je zapisa u indeksu (N) ore
• DOLJE=0, GORE=N
• ponavljati dok se ne nađe zapis ili
se ponovi vrijednost POZ:
• POZ=(DOLJE+GORE)/2
• pročitati zapis na poziciji POZ i provjeriti je li traženi Poz
• DA: pročitati zapis iz matične datoteke
• izlaz iz petlje
• ako je traženi zapis veći od pročitanog
• DOLJE=POZ inače
• GORE=POZ
Dolje N

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


datoteke.

Zapis datoteke robe: Zapis indeksne datoteke:

struct roba{ struct roba{


int sifra; int sifra;
char naziv[40]; int adresa;
float cijena; };
};

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

Omogućuje se pretraživanje datoteke po više ključeva. Npr. ako za datoteku robe imamo
jednu indeksnu datoteku sortiranu prema sifri proizvoda i jednu sortiranu prema nazivu
proizvoda, tada možemo uz pomoć jedne od njih pretraživati matičnu datoteku ili po šifri
proizvoda ili po nazivu.

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


fstream dat;
dat.open(„podaci.dat“, ios::in|ios::binary);
int brojac=0;
while(1){
dat.read((int*)&slog, sizeof(slog));
if (dat.eof()) break;
brojac++;
}
cout << „Broj zapisa u datoteci:“ << brojac << endl;
10. Pronađite uz pomoć indeksne datoteke godinu upisa studenata s
matičnim brojem 35000.
fstream dat;
fstream ind;
dat.open („studenti.dat“, ios::in|ios::binary);
ind.open („studenti.ind“, ios::in|ios::binary);
while(1) {
ind.read((char*)&indeks, sizeof(indeks));
if(ind.eof () )
break;
if(indeks.mat_br==35000) {
dat.seekg(indeks.adresa);
dat.read((char*) &student, sizeof(student));
cout<<“Godina upisa studenta: „<<student.god_upisa<<endl;
}
}
ind.close();
dat.close();

11. Pronađite uz pomoć indeksne datoteke naziv robe za šifru robe


32215.

fstream dat;
fstream ind;
dat.open(„roba.dat“, ios::in|ios::binary);
ind.open(„roba.ind“, ios::in|ios::binary);
while(1){
ind.read((char*)&indeks, sizeof(indeks));
if (ind.eof()) break;
if (indeks.sifra==32215){
dat.seekg(indeks.adresa);
dat.read((char*)&roba, sizeof(roba));
cout << „Naziv:“ << roba.naziv << endl;
}
}
ind.close();
dat.close();

12. Pronađite uz pomoć indeksne datoteke naziv predmeta za šifru


predmeta 32.
fstream dat;
fstream ind;
dat.open(„predmeti.dat“, ios::in|ios::binary);
ind.open(„predmeti.ind“, ios::in|ios::binary);
while(1){
ind.read((char*)&indeks, sizeof(indeks));
if (ind.eof()) break;
if (indeks.sifra==32){
dat.seekg(indeks.adresa);
dat.read((char*)&predmet, sizeof(predmet));
cout << „Naziv:“ << predmet.naziv << endl;
}
}
ind.close();
dat.close();

You might also like