Professional Documents
Culture Documents
1 Uvod 5
2 Povijesni razvoj racunalnih sustava 7
2.1 Prva racunalna pomagala . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Mehanicka racunalna . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Moderna racunala . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 Komercijalna primjena racunala . . . . . . . . . . . . . . . . . . . . 11
2.5 Pojava mikroprocesora i osobnih racunala . . . . . . . . . . . . . . 13
3 Osnove racunala 17
3.1
Sto je racunalo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Struktura racunala . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2.1 Memorija velike brzine . . . . . . . . . . . . . . . . . . . . . 19
3.2.2 Centralna jedinica za obradu . . . . . . . . . . . . . . . . . 20
3.2.3 Ulazno-izlazni sklopovi . . . . . . . . . . . . . . . . . . . . . 21
4 Osnovne operacije na racunalu 23
4.1 Brojevi i brojevni sustavi . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 Prezentacija podataka u memoriji . . . . . . . . . . . . . . . . . . . 24
4.3 Zapisivanje prirodnih brojeva u raznim brojevnim sustavima . . . 26
4.3.1 Pretvaranje brojeva iz binarnog u heksadecimalni sustav i
obratno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.2 Pretvaranje brojeva iz decimalnog u druge sustave . . . . . 27
4.4 Racunske operacije u binarnom, oktalnom i heksadecimalnom sus-
tavu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.4.1 Zbrajanje i oduzimanje u binarnom sustavu . . . . . . . . . 29
4.4.2 Zbrajanje i oduzimanje u heksadecimalnom sustavu . . . . 31
5 Pohranjivanje brojeva u racunalu 35
5.1 Konvencija predznaka . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 Konvencija dvostrukog komplementa . . . . . . . . . . . . . . . . . 36
5.3 Aritmeticke operacije u konvenciji dvostrukog komplementa . . . . 37
1
2 SADR
ZAJ
5.4 Binarni i alfanumericki kodovi . . . . . . . . . . . . . . . . . . . . . 39
5.4.1 Tezinski kodovi . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.4.2 ASCII kod . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4.3 Kodovi za otkrivanje pogresaka . . . . . . . . . . . . . . . . 42
6 Planiranje i razvoj programske potpore 51
6.1 Osnove pisanja programa . . . . . . . . . . . . . . . . . . . . . . . 51
6.2 Rjesavanje problema . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.3 Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.4 Pseudokod i dijagram toka . . . . . . . . . . . . . . . . . . . . . . . 54
7 Pisanje programskog koda (kodiranje) 59
7.1 Programski jezici . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2 Varijable i konstante . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.2.1 Vrste jednostavnih podataka . . . . . . . . . . . . . . . . . 61
7.3 Pridruzivanje vrijednosti . . . . . . . . . . . . . . . . . . . . . . . . 62
7.3.1 Aritmeticki izrazi . . . . . . . . . . . . . . . . . . . . . . . . 64
7.3.2 Komentiranje . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.4 Jednostavni unos i izlaz (Input/Output; I/O) . . . . . . . . . . . . 65
7.4.1 Unos i izlaz; C++ . . . . . . . . . . . . . . . . . . . . . . . 66
7.4.2 C I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
7.5 Pisanje cjelovitog programa . . . . . . . . . . . . . . . . . . . . . . 67
8 Struktura i pisanje programa 71
8.1 Booleove algebra . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
8.1.1 Booleove varijable i konstante . . . . . . . . . . . . . . . . . 71
8.1.2 Booleovi izrazi . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.2 Petlja za izbor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.2.1 Izbor izmedu dvije mogucnosti . . . . . . . . . . . . . . . . 74
8.2.2 Izbor izmedu vise mogucnosti . . . . . . . . . . . . . . . . . 75
8.3 Petlje za ponavljanje . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.3.1 Fiksna petlja (for petlja) . . . . . . . . . . . . . . . . . . . . 78
8.3.2 Pretest petlja (Do petlja ) . . . . . . . . . . . . . . . . . . . 79
8.3.3 Posttest petlja (Do while petlja ) . . . . . . . . . . . . . . 81
9 Numericki algoritmi 85
9.1 Primjeri numerickih algoritama i nekih struktura podataka . . . . 85
9.1.1 Slozenost numerickih algoritama . . . . . . . . . . . . . . . 89
9.2 Odredivanje slozenosti . . . . . . . . . . . . . . . . . . . . . . . . . 91
9.2.1 Kako ocjenjujemo slozenost algoritma ? . . . . . . . . . . . 93
9.3 Polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
9.3.1 Dvodimenzionalna polja . . . . . . . . . . . . . . . . . . . . 95
Sadrzaj 3
9.4 Racunske operacije s oating-point brojevima . . . . . . . . . . . . 96
9.4.1 Aproksimacije realnih brojeva strojnim (oating-point) bro-
jevima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
9.5 Jednosturka tocnost, 32 bitni zapis . . . . . . . . . . . . . . . . . . 97
9.5.1 Racunske operacije sa strojnim (oating-point) brojevima . 98
9.5.2 Zakoni strojne aritmetike (oating-point aritmetika) . . . . 99
10 Funkcije i potprogrami 103
10.1 Funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
10.2 Potprogrami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
10.3 Djelokrug djelovanja i vrijeme trajanja odredenih okruzenja (var-
ijabli) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
4 Sadrzaj
Poglavlje 1
Uvod
5
6 Uvod
Poglavlje 2
Povijesni razvoj racunalnih
sustava
2.1 Prva racunalna pomagala
Moglo bi se reci da su prva racunala bili ljudi, tj. elektronska racunala su naz-
vana upravo po ljudima koji su prije njihove pojave obavljali poslove racunanja.
Ti poslovi su obuhvacali uzastopno izracunavanje navigacijskih tablica, pozicija
planeta za astronomske potrebe ili matematicke izracune (npr. rjesavanje lin-
earnih sustava jednadzbi Jacobijevom metodom).
Lako je zamisliti da na poslu, u kojem se iz sata u sat i iz dana u dan racunaju
samo jednostavne racunske operacije zbrajanja i oduzimanja te mnozenja i di-
jeljenja, lako moze doci do pogreske. Stoga su se ljudi u najranijim razdobljima
svog postojanja trudili pronaci strojeve koji bi olaksali te mukotrpne poslove.
Najstarije poznato pomagalo pri izvodenju racunskih operacija je Abacus.
Zbrajanje i oduzimanje na Abacusu se mogu izvoditi gotovo brzo kao i na
rucnom elektronickom kalkulatoru, dok se mnozenje i dijeljenje izvodi sporije.
Najstariji poznati Abacus koristen je 300 godina p.n.e. u Babilonu, ali i danas se
koristi i to najvise na istoku (Kina).
2.2 Mehanicka racunalna
= 1 2
14
+ 1 2
10
+ 1 2
6
= 17427
(10
0110001101100101
(2
= 0
15
1
14
1
13
0
12
0
11
0
10
1
9
1
8
0
7
1
6
1
5
0
4
0
3
1
2
0
1
1
0
= 1 2
14
+ 1 2
13
+ 1 2
9
+ 1 2
8
+ 1 2
6
+ 1 2
5
+ 1 2
2
+ 1 2
0
= 24445
(10
c) jedna duga rijec
01100011011001010100010001000000
(2
= 0
31
1
30
1
29
0
28
0
27
0
26
1
25
1
24
0
23
1
22
1
21
0
20
0
19
1
18
0
17
1
16
0
15
1
14
0
13
0
12
0
11
1
10
0
9
0
8
0
7
1
6
0
5
0
4
0
3
0
2
0
1
0
0
= 1667580992
(10
26 Osnovne operacije na ra cunalu
4.3 Zapisivanje prirodnih brojeva u raznim brojevnim
sustavima
U ovom poglavlju cemo proucavati veze izmedu zapisa brojeva u razlicitim bro-
jevnim sustavima. Kao sto se moze vidjeti u Tablici 4.2, svakom binarnom nizu
(broju u binarnom sustavu) odgovara jedan i samo jedan broj u jednom od pre-
ostalih sustava.
Sljedeca tablica sadrzi zapis brojeva 0, . . . , 15 u dekadskom (dec), oktalnom
(oct), heksadecimalnom (hex) i binarnom (bin) sustavu.
dec oct hex bin
0 0 0 0
1 1 1 1
2 2 2 10
3 3 3 11
4 4 4 100
5 5 5 101
6 6 6 110
7 7 7 111
8 10 8 1000
9 11 9 1001
10 12 A 1010
11 13 B 1011
12 14 C 1100
13 15 D 1101
14 16 E 1110
15 17 F 1111
Tablica 4.2: Ekvivalencija zapisa u binarnom, oktalnom, dekadskom i heksadeci-
malnom sustavu
. Tada kazemo da je
nastupio (ili da je doslo do) prekoracenja (overowa).
Primjer 5.2 Odredite decimalnu vrijednost zbroja brojeva 10100011 i 00010110
ako su dani konvencijom predznaka i ako je osnavna jedinica byte.
broj: 10100011 broj: 00010110
predznak: 1 (negativan) 0 (pozitivan)
Apsolutna vrijednost 1 2
5
+ 1 2
1
+ 1 2
0
1 2
4
+ 1 2
2
+ 1 2
1
Decimalna vrijednost: (32 + 2 + 1) = 35 +(16 + 4 + 2) = +22
5.2 Konvencija dvostrukog komplementa
Zbog svoje jednostavnosti, ova je konvencija najpopularnija medu proizvodacima
racunala diljem svijeta.
U konvenciji dvostrukog komplementa pozitivne brojeve zapisujemo na
jednak nacin kao i kod konvencije predznaka, a za negativne brojeve koris-
timo sljedecu proceduru (u 3 koraka):
1. Korak: Izrazimo apsolutnu vrijednost promatranog broja binarno
2. Korak : Promjenimo sve nule u jedinice i sve jedinice u nule (0 1 i
1 0); ovu proceduru zovamo komplementiranje bitova.
3. Korak : Dodamo 1 broju dobivenom u koraku 2.
Ako nam konvencije predznaka da negativni, njemu pridruzeni pozitivni
broj dobivamo provodeci korake 2. i 3. iz gornje procedure.
Primjer 5.3 Kako glasi reprezentacija broja 31 u konvenciji dvostrukog kom-
plementa?
Rjesenje:
1. Korak: Apsolutna vrijednost broja je 31, tj. 31
(10
= 00011111
(2
.
Aritmeti cke operacije u konvenciji dvostrukog komplementa 37
2. Korak: Promjenimo 0 1 i 1 0, dobivamo 11100000
(2
.
3. Korak: Broju iz koraka 2. dodajemo 1, tj.
11100000 +
1
11100001
Trazena reprezentacija broja 31 glasi 11100001. Primjetite da je predznak
dobivenog broja 1 sto odgovara .
U konvenciji dvostrukog komplementa, u rijec duljine n bitova mozemo za-
pisati brojeve od (2
n1
) do +(2
n1
1). Primjetite da se u ovoj konvenciji mogu
zapisati manji negativni brojevi nego u konvenciji predznaka (veci po apsolutnoj
vrijednosti).
Primjer 5.4 Kolika je pozitivna vrijednost pridruzenog broja u dekadskom
sustavu broju koji u konvenciji predznaka ima oblik 11100100?
Rjesenje: Buduci da ovaj broj na prvom mjestu ima 1, znaci da je negativan
pa provodimo 2. i 3. korak gornje procedure.
2. Korak: Promjenimo 0 1 i 1 0, tj. mijenjamo 11100100 u 00011011.
3. Korak: Broju iz koraka 2. dodajemo 1, tj.
00011011 +
1
00011100
Dakle, trazeni broj ima oblik 00011100, dekadska vrijednost mu je 28.
5.3 Aritmeticke operacije u konvenciji dvostrukog kom-
plementa
Zakon zbrajanja: Brojeve zbrajamo tako da ih tretiramo kao brojeve bez predz-
naka, tj. najznacajniji bit (lijevi bit), odnosno, bit s predznakom smatramo da je
dio broja. Ako nakon zbrajanja ostane dio koji bi trebali prenijeti (1), nakon
lijevog bita, to zanemarujemo.
38 Pohranjivanje brojeva u ra cunalu
Zakon oduzimanja: Brojeve oduzimamo takoder smatrajuci ih brojevima
bez predznaka, tj. najznacajniji bit (lijevi bit), odnosno, bit s predznakom sma-
tramo da je dio broja. Ako nam za oduzimanje treba 1 iza lijevog bita, to
posudimo i nakon operacije oduzimanja tu jedinicu zanemarujemo.
Primjer 5.5 Zbrojite brojeve 11000111 i 11011101 koji su dani u konvenciji
dvostrukog komplementa.
11000111 +
11011101
0 1 i 1 su 10 pa pisemo 0
i 0 i 1 pamtimo (prenosimo)
11000111 +
11011101
00 1 i 0 su 1 plus ono sto smo zapamtili je 10,
pa pisemo 0 i 1 prenosimo
11000111 +
11011101
100 1 i 1 su 10 plus 1 koji smo prenijeli je 11,
pa pisemo 1 i 1 prenosimo
11000111 +
11011101
0100 0 i 1 su 1 plus ono sto pamtimo je 10,
pa pisemo 0 i 1 prenosimo
11000111 +
11011101
00100 0 i 1 su 0 plus ono sto pamtimo je 10,
pa pisemo 0 i 1 prenosimo
11000111 +
11011101
100100 0 i 0 su 0 plus ono sto pamtimo je 1,
pa pisemo 1 i nista ne prenosimo
11000111 +
11011101
0100100 1 i 1 su 10 pa pisemo 0 i 1 prenosimo
11000111 +
11011101
10100100 1 i 1 su 10 plus ono sto smo prenijeli je 11, pa
pisemo 1 i zanemarujemo ono sto treba prenijeti
Primjetimo: Dekadski zapis dobivenog broja iznosi 92, sto je upravo vrijed-
nost zbroja brojeva 11000111
(2
= 57
(10
i 11011101
(2
= 35
(10
.
Binarni i alfanumeri cki kodovi 39
Primjer 5.6 Odredite rezultat oduzimanja broja 11011101 od broja 00111001,
ako su brojevi dani u konvenciji dvostrukog komplementa.
00111001
11011101
0 1 minus 1 su 0 pa pisemo 0
00111001
11011101
00 0 minus 0 su 0 pa pisemo 0
00111001
11011101
100 0 je manje od 1, pa posudujemo 2 od gornjeg broja.
2 minus 1 su 1 pa pisemo 1
00111001
11011101
1100 1 je dobivena tako da smo uzimajuci u obzir ,
posudenu 1-cu, umjesto 1 dobili 0, a kako je 0 manja
od 1 moramo ponovno posuditi 2 u gornjem broju
tako da imamo 2 minus 1 je 1 i pisemo 1
00111001
11011101
11100 ova nova 1-ca je dobivena potpuno analogno kao u
gornjem slucaju, tako da i dalje imamo posudeno 2
00111001
11011101
011100 buduci da smo posudili 2, to gornja jedinica postaje 0
pa imamo 0 minus 0 je 0 i pisemo 0.
00111001
11011101
1011100 0 je manje od 1, pa posudujemo 2 od gornjeg broja.
2 minus 1 su 1 pa pisemo 1
00111001
11011101
01011100 0 postaje 1, pa kako je 1 minus 1 jednako
0 pisemo 0.
5.4 Binarni i alfanumericki kodovi
Kao sto je ljudima puno jednostavnije da u svakodnevnom zivotu upotrebljavaju
brojeve iz dekadskog brojevnog sustava nego nizove 0 i 1-ca (brojeve iz binarnog
sustava), tako je racunalima upravo obratno, tj. njima je potpuno prirodno
(jednostavnije) raditi s nizovima 0 i 1-ca.
40 Pohranjivanje brojeva u ra cunalu
U svrhu rjesavanja tog problema razvijeno je nekoliko vrsta dogovora koji
ce biti prepostavka za uspjesno komuniciranje izmedu ljudi i racunala. To su
dogovori o skupu znakova koji ce se u radu s racunalom koristiti, te o pripadnim
binarnim kombinacijama za svaki od znakova i zadacima koji se za svakog moraju
izvrsiti. Dogovori se vremenom prosiruju i dograduju, pri cemu su neki od njih
ozakonjeni standard drzave ili preporuka neke medunarodne organizacije.
Skup svih znakova koji se tako koriste naziva se apstraktna abeceda, koja
zajedno s pripadnim binarnim (ili nekim drugim) kombinacijama tvori kod. Po-
jedini znakovi u kodu nazivaju se kodni elementi, a pripadni im se zamjenjitelj,
bilo da je u pitanju binarna kombinacija, neki drugi znak ili nesto trece, naziva
kodna zamjena.
Mi cemo spomenuti neke tezinske kodove (BCD npr.) i jedan alfanumericki
kod (ASCII).
5.4.1 Tezinski kodovi
Broj kodnih elemenata u apstraktnoj abecedi naziva se obim koda. Medu pop-
ularnije 4 bitne kodove spadaju tzv. tezinski kodovi.
U takvoj reprezentaciji svaki od 4 bita, pomocu kojih zapisujemo dekadski
broj N, ima svoju tezinu tj.
N = w
1
b
1
+ w
2
b
2
+ w
3
b
3
+ w
4
b
4
gdje su b
i
, i = 1, . . . 4 bitovi, a w
i
, i = 1, . . . 4 tezine. Niz binarnih znamenaka
koji predstavljaju dekadski broj N zovemo kodna rijec.
Jedan od najpoznatijih 4 bitnih kodova je BCD ((Binary-Coded-Decimal), u
prijevodu binarno kodirana dekada). BCD je tezinski kod s tezinama 8-4-2-1 sto
odgovara reprezentaciji decimalnog broja u binarnom obliku.
Sljedeca tablica sadrzi prikaz dekadskih znamenki u razlicitim kodovima BCD
(8-4-2-1), 8-2-4-1 i 2-4-1-2 kodu.
Primjer 5.7 Prikazite dekadski broj 9 u 2 4 2 1, odnosno, u 8 4 2 1
tezinskom kodu.
1 2 + 1 4 + 1 2 + 1 1 = 9
(10
, 1 8 + 0 4 + 0 2 + 1 1 = 9
(10
.
Stoga je reprezentacija broja 9 u 2 4 2 1 dana s 1111, dok je u 8 4 2 1
kodu dana s 1001.
Primjetite: Zapis broja u danom kodu ne mora biti jedinstven:
1 2 + 1 4 + 0 2 + 0 1 = 6
(10
, 0 2 + 1 4 + 1 2 + 0 1 = 6
(10
,
Prirodno se namecu sljedeca pitanja: 1. Kako racunalo zna koji kod koris-
timo? 2. Moze li se istovremeno koristiti vise razlicithih kodova?
Binarni i alfanumeri cki kodovi 41
dekadske kod BCD kod
znamenke 2-4-1-2 8-4-2-1
0 0000 0000
1 0001 0001
2 0010 0010
3 0011 0011
4 0100 0100
5 1011 0101
6 1100 0110
7 1101 0111
8 1110 1000
9 1111 1001
Tablica 5.1: Zapis dekadskih znamenki u tezinskim kodovima
Odgovor na drugo pitanje je ne. Moze se koristiti samo jedna vrsta koda.
Za odgovor na prvo pitanje potrebno je denirati novu vrstu koda. To je tzv.
samokomplementirajuci kod, odnosno kod za koji vrijedi da se zapis broja
9 N dobije komplementiranjem (zamjenom 0 u 1 i obratno) zapisa broja N.
Sljedeca tablica prikazuje kako izgleda zapis broja N i 9 N u samokomple-
mentirajucem kodu.
Primjer 5.8 U sljedecoj tablici prikazani su zapisi dekadskih znamenaka u kodu
2-4-2-1 koji je samokomplementirajuci. Primjetite da se komplemetni brojeva
N (9 N) dobivaju jednostavnim komplementiranjem pripadnog niza binarnih
znamenaka.
5.4.2 ASCII kod
Racunala danas intenzivno koriste, osim numerickih podataka, i alfanumericke
podatke (slova, specijalne znakove, . . . .) Da bi racunala mogla uspjesno baratati
s alfanumerickim podacima, najjednostavnije je da svakom znaku koji nam je
potreban pridruzimo odredeni broj (kod) koji cemo koristiti. Standardna engleska
(US) tipkovnica sadrzi najmanje 128 razlicitih znakova(koje treba kodirati):
Brojevi : 10
Slova (velika i mala) 52
Posebni znakovi 33 (ukljucujuci !, @, #, $, %, . . . )
Kontrolni znakovi 33 (ukljucujuci Enter, space, backspace, . . . )
Ukupno 128
Najmanji potrebni broj bitova za prikazivanje 128 znakova iznosi 7 (jer je 2
7
=
128).
42 Pohranjivanje brojeva u ra cunalu
N
10
2 4 2 1 (9 N)
10
reperezantacija 9 N
u 2 4 2 1 kodu
0 0000 9 1111
1 0001 8 1110
2 0010 7 1101
3 0011 6 1100
4 0100 5 1011
5 1011 4 0100
6 1100 3 0011
7 1101 2 0010
8 1110 1 0001
9 1111 0 0000
Tablica 5.2: samokomplementirajuci kod 2-4-2-1
Najcesce koristeni alfanumericki kod je tzv. ASCII (American Standard
Code for Information Interchange), sto prevedeno znaci: americki standardni
kod za razmjenu informacija. Tijekom razvoja racunalne tehnologije denirano
je vise varijanti ovoga koda. Najcesce je u uporabi osam bit-na varijanta u kojoj
je prvih 128 kombinacija (0-127) standarizirano, a drugih 128 kombinacija (128-
255) dato na volju korisniku da sam kreira kodne elemente. Prvih 128 elemenata
koda prikazano je u sljedecim tablicama:
Primjer 5.9 Kako glasi ASCII reprezentacija poruke Pozdrav svima
P o z d r a v s v i m a
dec 80 111 122 100 114 97 118 32 115 118 105 109 97
hex 50 6F 7A 64 71 61 76 20 73 76 69 6D 61
5.4.3 Kodovi za otkrivanje pogresaka
U prenosu (transmisiji) binarnih podataka postoji mogucnost pogreske sum ili
buka, sto je posljedica nesavrsenosti uredaja. To znaci, da ako dode do takve
pogreske pri komunikaciji, u nekim bitovima je doslo do promjene nule u jedinicu
ili obratno. Ako se ovako nesto dogodi kod i dalje moze biti procitan, ali sadrzaj
mu je netocan.
U ovomcemo poglavlju prikazati jedan (najjednostavniji) nacin na koji mozemo
otkriti je li procitani kod ispravan i, ako nije, kako pronaci pogresku te kako ju
ispraviti.
Dakle pretpostavit cemo da se moze mijenjati samo jedan bit. Tada pogreske
mozemo otkriti i ispraviti pomocu koda za otkrivanje jedne pogrese.
Binarni i alfanumeri cki kodovi 43
dekadski oktalni heksadecimalni binarni vrijednost
000 000 000 00000000 NUL
001 001 001 00000001 SOH
002 002 002 00000010 STX
003 003 003 00000011 ETX
004 004 004 00000100 EOT
005 005 005 00000101 ENQ
006 006 006 00000110 ACK
007 007 007 00000111 BEL
008 010 008 00001000 BS
009 011 009 00001001 HT
010 012 00A 00001010 LF
011 013 00B 00001011 VT
012 014 00C 00001100 FF
013 015 00D 00001101 CR
014 016 00E 00001110 SO
015 017 00F 00001111 SI
016 020 010 00010000 DLE
017 021 011 00010001 DC1
018 022 012 00010010 DC2
019 023 013 00010011 DC3
020 024 014 00010100 DC4
021 025 015 00010101 NAK
022 026 016 00010110 SYN
023 027 017 00010111 ETB
024 030 018 00011000 CAN
025 031 019 00011001 EM
026 032 01A 00011010 SUB
027 033 01B 00011011 ESC
028 034 01C 00011100 FS
029 035 01D 00011101 GS
030 036 01E 00011110 RS
031 037 01F 00011111 US
032 040 020 00100000 SP
033 041 021 00100001 !
034 042 022 00100010
035 043 023 00100011 #
036 044 024 00100100 $
037 045 025 00100101 %
44 Pohranjivanje brojeva u ra cunalu
dekadski oktalni heksadecimalni binarni vrijednost
038 046 026 00100110 &
039 047 027 00100111
040 050 028 00101000 (
041 051 029 00101001 )
042 052 02A 00101010 *
043 053 02B 00101011 +
044 054 02C 00101100 ,
045 055 02D 00101101 -
046 056 02E 00101110 .
047 057 02F 00101111 /
048 060 030 00110000 0
049 061 031 00110001 1
050 062 032 00110010 2
051 063 033 00110011 3
052 064 034 00110100 4
053 065 035 00110101 5
054 066 036 00110110 6
055 067 037 00110111 7
056 070 038 00111000 8
057 071 039 00111001 9
058 072 03A 00111010 :
059 073 03B 00111011 ;
060 074 03C 00111100
061 075 03D 00111101 =
062 076 03E 00111110
063 077 03F 00111111 ?
064 100 040 01000000 @
065 101 041 01000001 A
066 102 042 01000010 B
067 103 043 01000011 C
068 104 044 01000100 D
069 105 045 01000101 E
070 106 046 01000110 F
071 107 047 01000111 G
072 110 048 01001000 H
073 111 049 01001001 I
074 112 04A 01001010 J
Binarni i alfanumeri cki kodovi 45
dekadski oktalni heksadecimalni binarni vrijednost
075 113 04B 01001011 K
076 114 04C 01001100 L
077 115 04D 01001101 M
078 116 04E 01001110 N
079 117 04F 01001111 O
080 120 050 01010000 P
081 121 051 01010001 Q
082 122 052 01010010 R
083 123 053 01010011 S
084 124 054 01010100 T
085 125 055 01010101 U
086 126 056 01010110 V
087 127 057 01010111 W
088 130 058 01011000 X
089 131 059 01011001 Y
090 132 05A 01011010 Z
091 133 05B 01011011 [
092 134 05C 01011100
093 135 05D 01011101 ]
094 136 05E 01011110 ^
095 137 05F 01011111 _
096 140 060 01100000
46 Pohranjivanje brojeva u ra cunalu
dekadski oktalni heksadecimalni binarni vrijednost
097 141 061 01100001 a
098 142 062 01100010 b
099 143 063 01100011 c
100 144 064 01100100 d
101 145 065 01100101 e
102 146 066 01100110 f
103 147 067 01100111 g
104 150 068 01101000 h
105 151 069 01101001 i
106 152 06A 01101010 j
107 153 06B 01101011 k
108 154 06C 01101100 l
109 155 06D 01101101 m
110 156 06E 01101110 n
111 157 06F 01101111 o
112 160 070 01110000 p
113 161 071 01110001 q
114 162 072 01110010 r
115 163 073 01110011 s
116 164 074 01110100 t
117 165 075 01110101 u
118 166 076 01110110 v
119 167 077 01110111 w
120 170 078 01111000 x
121 171 079 01111001 y
122 172 07A 01111010 z
123 173 07B 01111011 {
124 174 07C 01111100 |
125 175 07D 01111101 }
126 176 07E 01111110
127 177 07F 01111111 DEL
Tablica 5.3: Tablice ASCII znakova
Binarni i alfanumeri cki kodovi 47
U svrhu otkrivanje jednog pogresnog bita koristimo: paritet. To je dodatni
bit koji u slucaju parnog pariteta treba postaviti tako da cijeli kod ima paran
broj 1-ca, ili za neparni paritet taj se bit denira tako da cijeli kod ima neparan
broj jedinica.
Decimalne tezinski kod Paritet Paritet
znamenke 8 4 2 1 (parni) (neparni)
0 0000 0 1
1 0001 1 0
2 0010 1 0
3 0011 0 1
4 0100 1 0
5 0101 0 1
6 0110 0 1
7 0111 1 0
8 1000 1 0
9 1001 0 1
Komunikacija izmedu dvaju racunala:
Racunalo koje salje informacije nazivamo izvor, a racunalo koje prima infor-
macije nazivamo odrediste (cilj).
Postupak slanja i primanja poruka prikazat cemo u 5 koraka:
(i) Ako izvor ne salje podatke, onda se stalno prenosi niz 1-ca
(ii) Bit 0 odreduje pocetak poruke
(iii) Paritetni bit se postavlja po paritetnoj konvenciji koju koristimo (parni ili
neparni paritet)
(iv) Nakon paritetnog bita stavljamo dodatnu 1-cu koja ukazuje na kraj poruke
(v) Nakon toga izvor moze nastaviti slati sljedeci byte ili nastaviti slati niz
1-ca sto odgovara prestanku poruke.
Primjer 5.10 Petpostavimo da dva racunala medusobno komuniciraju po kon-
venciji parnog pariteta u smjeru strelice
Sto su ulazni podaci?
Sto je poznato, sto cemo dobiti i u kojem formatu?
Sto su ocekivani izlazni podaci? U kakvom obliku zelimo izlaz? (gracki,
alfanumericki, . . . )
Kako ce izgledati pojedini koraci potrebni da od danih ulaznih poataka
dodemo do zeljenog izlaza.
2. Korak Formiranje rjesenja.
Zahtijeva se tocno odredivanje potrebnih koraka cija primjena dovodi do
zeljenog rjesenja. Taj niz koraka mora biti:
nedvosmislen
temeljit, odnosno detaljan
konacan
3. Korak Pisanje programskog koda u programskom jeziku i doku-
mentiranje.
Ako su prva dva koraka pazljivo napravljena, onda je ovaj korak relativno
jednostavan.
_
n
i=1
a
i
Treba provjeriti kako ce se program ponasati ako je samo jedan od brojeva
a
i
< 0.
6.3 Algoritmi
Cilj rjesavanja problema (gore navedeni koraci) jest kreiranje algoritma.
U svakodnevnom zivotu pri obavljanju bilo kakvih zadataka, nesvjesno ko-
ristimo odredene algoritme. Pod pojmom algoritam podrazumjevamo uredeni
skup jednoznacnih (nedvosmislenih) izvedivih koraka koji opisuju odredenu ak-
tivnost (npr. provodenje niza racunskih operacija koje izvodi racunalo ili pravl-
jenje sendvica za uzinu).
Sljedeci primjer ilustrira kako bi mogao izgledati algoritam koji opisuje nacin
pravljenja sedvica sa sunkom i sirom.
Primjer 6.2 Napisite algoritam za pravljenje sendvica sa sunkom i sirom.
Algoritam:
1. stavi kruh, maslac, sunku, sir, noz i tanjur na radnu plohu
2. stavi dvije kriske kruha na tanjur
3. nozem namazi jednu krisku kruha maslacem
4. ako zelite sir, onda ga stavite na drugu krisku
5. stavite sunku na krisku na kojoj je maslac
6. spojite kriske
7. ako zelite novi sendvic, ponovite korake 1-6
8. pojedite sendvic
54 Planiranje i razvoj programske potpore
Posljednji korak nije dio originalnog algoritma jer sendvic mozete i pokloniti
ili dati nekom drugom da ga pojede itd.
U gornjem algoritmu korake mozemo podijeliti na:
korak 1 Ulaz (Input)
koraci 2-7 Obrada (Process)
korak 8 Izlaz (Output)
Kako vidimo iz primjera (a i sama denicija istice), algoritam predstavlja
ureden skup jednoznacnih (nedvosmislenih) izvedivih koraka. Stoga je logicno
da se koraci algoritma izvode odredenim redoslijedom. Medutim, to ne znaci da
se koraci algoritma uvijek izvode sekvencijalno, u nizu. Postoje i tzv. paralelni
algoritmi koji sadrze takozvane niti (thread) koje izvodi pojedini procesor, pa se
odredeni koraci mogu izvoditi istovremeno.
Pojam jednoznacni (nedvosmisleni) izvedivi koraci znaci da za vrijeme izvodenja
algoritma, informacija o stanju procesa mora biti dovoljna, odnosno da jed-
noznacno i potpuno denira akciju koja slijedi. Drugim rijecima, izvodenje
(napredovanje) algoritma ne smije se temeljiti na kreativnosti (procesora, osobe
koja ga slijedi), nego mora biti rezultat slijeda uputa.
6.4 Pseudokod i dijagram toka
Zamijenimo li formalnu, strogu strukturu programskog jezika, manje formalnim
sustavom oznacavanja, dobili smo sustav za predstavljanje algoritma poznat pod
nazivom pseudokod pomocu kojeg ideje mozemo izraziti (zapisati) na laksi i
manje formalan nacin tijekom postupka razvijanja (smisljanja) samog algoritma.
Pseudokod je strukturirani jezik za pisanje algoritama.
Jedan od nacina predstavljanja algoritma pseudokodom je izostavljanje prav-
ila iz naredbi koja prate svaki formalni programski jezik. Ovaj se nacin obicno ko-
risti kada znamo koji cemo programski jezik koristiti, pa je tako semi-sintakticka
struktura kojom opisujemo algoritam velikim dijelom nalik, ali manje formalna
od programskog jezika.
Zelimo li, pak, ponuditi formalni zapis za predstavl-
janje algoritma neovisan o programskom jeziku, tada formaliziramo oznake za
ponavljajuce semanticke strukture i deniramo pseudo kod kao intuitivni nacin
predstavljanja algoritma kod kojeg ipak postoje odredena pravila zapisa. Prim-
jer 6.2 je napisan u pseudokodu, pri cemu svaki korak ima specicni (odredeni)
glagol (uzmi, stavi, namazi, . . . )
Primjer 6.3 Napisite algoritam za racunanje povrsine pravokutnika stranica a
i b.
Algoritam:
1. ucitajte velicine stranica a i b.
Pseudokod i dijagram toka 55
2. ako je jedan od brojave negativan, javi pogresku da uneseni brojevi nisu
duljine stranica.
3. pomnozi brojeve a i b
4. ispisite: trazena povrsina iznosi ab
Da bi se istaknuo tijek algoritma (nacin na koji se izvode pojedine naredbe
programa u kojem se kodira pojedini algoritam), dobro je naciniti tzv. dijagram
toka.
U dijagramu toka koriste se pojedini simboli koji svojim oblikom deniraju
vrstu posla koji treba obaviti. Slijedeca tablica prikazuje simbole od kojih se
sastoji svaki dijagram toka.
Pravokutnikprikazuje
korakeobrade(procesa)
Paralelogramprikazuje
ulazneiizlaznekorake
Rombprikazujemjesto
odluivanja( ) grananje
Strelicaukazujena
smijertokapodataka
Krui je
mjestospoja
Slika 6.1: Simboli za sastavljanje dijagrama toka
Primjer 6.4 Nacinite dijagram toka algoritma za pravljenje sendvica sa sunkom
i sirom (vidi 6.3).
Zadatak 6.1 Izradite prva dva koraka programiranja (analiza problema i dizajni-
ranje rjesenja) za program koji radi obracun hotelskih troskova. Hotel naplacuje
sobe 500kn/dan za jednu osobu, 600 za dvije, 700 za tri ili vise.
Zadatak 6.2 Nacrtajte dijagram toka za program koji ucitava dva broja i ispisuje
veci.
Zadatak 6.3 Napravite dijagram toka za algoritam koji ucitava broj i ispisuje
njegov kvadrat sve dok se ne unese negativan broj.
56 Planiranje i razvoj programske potpore
Slika 6.2: Dijagram toka algoritma za pravljenje sendvica
Pseudokod i dijagram toka 57
Zadatak 6.4 Napisite algoritam u pseudokodu i dijagram toka za program koji
ucitava niz brojeva sve dok korisnik ne unese -1 i ispisuje aritmeticku sredinu
brojeva.
Zadatak 6.5 Napisite algoritam u pseudokodu i dijagram toka koji ispisuje dva
ucitana broja u rastucem redoslijedu.
Zadatak 6.6 Napisite algoritam u pseudokodu i dijagram toka koji racuna po-
tenciju a
b
, gdje je b pozitivan cijeli broj.
Zadatak 6.7 Napisite algoritam koji zadani niz rotira za jedno mjesto udesno.
Pretpostavimo da imamo ucitani niz x
n
.
Zadatak 6.8 Napisite pseudokod i dijagram toka za algoritam koji ucitava katete
pravokutnog trokuta i ispisuje njegov:
a) opseg
b) povrsinu.
Zadatak 6.9 Napisite pseudokod i dijagram toka za algoritam koji za ucitane
duljine stranica kvadra ispisuje njegov:
a) volumen
b) oplosje.
Zadatak 6.10 Nacrtajte dijagram toka za algoritam koji ucitava prirodni broj i
ako je broj paran, ispisuje njegovog prethodnika, a ako je neparan sljedbenika.
Zadatak 6.11 Nacrtajte dijagram toka za algoritam koji ucitava broj i ako je
pozitivan ispisuje da li je veci, jednak ili manji od 100. Ako je broj negativan,
potrebno je ispisati odgovarajucu poruku.
58 Planiranje i razvoj programske potpore
Poglavlje 7
Pisanje programskog koda
(kodiranje)
7.1 Programski jezici
U ovom cemo poglavlju proucavati osnovna pravila i nacine pisanja programskih
jezika (programiranja ili kodiranja). Nakon sto rijesimo problem (konstruiramo
rjesenje) i nacinimo dijagram toka (pseudokod), prelazimo na pisanje programa.
Programe cemo pisati u programskim jezicima C i C++, pri cemu cemo uvijek
istaknuti razliku u obliku programa, ako ona postoji.
Osvrnimo se prvo na povijesni razvoj programskih jezika. Najstarija racunala
zahtijevala su da programer prevede sve algoritme na strojni jezik. Taj je pristup
dao jos vecu vaznost izucavanju algoritama, jer je ucinkovitiji algoritam smanji-
vao broj redova programskog koda i broj prepisivanja heksadecimalnog koda sa
kojima se opisivala naredba, a time i vjerojatnost pogreske.
Tako su se razvili programi nazvani asembleri koji su prevodili program napisan
mnemonickim kodom u strojni jezik. S vremenom, strojni jezik smatran je pr-
vom generacijom jezika, a asembler 2. generacijom. Iako je asembler imao niz
prednosti u odnosu na strojni jezik, ipak mu je nedostajalo cjelovitije okruzenje.
Prvi nedostatak ovakvog programskog jezika jest da je program napisan u
asembleru ovisio o procesoru kojem je bio namijenjen i nije se bas jednostavno
prenosio na racunalo sa drugim tipom procesora, jer je trebalo voditi racuna o
novom obliku instrukcijskog skupa i drugacijim registrima. Drugi nedostatak
ocitovao se u nacinu koji je programer bio prisiljen usvojiti ukoliko je zelio nesto
isprogramirati. Programer je bio prisiljen razmisljati o malim, inkrementalnim
koracima strojnog jezika. Situacija je usporediva sa primjerom vezanim za prob-
lem opisa gradnje kuce ako bismo morali razmisljati o polozaju svake cigle, daske
i slicno.
Cinjenica je da u nekom trenutku treba elemente kuce predstaviti i na
takav nacin, ali je o funkcionalnosti projekta lakse i razumljivije govoriti koristimo
59
60 Pisanje programskog koda
li vece jedinice kao sto su sobe, kuhinja, vrata, prozori i sl.
Ukratko, elementi od kojih je proizvod sastavljen, ne moraju biti oni koje
koristimo kada ga projektiramo. Projektirati je lakse na vecem nivou na kojem
svaki dio oznacava koncept. Slijedom ove lozoje, poceli su se razvijati novi
programski jezici prilagodeniji razvoju softwarea od asemblerskih jezika. Tako su
nastali jezici trece generacije koji su se od prethodne razlikovali u tome da su bili
na visem nivou i neovisni o procesoru. Tipicni primjeri su FORTRAN (FOR-
mula TRANslator) za matematicke i znanstvene proracune i COBOL (Common
Business Oriented Language) kojeg je razvila US Navy za poslovne aplikacije.
Bez obzira na naprednu tehnologiju racunalo i dalje razumije samo nizove
nula i jedinica, stoga se program koji pisemo mora prevesti na jezik racunala.
Postoje dvije osnovne vrste prevoditelja programa (transleter-a) koji prevode
nizove naredbi u strojevni 0, 1 jezik:
Compiler-i i Interpreteri
Compiler to je prevoditelj koji prevodi neki od visih programskih jezika
(samo jedanput), tako da prevede cijeli program nakon cega se program
izvodi koristeci tzv. izvedbeni oblik (nejcesce s ekstenzijom .exe)
Primjeri: C, C++, Turbo Pascal, Fortran 99, . . .
Interpreter je prevoditelj koji prevodi i odmah izvodi redak po redak
programa. Ako naide na pogresku u odredenom retku, prevoditelj prekida
daljnje prevodenje na tom mijestu.
Primjeri: GVBasic, MatLab, Mathematica, . . .
Posebno mijesto zauzimaju jezici koji su i Compiler-i i Interpreteri, npr.
Java. Izvorni Java kod se prevodi (kompajlira) u posebni bytecode koji se moze
izvoditi na razlicitim operacijskim platformama. Takoder, postoje Java programi
koji se zovu apleti (applets), a mogu se prenositi kroz World Wide Web i mogu
se izvrsavati na bilo kojem Java-aware browseru.
7.2 Varijable i konstante
Varijabla je memorijska lokacija ciji se sadrzaj moze mijenjati tokom izvodenja
programa.
Konstanta je memorijska lokacija ciji je sadrzaj konstantan tijekom izvodenja
programa.
Racunalo treba unaprijed znati koju memorijsku lokaciju ce povezati s kojom
varijablom, odnosno konstantom, pa se i varijable i konstante moraju deklarirati
unaprijed.
Vrste jednostavnih podataka 61
7.2.1 Vrste jednostavnih podataka
Prisjetimo se: memorijska lokacija se sastoji od niza 0 i 1-ca. Takav niz moze
predstavljati razlicite stvari: cijeli broj, realni broj (oating-point broj), ili ASCII
kod nekog znaka (karaktera) ili jednostavno 1-bitnu DA/NE vrijednost. Na prim-
jer, rijec od 2 bytea
[00000000 01000001]
moze predstavljati broj 65 ako ju citamo kao cijeli broj ili moze predstavljati
slovo A ako ju citamo kao ASCII kod.
U sljedecoj je tablici dan pregled osnovnih vresta podataka koje koriste jezici
C i C++.
Vrsta podatka velicina i ime
boolean dostupno samo kod nekih compilera
karakter 1 byte - char
mali cijeli broj 2 byte-a - short
cijeli broj 4 byte-a - int
dugi cijeli broj 4 ili 8 byte-a - long
realni broj (oating point) 4 byte-a - oat
realni broj dvostruke preciznosti 8 byte-a - double
Tablica 7.1: Jednostavne vrste podataka u C/C++
Prije nego upotrijebimo pojedinu memorijsku lokaciju, moramo racunalu unar-
ijed reci cemu je ona namjenjena, varijabli ili konstanti. Tada racunalo rez-
ervira prostor u memoriji za danu varijablu tokom vremena u kojem se program
izvrsava.
Taj postupak zovemo deklariranje varijable (konstante).
Programer tijekom izrade programa koristi samo ime varijable, a ne njenu
memorijsku lokaciju. Medutim, programski jezici C i C++ dozvoljavaju pro-
grameru da se koristi odredenom memorijskom lokacijom, no, taj nacin programi-
ranja prelazi predvideni materijal ove knjige.
Izbor imena varijable ovisi o programeru.
Cesto se koristi nepisano pravilo
u kojem su konstante pisane velikim slovima PI, E, RATE, . . . , dok za varijable
koristimo pocetno malo slovo: sum, myCh, . . . .
Napomena: C i C++ razlikuju velika i mala slova (DOS to ne razlikuje, ali
UNIX da) tako da su myCh = mych.
62 Pisanje programskog koda
naredba (C/C++) Objasnjenje
const int NUM=2; Deklaracija cjelobrojne konstante
vrijednosti 2 imena NUM
const oat PI=3.14; Deklaracija realne konstante
vrijednosti 3.14 imena PI
int sum; Deklaracija cjelobrojne varijable imena sum
char myCh; Deklaracija varijable koja ce sadrzavati
karaktere imena myCh
oat interestRate; Deklaracija realne varijable imena interestRate
Tablica 7.2: Deklariranje varijabli i konstanti u C/C++
7.3 Pridruzivanje vrijednosti
Nakon sto smo izabrali ime varijabli i rezervirali memorijsku lokaciju, potrebno
je varijablama dodijeliti vrijednosti.
Za takvo pridruzivanje postoje tri mogucnosti:
ucitavanje vrijednosti iz datoteke
unosenje podataka preko tipkovnice
pridruzivanje vrijednosti unutar programa
Sintaksa pridruzivanja odredene vrijednosti odredenoj memorijskoj lokaciji
ima oblik:
ime varijable = vrijednost
Pravila pridruzivanja (assignment rules) su jednoznacna za bilo koji pro-
gramski jezik:
i ) Samo jedno ime varijable moze biti s lijeve strane znaka jednakosti jer to
predstavlja memorijsku lokaciju koja mora biti jednoznacno odredena;
ii ) Konstante ne mogu stajati s lijeve strane znaka jednakosti (jer se one ne
mogu mijenjati);
iii ) Velicina s desne strane jednakosti moze biti konstanta, druga varijabla ili
neki aritmeticki izraz koji se sastoji od varijabli i konstanti;
iv) Sve sto se nalazi s desne strane jednakosti ostaje nepromjenjeno;
v) Varijable i pridruzene vrijednosti moraju biti istog tipa.
Pridruzivanje vrijednosti 63
Primjer 7.1 Odredite sadrzaj svake od varijabli: initial (character), lenght (in-
teger, cjelobrojna varijabla) areaOfSquare (oating point, realna varijabla), nakon
svakog od sljedeceg niza pridruzivanja:
a) prije nego se bilo sto pridruzi;
b) lenght=5;
c) initial=P;
d) areaOfSquare = lenght;
e) areaOfSquare = initial;
f) areaOfSquare=37.5;
g) lenght=areaOfSquare;
h) initial=areaOfSquare;
Rjesenje: Rezultate sadrzaja varijabli nakon izvedenih koraka a) h). cemo
prikazati u sljedecoj tablici:
Pridruzivanje Sadrzaj varijabli nakon pridruzivanja
initial lenght areaOfSquare
a) prije pridruzanja nedenirana nedenirana nedenirana
b) lenght=5 nedenirana 5 nedenirana
c) initial=P P 5 nedenirana
d) areaOfSquare = lenght P 5 5.0
e) areaOfSquare = initial P 5 80.0
f) areaOfSquare=37.5 P 5 37.5
g) lenght=areaOfSquare P 37 37.5
h) initial=areaOfSquare % 37 37.5
Pridruzivanja u redovima b), c) i f) su jednostavna pa su pripadne vrijednosti
varijabli upravo one koje su ucitane u tim redovima. Primjetite da u redu d)
cjelobrojna vrijednost 5 moze biti spremljena u realnu (oating point) varijablu,
pri cemu je vrijednost varijable areaOfSquare realni broj 5.0. Nadalje, u redu e)
se umjesto slova P realnoj varijabli areaOfSquare pridruzuje ASCII vrijednost
slova P. U redu g) je realan broj pridruzen cjelobrojnoj varijabli pa je rezul-
tat toga zaokruzivanje na 37. U posljednjem redu h) rezultat spremanja cjelog
broja u slovnu varijablu (character) dalo je za rezultat odgovarajuci ASCII znak
(character) koji pripada broju (kodu) 37.
64 Pisanje programskog koda
7.3.1 Aritmeticki izrazi
U dosadasnjim razmatranjima proucavali smo nacine na koje se pojedinacne vri-
jednosti (bilo da se radi o konstantim ili promjenjivim velicinama) pridruzuju
nekoj varijabli. Naravno, opcenito pridruzivanje moze biti puno slozenije. Na
primjer, mozemo varijablama dodjeljivati rezultate razlicitih funkcija koje u
sebi sadrze aritmeticke izraze.
Treba istakuti da redoslijed racunskih operacija odgovara standardnom arit-
metickom redoslijedu, tj.
1.) operacije se izvode u zagradama
2.) mnozenje, djeljenje te zaokruzivanje
3.) zbrajanje i oduzimanje
Popis racunskih operacija koje mozemo izvoditi dan je u sljedecoj tablici:
Operator (oznaka) Racunska operacija smjer izvodenja
() zagrada iznutra prema van
* / mnozenje i dijeljenje s lijeva na desno
% modulo (zaokruzivanje) s lijeva na desno
+ zbrajanje i oduzimanje s lijeva na desno
Tablica 7.3: Racunske operacije u C/C++
Primjetite da u C/C++ nema operatora potenciranja, za to se koristi posebno
denirana funkcija koja se moze koristiti samo uz dodatnu biblioteku matematickih
funkcija: #include<cmath>
Biblioteka matematickih funkcija
To je grupa funkcija koje mozete ukljuciti u svoj program, a sadrzi standardne
matematicke funkcije (elementarne funkcije).
Ucitava se:
include<cmath>
Neke od funkcija koje ta biblioteka sadrzi su:
apsolutna vrijednost broja a: abs(a)
potencija (a na b): pow(a,b)
drugi korijen od a: sqrt(a)
sinus (odnosno kosinus ili tangens): sin(a)
logaritam (prirodni logaritam) broja a: log(a)
Jednostavni unos i izlaz 65
dekadski logaritam broja a: log10(a)
Napomena: Programski jezici (C i C++) tretiraju djeljenje s cijelim broje-
vima razlicito od djeljenja s oating-point brojevima.
real1 = 5.6;
real2 = real1/2; ( rezultat = 2.8)
real2 = 25/2.0; ( rezultat = 12.5)
real2 = 25/2 ( rezultat = 12);
7.3.2 Komentiranje
Svaki programski jezik, pa tako i C/C++, omogucuje programeru da u samom
programu zapisuje objasnjenja pojedinih dijelova programa na takav nacin da
prevodilac (compiler) tijekom izvrsenja programa taj dio jednostavno zanemari
(preskoci).
Iako komentiranje programa iziskuje dodatno vrijeme i napor, kod pisanja
slozenijih programa ono se redovito isplati. Dogodi li se da netko drugi mora is-
pravljati nas kod ili da nakon duljeg vremena sami moramo ispravljati vlastiti kod
(sto je cesta pojava), komentari olaksavaju razumijevanje originalnih autorovih
namjera. Takvi dijelovi programa se zovu komentari. U jezicima C i C++ oni
se deniraju tako da se upisu dvije kose crte // , a sav tekst u retku iza njih
prevoditelj zanemaruje, odnosno tekst iza kosih crta je komentar.
Svatko tko zeli ozbiljno pristupiti pisanju programa, mora biti svjestan cinjenice
da ce, nakon sto napise stotinjak programa, poceti zaboravljati cemu koji pro-
gram sluzi pa je vrlo vazno da se na pocetku datoteke u kojoj se nalazi izvorni
kod programa stavi komentar koji sadrzi osnovne podatke o programu, npr. ime
programera, ime datoteke u kojoj se nalazi osnovni kod i nacin (sintaksa) na koji
se program izvrsava, kratki opis sto program radi, popis varijabli, konstanti i
funkcija koje koristi i slicno.
7.4 Jednostavni unos i izlaz (Input/Output; I/O)
Prisjetimo se da je osnovni oblik toka podataka u racunalima: unos, obrada i
izlaz (input, process, output).
Opcenito, unos, odnosno izlaz (ispis ili spremanje) podataka ovisi o tome
otkuda citamo podatke i kamo ih spremamo (upis s tipkovnice ili unos iz datoteke,
. . . )
Jednostavni unos i izlaz se odnose na upis podataka s tipkovnice i ispis rezul-
tata na ekran.
66 Pisanje programskog koda
7.4.1 Unos i izlaz; C++
Opcenito, za upisivanje i ispisivanje podataka u programskom jeziku C++ potrebno
je ucitati odgovajucu biblioteku
#include<iostream.h>
U sljedecoj su tablici navedene neke od naredbi za upis i ispis iz iostream.h
biblioteke:
naredba vrsta Objasnjenje
cin objekt kontrolira vadenje byteova iz
niza koji ulaze s tipkovnice
>> operator ispisa uzima byteove iz ulaznog niza
cout objekt kontrolira ubacivanje byteova i
niza koji odlazi na ekran
<< operator upisa stavlja byteove u izlazni niz
cerr objekt
\n
Z LA
Z
LA
Z
8.2 Petlja za izbor
Racunalni programi izvrsavaju samo ono sto im je programer rekao da izvrsavaju.
Naredbe se izvode na tri osnovna nacina: po redu svaki posebni dio, pojedini
dijelovi (neki mogu biti preskoceni) ili ponavljanjem pojedinih dijelova.
74 Pisanje programskog koda
Ponekad programer mora izabrati jednu (ili vise) mogucnosti izmedu ponudenih,
dakle treba mu mogucnost izbora. U takvim slucajevima koristi se izborna
petlja ili if petlja.
Petlja za izbor omogucava racunalu da u ovisnosti o Booleovom izrazu izvrsi
ili preskoci niz naredbi. Izbor moze ovisiti o jednoj ili vise mogucih alternativa.
8.2.1 Izbor izmedu dvije mogucnosti
Postoje dva nacina na koji mozemo birati izmedu dvije mogucnosti.
Na primjer: Ako pada kisa, uzet cu kisobran. To je izbor koji govori sto
treba uciniti u slucaju ako pada kisa (uzeti kisobran). Medutim, u slucaju ako
kisa ne pada, ne poduzimamo nista. Ovo je tzv. if petlja.
S druge strane, ako kazemo: Ako pada kisa, uzet cu kisobran i prosetati. U
suprotnom uzet cu bicikl i provozati se. Vidimo da i u slucaju ako ne pada kisa,
mi cemo izvrsiti nesto. Ovo je tzv. if, . . . else petlja.
Boole-ov
izraz?
Istina La
Izvrenje
naredbe
Boole-ov
izraz?
Istina La
Izvrenje
naredbe 1
Izvrenje
naredbe 2
Sintaksa za if i if, . . . else u C i C++ (oblik pisanja naredbe if i if,
. . . else)
if (Booleov izraz) if (Booleov izraz)
{ { Naredba(e) }
Naredba(e) else
} { Naredba(e) }
Primjer 8.2 Napisite if i if, . . . else petlje pomocu kojih ce te odluciti, u
ovisnosti o vremenu (suncano S, kisno K), hocete li ponijeti kisobran u setnju
ili cete se provozati biciklom.
// primjer C ++ programa koji sadrzi if petlju
// pri cemu se izbor izvodi izmedju dvije mogucnosti
// odnosno za if else petlju
Petlja za izbor 75
#include<iostream.h>
// #include<cmath>
void main() {
// deklariramo varijable
char vrijeme;
// 1. Upisujemo podatke o vremenu, S ako je suncano
// i K ako pada kisa
cout<<"\n Upisite kakvo je vrijeme i to S ako je suncano";
cout<<"\n ili K ako pada kisa";
cout<<"\n";
cin>>vrijeme;
cout<<"\n Vrijeme je =>";
cout<<vrijeme;
cout<<"\n";
// if (vrijeme==S)
// { cout<<"\n Uzet cu bicikl i provozati se";}
if (vrijeme==S)
{ cout<<"\n Uzet cu bicikl i provozati se";
cout<<"\n";}
else
{cout<<"\n Uzet cu kisobran i prosetati se";
cout<<"\n";}
} // kraj programa
8.2.2 Izbor izmedu vise mogucnosti
Ponekad programer mora odluciti izmedu vise mogucnosti. Na primjer: Ako je
suncano, uzet cu bicikl, ako pada kisa uzet cu kisobran, a ako puse vjetar uzet
cu vjetrovku.
Naravno, ovaj nacin odlucivanja moze biti i drugaciji. Na primjer: Ako je
suncano i ako je vjetrovito, uzet cu bicikl i vjetrovku, itd..
76 Pisanje programskog koda
Sintaksa za visestruku if naredbu u C i C++:
if (Booleov izraz)
. . . {
Naredba(e)
}
else {
if (Booleov izraz)
. . . {
Naredba(e)
}
else {
if (Booleov izraz)
. . . {
Naredba(e)
}
else
. . . {
Naredba(e)
}
}
}
Primjer 8.3 Napisite C++ program sa slozenom petljom koji ce u ovisnosti o
upisanom vremenu (suncano S, kisno K) odluciti hocete li uzeti kisobran i
prosetati se (ako pada kisa) ili cete se provozati biciklom (ukoliko je suncano), te
Petlje za ponavljanje 77
ujedno provjerava ispravnost upisa (je ste li upisali mozda neki karakter razlicit
od S i K).
#include<iostream.h>
void main()
{
// deklariramo varijable
char vrijeme;
// 1. Upisujemo podatke o vremenu, S ako je suncano
// i K ako pada kisa
cout<<"\n Upisite kakvo je vrijeme i to S ako je suncano";
cout<<"\n ili K ako pada kisa";
cout<<"\n";
cin>>vrijeme;
cout<<"\n Vrijeme je =>";
cout<<vrijeme;
cout<<"\n";
if (vrijeme!=S && vrijeme!=K )
{ cout<<"\n GRESKA!!! Upisali ste krivi karakter za vrijeme";
cout<<"\n";}
else
{
if (vrijeme==S)
{ cout<<"\n Uzet cu bicikl i provozati se";
cout<<"\n";}
else
{cout<<"\n Uzet cu kisobran i prosetati se";
cout<<"\n";}
}
} // kraj programa
8.3 Petlje za ponavljanje
Kao sto se moze zakljuciti iz imena ovih petlji, pomocu njih program ponavlja
jednu ili vise naredbi onoliko puta koliko mu mi naredimo. Svako ponavljanje kon-
trolirano je takozvanom kontrolnom varijablom koja ima pocetnu i konacnu
vrijednost. Kontrolna varijabla pocinje s odredenom vrijednoscu i u svakom
78 Pisanje programskog koda
koraku se povecava (ili smanjuje, ili se mijenja na neki drugi nacin) i nakon toga
se provjerava njena vrijednost.
U ovisnosti o vrsti kontrolne varijable i njenoj deniciji postoje razlicite vrste
petlji: ksne, pretest i posttest petlje.
8.3.1 Fiksna petlja (for petlja)
Fisna petlja se koristi kada se zna unaprijed koliko koraka ce petlja imati.
Sintaksa za C/C++:
for (postavljanje contrVar na vrijednost poc;
provjera vrijednosti contrVar; promjena contrVar )
{ naredba }
Jelidostignuta
konanavrijednost
kontr. Varijable
Izvrenje
naredbe 2
Postavitikontrolnuvarijablu
napoetnuvrijednost
Izvrenje
naredbe 1
NE
DA
Promjeniti
kontr. Varijablu
Provjera Booleovog izraza u kojem se provjerava vrijednost kontrolne varijable
obavlja se prije ulaska u petlju. Nakon izvrsenja svih naredbi unutar petlje,
kontrolna varijabla se automatski povecava.
Primjer 8.4 Nacinite C++ program koji ce u svakom koraku ispisivati vrijed-
nost kontrolne varijable. Ukupan broj koraka neka bude 10.
// vjezba za konstrukciju jednostavne for petlje
Petlje za ponavljanje 79
#include<iostream.h>
void main() {
int a, lcv; // deklariramo varijable
for (lcv=1; lcv<=10; lcv++) // pocetak for petlje
cout<<"\n vrijednost kontrolne varijable u "<<lcv<<". koraku
iznosi "<<lcv; cout<<"\n";
// kraj petlje
} // kraj programa
8.3.2 Pretest petlja (Do petlja )
Opcenito, za razliku od sknih petlji, ove petlje koristimo kada ne znamo koliko
cemo puta morati ponavljati pojedine korake iz petlje.
U pretest petlji se prvo provjerava Booleov izraz za kontrolnu varijablu, a
zatim se izvodi glavni dio petlje (sve naredbe koje se trebaju izvrsiti u promatra-
noj petlji).
Dakle, pretest petlju koristimo kada unaprijed ne znamo koliko koraka ce
petlja imati.
Osnovna svojstva pretest petlji su:
While petlja se izvrsava dok je Booleov izraz istinit, Until petlja se
ispunjava dok Booleov izraz ne postane istinit
Booleov izraz se mora promijeniti u petlji, inace ce sve zavrsiti u beskonacnoj
petlji
Booleov izraz moze biti kontrolna varijabla, aritmeticki izraz ili neki kon-
trolni izraz
Svojstva karakteristicna samo za pretest petlje su:
Prije pocetka petlje, mora se zadati pocetna vrijednost u Booleovom izrazu
U slucaju da je Booleov izraz pogresan, petlja ce biti preskocena.
Sintaksa za standardnu While petlju u C, C++:
Postavljamo kontrolnu varijablu
na inicijalnu vrijednost
while (Booleov izraz )
80 Pisanje programskog koda
{ naredbe
promjena kontrolne varijable
}
Dok( )je
Boole-ovizraz
istinit
while
Izvrenje
naredbe 2
Izvrenje
naredbe 1
NE
DA
Primjer 8.5 Napisite jednostavni C++ program koji ce zbrajati sve brojeve koje
korisnik unosi, a zaustavit ce se kada upise 1.
#include<iostream.h>
void main()
{
int sum, lcv; // deklariramo varijable
sum=0; // inicijalizacija varijable sum
cout<<"\n Upisite zeljeni cijeli broj ili -1 za prekid programa";
cin>>lcv;
while (lcv!=-1)
{ sum+=lcv;
cout<<"\n Upisite zeljeni cijeli broj ili -1 za prekid programa";
cin>>lcv;
}
cout<<"\n Rezultat zbrajanja iznosi => "<<sum;
cout<<"\n";
} // kraj programa
Petlje za ponavljanje 81
8.3.3 Posttest petlja (Do while petlja )
U posttest petlji Booleov izraz ispitujemo nakon sto smo izvrsili sve naredbe
glavnog dijela petlje. Ove petlje takoder koristimo kada ne znamo unaprijed
koliko koraka ce petlja imati, ali smo sigurni da ce imati barem jedan korak.
Osnovna svojstva posttest petlji su ista kao i kod pretest petlji:
While petlja se izvrsava dok je Booleov izraz istinit, Until petlja se
ispunjava dok Booleov izraz ne postane istinit
Booleov izraz se mora promijeniti u petlji, inace ce sve zavrsiti u beskonacnoj
petlji
Booleov izraz moze biti kontrolna varijabla, aritmeticki izraz ili neki kon-
trolni izraz
Svojstva karakteristicna samo za posttest petlje su:
Pocetna vrijednost u Booleovom izrazu se moze zadati unutar petlje
Buduci da se Booleov izraz ispituje nakon izvrsenja osnovnog dijela petlje,
petlja ce uvijek biti izvrsena barem jednom.
Sintaksa za posttest petlje u C, C++:
do {
naredbe
promjena kontrolne varijable
}
while (Boolean expression)
(provjera Booleov izraza)
Dok( )je
Boole-ovizraz
istinit
while
Izvrenje
naredbe 2
Izvrenje
naredbe 1
NE
DA
82 Pisanje programskog koda
Primjer 8.6 Napisite jednostavni C++ program koji ce zbrajati sve pozitivne
brojeve koje unosi korisnik do trenutka kada on odluci prestati (odnosno upise
1).
#include<iostream.h>
void main()
{
int sum, lcv; // deklariramo varijable
sum=0; // inicijalizacija varijable sum
lcv=0; // inicijalizacija varijable lcv
do
{
sum+=lcv;
cout<<"\n Upisite zeljeni cijeli broj ili -1 za prekid programa ";
cin>>lcv;
}
while (lcv!=-1);
cout<<"\n Rezultat zbrajanja iznosi => "<<sum;
cout<<"\n";
} // kraj programa
Zadatak 8.1 Koji su rezultati sljedecih Boole-ovih izraza:
(5>4)||(3==2)
(3>=4)&&(5<8)
!(10<0)
(5/2)==2.5
Zadatak 8.2 Napisite if...else petlju koja ce ispisati je li broj smjesten u cjelo-
brojnoj varijabli mojBroj paran ili neparan.
Zadatak 8.3 Napisite program koji ispisuje znamenke dekadskog brojevnog sus-
tava.
Zadatak 8.4 Napisite program koji ispisuje sumu svih cijelih brojeva izmedju
100 i 200.
Zadatak 8.5 Napisite program koji ispisuje sve znamenke iz intervala [0, 30] koje
zadovoljavaju uvjet a
2
+ b
2
= c
2
(Pitagorine trojke).
Petlje za ponavljanje 83
Zadatak 8.6 Napisite program koji ispisuje zbroj neparnih brojeva iz intervala
[0, 100].
Zadatak 8.7 Napisite program koji izracunava faktorijel unesenog cijelog broja.
Zadatak 8.8 Napisite program koji izracunava aritmeticku sredinu n ucitanih
brojeva (broj n treba prethodno ucitati) i ispisuje najveceg od njih.
Zadatak 8.9 Napisite program koji ispisuje brojeve vece od 500 i manje od 700
koji su djeljivi sa 17. Na kraju treba ispisati koliko ima takvih brojeva.
Zadatak 8.10 Napisite program koji ispisuje prvu potenciju broja 5 vecu od 125,
te ispisuje koja je to potencija.
Zadatak 8.11 Napisite program koji ucitava znakove s tipkovnice i ispisuje ih
na ekran. Prekid unosa oznacava znak k ili K.
Zadatak 8.12 Napisite program u C-u koji ucitava vrijednost otpora otpornika
spojenih u paralelu i racuna ukupan otpor. Za prekid unosa treba upisati otpor 0.
84 Pisanje programskog koda
Poglavlje 9
Numericki algoritmi
Cilj ovog poglavlja jest upoznati studente s dijelom racunarske znanosti koji
prirodno pripada matematickim strucnjacima i znanstvenicima. To se odnosi na
soft racunarstvo ili izradu software-a, gdje prirodno prevladava matematicki
nacin razmisljanja. Ovdje se prije svega misli na razvoj algoritamskih rjesenja i
matematickih formulacija za probleme iz primjene.
Zahtjevi danasnje tehnologije su visoki, koriste se sosticirane metode (matematicki
modeli), razni software-ski alati koji su sve slozeniji jer je trziste sve nemilosrdije.
Matematicki trening i nacin razmisljanja te primjena racunala daju prednost u
prevladavanju slozenijih problema iz primjene u odnosu na druge struke.
9.1 Primjeri numerickih algoritama i nekih struktura
podataka
Za pocetak promotrimo niz jednostavnih primjera koji ilustriraju neke numericke
algoritme te vrste podataka koji se u njima pojavljuju.
Primjer 9.1 Proumotrimo nacin rjesavanja linearnih sustava.
3x + 2y = 7 x + 2y 3z = 0
6x y = 4 x + y + z = 7
2x + 2y + z = 3
Zada na su dva sustava s dvije odnosno tri nepoznanice, ali mogli smo opcenito
zadati i sustav sa 100 ili 100000 nepoznanica.
Radi jednostavnosti, oznacimo nepoznanice s x
1
,
2
, . . . x
n
, pa je u gornjem
slucaju n = 2, odnosno n = 3, a opcenito n = 1000 ili n = 100000.
85
86 Numeri cki algoritmi
Dakle, rjesenje cini cjelinu. Oznacimo ju sa x, pri cemu su komponente
rjesenja x
i
, tj.
x
1
-prva koomponenta
x
2
-druga koomponenta
.
.
.
.
.
.
x
n
-n-ta koomponenta
Pogledamo li desnu stranu sustava, vidimo da se sastoje od nizova brojeva
7, 4, odnosno 0, 7, 3. Ocito je da i desnu stranu mozemo sloziti u cjelinu koju
cemo nazvati b, pri cemu su koomponente od b
b
1
= 7, b
2
= 4
b
1
= 0, b
2
= 7, b
3
= 3
Pogledajmo sada koecijente u sustavima jednadzbi. Oni su oblka:
3 2
6 1
1 2 3
1 1 1
2 2 1
Vidimo da se gornji brojevi prirodno mogu organizirati u tablicu (odnosno ma-
tricu)
1 2 3
1 1 1
2 2 1
_
_
1 2 3
1 1 1
2 2 1
_
_
Ako cijelu matricu oznacimo jednom oznakom npr. A, onda pojedine koecijente
(brojeve iz tablice) lociramo (preciziramo) navodeci indeks retka i stupca u
kojem se nalaze:
A
11
= 1 element u 1. retku i 1. stupcu
A
12
= 2 element u 1. retku i 2. stupcu
A
13
= 3
A
21
= 1 element u 2. retku i 1. stupcu
A
22
= 1 , A
23
= 1
A
31
= 2 , A
32
= 2, A
33
= 1 .
Dakle A
ij
je element koji se nalazi na presjeku i-tog retka i j-tog stupca.
Vidimo da je matrica
A
_
_
1 2 3
1 1 1
2 2 1
_
_
Primjeri numeri ckih algoritama . . . 87
dvodimenzionalno polje, dvodimenzionalni niz, za razliku od vektora
A
_
_
0
7
3
_
_
x =
_
_
x
1
x
2
x
3
_
_
koji su jednodimenzionalni nizovi, tj. jednodimenzionalna polja.
Dakle, neki su podaci organizirani jednodimenzionalno, a neki dvodimenzion-
alno.
Sljedeci primjer ilustrira vaznost deniranja uredenja ulaznih podataka.
Primjer 9.2 U rjesavanju mnogih slozenih problema vrlo je korisno ako su po-
daci dobro slozeni, uredeni, poredani po velicini, tj. sortirani.
b
2
4ac
2a
x
2
=
b
b
2
4ac
2a
To znaci da smo odredili postupak koji za bilo koje podatke a, b, c (a = 0) daje
dva rjesenja x
1
, x
2
kvadratne jednadzbe (9.1.1).
Za a = 0 jednadzba (9.1.1) je linearna jednadzba bx + c = 0, koja u slucaju
b = 0 ima rjesenje x = c/b.
Konacno, u slucaju za a = b = 0 i c = 0 nemamo rjesenje, a za a = b = c = 0
rjesenja su svi realni brojevi.
Vidimo da u slucaju a = 0 jednadzba (9.1.1) ima dva rjesenja dana formulama
x
1
=
b +
b
2
4ac
2a
,
x
2
=
b
b
2
4ac
2a
.
Koliko racunskih operacija je potrebno za izracunavanje oba rjesenja?
Npr: za x
1
imamo 3 mnozenja (4 a c i 2 a), jedno kvadriranje b
2
i jedno
korjenovanje, te jedno zbrajanje i jedno djeljenje. Ukupno 7 racunskih operacija.
Mogli bi zakljuciti da ukupan broj operacija za oba rjesenja iznosi 14. To je
krivi nacin razmisljanja!!!
90 Numeri cki algoritmi
Ono sto mi zelimo jest optimalan algoritam (optimalan nacin) za rjesavanje
kvadratne jednadzbe, sto izmedu ostalog podrazumijeva i najmanji moguci broj
racunskih operacija.
Uocimo prvo da se rjesenja x
1
i x
2
mogu zapisati u obliku:
t =
b
2a
, =
t
2
c
a
,
x
1
= t + , x
2
= t .
Ukupan broj operacija iznosi: 2 (jedno mnozenje i jedno djeljenje) za t, 4 za
(djeljenje, kvadriranje, oduzimanje i korjenovanje) i jos 2 za x
1
i x
2
ukupno 8.
To je vec puno bolje !!!
Uocimo da gore navedeni postupak treba izvoditi samo u slucaju a = 0, u
suprotnom smo vidjeli da rjesenje jednadzbe (9.1.1) dobivamo puno jednostavnije.
Promotrimo na slican nacin problem rjesavanja sustava od dvije linearne jed-
nadzbe s dvije nepoznanice:
Primjer 9.5
3x + 2y = 7
6x y = 4
Jedan od nacina na koji mozemo rjesavati gornji sustav jest da izrazimo x
pomocu y i onda taj izraz uvrstimo u drugu jednadzbu sto ce znaciti da smo
dobili jednadzbu po y.
3x = 7 2y x =
1
3
(7 2y)
6(
1
3
(7 2y)) y = 4 , 14 4y y = 4 5y = 10 , y = 2
x =
1
3
(7 2 2) x = 1
Napisimo sada algoritam za rjesavanje linearnog sustava od dvije jednadzbe
s dvije nepoznanice u opcem slucaju.
A
11
x + A
12
y = b
1
A
21
x A
22
= b
2
x =
1
A
11
(b
1
A
12
y)
A
21
A
11
(b
1
A
12
y) + A
22
y = b
2
(A
22
A
12
A
21
A
11
)y = b
2
A
21
A
11
b
1
, (A
11
A
22
A
12
A
21
)y = A
11
b
2
A
21
b
1
(sto vrijedi za A
11
= 0)
y =
A
11
b
2
A
21
b
1
A
11
A
22
A
12
A
21
uz A
11
A
22
A
12
A
21
= 0
Odredivanje slozenosti 91
Uvrstavanjem y u jednakost za x dobivamo:
x =
A
22
b
1
A
12
b
1
A
11
A
22
A
12
A
21
Dakle, rjesenje linearnog sustava od dvije jednadzbe s dvije nepoznanice za
koji vrijedi A
11
A
22
A
12
A
21
= 0 jest:
S
= A
11
A
22
A
12
A
21
,
x =
b
1
A
22
b
2
A
12
S
,
y =
b
2
A
11
b
1
A
21
S
,
za sto nam je potrebno ukupno 11 operacija (6 mnozenja, 3 oduzimanja, dva
dijeljenja).
Dakle razmisljajuci na gore navedeni nacin (odnosno konstruirajuci odgo-
varajuce algoritme) mi mozemo opisati odredene klase problema, pri cemu za
svaki pojedini problem iz klase (problem s konkretnim podacima) znamo elemen-
tarni postupak koji daje rijesenje.
9.2 Odredivanje slozenosti
U primjenama algoritama zelimo znati koliko je operacija potrebno za izvodenje
odredenog algoritma. To je prije svega praktican problem jer u praksi zelimo
imati algoritam koji ce nam u odgovarajucem vremenu dati rezultat. Na primjer,
ako razvijamo algoritam koji nam daje preciznu vremensku prognozu za sljedeci
dan, a njegova impementacija traje 3 dana, onda ocito takav algoritam nema
smisla.
Pogledajmo sljedeci primjer:
Primjer 9.6 Promotrimo sljedecu jednostavnu igru: Na stolu se nalazi 6 kuglica,
igraju dva igraca koji naizmjenice uzimaju jednu ili dvije kuglice. Gubi onaj igrac
koji zadnji uzme kuglicu.
Zelimo li nauciti racunalo tu igru, posatvlja se pitanje
kako to uciniti, pri cemu ga treba nauciti da pobjeduje.
92 Numeri cki algoritmi
igraB
igra A
1 2
6kuglica
igra A
5kuglica 4kuglice igraB
4kuglice
1 2 1 2
4kuglica 3kuglice 3kuglice
1 2
2 2
1 2
1 2
1 2
1 3
1 2
3 2
igra A
2
2
1
0 1
1
1 2
2
q
1
0 1
2
2
q
1
1 1
0 1
2
q
1
0
q
1
1 2
2 1
0 1
2
q
igraB
0 0 1 0
1 2
q
1
0
1
0 0 0 1
1 2
q
0 0
q
--pobjeuje A
Gornja igra odgovara sljedecem binarnom stablu
2
......................
1=2
0
2
1
2
2
2
4
2
n
2
3
Vidimo da, ako zelimo provjeriti sve mogucnosti u slucaju od n razina (sto
odgovara igri s n kuglica pri cemu pocinjemo od tzv. nulte razine), imamo 2
n
mogucnosti.
Pretpostavimo da zelimo igrati s vecim brojem kuglica, npr. n = 100,
onda je za provjeru svih mogucnosti potrebno 2
100
operacija (primjetimo da je
usporedivanje takoder jedna od operacija na racunalu), odnosno
2
100
= 2
10
10
= (1024)
10
> (1000)
10
= 10
30
operacija
Odredivanje slozenosti 93
Ako pretpostavimo da ucimo igrati mocno racunalo koje izvodi 10
10
operacija u
sekundi, treba nam vise od
10
30
10
10
= 10
20
sekundi, odnosno preko 10
12
godina.
godina = 31536000sec. odnosno godina < 10
8
sec.
Dakle, upravo smo pokazali da se moze dogoditi da je neki algoritam neizvo-
div, iako smo pokazali da daje rjesenje.
9.2.1 Kako ocjenjujemo slozenost algoritma ?
Radi ilustracije odredimo broj racunskih operacija algoritma za sortiranje niza
podataka.
Prisjetimo se kako izgleda taj algoritam:
za i = 1, 2, . . . n 1 ponavljaj
m = i
za j = i + 1, i + 2, . . . n ponavljaj
ako je x
j
> x
m
onda elementarne operacije
m = j usporedbe
ako je m = i onda
pom = x
i
x
i
= x
m
elementarne operacije
x
m
= pom zamjene
Ovaj algoritam u i-tom prolazu ima (n i) + 1 usporedbi, ili ukupno:
n + (n 1) + (n 2) + . . . + 2 =
n(n + 1)
2
1 =
n
2
2
+
n
2
1
i najvise n 1 zamjena. Ako usporedbe i zamjene uzmemo jednako zahtjevnim
kao i numericke operacije, onda je ukupan broj operacija potreban za sortiranje
liste od n podataka izrazen s
f(n) =
n
2
2
+
3
2
n 2. ,
Primjetimo da je
f(n) =
n
2
2
(1 +
3
n
4
n
2
)
sto je za jako velike n priblizno n
2
, zato pisemo f(n) = O(n
2
) i kazemo da se
algoritam ponasa kvadraticno. Oznaka O(n) se naziva big O oznacavanje.
94 Numeri cki algoritmi
Formalna denicija ponasanja neke funkcije glasi:
Neka su f, g : I R, (I R). Kazemo da se funkcija f ponasa kao g(x) i
pisemo f(x) = O(g(x)) ako i samo ako postoji x
0
, M R takvi da je
|f(x)| M |g(x)| za x x
0
.
Drugim rijecima to znaci da se funkcije f(x) i g(x) ponasaju jednako u beskonacnosti
(lim
x
f(x)/g(x) = konstana).
Primjer 9.7 Pokazimo da se polinom f(x) = 6x
4
2x
3
5 ponasa kao g(x) = x
4
(kvadraticno) za x .
Rijesenje: Primjetimo da za x > 1
|6x
4
2x
3
5| 6x
4
+ 2x
3
+ 5 13x
4
.
Vidimo da M = 13 zadovoljava deniciju, odnosno da f(x) = O(x
4
).
Treba napomenuti da se big O oznacavanje koristi i za male vrijednosti, tj.
kada x 0. Kazemo da se f(x) ponasa kao O(g(x)) kada x 0 ako i samo ako
je za neki broj m, |f(x)| m |g(x)| za dovoljno mali x.
Primjer 9.8 Promotrimo Taylorov red funkcije e
x
u okolini nule;
e
x
= 1 + x +
x
2
2
+ R(x) .
Pokazimo da se ostatak R(x) ponasa kao O(x
3
) za dovoljno male x.
Rijesenje: Ostatak je dan sa
R(x) =
x
3
6
+
x
4
24
+ .
Ocito za x > 0 i dovoljno mali (x 1) vrijedi
x
3
6
(1 +
x
4
+
x
2
20
+ )
1
6
x
3
,
pa je R(x) = O(x
3
).
9.3 Polja
Kako smo vidjeli u poglavlju 9.1, polje je grupa memorijskih lokacija iste vrste
koje ima jedno ime. Vidjeli smo takoder da polja mogu biti jednostruka (vek-
tori), dvostruka (matrice), ali mogu biti i visestruka.
Deklariranje jednodimenzionalnih polja u C i C++:
Polja 95
int ar[6]
ovo znaci da smo denirali 6 memorijskih lokacija s imenom ar u koje mozemo
smjestiti 6 cijelih brojeva.
Cijelo polje se deklarira samo jednom i poziva se imenom (u gornjem prim-
jeru sa ar). Nakon deklariranja broj memorijskih lokacija je odreden. Sve lokacije
moraju sadrzavati podatke istog tipa. Do pojedinog elementa u polju mozemo
doci koristeci njegovu adresu odnosno indeks. Na primjer int ar[3] se odnosi
na treci element u polju int ar. Unos i ispis podataka u polja se najcesce ost-
varuje preko petlji.
Primjer 9.9 Kako ce izgledati C++ program koji ce u 6-dimenzionalno polje
upisivati brojeve dvostuko vece od indeksa pojedinog elementa polja.
#include<iostream.h> void main() {
const int MAX=6;
int ar[MAX], i ;
for (i=1; i<=MAX; i++)
ar[i]=2*i;
for (i=1; i<=MAX; i++)
cout<<"\n vrijednost "<<i<<". polja iznosi "<<ar[i];
cout<<"\n";
}
Napomena: Sa poljima oprezno!
Promjenimo li u drugoj petlji (petlji za ispis) granicu do koje ide i sa MAX
na MAX + 4 ispis ce imati sljedeci oblik:
2, 4, 6, 8, 10, 12, 1245120, 4207993, 1, 3149424
Zasto se ovo dogodilo? Odgovor je jednostavan. Mi smo racunalu rekli da ispise
polja s adresama ar[1], . . . , ar[MAX+4], a denirali smo samo sadrzaj polja
ar[1], . . . , ar[MAX]. Stoga racunalo ispisuje odgovarajuci kod trenutnog sadrzaja
cetiri dodatna polja ar[MAX+1], . . . , ar[MAX+4], koji moze biti bilo sto.
9.3.1 Dvodimenzionalna polja
Kao sto smo ranije naveli, polja mogu biti i dvodimenzionalna, odnosno adresa
polja sadrzi dvije komponente (kao u tablici broj retka odnosno broj stupca).
Primjer 9.10 Kako ce izgledati C++ program kojim cemo, pomocu dvodimen-
zionalnog polja, konstruirati Hilbertovu matricu n-tog reda koja je denirana:
H
ij
=
1
i + j
i, j = 1, . . . n.
96 Numeri cki algoritmi
#include<iostream.h> void main() {
const int N=3;
int i, j;
float myHilbert[N][N];
for (i=0; i<N; i++)
for (j=0; j<N; j++)
myHilbert[i][j]=1.0/((i+1)*(j+1));
for (i=0; i<N; i++)
for (j=0; j<N; j++)
cout<<"\n matricni elment ("<<i+1<<j+1<<") iznosi "
<<myHilbert[i][j];
cout<<"\n";
}
9.4 Racunske operacije s oating-point brojevima
Prisjetimo se da smo na pocetku rekli da racunala posjeduju konacan skup brojeva
reprezentiranih s nizom 0 i 1-ca.
Cjelobrojne vrijednosti se u racunalu takoder prezentiraju nizom 0 i 1-ca, koji
su prikazi tih brojeva u binarnom sustavu.
Primjetimo dvije stvari:
1. Postoji najveci (odnosno najmanji) cijeli broj koji racunalo pozna.
2. Operacije +, i su egzaktne, odnosno izvode se bez pogreske.
Sa dijeljenjem je problem jer pri djeljenju dobivamo cijeli broj koji je dobiven
zaokruzivanjem na manji cijeli broj (1/2 = 0).
1
2
r .
Dakle e =
1
2
r je najveca relativna pogreska strojnog zbrajanja .
Znaci mozemo pisati da vrijedi
x y = (x + y) (1 +
x+y
) , |
x+y
| e .
Nas u praksi ne zanima stvarna vrijednost broja
x+y
. Ono sto zelimo jest
osigurati da uvijek vrijedi
|
x+y
| e = 2
24
10
8
( u jednostrukoj tocnosti.)
Napomena: Primjetite:
1. za relativnu gresku
x+y
zbrajanja brojeva x, y F vrijedi
|(x + y) (x y)|
|x + y|
x+y
2. neka
i
oznacava relativnu gresku aproksimacije racunalnim brojem nekog
broja. Tada vrijedi x = x(1+
1
) i y = y(1+
2
), a zbrajanje brojeva x, y mozemo
pisati
(x y) = x(1 +
1
) + y(1 +
2
) = (x + y)(1 + (
1
+
2
)) ,
100 Numeri cki algoritmi
odnosno za relativnu gresku
x+y
zbrajanja brojeva x, y F vrijedi
|(x + y) (x y)|
|x + y|
1
+
2
x+y
To znaci da je relativna greska
x+y
zbrajanja brojeva x, y F uvijek veca od
zbroja pogresaka aproksimacija strojnih brojeva.
Isti zakljucci vrijede i za ostale strojne aritmeticke operacije:
x y = (x y) (1
xy
) , |
xy
| e
x y = (x y) (1
xy
) , |
xy
| e
x y =
x
y
(1
x/y
) , |
x/y
| e y = 0
SQRT(x) =
x (1
x
) , |
x
| e y 0
(za
x se cesto koriste posebni algoritmi)
Napomena: za svaki x F funkcija ABS(x) = x se izracunava egzaktno
jer je to jednostavna operacija promjene bita predznaka.
Vazno je biti svjestan da za strojne operacije opcenito ne vrijede neki od stan-
dardnih racunskih zakona kao sto su distributivnost ili asocijativnost. Tocnije:
(x y) z = x (y z)
(x y) z = x (y z)
x (y z) = x y x z
x (1 x) = 1
Primjer 9.11 Promotrimo racunanje funkcije f(x) = e
x
x1 u tocki x = 0.01,
na stroju koji radi s pet znacajnih znamenaka.
Izracunajmo prvo
a = e
x
1 = 1.0101 1 = 0.0101 ,
sada vidimo da je vrijednost funkcije f(0.01) = 0.0001
Medutim, tocan rezultat u prikazu s pet znacajnih znamenaka glasi
f(0.01) = 0.000050167.
b
2
4ac
2a
x
2
=
b
b
2
4ac
2a
Neka je b
2
4ac. Tada je
b
2
4ac = |b| pa pri racunanju b|b| u jednom
slucaju nastupa katastrofalno kracenje.
Sto uraditi??!!
Treba izbjeci katastrofalno kracenje po svaku cijenu.
Zapisimo x
1
i x
2
malo drugacije:
x
1
=
b +
b
2
4ac
2a
b
b
2
4ac
b
b
2
4ac
=
b
2
(b
2
4ac)
2a(b
b
2
4ac)
=
2c
b
b
2
4ac
.
Analogno dobivamo za x
2
:
x
2
=
b
b
2
4ac
2a
b +
b
2
4ac
b +
b
2
4ac
=
b
2
(b
2
4ac)
2a(b +
b
2
4ac)
=
2c
b +
b
2
4ac
102 Numeri cki algoritmi
Neka je sada b
2
4ac (bez smanjenja opcenitosti pretpostavimo da je b > 0).
Iz gornjih jednakosti slijedi
x
1
=
2c
b +
b
2
4ac
2c
2b
x
2
=
b
b
2
4ac
2a
b
a
Kako bi formule za x
1
i x
2
trebale izgledati u slucaju da je b < 0?
Poglavlje 10
Funkcije i potprogrami
Pri pisanju programa od izuzetne je vaznosti koristenje funkcija i potprograma,
buduci da omogucuju programeru da podijeli program na manje logicke jedinice
i module.
Potprogram je samostalna programska struktura koja je ukljucena u glavni
program. Koriti se za rjesavanje posebnog problema (npr. mnozenje matrice i
vektora ili vektor i vektor, . . . ) ; namjena potprograma se posebno odreduje.
Funkcija je takoder (kao i potprogram) samostalna programska struktura
konstruirana da rijesi ksni problem. Za razliku od potprograma, funkcija vraca
jednu vrijednost odredenog tipa.
Prije nego prijedemo na upoznavanje pojedinosti o konstrukciji funkcija i pot-
programa, obrazlozimo jos jednom pojam modularnog programiranja (ili
programiranja po modulima)
Osnovni princip modularnog programiranja jest princip
podijeli i zavladaj (divide and conquer).
Cime treba zavladati (ili sto treba rijesiti) jest problem koji promatramo,
a da bi to ucinili, podijeliti cemo problem na manje probleme (potprobleme) za
koje cemo lakse naci rjesenje. Naravno, to dijeljenje moze ici skroz do podjele
(razbijanja) problema na elemntarne probleme ili dovoljno jednostavne probleme
za koje nece biti poteskoca pri njihovom rjesavanju.
Dakle, potprogrami i funkcije se mogu koristiti kao blokovi pomocu kojih cemo
konstruirati programe.
Stovise, ako smo nacinili dovoljno dobre (dovoljno elemen-
tarne) funkcije i potprograme, onda ih mozemo koristiti u bilo kojem programu
pa s vremenom mozemo pojedine potprograme usavrsavati i zamjenjivati stare
potprograme u nekom programu s novim, brzim i jednostavnijim potprogramima
koji ce nam omoguciti i bolje izvrsavanje naseg programa.
103
104 Funkcije i potprogrami
10.1 Funkcije
Kao sto je bilo napomenuto ranije, funkcija je samostalna programska struktura
koja uvijek vraca jednu vrijednost, dok ulaznih argumenata moze imati jedan ili
vise. Te ulazne vrijednosti zovu se argumenti ili parametri
Funkcija moze biti pozvana ili izvrsena iz glavnog programa ili unutar pot-
programa ili neke druge funkcije.
Poneki programi zahtjevaju da se na pocetku glavnog programa nabroje sve
funkcije koje ce biti koristene u tom programu, te da se nabroje i potrebni
parametri kao i njihova vrsta (int, oat, . . . ).
Bez obzira na razlikovanje oblika i nacina zadavanja funkcija u ovisnosti o
programskom jeziku koji koristimo, prema ANSI (American National Standards
Institue) svaka funkcija posjeduje dva glavna dijela:
zaglavlje programa header (function header)
glavni dio programa body (function body)
Primjer 10.1 Razlicitim brojevima smo oznacili zaglavlje i glavni dio ove jed-
nostavne funkcije koja od tri broja odreduje najveci
int max_od_dva_broja(int a, int b,int c) (1)
{ int maximum;
maximum=a;
if (b > maximum)
maximum=b; (2)
else
if (c > maximum)
maximum=c;
return(maximum);
}
zaglavlje programa function header istice:
(1) ime funkcije
(2) tip podataka koji se koriste
(3) broj ulaznih argumenata.
Funkcija iz gornjeg primjera za ulaz ima tri podatka i sva tri su cijeli brojevi int.
glavni dio programa function body istice:
Funkcije 105
(1) deklaracija lokalnih varijablii
(2) instrukcije, odnosno niz naredbi koje treba provesti da se postigne zeljeni
rezultat.
U gornjem primjeru je u glavnom dijelu programa deklarirana dodatna varijabla
maximum, te je napisan niz naredbi zakljucno s naredbom
return(maximum);
koja salje nazad izracunatu vrijednost.
Koristenje funkcija u okviru glavnog programa, odnosno nacin na koji se
funkcije pozivaju, ilustrirati cemo sljedecim primjerom:
Primjer 10.2 Objasnite koji dio programa poziva funkciju, sto radi funkcija, te
sto radi cijeli program (C++):
#include<iostream.h>
int max_od_dva_broja(int a, int b,int c);
int main()
{ int val1, val2, val3, max;
cin >> val1>>val2>>val3; // unos triju cijelih brojeva
max=max_od_dva_broja(val1, val2, val3);
// ova naredba poziva funkciju
cout<<"\nNajveci od tri unesena cijela broja je "<<max;
// ispis najveceg broja
cout<<"\n";
return (0);}
int max_od_dva_broja(int a, int b,int c)
{ int maximum;
maximum=a;
if (b > maximum)
maximum=b;
// else
if (c > maximum)
maximum=c;
return(maximum);}
106 Funkcije i potprogrami
Napomenimo da parametre koje koristi funkcija val1, val2, val3 nazivamo
stvarni (aktualni) parametri i oni odgovaraju formalnim parametrima (s ko-
jima je funkcija denirana int a, int b, int c) uvazavajuci njihov poloaj.
max=max_od_dva_broja( val1, val2, val3 );
int max_od_dva_broja( int a, int b, int c );
Prethodni primjer ilustrira pravila kojih se moramo drzati prilikom pozivanja
funkcija:
(1) Broj parametara u pozivnom obliku funkcije (aktualnih parametara) mora
biti jednak broju formalnih parametara u deniciji funkcije.
(2) Vrste aktualnih parametara mora biti jednak vrsti formalnih parametara
(3) Aktualni parametri su formalno povezani s formalnim parametrima po
poziciji.
Kao sto se vidi u primjeru, funkciju moramo deklarirati prije njenog koristenja.
To cemo uraditi tako da deniramo tzv. prototip funkcije. To znaci da moramo
deklarirati vrstu varijable koju ce funkcija dati kao rezultat, te broj i vrstu param-
etara koje funkcija koristi. U nasem primjeru to smo ucinili pomocu naredbe:
int max_od_dva_broja(int a, int b,int c);
a mogli smo koristiti i int max_od_dva_broja(int, int, int);
10.2 Potprogrami
Kao sto smo naveli u uvodu, potrprogrami su kao i funkcije samostalne pro-
gramske strukture, ali za razliku od funkcija potprogrami ne moraju vratiti neku
vrijednost, a kada to cine, za to koriste drugaciji mehanizam.
Primjer 10.3 Prikazimo program koji pomocu potprograma Pretvaranje pret-
vara zadanu brzinu iz km/h (kilometar na sat) u m/s (metar u sekundi)
#include<iostream.h>
void Pretvaranje(void);
double BrzinaKm;
double Brzinams;
void main()
{
// unosenje brzine u kilometar satima
cout<<"\n";
cout<<"Unestie brzinu u kilometar/sat ";
cin>>BrzinaKm;
Djelokrug djelovanja i vrijeme trajanja . . . 107
Pretvaranje(); // Pozivanje potprograma !!!
cout<<"\n";
cout<<"Zadana brzina iznosi "<<Brzinams<<" m/s";
cout<<"\n";
} // kraj glavnog programa
void Pretvaranje(void)
{
Brzinams = BrzinaKm*1.0/3.6;
}
10.3 Djelokrug djelovanja i vrijeme trajanja odredenih
okruzenja (varijabli)
Za potpuno razumijevanje medusobne interakcije pojedinih dijelova programa
potrebno je poznavati djelokrug djelovanja odgovarajuceg okruzenja. Pod
ovim pojmom podrazumijevamo vidljivost (dostupnost) svakoj od varijabli,
konstanti, funkciji ili potprogramu unutar cijelog programa.
Pravila pomocu kojih se denira (odreduje) djelokrug djelovanja odredenog
okruzenja razlicita su od jezika do jezika, ali se u svim jezicima ta pravila dijele
na globalni djelokrug djelovnja i lokalni djelokrug djelovanja.
Kada je vidljivost odnosno dostupnostost pojedinoj varijabli, konstanti,
proceduri, ili funkciji ogranicena unutar nekog modula, dijela programa (potpro-
grama), tada kazemo da se radi o lokalnom djelokrugu (lokalnoj dostupnosti). U
suprotnom, ako je vidljivost odnosno dostupnostost moguca u svakom trenutku
unutar cijelog programa, kazemo da se radi o globalnom djelokrugu (globalnoj
dostupnosti).
Na primjer, ako za vrijeme izvrsavanja odredenog programa deniramo vari-
jable kojima mozemo pristupiti u bilo kojem trenutku tijekom izvodenja programa
iz bilo kojeg potprograma ili funkcije, onda takve varijable zovemo globalne var-
ijable. S druge strane, ako se varijabli moze pristupiti samo unutar odredenog
potprograma, funkcije ili dijela programa, onda takvu varijablu zovemo lokalna
varijabla.
Nakon pokretanja programa, sve njegove globalne varijable, kao i lokalne
varijable zauzimaju odredene pozicije u glavnoj memoriji. Memorijske pozicije
globalnih varijabli ostaju neporomjenjene tijekom izvodenja cijelog programa,
dok se pozicije lokalnih varijabli cuvaju samo tijekom izvodenja dijela potpro-
grama, funkcije ili potprograma u kojem koristimo odredenu lokalnu varijablu,
nakon cega se te pozicije oslobadaju. Vidimo da, tijekom izvodenja glavnog pro-
grama, globalne i lokalne varijable imaju razlicito vrijeme trajanja (lifetime)
108 Funkcije i potprogrami
u memoriji. Drugim rijecima, vrijeme trajanja pojedine varijable ili konstante
odreduje koliko dugo ce pridruzena vrijednost odredenoj varijabli ostati spreml-
jena.
Mozemo reci da je vrijeme trajanja globalne varijable cijelo vrijeme izvodenja
programa, dok je vrijeme trajanja lokalne varijable ograniceno na vrijeme
izvodenja dijela potprograma, funkcije ili potprograma u kojem koristimo lokalnu
varijablu.
Prije nego objasnimo kako i kada cemo koristiti lokalne odnosno globalne
varijable, istaknimo tri osnovna pravila koja treba zapamtiti pri izboru vrste
(glabalne ili lokalne) varijable.
(1) Osnovno je pravilo da djelokrug djelovanja ili vidljivost varijabli treba
drzati sto je moguce uze. Nekontrolirano koristenje globalnih varijabli moze
prouzrokovati razne probleme, od nepotrebnog opterecenja memorije sve do
velike mogucnosti pogreske radi nepravilne promjene sadrzaja globalne var-
ijable. Da bi se izbjegli takvi problemi, treba strogo minimizirati upotrebu
globalnih varijabli. Idealno bi bilo da se globalne varijable mijenjaju samo
jednom prilikom izvodenja programa.
(2) Treba optimizirati broj globalnih varijabli jer one ostaju u memoriji tijekom
cijelog vremena u kojem se program izvodi, sto opterecuje RAM.
(3) Treba izbjegavati davanje jednakih imena lokalnim i globalnim varijablama,
jer ako lokalna varijabla ima isto ime kao i neka globalna varijabla, onda se
toj globalnoj varijabli nece vise moci pristupiti unutar tog dijela programa.
Varijable deklarirane izvan glavnog dijela programa su globalne
varijable.
Varijable deklarirane unutar neke funkcije su lokalne varijable za tu
funkciju.
Primjer 10.4
#include<iostream.h>
void Ispis_dvostruke_sume(int,int);
void Ispis_trostuke_sume(int,int);
int Ukupna_suma; // Ovo je globalna varijabla
void main() { int broj1, broj2; // upisivanja brojeva
cout<<"\n";
cout<<"Unesite dva cijela broja ";
Djelokrug djelovanja i vrijeme trajanja . . . 109
cout<<"\n";
cin>>broj1>>broj2;
Ispis_dvostruke_sume(broj1, broj2);
cout<<"\n";
Ispis_trostuke_sume(broj1, broj2);
cout<<"\n";
// return(0);
} // kraj glavnog programa
void Ispis_dvostruke_sume(int br1,int br2) {
Ukupna_suma=2*(br1+br2);
cout<<"\n Dvostruka suma unesenih brojeva iznosi ";
cout<<Ukupna_suma;
}
void Ispis_trostuke_sume(int br3,int br4) {
Ukupna_suma=3*(br3+br4);
cout<<"\n Trosturka suma unesenih brojeva iznosi ";
cout<<Ukupna_suma;
}
110 Funkcije i potprogrami
Bibliograja
[1] L. Budin, Informatika za 1. razred gimanzije, Element, 2000.
[2] R. Mata-Toledo, P. Cushman, Schaums outline of Introduction to Computer
Science. McGrow-Hill, New York, 2000.
[3] R. Scitovski, Numericka matematika, Sveuciliste u Osijeku, 2005.
111