STRUKTURE PODATAKA I PROGRAMA - …. semestar/Operacijski... · STRUKTURE PODATAKA I PROGRAMA...
Transcript of STRUKTURE PODATAKA I PROGRAMA - …. semestar/Operacijski... · STRUKTURE PODATAKA I PROGRAMA...
STRUKTURE PODATAKA I PROGRAMA
Općenito u računarskom sustavu na najnižoj razini programski gledano postoje:
procedure
elementarneoperacije
sklopovi
nizovi elementarnihoperacija
Slika 1:
1. Elementarne operacije
Najjednostavnija računarska arhitektura prikazana je na slici 2.
Memorija: skup memorijskih lokacija duljine n
bitova.
Primjer: (8 bitovni procesor npr. 8k x 8 bita).
(16 bitovni procesor npr. 8k x 16 bita).
Procesor: sprava napravljena da ponavlja
ciklus izvođenja elementarnih
operacija.
Procesor izvodi:
ponavljaj
dohvati naredbu;
dekodiraj naredbu;
dohvati operande;
obavi operaciju;
do zaustavljanja
Procesor obavlja elementarne operacije nad operandima (podacima).
Razlikuju se:
elementarni tipovi podataka,
složeni tipovi podataka,
dinamičke strukture podataka.
memorija
procesor
2. Elementarni tipovi podataka
niz bitova,
prirodan broj (npr. 1001 1110 = 9E = 159),
cijeli broj, prikazan u dvostrukom komplementu,
1010 0111 = -(39+1)=-40
0 101 1000 = 88
predznak -predznak +
101 1000
+
1
realni broj,
0 0111 1111 = 2.000000
mantisa
111 1111 1111 1111 1111 1111
eksponentpredznak
2 0031 30 23 022
Kod realnog broja mantisa od 23 bita normalizira se na broj 2 tj. sve jedinice su broj 2.
Kako je mantisa normalizirana MSB je uvjek jedan pa ga nije potrebno pisati pa je
praktički mantisa 0xFFFFFF broj 2 odnosno broj s kojim se normalizira. Tako je:
0 0111 1111 = 1.000000
mantisa
000 0000 0000 0000 0000 0000
eksponentpredznak
2 00
31 30 23 022
1
ova znamenka se ne unosi
Eksponent 7F 20 pa se eksponent računa prema izrazu 2
7F+exp. Tako je npr. broj 10
prikazan kao 1.2523 tj exp = 3, a mantisa 0xA00000. Nakon sređivanja eksponenta i
odbacivanja prve jedinice mantise dobiva se: 10 0x41200000. Na sličan način vrijedi
za -10 0xC1200000, a za 0.1 0x3DCCCCCD.
Osim navedenih elementarnih tipova podataka u računarskim sustavima koriste se sljedeći
brojevni formati: znak (character)1 oktet, cjelobrojni podatak (integer)2 okteta,
dvostruki cjelobrojni podatak (double integer)4 okteta, relni broj (real)4 okteta,
dvostruki relni broj (double real)8 okteta.
3. Složeni tipovi podataka
3.1. Jednodimenzionalni poredak (polje)
ime[donja granica,gornja granica] tip elementa ili veličina
u Pascalu Array = vektor[10...100] of Real;
u C-u Float vektor[91];
u FOTRANu DIMENSION vektor(91)
Ovakav tip podatka sistemski je opisan s pomoću deskriptora poredka
početna adresa a
donja granica DG
gornja granica GG
duljina elementa e
vektor DGa
vektor DG+1a+e
vektor DG+2a+2e
vektor DG+Na+Ne
a+3e
memorija
e
deskriptor poredka
Adresa se računa s pomoću izraza:
polinom adresni
eDGiaivektoradr
3.2. Dvodimenzionalni poredak
ime[DG1...GG1,DG2...GG2] tip elementa ili veličina
u Pascalu Array = vektor[5...20,10...15] of Real;
u C-u Float vektor[16][6];
u FOTRANu DIMENSION vektor(16,6)
početna adresa a
donja granica DG1
gornja granica GG1
duljina elementa e
matrica[DG1,DG2]a
matrica[DG1,DG2+1]a+e
matrica
[i,j]
a+2e
matrica
a+3e
memorija
deskriptor poredka
donja granica DG1
gornja granica GG1
[DG1,DG2+2]
[DG1+1,DG2]matrica
GG
2-D
G2
+1
ele
me
na
ta[DG1,GG2]matrica
adr
ej
K
12DG2GGi
'a
K
e2DG12DG2GG1DGa
e2DGje12DG2GG1DGiaj,imatricaadr
21
jeiK'aj,imatricaadr 2
a’ i K2 se dodaju u DESKRIPTOR POREDKA
3.3. n-dimenzionalni poredak
neka je k [1,n]
DGk donja granica k-tog elementa,
GGk gornja granica k-tog elementa.
Adresni polinom može se odrediti rekurzivnom procedurom:
za p = 0 0faaelementaadr
za p = 1 1fae1DGiaielementadr
za p = 2
212121
2121
i,ifae2D1DGiifa
e2DGie12DG2GG1DGiai,ielementadr
za p = 3
32131212
2121321
i,i,ifae3D2D1DGii,ifa
i,ife13DG3GG12DG2GG1DGiai,i,ielementadr
za p = k
eDk2D1DGii,...,i,ifa
i,..,i,ife1DGkGGk12DG2GGDGkiai,..,i,ielementadr
kk21k
k211kkk21
3.4. Zapis
Zapis (RECORD ili STRUCTURE) je struktura podataka koja se sastoji od više elemenata
različite dužine ili različitog tipa.
primjer:
student = record
ime : niz;
prezime : niz;
godina : integer;
end
struct student
{
char ime[20];
char prezime[20];
int godina;
};
Elementi zapisa slažu se u memoriju jedan za drugim po redu kojim su navedeni. Za
pristup elementima zapisa operacijski sustav koristi DESKRIPTOR ZAPISA.
početna adresa a
broj elemenata p
duljina elementa 1 D1
element 1a
element 2
element 3
element p
memorija
deskriptor zapisa
duljina elementa p Dp
duljina elementa 2 D2
D1
D2
D3
Dp
Adresa i-tog elementa strukture računa se s pomoću izraza:
1i
1j
jDaielementadr
Da se prilikom svakog pristupa elementima zapisa ne računa suma DESKRIPTOR
ZAPISA preuredi se na način:
iKaielementadr
Apsolutne adrese se ne upisuju jer je potrebno
prilikom svakog punjenja programa u memoriju
ažurirati tablicu što svakako nije prikladno.
početna adresa a
broj elemenata p
duljina elementa 1 K1
deskriptor zapisa
duljina elementa p Kp
duljina elementa 2 K2
K1=0
K2=D1
K3=D1+D2
Kp= D ii=1
p-1
duljina elementa 2 K2
Osnovni tipovi podataka u Cu
Tip podatka Oznaka Vrijednost
oktet char -128 do 127
znak unsigned char 0 do 255
cijeli broj int
short
-32 768 do 32 767
prirodni broj unsigned
unsigned int
0 do 65 535
dvostruki cijeli broj long int -2 147 483 647 do 2 147 483 648
dvostruki prirodni broj unsigned long int 0 do 4 294 967 295
realni broj float 1.2 E-38 do 3.4 E38 (/ znamenaka)
dvostruki cijeli broj double 2.2 E-308 do 1.8 E308 (15 znamenki)
četverostruki realni broj long double 3.4 E-4932 do 1.2 E4932 (19 znamenki)
primjer:
char znak, slovo;
int broj1;
short broj2;
float broj3;
double broj4;
broj4-8broj4-7broj4-6broj4-5broj4-4broj4-3broj4-2broj4-1broj3-4broj3-3broj3-2broj3-1broj2-2broj2-1broj1-2broj1-1slovoznak
a
a+2
a+4
a+6
a+10
a+18
a+1
MSB
LSB
Složeni tipovi podataka u Cu
Polje se definira tipom elemnta polja i brojem elemenata:
primjer:
char ime[20]; polje od 20 znakova zauzima u memoriji 20 okteta
int matrica[10][10]; dvodimenzionalno polje cijelih brojeva,
zauzima u memoriji 200 okteta
double matrica[10][10]; dvodimenzionalno polje realnih brojeva dvostruke
preciznosti, zauzima u memoriji 800 okteta
0309
0037
0006
012F
0FE5
00B0
int polje[2][3] = { {176, 4069, 303}, {6, 55, 777} };
polje[0][1]=4069
polje[0][2]=303
polje[1][0]=6
polje[1][1]=55
polje[1][2]=777
&polje[0][1]=3500
3498
3500
3502
3504
3506
3508
polje[0][0]=176
&polje[0][2]=3502
&polje[1][0]=3504
&polje[1][1]=3506
&polje[1][2]=3508
&polje[0][0]=3498
Struktura se defnira na način:
struct zapis
{
char naziv[10];
char semestar;
char broj_studenata;
};
struct zapis predmet1;
Ovaj podatak zauzima 12 okteta.
Ukolik ima npr. 100 predmeta na studiju može se definirati polje struktura tipa zapis:
struct zapis predmet[100]
Ovim je rezervirano u memoriji 1200 okteta za 100 zapisa.
7A
69
6B
61
32
00
02
64
66
69
f
z
k
2
a
i
i
00
00
2
100predmet1.broj_studenata
predmet1.semestar
predmet1.naziv
Pokazivač
Pokazivač (pointer) je varijabla koja sadrži adresu određenog podatka tj varijable. Naziv
ove varijable proizlazi iz njene funkcije, a to je pokazivanje na neku drugu varijablu.
Prilikom definiranja pokazivača potrebno je navesti na koji tip varijable on pokazuje. Tako
se u Cu pokazivač definira na način:
int *ptr_int; pokazivač s nazivom ptr_int koji pokazuje na cjelobrojnu varijablu
float *ptr_real; pokazivač s nazivom ptr_real koji pokazuje na realnu varijablu
struct zapis *ptr_zapis; pokazivač na strukturu zapis
broj
5308ptr_int
555
5308 5309
broj=555;broj
?ptr_int
555
?
5308 5309
ptr_int=&broj;
broj2
5310ptr_int2
888
5311
ptr_int2=&broj2;
ptr_int1=&broj1;
broj1
555
5308 5309 5310
5308ptr_int1
broj2
5310ptr_int2
555
5311
*ptr_int2=*ptr_int1;
broj1
555
5308 5309 5310
5308ptr_int1
broj2
5308ptr_int2
555
5311
ptr_int2=ptr_int1;
broj1
555
5308 5309 5310
5308ptr_int1
broj2
5310ptr_int2
555
5311
ptr_int2++;
broj1
555
5308 5309 5310
5308ptr_int1
f
z
k
2
a
i
i
2
100 predmet1.broj_studenata
predmet1.semestar
predmet1.naziv
ptr_zapis
*ptr_zapis=&predmet1;
ptr_zapis->naziv
ptr_zapis->semestar
ptr_zapis->broj_studenata
Koliko memorije zauzima pokazivač ovisi o modelu programa, a i tipu računala. Ukoliko
je small model programa (podaci do 64 k) tada je pokazivač samo offset, dok kod large
modela je offset + baza.
3. DINAMIČKE STRUKTURE PODATAKA
Statičkim podacima se prilikom punjenja programa u memoriju računala dodjeli fiksna
memorijska lokacija koja se ne mijenja tjekom izvođenja. Dinamički podaci nemaju fiksno
mjesto u memoriji već nastaju i nestaju tjekom izvođenja programa.
Operacijski sustav koristi pokazivače (pointer) za pristup dinamičkim podacima.
slobodni memorijski prostor
dinamičke varijable
stog
podaci
korisnički program
operacijski sustav
memorija
pokazivač
Da bi operacijski sustav tjekom izvođenja mogao programu staviti na raspolaganje dio
slobodne memorije mora imati podatak gdje počinje slobodni memorijski prostor, koliko
memorije treba korisniku i kakvi se tipovi podataka dohvaćaju.
Primjer 1
Potreba je za memorijom za 30 cjelobrojnih varijabli.
1. Inicjalizira se pokazivač na cjelobrojnu varijablu:
int *cijeli_broj;
2. Zatraži se od sustava memorija za 30 cjelobrojnih veličina (60 okteta);
broj_okteta = 60;
cijeli_broj=(int*)malloc( (size_t) broj_okteta);
ili
cijeli_broj=(int*)malloc( (size_t) sizeof( int )*30);
Primjer 2
Potreba je za memorijom za 20 cjelobrojnih varijabli.
1. Inicjalizira se pokazivač na strukturu zapis:
struct zapis *ptr_zapis;
2. Zatraži se od sustava memorija za 20 struktura tipa zapis;
ptr_zapis=(struct zapis*)malloc( (size_t) sizeof( struct zapis )*20);
Memorija se oslobodi naredbom free(cijeli_broj) ili free(ptr_zapis). Slobodna memorijska
mjesta bilježe se u obliku liste.
Organizacija varijabli u memorijskom prostoru prikazana je na sljedećoj slici:
lista slobodnih memorijskih mijesta
slobodna memorija
dinamičke varijable
stog
podaciglobalne varijable
Data segment
konstante
potprogrami iz biblioteka
potprogram A
potprogram B
potprogram N
glavni program
zaglavlje programaProgram Segment Prefix
16 k okteta64 k okteta
256 okteta
64 k oktetamaksimum
64 k oktetamaksimum
HeepPtr
CSeg
FreePtr
HeepOrg
SSeg
SPtr
DSeg
STOG
Struktura podataka stog prikazana je na slici:
1 2 3
2
11
2
1
2
3
1
2
3
1
Princip strukture First In Last Out (FIFO).
Zadatak:
Realizirati stog zapisa kao dinamičkih varijabli.
struct zapis
{
struct zapis *ptr_zapis;
char naziv[10];
char semestar;
char br_stud;
};
struct zapis *ptr_vrh;
struct zapis *ptr_pomocni;
ptr_pomocni
ptr_vrh=( zapis*)malloc((size_t)sizeof( zapis)*1);
structstruct
memorija
Heap
rezerv
irana
mem
orija
ptr_vrh->naziv="fizika2";ptr_vrh->semestar=2;ptr_vrh->br_stud=97;ptr_vrh->ptr_zapis=ptr_pomocni;ptr_pomocni=ptr_vrh;
ptr_vrh
ptr_zapis
naziv
semestarbr_stud
memorija
ptr_vrh
ptr_vrh->naziv="fizika1";ptr_vrh->semestar=1;ptr_vrh->br_stud=100;ptr_vrh->ptr_zapis=ptr_pomocni;ptr_pomocni=ptr_vrh;
ptr_vrh=( zapis*)malloc((size_t)sizeof( zapis)*1);
structstruct
ptr_pomocni
0
fizika1
1
100
memorija
ptr_vrh
ptr_pomocni=0;
0
fizika1
1
100
fizika2
2
97
ptr_zapis
Heap Heap
ptr_pomocni
memorija
ptr_zapisptr_vrh
0
fizika1
1
100
fizika2
2
97predmet=ptr_vrh->naziv;broj_semestara=ptr_vrh->semestar;broj_studenata=ptr-vrt->br_sem;ptr_pomocni=ptr_vrh->ptr_zapis;free(ptr_vrh);ptr_vrh=ptr_pomocni;
Heap
Nakon ovih operacija sadržaj vrha stoga spremljen je u varijable predmet, broj_semestra i
broj_studenata, a zauzeto mjesto u memoriji je oslobođeno.
RED
Red je struktura podataka u kojoj posljednji element koji se stavlja na kraj reda prvi se vadi
iz reda.
kraj
pokazivačpočetak
zapis 3
nil
kraj
pokazivačpočetak
zapis 1
nil
pokazivač
zapis 1
kraj
pokazivačpočetak
zapis 1
nilpokazivač
zapis 2
pokazivač
zapis 2
pokazivač
zapis 3
pokazivač
zapis 2
kraj
pokazivačpočetak
zapis 3
nilpokazivač
zapis 1
pokazivač
zapis 2
LISTA
Lista je struktura podataka u kojoj se element može ubaciti na bilo koje mjesto, odnosno
moguće je iz liste izbaciti proizvoljni element.
novi->pokazivač = tekući->pokazivač
pokazivač3početak
zapis 3
pokazivač1
zapis 1
pokazivač2
zapis 2
pokazivač4
zapis 4
nil
novi
tekući
tekući = pokazivač1
pokazivač3početak
zapis 3
nil
pokazivač1
zapis 1
pokazivač2
zapis 2
pokazivač4
zapis 4
nil
novi
tekući
tekući = pokazivač1
tekući->pokazivač = novi;
pokazivač3početak
zapis 3
pokazivač1
zapis 1
pokazivač2
zapis 2
pokazivač4
zapis 4
nil
novi
tekući
tekući = pokazivač1
STABLASTE STRUKTURE
korjen
unutrašnji čvorovi
listovi
Poseban slučaj je BINARNO STABLO tj stablo koje ima najviše dvije grane.
pokazivačna lijevi
pokazivačna desni
sadržaj
Opće stablo može se pretvoriti u binarno stablo sljedećim postupkom:
Lijva kazaljka pokazuje na najljevijeg potomka, a desna kazaljka na susjedni član na istoj
razini.
I
J
G
H
B
E
F
C
D
A1
2
3 4
5
6
7
8
9
A
B
E
C
F H
D
G I
1
2
3
4
5
6 7
8
9
J
opće stablo ekvivalentnobinarno stablo