17
STRUKTURE PODATAKA I PROGRAMA Općenito u računarskom sustavu na najnižoj razini programski gledano postoje: procedure elementarne operacije sklopovi nizovi elementarnih operacija 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

STRUKTURE PODATAKA I PROGRAMA - …. semestar/Operacijski... · STRUKTURE PODATAKA I PROGRAMA elementarne Općenito u računarskom sustavu na najnižoj razini programski gledano postoje:

  • Upload
    doanque

  • View
    226

  • Download
    0

Embed Size (px)

Citation preview

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

DC

A

E

F

B

A

B

C D

E

F

stablo