Professional Documents
Culture Documents
Programski Jezici I Strukture Podataka - Dusan Malbaski
Programski Jezici I Strukture Podataka - Dusan Malbaski
Programski Jezici I Strukture Podataka - Dusan Malbaski
1
Semestar
Elektrotehnika i računarstvo
Odsek za računarstvo i automatiku
Programski jezici
i strukture
podataka
1
P R O F. D R D U Š A N M A L B A Š K I , T M D 1 4 5
LITERATURA:
O'Brian S.: Turbo Pascal 6.0, Mikro Knjiga, Beograd, 1991. (ili ekvivalent)
Malbaški D., Obradović D.: Osnovne strukture podataka, UNS, 1995.
Hotomski P., Malbaški D.: Matematička logika i principi programiranja, UNS, 2000.
Malbaški D.: Odabrana poglavlja metoda programiranja, UNS, 2002.
Sadržaj
UVOD
Alfabet Pascala 2
TIPOVI PODATA KA
Tipovi podataka 4
Hijerarhija operatora 5
Logički tip 5
Celobrojni tip 6
Realni tip 7
Znakovni tip 8
String 8
Enumeracija 9
Intervalni tip 9
Nizovi 10
Skupovi 11
Slog 12
Datoteke 13
Primer 18
Zaglavlje 22
Deklaracije 23
Algoritamski deo 24
NARED BE
Naredba dodele 26
Naredbe selekcije 26
Petlje 28
Naredbe skoka 29
Elementarni ulaz/izlaz 30
M ODUL I
Potprogrami 31
Moduli 35
1
D E S I G N C U S T O M I Z A T I O N
Alfabet Pascala
Skup simbola koji se koriste u programskom jeziku naziva se alfabet
programskog jezika.
Pascal je veštački jezik i stoga poseduje strogo definisan skup simobla koji
se smeju koristiti.
cifre od 0 do 9
3
P R O G R A M S K I J E Z I K P A S C A L
Dobra upotreba
identifikatora eliminiše
najveći deo potrebe za
komentarima.
se pitanje da li treba koristiti englesku mnemoniku ili mnemoniku
maternjeg jezika. Engleski jezik ima drugačiju strukturu od srpskog, tako
da je engleska mnemonika kraća. Takođe, naredbne programskog jezika
su na engleskom, ali postoji ograničenje u vidu dovoljnog poznavanja
stranog jezika.
4
Tipovi podataka
Kad je Pascal nastao, prava inovacija koju je on doneo bila je u domenu
tipova podataka. Ranije je postojao mali broj tipova i nije bilo moguće da
programer kreira svoj sopstveni.
tipovi podataka
osnovni (skalarni)
izvedeni (strukturirani)
standardni niz
nestandardni
deo su programskog jezika, na
njih programer nema uticaja
koje programer sam pravi skup
slog
datoteka
celobrojni interval
realni
znakovni
string
pokazivač
Tipovi podataka
Ovaj tip ima dve Važno!
logičke vrednosti: false < true
tačno i netačno.
Hijerarhija operatora
Pošto u izrazu figurišu promenljive, konstante, operatori i funkcije, mora
postojati redosled izvođenja operacija. Postoje određene razlike u odnosu
na ovu hijerarhiju u matematici.
Redosled je sledeći:
zagrade: ( i );
funkcije;
operator not;
operatori: *, /, div, mod i and;
operatori +, -, or i
relacioni operatori: =, <>, >, >=, <, <= i operator in
Ukoliko se desi da su operatori na istom nivou prioriteta, onda se
primenjuje pravilo „s leva na desno“.
Logički tip
Njegov identifikator je: Boolean. Zbog nemogućnosti da se u Pascalu
koriste matematičke oznake za tačno i netačno (T i ), uvedene su logičke
konstante koje su dobile posebna imena. To su true i false.
Logičke operacije
Postoje tri osnovne logičke operacije u Pascalu. To su konjunkcija,
disjunkcija i neegacija. U tabeli su upoređene matematičke i Pascalove oznake
tih funkcija.
operacija u u
matematici Pascalu
konjunkcija and
disjunkcija or
negacija not
Relacioni operatori
U Pascalu ne postoje relacije kao u matematici. Postoje relacioni operatori,
pa se relacije u stvari tretiraju kao operacije koje imaju rezultat.
operato značenje
r
= jednako
6
P R O G R A M S K I J E Z I K P A S C A L
operato značenje
r
<> nije jednako
> veće
>= veće ili jednako
< manje
<= manje ili
jednako
operacija u u
matematici Pascalu
implikacija p<=q
ekvivalencija p=q
ekskluzivna
p<>q
disjunkcija
Celobrojni tip
Ovaj tip obuhvata familiju tipova, ali osnovni je integer. U Pascalu se tip
promenljive određuje zavisno od toga koji raspon promenljiva zauzima u
modelu.
tip opseg
integer od -32 768 do 32 767 2B
shortint od -128 do 127 1B
longint od oko -2,14∙109 do 2,14∙109 4B
byte od 0 do 255 1B
word od 0 do 65 535 2B
Operacije
Operacije koje možemo vršiti sa podacima celobrojnog tipa su: sabiranje
(+), oduzimanje (-), množenje (*), deljenje (/), celobrojno deljenje (div) i
ostatak pri deljenju (mod). Rezultat deljenja je uvek realan broj bez obzira
što delimo cele brojeve, a ako želimo da deljenjem dobijemo ceo broj,
koristićemo operator div. Treba voditi računa da operator div samo odbaci
brojeve iza decimalne tačke i na taj način formira ceo broj. Tako dobijamo
da je 9 div 10 = 0 iako bi matematičkim zaokruživanjem dobili 1.
Funkcije
Funkcije kojima raspolažemo kada obrađujemo podatke celobrojnog tipa
su: apsolutna vrednost (abs), kvadrat broja (sqr), neparnost (odd),
sledbenik (succ) i prethodnik (pred).
7
P R O G R A M S K I J E Z I K P A S C A L
Tipovi byte i word
Ovi tipovi nemaju ulogu da modeliraju cele brojeve. Naime, u njihovom
registru ne postoji mesto za predznak, pa se zbog toga svi bitovi jednako
tretiraju. Ovi tipovi prvenstveno služe za operacije nad bitovima ćelije.
Bit operacije
Na tipove byte i word su primenljive još neke operacije. To su tzv. bit
operacije. To mogu biti logičke operacije and, or, not i xor. N.b. označavaju
se isto kao Bulove operacije. Ove operacije obrađuju svaki bit posebno.
Tako:
Not $000F = $FFF0
Pored ovih za rad sa bitovima standardne su još i shl i shr, koje služe za
pomeranje (šift) bitova u levo i u desno.
Realni tip
I ovaj tip obuhvata familiju tipova, gde je osnovni tip real. Ovo je podskup
skupa realnih brojeva. Dok je u matematici skup celih brojeva podskup
skupa realnih brojeva (Z R), u programiranju to ne važi. Celobrojni tip
nije podskup realnog tipa.
8
P R O G R A M S K I J E Z I K P A S C A L
tip opseg
single od 1,5∙10-45 do 3,4∙1038 4B
real od 2,9∙10-39 do 1,7∙1038 6B
double od 5∙10-324 do 1,7∙10308 8B
comp od -9,2∙1018 do 9,2∙1018 8B
extended 3,4∙10-4932 do 10B
1,1∙104932
Operacije
Operacije koje možemo vršiti sa podacima realnog tipa su: sabiranje (+),
oduzimanje (-), množenje (*) i deljenje (/).
Funkcije
Funkcije koje možemo koristiti sa podacima realnog tipa su: apsolutna
vrednost (abs), kvadrat broja (sqr), kvadratni koren (sqrt), sinus (sin),
kosinus (cos), arkus tangengs (arctan), prirodni logaritam (ln), eksponent
(exp). Pored ovih postoje i dve funkcije koje povezuju realni tip sa
celobrojnim. To su odsecanje decimala (trunc) i zaokruživanje (round).
Znakovni tip
Njegov identifikator je char. Skup svih znakova se zove karakter set
(character set). Pascalov karakter set obuhvata 255 znakova ASCII kôda
gde spadaju prazno mesto, brojevi, velika i mala slova engleske abecede,
interpunkcijski i specijalni znaci i simboli.
Relacioni operatori
Sa podacima znakovnog tipa takođe možemo koristiti relacione operatore.
Prilikom upoređivanja, upoređuju se ordinalni brojevi karakterâ. U
Pascalu, ordinalni broj nekog karaktera odgovara ordinalnom broju tog
karaktera u ASCII kôdu.
Funkcije
Od funkcija možemo koristiti: prethodnik (pred), sledbenik (succ),
određivanje ordinalnog broja ASCII kôda (ord) i određivanje karaktera
definisanog ordinalnim brojem ASCII kôda (chr).
9
P R O G R A M S K I J E Z I K P A S C A L
string[duzina]
String
Ovo je tekstualni tip, tj. njegove promenljive su tekstovi.
Mora se voditi računa da tip string i char ne mogu biti ekvivalentni, jer se
operacije nad njima razlikuju. Takođe, prazan string postoji, dok prazan
znak ne može da postoji. Na kraju, podatak tipa char ima dužinu jedan
znak, dok podatak tipa string može da ima dužinu do 255 znakova.
Podatke string tipa označavamo isto kao i char, tj. stavljanjem među
apostrofe:
'Luka'
Operacije
Operacija sa stringovima ima nekoliko desetina, ali jedna od najvažnijih je
konkatenacija, tj. spajanje stringa. Ona se vrši pomoću operatora +:
Enumeracija
Ovo je nestandardni skalarni tip. Razlikuje se od svih ostalih do sada
spomenutih, zato što je njegov domet uvek program u kojem je definisan.
Ovaj tip ne postoji u Pascalu, pa ga programer definiše u svom programu.
Drugi nazivi za ovaj tip su i nabrojivi tip, nabrojani tip itd.
Opšti oblik
type ImeTipa = (sve_konstante_tipa);
Primer:
type Dani = (pon, uto, sre, cet, pet, sub, ned);
10
P R O G R A M S K I J E Z I K P A S C A L
Operacije
Operacije sa ovim tipom su dosta jednostavne. To su sledbenik (succ) i
prethodnik (pred). Takođe se mogu koristiti svih šest relacionih operatora
(=, <>, >, >=, <, <=) i funkcija ord koja određuje redni broj.
Sve ove operacije možemo koristiti, jer redosled vrednosti nije proizvoljan.
Stoga svaka vrednost u enumeraciji ima svoj redni broj i to: prva je 0,
druga je 1 itd.
Intervalni tip
Ovo je izvedeni tip, jer se oslanja na neki od osnovnih tipova. Intervalni tip
se izvodi iz nekog drugog tipa i to onih za koje postoji preslikavanje na skup
prirodnih brojeva (celobrojni i znakovni, ali ne real i string). Ovaj tip u
stvari „iseca“ jedan segment iz osnovnog tipa.
Opšti oblik
type ImeTipa = dg..gg
Primer:
type RadniDani = pon..pet;
type NulaDoSest = 0..6;
Ako je osnovni tip od kojeg se uzima interval neki izvedeni tip, prvo
moramo definisati taj izvedeni tip. U gornjem primeru prvo moramo
definisati tip Dani (enumeraciju), pa tek onda RadniDani.
11
P R O G R A M S K I J E Z I K P A S C A L
Nizovi
Ovo je izvedeni, struktuirani tip. Bez obzira na broj dimenzija, Pascal sve
nizove tretira jednako. Niz obuhvata sekvencu određenih vrednosti,
obavezno istog tipa. Njihov broj se zadaje u programu.
Opšti oblik
type ImeTipa = array[opseg1, opseg2, ..., opsegN] of tip;
Opseg je integralnog tipa, cela enumeracija ili logički tip. Ne može biti real
i integer. To znači da opseg može biti samo izvedeni celobrojni tip, kod
kojeg je definisana donja i gornja granica. Vrednost opsega može biti i
negativan po potebi ili izveden iz znakovnog tipa. U praksi se opseg
najčešće zadaje kao 1 do n i ima ih jedan ili dva. Broj opsega određuje broj
dimenzija niza.
Primeri:
type TNiz = array[1..5] of real;
type TMatrica = array[1..4, 1..10] of integer;
U suštini Pascal ne poznaje tip matrice, samo tip niza (zbog uniformnosti),
pa se matrica tretira kao niz nizova. Stoga TMatricu možemo definisati i
na sledeći način:
type TMatrica = array[1..4] of array[1..10] of integer;
Prvi način je skraćeni zapis niza nizova. Slično, i članu matrice se može
pristupiti na sledeći način:
matr[i][j];
12
P R O G R A M S K I J E Z I K P A S C A L
Čitamo: j-ti element niza koji je i-ti element niza matr.
Skupovi
Ovaj tip predstavlja metematičke skupove.
Opšti oblik
type ImeTipa = set of tip_elemenata;
Elementi skupa moraju biti istog tipa i to mogu mogu biti sledeći tipovi:
logički, znakovni, enumeracija i intervalni tip.
U Turbo Pascalu tip elementa može da ima najviše 256 različitih elemenata.
To je posledica memorisanja skupa. Skup se čuva kao podatak od 32 bajta,
što je 256 bita i to tako što se svakom potencijalnom elementu dodeli 1 bit.
Ako element pripada skupu, njegov bit ima vrednost 1, u suprotnom 0.
Primeri:
type TMalaSlova = set of 'a'..'z';
TOsnovneBoje = (crvena, zuta, plava);
TSkupOsnovnihBoja = set of TOsnovneBoje;
13
P R O G R A M S K I J E Z I K P A S C A L
Operacije
Tu pre svega spada dodela vrednosti, kada vrednosti elemenata jednog
skupa dodeljujemo elementima drugog skupa. Na primer:
type TSkup = set of 1..50;
var s1, s1: TSkup;
s1 := s2;
operacija u u
matematici Pascalu
podskup AB a <= b
nadskup AB a >= b
jednakost A=B a = b
nejednakost AB a <> b
pripadnost aB a in b
Slog
Slog se drugačije naziva zapis. Ovaj tip je izveden kao i niz, iz nekog
osnovnog tipa, ali za razliku od elemenata niza, elementi sloga ne moraju
biti istog tipa. Znači da tip sloga može biti izveden iz više različitih osnovnih
tipova.
14
P R O G R A M S K I J E Z I K P A S C A L
Opšti oblik
type ImeTipa = record
e1: tip1;
e2: tip2;
...
eN: tipN;
end;
Pri čemu je ei element sloga koji zovemo polje. Svako ei može imati više
identifikatora, u slučaju da više polja u jednom slogu ima isti tip. Tipovi
polja su proizvoljni. Svako polje se ponaša kao samostalna promenljiva tog
tipa.
Primer:
type Stanovnik = record
jmbg: string[13];
ime: string[15];
prezime: string[30];
end;
Dodela vrednosti
Ako dodeljujemo vrednost jedne promenljive tipa sloga drugoj
promenljivoj tipa sloga, vrednost svakog polja iz prve se kopira u
odgovrajuće polje ove druge.
Iterator with
Naredbu with koristimo za pristup poljima sloga, s tim što nam ona
omogućava da ne moramo svaki put navesti ime sloga kad pristupamo
nekom polju. Njen cilj nije skraćivanje kôda, već preglednost i
zadovoljavanje principa jedan posao – jedna naredba.
with a begin
jmbg := '1906983800052';
ime := 'Luka';
prezime := 'Ranisavljevic'
end;
15
P R O G R A M S K I J E Z I K P A S C A L
Datoteke
Svrha postojanja datoteke u svim programskim jezicima je permanentno
čuvanje podataka. Podaci se u memoriji čuvaju najduže dok traje program.
Dok se, na primer, lokalne promenljive čuvaju još kraće.
tipizirana datoteka;
tekstualna datoteka;
netipizirana datoteka.
Tipizirana datoteka
Deklarišemo je naredbom type. Alternativni način (koji se često koristi) je
direktno zadavanje tipa uz naziv promenljive. Na primer:
type TSlog = record
{opis}
end;
var f: file of TSlog;
16
P R O G R A M S K I J E Z I K P A S C A L
Ne postoje naredbe za komunikaciju sa datotekama, već se
koriste posebne procedure i funkcije. Za tipizirane
datoteke postoje desetine procedura i funkcija, a
najvažnije delimo u dve grupe.
17
P R O G R A M S K I J E Z I K P A S C A L
Da bismo rešili ovaj problem koristićemo funkciju IOResult koja nam može
poslužiti da testiramo uspešnost bilo koje funkcije za rad sa datotekama.
Funkcija vraća vrednost 0 ako nije nastala nikakva greška u operaciji sa
datotekom. U suprotnom vraća nam odgovarajući kôd koji predstavlja
šifru nastale greške i na osnovu kojeg možemo predvideti da se u
programu izvrše odgovarajući koraci koji saniraju grešku.
18
P R O G R A M S K I J E Z I K P A S C A L
Tekstualna datoteka
Ovaj tip datoteke se intenzivno koristi. U originalnom Pascalu su
tekstualne datoteke predstavljale vrstu tipiziranih datoteka – tipizirane
datoteke čiji su elementi znakovi. Kasnije je ovaj način definisanja
tekstualnih datoteka eliminisan. Drugačije se tekstualne datoteke zovu i
tekst fajlovi.
19
P R O G R A M S K I J E Z I K P A S C A L
Netipizirana datoteka
Ovo je uobičajen naziv za ovaj tip datoteke, ali nije dovoljno precizan kada
se govori o Turbo Pascalu. Jedno od osnovnih načela ovog programskog
jezika jeste da sve ima svoje ime, tako da je nepravilno govoriti o
netipiziranim podacima.
I za ove datoteke se koriste: assign, reset i rewrite, ali reset i rewrite imaju
drugačiju sintaksu, jer se navodi i veličina jednog elementa u bajtovima.
Mogu se koristiti i close, seek, filepos i filesize. Filesize ne vraća veličinu
datoteke u bajtovima, veću u elementima. Npr. ako jedan element ima 10
bajtova, filesize će vratiti broj desetobajtnih elemenata u datoteci. Za
rukovanje sadržajem datoteke se koriste posebne procedure: blockread i
blockwrite.
Pokazivači
Pokazivači predstavljaju jedan od najvažnijih tipova u Pascalu i
predstavljaju najveći konkretni doprinos Pascala uopšte. Omogućili su da
program u toku rada zahteva dodatnu memoriju od sistema i oslobađa tu
naknadno zahtevanu memoriju.
20
P R O G R A M S K I J E Z I K P A S C A L
U Pascalu se za
označavanje pokazivača
koristio simbol , a u
Turbo Pascalu se koristi
^.
Kad tražimo dodatnu memoriju od sistema, mi njenu adresu unapred ne
znamo. Dodatnu memoriju naš program traži od jednog drugog programa
čija je uloga da obezbedi onoliko memorije koliko smo tražili i onda nam
prosledi adresu te novozauzete memorije. Adresu ćemo čuvati u
promenljivoj tipa pokazivača.
Važno!
Netipizirani pokazivači
Ovo je jedan od osnovnih skalarnih tipova. Vrednosti promenljivih ovog
tipa se razlikuju od drugih vrednosti osnovnih tipova koliko se i oni među
sobom razlikuju. Drugačije se ovaj tip naziva i adresni tip ili generički
pokazivač. Nešto malo manje se koriste od tipiziranih pokazivača.
Tipizirani pokazivači
Pokazivači ovog tipa su od primarnog značaja, jer gotovo da nema
programa koji ih ne koristi. Nisu postojali u originalnom Pascalu.
i := 5;
p := @i;
p^ := -7;
t := @i;
w := p;
22
P R O G R A M S K I J E Z I K P A S C A L
Pokazivačka konstanta nil
Pokazivač bilo koje vrste može da uzme njenu vrednost. U tom slučaju
pokazivač ne pokazuje ni na šta.
Primer
U ovom primeru ilustrovaćemo rad sa datotekom i korišćenje unita u
Turbo Pascalu (strana 40). Program koristi unit MPoint koji je dat na
strani 42.
uses MPoint;
var DatTacka: file of TPoint;
Nula, tacka, najdalja: TPoint;
maxrast, pom: real;
begin
Assign(DatTacaka, 'c:\mydir\tacke.dat');
reset(DatTacaka);
Create(Nula, 0, 0);
maxrast := 0;
Close(DatTacaka);
writeln('Najdalja tačka ima apscisu ',
GetX(najdalja), ' i ordinatu ', GetY(najdalja))
end.
23
P R O G R A M S K I J E Z I K P A S C A L
zaglavlje
deklaracije
labele
konstante
tipovi
promenljive
potprogrami
algoritamski deo
blok
Zaglavlje
U zaglavlju se identifikuje program. Ova linija kôda u turbo Pascalu nije
obavezna.
program ime_programa;
24
P R O G R A M S K I J E Z I K P A S C A L
Deklaracije
Odmah na početku teksta o deklaracijama treba napomenuti dve stvari.
Prvo: redosled kategorija koje se deklarišu nije dat po važnosti. Drugo:
odnos važnosti deklaracija i algoritamskog dela se u toku vremena menjao.
Ranije su programeri veliku pažnju obraćali da algoritamski deo, dok
deklaracije nisu bile mnogo bitne. To je bilo zbog toga što su tadašnji
programi imali male mogućnost, pa samim tim tipova, promenljivih itd.
nije bilo mnogo. Kasnije je delu sa deklaracijama posvećena veća pažnja
(tako je i u Pascalu), jer vrlo se lako može desiti da pogrešno deklarisana
promenljiva utiče da se javlja greška u programu ili da ozbiljno ugrozi
performanse programa. Danas, pošto se koristi objektni model
programiranja, obrisana je granica između deklaracija i algoritamskog
dela i ta dva su dela postali ravnopravni.
Labele
Labele su oznake naredbi u programu. Ranije su mnogo korišćene, dok se
danas teži da se upotreba labela i skokova u programu maksimalno
izbegne. U Pascalu se one skoro uopšte ne koriste osim u slučaju komande
goto. Treba voditi računa da se program tako piše da ova komanda
postane izlišna.
Sintaksa:
label identifikator1, identifikator2, ..., identifikatorN;
Primer:
label kraj;
...
kraj: writeln;
Konstante
Deklarišemo samo imenovane konstante.
Sintaksa:
const ime1 = vrednost1, ime2 = vrednost2,
..., imeN = vrednostN;
25
P R O G R A M S K I J E Z I K P A S C A L
const pi = 3.14;
Tipovi
Tipovi koje deklarišemo su u stvari sopstveni tipovi koje definiše
programer. Takođe, ime tipa treba da bude smisleno. Nepisano pravilo je
da ime tipa počinje velikim slovom. Pošto identifikator ne može sadržati
razmake, onda ako ime tipa sadrži više reči, sve ih pišemo zajedno, ali
svaku počinjemo velikim slovom.
Sintaksa:
type ImeTipa1 = opis_tipa1;
ImeTipa2 = opis_tipa2;
...
ImeTipaN = opis_tipaN;
Primer:
type Visina = real;
Promenljive
Svaka promenljiva ima ime i tip i zauzima memoriju u kojoj se čuva njena
vrednost. U Pascalu je eksplicitno deklarisanje promenljivih obavezno. Na
taj način, između ostalog, se smanjuje mogućnost greške.
Potprogrami
Potprogrami u Pascalu su u stvari procedure i funkcije. Prilikom njihovog
deklarisanja one se navode u celini. Kao što program može da ima svoj
potprogram, tako i potprogram može da ima svoj potprogram. Broj nivoa
potprograma nije ograničen, ali je u praksi potrebno najviše dva nivoa, a
26
P R O G R A M S K I J E Z I K P A S C A L
veoma retko se koriste i tri. Velik broj podnivoa čini program teškim za
razumevanje, a ranije je rečeno da je osnovna svrha Pascala pisanje
čitljivih i razumljivih programa.
Algoritamski deo
Algoritamski deo se sastoji od naredbi. Da bi prevodiocu označili
algoritamski deo, stavljamo ga među tzv. programske zagrade:
begin
naredba;
end.
27
P R O G R A M S K I J E Z I K P A S C A L
Naredba dodele je
dvoznak.
Naredbe
Naredba dodele
Ova naredba je osnovna naredba svakog proceduralnog programskog
jezika. Njena sintaksa u Pascalu je sledeća:
promenljiva := izraz;
Mora se voditi računa da promenljiva i izraz imaju isti tip. Jedini izuzetak
je da je promenljiva tipa real, a izraz integer.
Naredbe selekcije
Drugačije se nazivaju uslovne naredbe.
28
P R O G R A M S K I J E Z I K P A S C A L
Sintaksa:
if logicki_izraz then naredba1;
else naredba2;
Kod komande if then else, zavisno od toga je li logički izraz tačan ili ne
izvršava se prva, odnosno druga naredba. Kod komande if then, pak,
naredba se izvršava ako je izraz tačan, ako nije, ne izvršava se.
Primer:
Case
Naredba case predstavlja naredbu višestruke selekcije. To je izvedena
naredba. Koristimo je kada treba da uporedimo vrednost nekog izraza sa
unapred zadatim vrednostima. Mora se voditi računa da izraz ne sme biti
tipa real i string.
Sintaksa:
case izraz of
vrednost1_1, vrednost1_2: naredba1;
vrednost2_1: naredba2;
...
vrednostN: naredbaN;
end;
Primer:
case i + s of
1, 4: y := sin(z);
0: begin y := 0; j := 1 end;
-10: x := x + 1
end;
29
P R O G R A M S K I J E Z I K P A S C A L
Upravljačka promenljiva
se zove i kontrolna
promenljiva.
Petlje
Petlje predstavljaju jednu od najosnovnijih struktura u programiranju.
Pomoću njih se fizički ograničenim brojem naredbi računaru može zadati
proizvoljno veliki psao. U Pascalu postoje tri naredbe ciklusa: for, while i
repeat. Svaki ciklus predstavlja jedinstvenu naredbu.
For
For je brojački ciklus. For petlja ima upravljačku promenljivu čija
vrednost upravlja ponavljanjem ciklusa. Njena vrednost se menja i
proverava automatski, stoga kod ove petlje postoji određena
automatizacija.
Sintaksa:
for kp := pv {to|downto} kv do naredba;
While
Ovo je osnovna vrsta ciklusa, pošto se njim može rešiti bilo koje
ponavljanje.
Sintaksa:
while logicki_izraz do naredba;
30
P R O G R A M S K I J E Z I K P A S C A L
Naredbe skoka
treba izbegavati.
Repeat
Sintaksa:
blok
naredbi
repeat
naredba_1;
logički false
naredba_2;
izraz
true ...;
naredba_n
until logicki_izraz;
Najvažnija razlika između while i repeat je što se while ponavlja dok iskaz
jeste tačan, a repeat dok iskaz ne postane tačan.
Naredbe skoka
U Pascalu postoji pet naredbi skoka. Kao što je iznešeno ranije, Pascal je
tako koncipiran da je potreba za skokom skoro eliminisana.
31
P R O G R A M S K I J E Z I K P A S C A L
Elementarni ulaz/izlaz
Elementarni ulaz jeste ulaz sa tastature, a elementarni izlaz jeste izlaz na
ekran.
Pažnja
Potprogrami
Prvobitna namena potprograma je bilo skraćivanje izvornog koda, ali je
ovo brzo zanemareno. Osnovni razlog upotrebe potprograma je što oni
predstavljaju logičku celinu i time sam program postaje pregledniji i lakši
za razumevanje. Potprogrami predstavljaju jedan od nivoa
modularizacije.
procedure ime(formalni_parametri)
procedure ime
Primeri:
function Proizvod(n: integer): longint;
var p: longint; i: integer;
begin
p := 1;
for i := 1 to n do p := p * i;
Proizvod := p;
end;
33
P R O G R A M S K I J E Z I K P A S C A L
Svaka funkcija vraća jednu vrednost, tako što njenom imenu dodelimo
vrednost u kôdu funkcije. (U primeru funkcije Prozivod, pretposlednja
linija kôda dodeljuje vrednost p funkciji.) Pri tome treba voditi računa da
se ime funkcije ne sme koristiti u njoj samoj, osim u slučaju dodele
konačne vrednosti koju funkcija vraća. Funkcije vraćaju samo skalarne
vrednosti.
Deklaracija unapred
Da bi jedan potprogram mogao pozvati drugi, onaj koji je pozvan mora
biti deklarisan pre ovog koji poziva. Tj. ako P koristi Q, Q mora biti
deklarisano pre P. U slučaju da P poziva Q, ali i Q poziva P nije moguće
oba programa smestiti jedan pre drugog, pa koristimo deklaraciju
unapred. U zaglavlje jedan potprogram postavljamo prvi i koristimo
ključnu reč forward koja prevodiocu označava da će potprogram biti
opisan kasnije.
Primer:
procedure Q(...); forward;
procedure P(...);
begin
...
Q
...
end;
34
P R O G R A M S K I J E Z I K P A S C A L
Pažnja
Prvi problem nastaje zbog toga što ako se niz prenosi kao parametar
vrednosti, svih n elemenata se prenosi na stek bez obzira koliko nam zaista
treba. Ovo zauzima nepotrebne resurse, ali i oduzima vreme pogotovo ako
niz ima velik broj članova. Zbog toga možemo dodati var u deklaraciju
parametra, da bi se niz preneo po imenu. Tad će potprogram raditi sa
stvarnim elementima niza, ali se mora voditi računa ako je niz čisto ulazni
da potprogram ne menja vrednost članova.
Ovaj problem je sintaksno rešen tek u Turbo Pascalu 7.0, ali samo za
jednodimenzionalne nizove. Kod deklaracije tog niza nećemo navesti
njegov opseg. Na primer, procedura P će prihvatiti sve nizove koji su
realnog tipa.
procedure P(RNiz: array of real);
Low() i High()
Ove dve funkcije su uvedene za rad sa otvorenim parametrima. Low nam
daje donju granicu niza (najmanji indeks, indeks prvog elementa), a High
gornju granicu (tj. najveći indeks, indeks poslednjeg elementa).
36
P R O G R A M S K I J E Z I K P A S C A L
Rekurzivni potprogrami
Rekurzivni potprogram je onaj koji poziva samoga sebe, tj. koristi
sopstvene usluge. Prvi put su se rekurzivni potprogrami pojavili u Algolu,
jer je tad uveden stek koji je omogućio rekurzivno pozivanje potprograma.
Primer rekurzivne funkcije je faktorijel.
37
P R O G R A M S K I J E Z I K P A S C A L
U početku biblioteke
Bez modula nema
nisu imale
profesionalne
strukturu,
izrade programa ni
predstavljale su skup
neuređenih programa na jednom
koji se koriste po proceduralnom
potrebi. programskom
jeziku.
Primer:
function Faktorijel(n: integer): longint;
begin
if n := 0 then Faktorijel := 1
else Faktorijel := n * Faktorijel(n-1)
end;
Moduli
Moduli predstavljaju vrstu autonomnih softverskih jedinica. Da bismo
lakše realizovali neki kompleksni program, razbijamo ga na delove od
kojih svaki predstavljaja logičku celinu, pa onda te delove zasebno
realizujemo i na kraju ih spajamo.
Da ne bismo svaki put kopirali deo kôda koji izvršava isti posao, pojavile
su se biblioteke gotovih programa. U početku su bile štampane na papiru, pa
se proces njihove implementacije svodio na prepisivanje kôda sa papira.
Kasnije je pronađen mehanizam da se ove biblioteke prenose u
prevedenom obliku.
Šta je modul?
38
P R O G R A M S K I J E Z I K P A S C A L
Šta se dešava sa ulazom i
Information Hiding
kako se transformiše u
Principle izlaz, klijenta se ne
tiče.
Modul može biti izvršni, a ne mora. U Pascalu postoje obe vrste modula.
Naime, kod Pascala glavni program je takođe modul (izvršni). Ostale
strukture po pravilu nisu izvršni moduli.
interfejs modula: klijent ga vidi, to je deo kroz koji se vrši interakcija između klijenta i modula, pa
je ovo u stvari deo za spregu sa klijentom.
U idealnom slučaju (a skoro uvek je i stvarno tako) interfejs se nikad ne menja, eventualno se dopunjava,
jer bilo kakva izmena interfejsa povlači promenu svih poziva klijenata tom modulu;
telo modula: ovo je obavezan deo i u Pascalu se zove implementacija. Ovaj deo sadrži pomenute
skrivene delove modula.
39
P R O G R A M S K I J E Z I K P A S C A L
Potprogram nije
modul, jer nije
autonomno realizovan,
već kao deo modula (tj.
glavnog programa).
modul u užem smislu reči, koji nije izvršni kao glavni program i
nudi svoje usluge klijentima.
Izbor imena zavisi od verzije Pascala. U Turbo Pascalu ime jedinice mora
da se poklopi sa imenom datoteke u kojoj se na disku čuva kôd te jedinice.
40
P R O G R A M S K I J E Z I K P A S C A L
Ukoliko se desi da
deklarišemo neki
potprogram u interfejsu,
a ne realizujemo ga u
implementaciji,
prevodilac će nam
prijaviti grešku.
Interfejs
Označavamo ga službenom reči interface iza koje ne stoji tačka-zarez. Ako
naš unit koristi usluge nekog drugog, onda u interfejs stavljamo referencu
na drugi unit. To se radi pomoću:
uses ime_jedinice1, ime_jedinice2, ..., ime_jediniceN;
Ako je neka procedura ili funkcija iz unita javno dostupna, onda se njeno
zaglavlje navodi u zaglavlje unita. Inače, zaglavlja potprograma u
interfejsu imaju osobinu deklaracije unapred i zbog toga je redosled
deklarisanja potprograma provizoran. Takođe je sve jedno kojim ih redom
navodimo u telu jedinice.
Implementacija
Označavamo je službenom reči implementation iza koje ne stoji tačka-
zarez. U ovom delu se nalazi realizacija procedura i funkcija deklarisanih u
interfejsu (njihov kompletan tekst uključujući i zaglavlje).
41
P R O G R A M S K I J E Z I K P A S C A L
Ovog dela obično
nema, jer ima vrlo
specifičnu namenu.
Inicijalizacija
Inicijalizacija služi za postavljanje nekih početnih stanja u modulu i
izvršava se samo jedanput i to kada se u zaglalvju klijenta naiđe na uses.
Inicijalizacija se najčešće koristi za postavljanje vrednosti nekih
promenljivih i ovo je jedini izvršni deo unita.
Bez obzira da li unit ima inicijalizaciju ili ne, uvek se završava sa end iza
kojeg sledi tačka.
Primer
Sledeći program predstavlja unit koji sadrži neke procedure i funkcije
potrebne za realizaciju tačke u Dekartovom koordinatnom sistemu.
Čuvamo ga u MPOINT.PAS datoteci.
UNIT MPOINT;
42
P R O G R A M S K I J E Z I K P A S C A L
INTERFACE
IMPLEMENTATION
END.
43
2
Tema
44
Sintaksa programskih
jezika
Ovde ćemo ukratko izložiti osnovne činjenice o sintaksi
prograsmskih jezika i reći nešto o tri najšire korišćena
sistem meta-jezika.
sintaksa,
semantika i
pragmatika.
Način za opis sintakse nekog programskog jezika postavlja pred nas jedan
osnovni problem: kako predstaviti terminale, a kako neterminale.
45
S I N T A K S A P R O G R A M S K I H J E Z I K A
Kompajler generator
Ulaz za kompajler generator jeste sintaksa novog programskog jezika koja
se saopštava odgovarajućim meta-jezikom. Semantiku zadajemo na
osnovu nekog već postojećeg programskog jezika (najčešće je to C).
Kompajler generator nam onda generiše kompajler tog našeg novog
programskog jezika.
46
S I N T A K S A P R O G R A M S K I H J E Z I K A
6. rekurzija je identična;
7. ponavljanje može biti nula ili više puta (kod BNF je jednom ili
više puta). Ograničeno ponavljanje je isto kao za BNF.
Na primer:
47
S I N T A K S A P R O G R A M S K I H J E Z I K A
Sintaksni dijagram
Kao što je već rečeno, najviše se koristi za prezentaciju sintakse forme i to u
glavnom čitaocu u knjigama. Sintaksni dijagram je čitljiviji od BFN i
EBNF. Sredstva za prikazivanje sintaksnog dijagrama su grafička.
Sintaksni dijagram kao celina ima jednu ulaznu granu na kojoj piše naziv
konstrukcije koju definišemo. Terminale prikazujemo krugovima ili
zaobljenim pravougaonicima, neterminale pravougaonicima i međusobno
ih povezujemo usmerenim granama, pa se lančanje postiže upravo na taj
način. Ekskluzivno ili ne postoji. Ponavljanje se postiže isto upotrebom
usmerenih grana.
Primeri
cifra
0 1 2 3 4 5 6 7 8 9
kard_broj
cifra
48
3
Tema
49
Osnovi teorije
algoritama
Ovde ćemo videti kako se definiše algoritam i biće dat
kraći prikaz tri najpoznatija algoritamska sistema:
rekurzivne funkcije, Tjuringove mašine i normalne
algoritme Markova.
Šta je to algoritam?
50
O S N O V I T E O R I J E A L G O R I T A M A
Izračunljive
funkcije su one čija se
vrednost može izračunati
algoritmom.
Algoritmi su deterministički (za isti ulaz daju isti izlaz) ili sholastički.
Algoritamski sistemi
Algoritamski sistem je sredstvo za zadavanje algoritma. Postoji čitav niz
poznatih algoritamskih sistema (npr. opšti BDA koji nije do kraja precizno
definisan ili oni vezani za konkretne probeleme, koji opet nisu dovoljno
opšti).
Rekurzivne funkcije
Ovo su najstariji algoritamski sistemi. Vrednost funkcije za neki argument
računa se poznatim postupkom na bazi vrednosti funkcije za prethodne
vrednosti argumenta. Na primer, ako računamo faktorijel broja n (n!)
imamo za f(0) = 1, a dalje f(i) = i f(i-1), i = 1, 2, ..., n.
51
O S N O V I T E O R I J E A L G O R I T A M A
1. nula funkcija: preslikava sve argumente u 0, tj. 0n(x1, x2, ..., xn) =
0;
fi je bazna funkcija i
Primer
Sabiranje celih nenegativnih brojeva kao rekurzivna funkcija:
f1(x) = I1(x)
f2(x) = S(x)
f3(x, 0) = I1'(x)
52
O S N O V I T E O R I J E A L G O R I T A M A
f3 f = x + y.
53
O S N O V I T E O R I J E A L G O R I T A M A
Tjuringove mašine
Pod Tjuringovim mašinama podrazumevamo familiju matematičkih
apstrakcija koje predstavljaju jednu apstraktnu mašinu. Ovde
posmatramo algoritam sa stanovišta onoga ko ga izvršava, tj. Tjuringove
mašine prikazuju apstraktnog izvršioca algoritma i njegovo ponašanje
kojim se strogo definisan ulaz transformiše u strogo definisan izlaz.
Među simbolima neke reči može se pojaviti i prazan simbol koji ne utiče na
reč i označavamo ga sa . Treba voditi računa da prazna ćelija (B) ne
sadrži nikakav podatak. Samim tim ako sadrži prazno slovo (), ona nije
prazna.
– unutrašnji alfabet;
q0 – početno stanje;
55
O S N O V I T E O R I J E A L G O R I T A M A
Konfiguracija Tjuringove mašine
Konfiguracija Tjuringove mašine je uređena trojka (q, , i) i ona određuje
njeno ukupno stanje.
Funkcije prelaza
Funkcija prelaza se zadaje u vidu pesudnonaredbe, npr: qa q'a'.
Primer
T = (, , , , q0, F)
= {0, 1, , B}
= {0, 1}
q0 = S1
F = {S3}
56
O S N O V I T E O R I J E A L G O R I T A M A
0 1 B
S1 (S2, 0, R) (S2, 1, R) - -
S2 (S2, 1, R) (S2, 0, R) - (S3, , R)
S3 - - - -
57
O S N O V I T E O R I J E A L G O R I T A M A
Naravno, ako smena ima više, mora se voditi računa o redosledu njihovog
izvršavanja. Tako intuitivno podrazumevamo strogo uređen niz smena
koje se primenjuju u tekućoj reči.
U svakom slučaju, mora postojati posebna vrsta nula ili više završnih
smena koje se izvršavaju ako ni jedna druga više ne može da se izvrši. Njih
označavamo tako što stavimo tačku iza strelice, npr. . .
58
O S N O V I T E O R I J E A L G O R I T A M A
i je smena;
x je reč;
početak
ulaz:
X
DA NE
P(1, x) x = 1(x) K(1)
NE DA
1
DA NE
P(2, x) x = 2(x) K(2)
NE DA
1
DA NE
P(i, x) x = i(x) K(i)
NE DA
1
1
izlaz:
X
kraj
59
O S N O V I T E O R I J E A L G O R I T A M A
Fundamentalne osobine
algoritama
To su diskretnost, primenljivost, determinisanost i masovnost.
60
4
Tema
61
Strukturirano
programiranje
subtitle
62
S T R U K T U R I R A N O P R O G R A M I R A N J E
Primer
63
S T R U K T U R I R A N O P R O G R A M I R A N J E
Pravilni programi
Klasa programa koja se razmatra kao ciljna klasa se zove pravilni program.
Pravilni program zadovoljava tri uslova:
Prva dva uslova nalažu da ceo pravilni program možemo zameniti tačno
jednim čvorom, a treći uslov eliminiše mogućnost beskonačnih ciklusa i
izolovanih (nedostupnih) delova programa.
Pravilni potprogram
Pravilni potprogram je sastavni deo nekog programa koji je takođe
pravilan. Na datom primeru grafa toka programa zaokružen je jedan
podgraf koji je takođe i pravilan program.
Analiza algoritama
Analiza algoritama se direktno bavi problemom koji iskazi treba da
postoje u nekom programskom jeziku. Izgrađena je oko dva centralna
pojma: pojma pravilnog programa i pojma prostog programa.
64
S T R U K T U R I R A N O P R O G R A M I R A N J E
1. f
funkcionalni čvor
2. f g sekvenca
3. S
T
IF-THEN
P
4. S
T
P WHILE-DO
5.
T REPEAT-UNTIL
S P
6. T f
P IF-THEN-ELSE
g
7. g T
DO-WHILE-DO
f P
65
S T R U K T U R I R A N O P R O G R A M I R A N J E
Pošto dva čvora mogu da slede neki predikat (ili jedan ili drugi, ne oba) u
odgovarajuće kolone nećemo staviti oznake T i , već stavljamo P i P , od
kojih opet samo jedna može biti tačna i ona nam pokazuje koji se čvor
sledeći izvršava.
0 1 2 3
0 T
1 T
2 P P
3 T
Sada, definišemo funkciju next koja preslikava skup oznaka čvorova na
samog sebe:
function next(n: integer): integer;
begin
j := 0;
while not L[n, j] do j := j + 1;
next := j;
end;
if p then A else B
while
while
q
r
do
do
begin
begin
A,
B,
q
r
:
:
not
not
q
r
end;
end;
68
S T R U K T U R I R A N O P R O G R A M I R A N J E
Uzroci nestrukturiranosti
programa
Strukturiran program je relativan pojam, jer se odnosi na bazu. Ukoliko
ne postoji referenca na neku bazu, pojam strukturiranog programa se
odnosi na programe koji su pisani bez upotrebe skokova ili uopšte koji se
odnose na bazu izgrađenu od sekvence, iteracije tipa while-do i selekcije
tipa if-then-else.
To su sledeće strukture:
T
69
S T R U K T U R I R A N O P R O G R A M I R A N J E
70
S T R U K T U R I R A N O P R O G R A M I R A N J E
T T
71
S T R U K T U R I R A N O P R O G R A M I R A N J E
Strukturiranje programa
Strukturiranje programa se bavi problemom eliminisanja skokova. Oni
ostaju kao opcija jedino za eventualno iskakanje iz nekog ciklusa. Skokove
eliminišemo transformacijom programa koji ih koristi u funkcionalno
ekvivalentni koji ih nema.
Metoda Aschroft-Manna
Primer
Transformisaćemo program dat sledećim GTP u funkcionalno
ekvivalentan program.
4
Ova metoda je izuzetno pogodna za automatizaciju.
T
Q
Bazira se na transformaciji nestrukturiranog
programa (sa goto skokovima) u program bez goto
naredbi.
72
S T R U K T U R I R A N O P R O G R A M I R A N J E
n1
T
n=1
A
n2
T T
n=2 P n1
n3
T
n=3
B
n4
T T
n=4 Q n2
n0
n=0
T
73
S T R U K T U R I R A N O P R O G R A M I R A N J E
Primer
Rešiti sistem linearnih jednačina Ax = b reda n, Ax = b, n.
REŠITI
Ax = b, n
odrediti odrediti
A-1 x = A-1b
Ova metoda više nije toliko popularna, njen osnovni nedostatak je taj što je
algoritamski orijentisana.
74
5
Tema
75
Strukture podataka
U dosadašnjem izlaganju najviše reči je bilo o
algoritmima. Ovde ćemo se baviti jednom podjednako
bitnom komponentom svakog programa – strukturama
podataka.
Pojam podatka
Dakle, mora postojati bar jedno uređenje podataka. Tako da, ako skup S
snabdemo uređenjem, to više neće biti skup. Uređen skup se zove struktura.
76
S T R U K T U R E P O D A T A K A
U Pascalu, Wirth je izjednačio po značaju algoritamski i deklarativni deo
(u kojem su date strukture podataka). On je pokazao da je struktura
podataka potpuno ravnopravna u odnosu na algoritam i da je to stabilniji
deo programa.
A1 A2 Ai An
Ako posmatramo gornju šemu gde su prikazani algoritmi A1, A2, ..., An
koji svi pristupaju nekoj strukturi podataka S, jasno je da izmena nekog
od algoritama Ai verovatno neće imati uticaj na drugih n-1 algoritama. Ali
svaka izmena strukture S će gotovo sigurno izazvati izmene u skoro svim
algoritmima.
77
S T R U K T U R E P O D A T A K A
Prvo, memorisaćemo samo one čija je vrednost različita od nule. Time smo
matricu pretvorili u niz slogova (p je mnogo manje od m i n.):
var B: array[1..p] of record
vrednost: T;
vrsta, kolona: integer
end;
Ovim smo smanjili troškove memorije i vreme obrade, ali sada pristup
elementima A više nije jednostavan. Pristup elementu A[i,j] možemo rešiti
na primer na sledeći način:
k := 1; nadjen := false;
while (k <= p) and (not nadjen) do
if (B[k].vrsta = i) and (B[k].kolona = j) then
nadjen := true
else k := k + 1;
if nadjen then x := B[k].vrednost else x := 0;
78
S T R U K T U R E P O D A T A K A
Grafovi
Za grafičko prikazivanje struktura podataka
se koriste grafovi. Graf je skup snabdeven
a1 a2
jednom binanom relacijom, tj. uređeni par (S,
r). Sastoji se od čvorova (elementi skupa S).
Relacije među tim čvorovima se prikazuju
tako što ih povezujemo granama koje ne
a3 a4
moraju biti orjentisane. Orjentisan graf se
zove digraf (directed graph).
X1 X2 X3 ... Xn-1 Xn
Graf niza
79
S T R U K T U R E P O D A T A K A
80
S T R U K T U R E P O D A T A K A
b) sortiranje
– to je uređivanje (po pravilu) linijske strukture
podataka po nekom kriterijumu
c) kopiranje;
81
S T R U K T U R E P O D A T A K A
Primer
Uzećemo primer strukture matrice. Njena logička struktura se sastoji od
vrsta i kolona. Sa druge strane, memorija računara je po svojoj prirodi
jednodimenzionalna (linijska) struktura. Zbog toga moramo smisliti
određeni način kako da dvodimenzionalnu strukturu transformišemo u
jednodimenzionalnu i kasnije tu jednodimenzionalnu opet u
dvodimenzionalnu. U Fortranu, na primer, to je bilo rešeno tako što se
matrica razdvajala na kolone i onda su one upisivane sekvencijalno jedna
iza druge u memoriju.
a b c d
e f g h a b c d e f g h i j k l
i j k l
82
S T R U K T U R E P O D A T A K A
83
S T R U K T U R E P O D A T A K A
Nizovi mogu biti
statički i
dinamički. Ovde
ćemo se baviti statičkim
nizovima.
Nizovi
Nizovi spadaju u najznačajnije i najstarije strukture podataka. Zovu se i
višedimenzionalne strukture. Kod Pascala, nizovi se odnose na vektore, na
matrice i na višedimenzionalne nizove, što nije bio slučaj i sa starijim
programskim jezicima.
84
S T R U K T U R E P O D A T A K A
Fizička realizacija
Neposredna fizička realizacija jedne strukture podataka može biti:
sekvencijalna i
spregnuta.
X: array[-5..4] of char;
x[- x[- ... x[3 x[4 V X
5] 4] ] ] adr(X[-5])
Realizacija niza u memoriji -5 4
char 1
85
S T R U K T U R E P O D A T A K A
Deskriptor niza
Iliffeovi vektori
Illifeovi vektori se primenjuju ako želimo veliku brzinu obrade, a pri tom
to što ova struktura traži nešto više memorije nije problem. Ovu strukturu
mora programer sâm da realizuje, jer nije sastavni deo ni jednog
programskog jezika. Na primer:
X: array[2..3, -1..1, -2..-1] of T;
Kao i nizovi, Iliffeovi vektori najčešće imaju dve dimenzije, a retko kad
više od tri. Jedina razlika u odnosu na strukturu niza je u tome što Iliffeovi
vektori ne sadrže adrese, već samo vrednosti elemenata.
Za svaki nivo indeksâ se odvaja jedan Iliffeov vektor koji se svaki stvara na
bazi raspona indeksâ. Ako nivo indeksâ ne obuhvata nulu, stvaraju se
pseudoelementi u kojima ne postoji ništa. Za svaki sledeći nivo indeksa
86
S T R U K T U R E P O D A T A K A
deskriptor 0
1 a2 = a1 + 3l(T)
a1 2
3 x[3, 1, -2]
a3 = a2 + 1l(T)
x[2, -1, -2]
-1 -1
0 0
1 1
2 2 2 3 3 3
-1 2 0 2 1 2 -1 3 0 3 1 3
-2 -1 -2 0 -2 1 -2 -1 -2 0 -2 1
-1 -1 -1 -1 -1 -1
Slogovi
Formalno gledano, slogovi podsećaju na nizove. Svaki skalar možemo
shvatiti kao trivijalni slog sa jednim elementom.
87
S T R U K T U R E P O D A T A K A
Fizička realizacija
Teorijski, fizička realizacija sloga je dvojaka: i sekvencijalna i spregnuta. U
praksi je ovo retko, jer je osnovna (koja je i gotovo uvek zastupljena)
sekvencijalna realizacija. Može se pojaviti i kombinacija ove dve.
Primena sloga je kranje široka i teško je izdvojiti neku za koju se može reći
da preovladava. Karakteristično je da se svaka baza podataka sastoji
upravo od slogova.
Tabele
Struktura tabele predstavlja niz čiji su elementi slogovi. Ova struktura ima
posebne primene, jer objedinjuje slogove.
89
S T R U K T U R E P O D A T A K A
Poludinamičke strukture
podataka
Za ove strukture podataka uz određena ograničenja definisane su sve tri
osnovne operacije. Ova ograničenja nisu iznuđena, već su posledica
posebnih namena ovih struktura podataka. Dinamičke strukture podataka
promenljive su u vremenu.
Stek (stack)
Ovo je najvažnija od poludinamičkih struktura s obzirom na svoju ulogu,
ima je svaki program (makar i implicitno). Teorijski, ova struktura je
najjednostavnija od svih.
x i1 , x i i 1, 2, n 1 n 2
S(L) = {x1, x2, ..., xn} i r L
n2
Fizička realizacija
Fizička realizacija steka obavlja se na oba standardna načina: i
sekvencijalno i spregnuto. Osnovni način realizacije je sekvencijalni, jer je
brži što se i najviše očekuje od steka. Ovaj način uvodi ograničenje
maksimalnog broja elemenata na steku. Podrazumeva se deskriptor koji se
ne vidi. Važno je napomenuti da programski jezici nemaju ugrađen stek
kao tip podatka, ali ga svi programi imaju implicitno.
L ST
Amin vr Amax Amax Amin
h
vrh
opis
Realizacija steka u memoriji
elemenata
Deskriptor steka
91
S T R U K T U R E P O D A T A K A
Primena
Stek se primenjuje gde god se
S1
pojavljuje neka vrsta rekurzije. Na
primer kod prevođenja izraza na S2
mašinski jezik, izrazi se prvo prevode S3
iz infiksne (a+b) u postfiksnu (ab+) ili
prefiksnu (+ab) notaciju (najčešće u
postfiksnu, jer je taj zapis izraza
najsličiniji onom na mašinskom
jeziku). Kod poslednje dve za
naznačavanje redosleda izvršavanja
operacija nisu potrebne zagrade. S3
Standardni algoritam za prevođenje S2
izraza iz jedne u drugu notaciju ne S1
može da funkcioniše bez steka. stek
Dakle, druga veoma važna primena steka jeste razmena podataka među
programima i potprogramima. Skup podataka koji sadrži stvarne parametre i
adresa povratka se smeštaju na stek, odakle ih čita potprogram. On rezultate
obrade upisuje na stek, a povratni parametar na datu adresu.
92
S T R U K T U R E P O D A T A K A
potprogram A'
A A
A' P A' param.
kôd
program param. program potprogram
A'
stek
Pascalski i fortranski način razmene podataka između programa i potprograma
Red (queue)
Red se drugačije zove red čekanja ili FIFO red (First In First Out). Ovo je
takođe jedna od vrlo važnih struktura podataka . Formalno, red veoma liči
na stek, ali je područje primene reda sasvim drugačije.
x i1 , x i i 1, 2, n 1 n 2
S(F) = {x1, x2, ..., xn}, r L
n2
Xn Xn-1 ... X1
Digraf reda
Fizička realizacija
Postoje dva načina fizičke realizacije reda: sekvencijalna i spregnuta. Od
reda se, kao i od steka, očekuje brzina, pa je osnovni način sekvencijalna
fizička realizacija. Kao i kod steka, ovakvom realizacijom se izdvaja
kompaktan memorijski prostor koji će služiti za smeštanje elemenata reda.
RD F
Amax Amin
Amin poslednji prvi Amax prvi
poslednji
Realizacija reda u memoriji opis
elemenata
Deskriptor reda
94
S T R U K T U R E P O D A T A K A
x l F x A min
Prethodni x, F
A max x A min
95
S T R U K T U R E P O D A T A K A
Primena
Primena redova je vrlo široka. Prilikom prenosa poruka na daljinu veoma
je bitno da one stižu istim redom kojim su poslate. Na računaru redovi
postoje kod ulaznih uređaja (npr. bafer tastature i miša). Drugi primer
reda kod računara je red čekanja za štampač.
Dek (deque)
Dek je red sa dva kraja. Odatle i engleski naziv (Double Ended QUEue).
Ova struktura ima više teorijsku primenu.
Sekvenca
Sekvenca je linijska struktura kod koje je pristup dozvoljen svakom
elementu, a uklanjaju se samo svi elementi odjednom. Postoji i varijanta
uklanjanja gde se uklanjaju svi elementi počev od zadate pozicije.
Dodavanje novih elemenata se uvek vrši iza poslednjeg elementa.
Fizička realizacija
Imajući u vidu da je glavni predstavnik sekvence datoteka, ova se
struktura realizuje sekvencijalno-spregnutom realizacijom, tj. mešavinom
ove dve. Ovo je jedina strukutra koja se ovako organizuje.
97
S T R U K T U R E P O D A T A K A
2. dinamički niz;
98
S T R U K T U R E P O D A T A K A
Ono što karakteriše ovu strukture je, prvo, da je pristup dozvoljen svakom
elementu, zatim ukloniti se može bilo koji element, a dodati se isto može
bilo gde. Jedino ograničenje postavlja činjenica da je ova struktura
linearna.
Definisane su sve tri vrste pristupa. Pristup po poziciji je nešto sporiji, jer
se ne može unapred izračunati adresa elementa. Dakle, za pristup nekom
k-tom elementu mora se pristupiti redom svakom do tog k-tog. U ovome se
ogleda razlika između statičkog niza i liste. Pristup prema informacionom
sadržaju isto zahteva da se pođe od prvog elementa dok se ne nađe traženi.
U svakom slučaju, listu možemo snabdeti mehanizmom za navigaciju i tad
će u svakom trenutku postojati jedan tekući element.
Kao što je već rečeno, ukloniti se može svaki element, ali ovaj postupak
nikako nije trivijalan. Na primer, mora se voditi računa o specijalnim
slučajevima. Ako je lista prazna, neće doći do uklanjanja. Ako se uklanja
prvi ili poslednji element, uz njega se uklanja samo jedna veza.
...
Ako želimo da pristup po poziciji bude definisan kao i kod statičkog niza,
posle svakog uklanjanja i dodavanja moramo ažurirati pozicije elemenata.
Zbog ovoga su operacije spore, pa dinamički nizovi nemaju praktične
osobine liste. Takođe, fizička realizacija mora biti sekvencijalna, pa može
doći do prepunjenosti.
Primena dinamičkih nizova nije široka, ali se oni vrlo često koriste. To
zbog toga što tip podataka string ima osobine dinamičkog niza.
100
S T R U K T U R E P O D A T A K A
...
Treba voditi računa da dvostruka lista (tj. lista sa dve relacije) nije isto što i
dvostruko spregnuta lista. Pošto se relacija uspostavlja na bazi nekog
kriterijuma, kod ovih drugih, jedna relacija je taj kriterijum, a druga
suprotan kriterijum. Kod dvostruke liste, jedan i drugi kriterijum ne
moraju imati nikakve veze.
Stabla
Stablo (zove se još i drvo) je izuzetno važna struktura podataka. Modelira
više fundamentalnih odnosa iz realnog svega (hijerarhijski odnosi, odnos
opšte-pojedinačno, postupak dekompozicije itd.).
101
S T R U K T U R E P O D A T A K A
u svaki čvor osim jednog ulazi po jedna grana (svaki ima tačno
jednog prethodnika) i
Stablo koje pokazuje dobre osobine (tj. približno je puno i kompletno) zove
se balansirano stablo. Za bilo koja dva čvora istog nivoa balansiranog
stabla važi da se broj elemenata u njihovim podstablima razlikuje najviše
za jedan element. Postoje algoritmi za balansiranje stabla i oni zavise od
konkretnog stabla. Primenom ovih algoritama ubrzavamo pristup
elementima stabla.
102
S T R U K T U R E P O D A T A K A
N-arna stabla
N-arna stabla reda n su ona gde svaki element ima tačno nula ili n
podređenih. U svakom trenutku, postoji n mesta rezervisanih za smeštanje
podređenih elemenata nekog elementa, ali ta mesta ne moraju biti uvek
popunjena (mogu biti nezauzeta). Zbog toga skup podređenih nivoa n ima
osobine statičkog niza.
X X X
A B B A A B C
Prva dva stabla su binarana i razlikuju se po rasporedu elemenata, a treće je ternarno, ali pozicija c nije zauzeta
103
S T R U K T U R E P O D A T A K A
Binarna stabla
Binarna stabla su posebna vrsta n-arnih, to su n-arna stabla reda dva. Za
ova stabla postoji jedna vrlo karakteristična izvedena operacija. To je
obilazak binarnog stabla.
B C
D E F
G H I
Obilazak s leva u desno se izvodi tako što se prvo pristupa levom podstablu
(2), zatim elementu (1), pa desnom podstablu (3). Proces uvek počinje od
104
S T R U K T U R E P O D A T A K A
Fizička struktura
Pošto je logička struktura stabla data na bazi fizičke, fizička struktura
stabla je određena definicijom.
B C
D E F
G H I
Tehnika niti
Pretpostavka je da imamo binarno stablo i da se očekuje intenzivan
obilazak. Svrha upotrebe niti je da se eliminiše stek i još više ubrza
obilazak. Postoje dve varijante ove tehnike, tj. prošivke mogu biti
jednostruke ili dvostruke.
105
S T R U K T U R E P O D A T A K A
B * C
D * E * F *
* G * * H * * I *
Ovakav način realizacije se koristi za statična stabla ili za ona koja se vrlo
malo proširuju (zbog vrlo lakog prepunjavanja memorije).
106