You are on page 1of 111

Sadrzaj

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

Skotski matematicar J. Napier (1550.-1617.) otkriva logaritme i 1614. godine ob-


javljuje prve logaritamske tablice u knjizi Rabdologia. Otkrice logaritama bitno
je pojednostavnilo operacije mnozenja i dijeljenja, koje su u to vrijeme bile vrlo
slozene matematicke operacije. Godine 1622. W. Oughtred
(1574.-1660.) i E. Gunter (1581.-1626.) izraduju cirkularno logaritamsko racunalo.
Od 1654. godine u uporabi su ravna logaritamska racunala ili pomicna racunala,
u nas popularno zvana siber. Popularnost pomicnih racunala naglo je porasla
7
8 Povijesni razvoj ra cunalnih sustava
Slika 2.1: Vrlo stara verzija abacusa
nakon 1850. godine kada je francuski topnicki casnik A. Mannheim (1831.-1906.)
racunalu dodao klizni prozorcic s oznakama. Ta inacica pomicnog racunala naz-
vana je astrolab, zbog ceste primjene u astronomiji. U tom obliku pomicna
racunala su se odrzala sve do 80-ih godina 20. stoljeca kad su ih u potpunosti za-
mijenili elektronicki kalkulatori. Zanimljivo je istaknuti da su NASA-ini inzenjeri
60-tih godina proslog stoljeca koristili sibere u Apollo programu koji je uspjesno
zavrsio spustanjem covjeka na Mjesec.
Prvi poznati mehanicki kalkulator izraduje 1623. godine njemacki profesor
W. Schickard ( 1592.-1635.), ali taj pronalazak ostaje dugo nepoznat zbog prerane
smrti Schickarda i tek 1956. godine biva ponovno otkriven. Mnogo je poznatiji bio
Pascalov kalkulator, pa je slava za izum prvoga mehanickog kalkulatora pripala
velikom francuskom znanstveniku Blaiseu Pascalu.
Nacelo djelovanja Pascalovog kalkulatora temeljilo se na napravi za mjerenje
prijedenog puta kocije koju je u 2. stoljecu opisao Heron iz Aleksandrije. Na istom
nacelu rade brojila prijedenog puta u automobilima. Ni Pascalov niti Schickardov
kalkulator nisu bili prakticno primjenjivi zbog ogranicenja tadasnje tehnologije
koja nije omogucavala preciznu i pouzdanu izradu mehanickih dijelova kao sto su
zupcanici, precizni prijenosni elementi i sl.
Sljedeci veliki izumitelj, koji se ogledao u izradi mehanickog kalkulatora,
bio je G.W.Leibnitz (1646.-1716.). On je znatno pridonio napretku dvanaes-
tak znanstvenih podrucja, od logike do lingvistike, a svoj kalkulator poznat kao
Leibnitzov kotac izradio je 1672. godine u Parizu.
Iako je taj kalkulator bio mnogo savrseniji od prethodnih dvaju i mogao je
Moderna ra cunala 9
Slika 2.2: Moderinja verzija abacusa
obavljati sve cetiri osnovne aritmeticke operacije, nije bio pouzdan i upotrebljiv u
praksi. Ogranicenje je i opet bila tehnologija koja nije mogla slijediti Leibnitzovu
zamiso.
Mehanicki kalkulatori ostali su gotovo nepromjenjeni sve do 1820. godine,
kada Thomas De Colmar razvija komercijalno uspjesan mehanicki kalkulator
koji je mogao izvoditi cetiri osnovne racunske operacije: zbrajanje, oduzimanje,
mnozenje i djeljenje. Razlicite inacice tog modela poznatog pod engleskim nazivom
arithmometer, proizvodile su se sljedecih stotinu godina.
Napretkom ne mehanike otvara se mogucnost izrade pouzdanih mehanickih
kalkulatora. Mehanicki stolni kalkulatori dozivljavaju najveci razvoj na prijelazu
iz 19. u 20. stoljece.

Svedanin W.T. Odhner konstruira uspjesan mehanicki
kalkulator i 1874. godine pocinje proizvodnju i prodaju modela koji su mnogi
kasnije kopirali. Odhnerov kalkulator je u potpunosti zamijenio arithmometar.
Amerikanac W.S. Borroughs (1857.-1898.) godine 1886. konstruira vrlo uspjesan
model koji prodaje tvrtka Arithmometer Company. Prvi mehanicki kalkulator,
koji je pokretao elektromotor, proizvodi se od 1920. godine.
2.3 Moderna racunala
Tokom drugog svjetskog rata kolicina potrebnog racunanja je toliko porasla da
je npr. 1944. godine u SAD-u kolicina proizvedenih topova ovisila o zickim
mogucnostima ljudi koji su obavljali racunanje (ljudski kalkulator). Stoga
je SAD bio spreman nancirati gotovo svaki projekt racunala koji je obecavao
razrjesenje problema, pa se ubrzano pocinju ostvarivati mnoge zamisli o racunskim
10 Povijesni razvoj ra cunalnih sustava
strojevima.
U isto vrijeme u Engleskoj se gradi elektronicki programabilni kalkulator pod
imenom Colossus.
Slika 2.3: Stroj za desifriranje Colossus
Prvo racunalo pocelo je raditi 1943. godine, a napravljeno ih je ukupno de-
set. Racunala su se cuvala u najvecoj tajnosti. Na temelju toga iskustva En-
glezi grade prvo posve elektronicko racunalo (s elektronickom memorijom) pod
nazivom Manchester Mark I, koje je sadrzavalo 2400 elektronskih cijevi. Komer-
cijalno i prakticno primjenjivo racunalo pod nazivom EDSAC (engl. Electronic
Delay Storage Automatic Calculator) Englezi grade 1949. godine. U to su
vrijeme Englezi tehnoloski posve ravnopravni s Amerikancima. No na njihovu
zalost, ubrzo napustaju istrazivanja i njihovo nanciranje i zauvijek zaostaju za
Amerikancima.
Zanimljivo je spomenuti da je engleski matematicar Alan Turing sa sveucili-
sta Cambridge u svom radu Hypotetical Machine opisao ustrojstvo modernog
racunala (memoriju, CPU i dr.). Njegov je rad bio posve teorijske naravi i Turing
nikada nije pokazao zanimanje za gradnju racunala prema navedenom nacelu.
U SAD-u se istodobno rada racunalo pod nazivom ENIAC (engl. Elec-
tronic Numerator, Integrator, Analyzer and Computer), koje se opcenito sma-
tra prvim elektronickim racunalom (engl. computer). Razvijeno je na relativno
malom i neuglednom americkom sveucilistu Moore School na prijedlog Johna
W. Mauchlya. Glavni inzinjer projekta bio je Presper Eckert Jr., tako da se
Mauchly i Eckert smatraju ocevima modernih racunala. Svakako valja spomenuti
Komercijalna primjena ra cunala 11
J.V.Atanasoa, koji je prvi osmislio ideju suvremene grade racunala (nacin na koji
je gradena vecina suvremenih racunala i mikroprocesora), i velikog matematicara
dvadesetog stoljeca Johna von Neumana, koji je teorijski obradio i sistematizirao
tu gradu.
ENIAC je dovrsen i pusten u rad u studenome 1945. godine, dakle tek nakon
zavrsetka 2. svjetskog rata. Sastojao se od 17468 elektronickih cijevi, bio je tezak
oko 30 tona i imao snagu 174 kW. Izmedu ostaloga, ENIAC je sluzio za proracune
prve hidrogenske bombe, a bio je u uporabi do 1955. godine.
Slika 2.4: ENIAC: Electronic Numerical, Integrator, Analyzer and Calculator
Uskoro zapocinje razvoj slicnih racunala, primjerice EDVAC-a, ILLIAC-a, i
dr. Sva su imala elektronicke cijevi i gradena su najcesce u sklopu sveucilista, a
nancirala ih je vlada SAD-a.
2.4 Komercijalna primjena racunala
Mauchly i Eckert u meduvremenu osnivaju vlastitu tvrtku za proizvodnju elek-
tronickih racunala, ali ubrzo zapadaju u nepremostive nancijske teskoce i prisil-
jeni su prodati tvrtku. Kupila ih je tvrtka Remington Rand, a Mauchly i Eck-
ert ostaju glavni konstruktori i grade prvo uspjesno komercijalno elektronicko
racunalo pod nazivom UNIVAC.
Za razliku od prvih primjeraka racunala ostalih proizvodaca koji su bili gradeni
12 Povijesni razvoj ra cunalnih sustava
Slika 2.5: ILLIAC II nacinjen na Sveucilistu u Illinois-u
za vojne potrebe, UNIVAC se prodavao poslovnim tvrtkama i proizvelo ih se
ukupno 46. Prvi primjerak racunala UNIVAC I isporucen je u ozujku 1951. go-
dine Uredu za popis stanovnistva SAD-a.
Uz veliku promidzbu, racunalo UNIVAC je 1952. godine upotrijebljeno za
predvidanje rezultata predsjednickih izbora u SAD-u. Na temelju samo 7%
izbrojenih glasova racunalo je predvidjelo tocan rezultat izbora. To je uveliko
pridonijelo popularizaciji racunala i pobudilo zanimanje za njih.
I dok su se IBM i UNIVAC bavili razvojem i prodajom velikih racunala,
koja su zbog visoke cijene mogle kupiti samo vlade pojedinih drzava ili velike
tvrtke, K. H. Olsen 1957. godine osniva tvrtku DEC, Digital Equipment Cor-
poration. Osjetivsi potrebu za malim i pristupacnim racunalima, primjerenima
jednostavnim problemima malih i srednjih tvrtki, Olsen se odlucuje za proizvod-
nju malih racunala namijenjenih industrijskom upravljanju. Buduci da je radio
na projektu SAGE, osnovnu koncepciju i iskustvo prenio je na prvo racunalo
tvrtke DEC koje se pojavilo 1959. godine pod nazivom PDP-1.
Godine 1963. DEC proizvodi model PDP-8, prvo malo, komercijalno uspjesno
racunalo. Cijena tog racunala iznosila je 18000 US $, pa su prvi put i male
tvrtke mogle kupovati i upotrebljavati racunala. Godine 1977. DEC proizvodi
32-bitno malo racunalo pod nazivom VAX, koje postize velik komercijalni uspjeh.
Porodica VAX racunala bila je tako uspjesna da ih je u 5 godina prodano vise od
10000 primjeraka. Racunala su iz laboratorija i posvecenih prostora najvecih
tvrtki usla u siroku uporabu. Prakticno neometana u podrucju malih racunala
Pojava mikroprocesora i osobnih ra cunala 13
sve do potkraj 70-ih godina, tvrtka DEC dozivljava nevjerojatan rast i 1983.
godine ima 78000 zaposlenih.
2.5 Pojava mikroprocesora i osobnih racunala
Razvojem tehnologije sve se vise elektronickih komponenata moze smjestiti na
plocicu poluvodica. Napokon su se 1970. godine svi osnovni elementi racunala
mogli smjestiti na samo jednu plocicu poluvodica velicine nekoliko desetaka kvadrat-
nih milimetara, pa je tako nastao mikroprocesor. Jednostavno receno, to je
racunalo na jednoj plocici poluvodica. Iste godine, tvrtka INTEL trzistu nudi
prvi mikroprocesor pod nazivom 4004.
Godine 1973. ista tvrtka proizvodi mikroprocesor 8080, prvi 8-bitni mikropro-
cesor, uvelike prihvacen na trzistu jer omogucuje proizvodnju malih i vrlo jeftinih
racunala. INTEL je sljedece desetljece i pol bio gospodar trzista mikroprocesora
s modelima 8086, 80286, 80386, 80486 te modelom Pentium.
Osobno racunalo koje je doista otvorilo put osobnoj uporabi racunala, bilo
je racunalo tvrtke Apple, posebno model Apple II. U Europi su tu ulogu imala
racunala Sinclair Spectrum i Commodore C64. Zbog vrlo niske cijene bila su
pristupacna prakticno svakome, sto je omogucilo siroku racunarsku naobrazbu.
Slika 2.6: Apple 1 je prodavan kao racunalo tipa uradi sam
Racunalo IBM PC koje se pojavilo 1981. godine konacna je prekretnica kojom
zapocinje vladavina osobnih racunala. Otada im neprestano raste snaga i snizuje
se cijena.
14 Povijesni razvoj ra cunalnih sustava
Do sada racunala dijelimo na 5 generacija. Svaku generaciju karakterizira ve-
liki tehnoloski napredak koji pomaze izgradnju manjih, jeftinijih i znatno ekas-
nijih uredaja.
1. generacija (1941-56)
Karakteriziraju je elektronske cijevi i magnetni bubnjevi koji se koriste
kao memorija. Velikih su dimenzija (ispunjavaju citave sobe). Zbrajanje i
oduzimanje trajalo je 50-70 ms (mili sekundi).
Primjeri racunala prve generacije su UNIVAC i ENIAC. Istaknimo da je
ENIAC (Electronic Numerator, Integrator, Analyzer and Computer) zauz-
imao
90 m
2
, a za zbrajanje mu treba 200 s (mikro sekundi), odnosno 2000
instrukcjia u sekundi. Problem mu je zagrijavanje.
2. generacija (1957-64)
Osnovne karakteristike 2. generacije su zamjena katodnih cijevi
tranzistorima. Koristi se hibridna tehnika, na jednom modulu smjesteno je
vise tranzistora, a kao unutarnja memorija koristi se magnetska jezgra.
Iako je upotreba tranzistora omogucila proizvodnju manjih, brzih i
jeftinijih racunala i dalje postoji problem zagrijavanja i mogucih ostecenja.
I dalje se za unos koriste busene kartice, a za ispis se koriste pisaci.
Pojavljuju se i programski jezici, a brzina racunala 2. generacije iznosi oko
1 MIPS-a, tj. milion instrukcija u sekundi sto je oko 500 puta vise nego
ENIAC.
3. generacija (1965-71)
Trecu generaciju karakterizira upotreba integriranih krugova. Razvoj tehnologije
je omogucio proizvodnju minijaturnih tranzistora smjestenih na jednom
poluvodicu koji je nazvan silikonski cip. To je omogucilo znacajno povecanje
brzine i ucinkovitosti racunala.
Ovu generaciju takoder karakterizira novi nacin unosenja i ispisivanja po-
dataka. Umjesto do tada koristenih busenih kartica, korisnici s racunalom
komuniciraju preko tipkovnice i monitora. Razvijaju se i
Operacijski Sustavi (OS), sto omogucuje primjenu razlicitih aplikaci-
jska istovremeno, pri cemu jedan centralni program (OS) nadzire koristenje
memorije. Brzina racunala dostize 10 MIPS-a, pri cemu su ona puno manja
i jeftinija te postaju dostupna sirokom broju korisnika.
4. generacija (1972-89)

Cetvrtu generaciju karakteriziraju mikroprocesori.


Pojava mikroprocesora i osobnih ra cunala 15
Mikroprocesor se sastoji od velikog broja (preko tisucu) integriranih kru-
gova smjestenih na jednom silikonskom cipu. Ono sto je u prvoj generaciji
racunala bilo smjesteno u citavu sobu sada se nalazilo na plocici velicine
ljudskog dlana.
Intel je 1971. godine razvio cip 4004, na kojem su bile smjestene sve
racunalne komponente od centralne procesorske jedinice i memorije do ulazno-
izlazne jedinice. Godine 1981. IBM uvodi prvo kucno racunalo a 1984
Apple predstavlja Macintosh. Svakim danom ta kucna racunala postaju
sve mocnija, a mogucnoscu njihovog povezivanja pojavila se i mogucnost
razvoja Interneta.

Cetvrta generacija je omogucila razvoj grackih sucelja (Graphical User


Interface - GUI), koristenje misa, . . . . Dolazi do razvoja programskih
jezika C, C++, Pascal, ldots.
Danasnja racunala
Danasnja racunala pripadaju tzv. petoj generaciji, koju karakterizira um-
jetna inteligencija.
Visoko integrirana racunala, cija je moc racunanja od nekoliko 1000 MIPS-a,
omogucila su razvoj umjetne inteligencije (npr. prepoznavanje glasa) koja
se i dalje intenzivno razvija. Intenzivno se radi na primjenama kvantne,
molekularne i nano tehnologije. Glavni cilj nove generacije racunala je
glasovno unosenje podataka i mogucnost samoorganiziranja racunala.
16 Povijesni razvoj ra cunalnih sustava
Poglavlje 3
Osnove racunala
3.1

Sto je racunalo?
Racunalo je stroj koji, u skladu sa uputama deniranim u programu, moze
obradivati podatke te izvoditi osnovne racunske i logicke operacije. Termin pro-
gram podrazumjeva skup instrukcija slozenih odredenim redoslijedom u skladu
sa kojima racunalo izvodi gore navedene operacije sa ciljem izvodenja odredenog
zadatka.
Na racunalo mozemo gledati sa dva osnovna nivoa. Prvi se odnosi na nama
vidljivi dio a drugi na primjenu. Vidljivi dio se najcesce naziva arhitektura
racunala ili hardware, a podrazumjeva dijelove racunala kao sto su monitor,
pisac, tipkovnica, mis te drugi elektronski dijelovi racunala.
Kao sto smo naveli, osnovne operacije koje racunalo izvodi mozemo podijeliti
na
Unos podataka (input):
Pri unosu podataka, racunalo prihvaca podatke predstavljene na nacin na
koje ih racunalo moze razumjeti. U ovom kontekstu podatak (data) odnosi
se na bilo kakav neorganizirani, sirovi materijal, sastavljen od rijeci, brojeva,
slika ili njihovih kombinacija.
Obrada (processing):
Kod obrade, racunalo izvodi aritmeticke ili usporedbene (logicke) operacije
sa predstavljenim podacima. Te operacije su uistinu jako jednostavne. U
biti, vecina stvari koje mikroprocesor (srce racunala) stvarno izvodi, temelji
se na operaciji zbrajanja ili usporedivanja dvaju brojeva. Medutim, buduci
da je brzina kojom izvodi te informacije izuzetno velika (milijune u sekundi),
to racunalu omogucava siroki spektar upotrebe. Druga cinjenica koja je bila
presudna za prodor racunarstva, je upravo pouzdanost u izvodenju obrade.
17
18 Osnove ra cunala

Cak i najjeftinija racunala mogu godinama izvoditi nekoliko milijuna op-


eracija u sekundi bez greske uzrokovane funkcioniranjem hardverskih kom-
ponenti. (Vecina pogresaka racunala uzrokovane su logikom u programi-
ranju ili pocetnim pogreskama u podacima koje se unose u racunalo, o cemu
cemo detaljno govoriti kasnije).
Izlaz (output):
Treca operacija ima za cilj predstaviti rezultate obrade na nacin razumljiv
ljudima. Obradeni podaci proslijeduju se kao informacija.
Pohranjivanje (storage):
Pri pohranjivanju racunalo sprema rezultate kako bi se mogli kasnije ko-
ristiti. Kolicina podataka koju moze spremiti i dobaviti jeftinije racunalo
mogla bi se usporediti sa enciklopedijom tiskanom u 32 volumena.
3.2 Struktura racunala
Vecina racunalnih sustava sadrzi tri osnovne strukture:
memorija velike brzine
centralna jedinica za obradu
ulazno-izlazni sklopovi
Slika 3.1: Osnovna struktura racunala
Struktura ra cunala 19
3.2.1 Memorija velike brzine
Memorija, o kojoj je ovdje rijec, ugradena je u samo racunalo. To je ona mem-
orija koju procesor (CPU) koristi za neposredno dobavljanje i pohranjivanje po-
dataka, a zovemo ju i glavna memorija ili zicka memorija. Dok je racunalo
ukljuceno i obraduje podatke, ti podaci i programi nalaze se u radnoj memoriji.
U vecini slucajeva memorija se sastoji od cipova nacinjenih od metalnog oksida
na silikonskoj plocici. Takvu vrstu memorije nazivamo RAM sto je skracenica
za Random Acces Memory.
Memorija racunala je podijeljena na logicke jedinice jednake velicine od kojih
najjednostavniju nazivamo byte(citamo bajt). Svaki se byte sastoji od 8 uzastop-
nih bit-ova, ili binarnih znamenki. Pohranjivanje bita u memoriju racunala
podrazumijeva postojanje uredaja koji moze biti u jednom od dva stanja kao sto
je prekidac (upaljen ili ugasen). Jedno se stanje koristi za predstavljanje nule, a
drugo za jedinicu. U primjenama cesto koristimo oznake 1B = jedan byte i 1b =
jedan bit.
6
1byte
7 4 5 2 3 0 1
Najmanjeznacajni
bit
Najznacajniji
bit
Slika 3.2: Shematski prikaz bytea
Memorijske lokacije mozemo zamisliti kao niz pretinaca, od kojih svaki ima
svoju adresu. I ne samo da svaka memorijska jedinica ima svoju adresu, nego i
unutar pojedinog bytea zna se tocan redoslijed bitova prema vaznosti. Krajnje
lijevi bit u byteu je bit najvece vaznosti, a onaj krajnje desni je najmanje znacajan
bit. Kao bitnu posljedicu oznacavanja (adresiranja) byteova i bitova u njima,
citavu glavnu memoriju mozemo predstaviti jednim dugackim redom. Dijelovi
tog dugog reda mogu se iskoristiti za pohranjivanje uzorka bitova koji je dulji
od 1 bytea. Obicno ga spremamo u string koji je cjelobrojni visekratnik osnovne
memorijske celije.
Osim toga, ovakav nacin organiziranja memorije omogucava nam direktni
pristup sadrzaju svake memorijske lokacije, bez obzira gdje se ona nalazi (kaoticno
20 Osnove ra cunala
1 nibble 4 bita
1 byte 8 bita
1 rijec 2 bytea = 16 bita
1 duga rijec 4 bytea = 32 bita
1 kvadratna rijec 8 bytea = 64 bita
1 oktalna rijec 16 bytea = 128 bita
Tablica 3.1: Uobicajena imena za skupove bitova
random). Stoga se ovakve memorije zovu RAM-ovi (random access memory).
Osim tih vrsta memorije, glavnu memoriju cine i ROM-ovi (memorije koje sluze
samo za citanje). Kapacitet memorije mjeri se ukupnim brojem byteova koji se
mogu u nju pohraniti. Danasnja racunala imaju 256 MB, 512 MB ili 1 GB i vise
kapaciteta glavne memorije.
Buduci da se memorijski sustavi izraduju tako da je ukupan broj lokacija
potencija broja 2, velicina memorije kod starijih sustava cesto se mjerila jedinicom
od 1024 bita, sto odgovara broju 2
10
. Kako je 1024 priblizno 1000, drustveno je
prihvacen preks kilo kao dodatak osnovnoj jedinici. Stoga je termin kilobyte
(KB) oznacavao 1024 bita, a za stroj sa 4096 adresnih lokacija govorilo se da
ima 4 KB memorije. Kako je memorija postajala sve veca, u upotrebu dolaze
termini megabyte (MB) (1 MB=2
20
B= 1048576B 10
6
B) i gigabyte (GB) (1
GB = 2
30
B= 1073741824B 10
9
B).
Pozeljno je da RAM bude sto veceg kapaciteta kako bi se pohranilo sto vise po-
dataka, sto nadalje omogucava brzi pristup vecoj kolicini podataka pa je racunalo
sa vecim RAM-om pogodnije (brze) za koristenje.
Druga vrsta memorije je tzv. ROM memorija (Read Only Memory) ispisna
memorija, tj. memorija u koju se podatak moze upisati samo jednom. Nakon
upisa, podatak se moze citati onoliko puta koliko se zeli, ali ne i mijenjati, brisati
ili upisivati novi podatak. Zato je primjena ove memorije ogranicena na pohranu
podataka koji su uvijek jednaki i nepromijenjeni.
3.2.2 Centralna jedinica za obradu
Centralna jedinica za obradu (CPU - Central Processing Unit) je mozak
racunala. U prethodnom dijelu paznja je bila posvecena pohranjivanju podataka
i organizaciji same memorije u racunalu. Jednom kada su podaci pohranjeni,
stroj mora biti sposoban manipulirati sa tim podacima u skladu sa naredbama
algoritma. Dakle, stroj mora imati ugradenu sposobnost izvodenja operacija i
koordiniranja redoslijeda izvodenja operacija.
Centralna je jedinica za obradu (CPU) ili obicno procesor, sastavljena od dva
osnovna dijela: aritmeticko logicke jedinice (AL) u kojoj su sklopovi za manip-
Struktura ra cunala 21
ulaciju sa podacima i upravljacke jedinice koja koordinira aktivnostima unutar
racunala. Za privremeno cuvanje podataka CPU koristi registre tzv. opce i
posebne namjene. Registri opce namjene sluze kao privremeni spremnici po-
dataka koji se obraduju unutar CPU-a. U ovim registrima cuvaju se vrijednosti
koje ulaze u aritmeticko logicku jedinicu i cuvaju se rezultati koji se iz AL jedinice
tamo posalju.
3.2.3 Ulazno-izlazni sklopovi
Ulazno-izlazni sklopovi (I/O sklopovi ili Input-output sklopovi) sluze za povezi-
vanje racunala s okolinom. Pod okolinom se podrazumijeva sve ono sto se nalazi
izvan racunala. Programe i podatke, koji se obraduju u racunalu, potrebno je na
neki nacin dostaviti racunalu, a isto je tako potrebno dobivene rezultate dostaviti
korisniku.
Ulazni sklopovi su gradeni tako da omogucuju prikljucivanje vanjskih jedinica
pomocu kojih je moguce iz okoline podatke predavati racunalu. Podaci na taj
nacin ulaze u racunalo, pa se takvi sklopovi nazivaju ulaznim sklopovima. Izlazni
sklopovi omogucuju prikljucivanje vanjskih jedinica pomocu kojih je moguce po-
datke iz racunala predavati okolini. Podaci na taj nacin izlaze iz racunala, pa
se takvi sklopovi nazivaju izlaznim sklopovima. U sklopu racunala postoji vise
ulazno-izlaznih sklopova koji omogucuju prikljucivanje najrazlicitijih vanjskih je-
dinica, kao sto su: tipkovnica, monitor, magnetski disk, zvucnici, itd.
Da bi mogli izmjenjivati podatke, CPU i RAM povezani su skupom zica
BUS-om. Preko BUS-a, CPU moze dohvatiti ili procitati podatke iz RAM-a
proslijedivanjem adrese odgovarajuce memorijske lokacije i signala za citanje.
Na isti se nacin podaci mogu upisati u memoriju postavljanjem na BUS adrese
lokacije odredista, postavljanjem podatka i signala za pisanje. Slijedom ovih up-
uta, zadatak zbrajanja dvaju pohranjenih vrijednosti iz RAM-a ukljucuje puno
vise od provodenja same operacije zbrajanja. Proces ukljucuje koordiniranu ak-
ciju upravljacke jedinice koja upravlja prijenosom informacija izmedu radne mem-
orije i registra unutar CPU-a, i aritmeticko logicke jedinice koja izvodi operacije
zbrajanja u trenutku kada joj upravljacka jedinica da znak da ih izvede. Cjeloku-
pan postupak zbrajanja dvaju vrijednosti pohranjenih u memoriju mogao bi se
predstaviti procedurom sastavljenom od 5 koraka:
Korak 1: Uzmi prvu vrijednost koja se zbraja i pohrani je u registar.
Korak 2: Uzmi drugu vrijednost koja se zbraja i pohrani je u drugi registar.
Korak 3: Aktiviraj sklopove za zbrajanje sa vrijednostima koje su pohran-
jene u registrima tijekom prva dva koraka.
Korak 4: Rezultat operacije pohrani u memoriju.
22 Osnove ra cunala
Korak 5: Stani.
Ukratko, podaci se moraju prenijeti iz memorije u CPU, a rezultat se na kraju
ponovno pohranjuje u memoriju.
Primjer 3.1 Koliko 3 GB ima byta?
Rjesenje:
3GB = 3 1024
3
B = 3221225472B.
Zadatak 3.1 Racunalo ima memoriju od 32 MB. Kolika je njegova stvarna
memorija izrazena u bytima?
Zadatak 3.2 Koliko 15 EB iznosi preracunato u byte?
Poglavlje 4
Osnovne operacije na racunalu
Operacije s podacima koje izvodi racunalo kontrolira kontrolna jedinica koja je
odgovorna za pravilan protok podataka unutar glavne memorije (CPU). Medutim,
postavlja se pitanje kako ce racunalo znati izvesti naredbu zbroji, oduzmi ili neku
drugu kada znamo da je ono sposobno procitati samo niz nula i jedinica.
Odgovor je jednostavan. Osnovni format odredene instrukcije ima sljedeci
oblik:
operator [operand
1
], [operand
2
], [operand
3
]
pri cemu pod operatorom podrazumijevamo jednu od operacija zbrajanja, mnozenja,
dijeljenja, usporedbe, . . . , dok operand
i
, i = 1, 2, 3, predstavlja dio informacije na
kojoj ce biti obavljena operacja. Nadalje, svaka od operacija ima svoj numericki
kod, pa tako za zbrajanje imamo 10000001 ili za mnozenje 10000110.
Na primjer, tipicna naredba za zbrajanje dvaju podataka koji se nalaze na
adresama lokacija
1
i lokacija
2
(vidi prosli paragraf) bi glasila
ZBROJIW3 lokacija
1
, lokacija
2
, rezultat
Ova naredba zbraja (dodaje) sadrzaj rijeci na adresama lokacija
1
i lokacija
2
i
sprema ih na adresu rezultat. Slovo W ukazuje da su operandi rijeci, dok broj 3
ukazuje na broj operanada u naredbi.
4.1 Brojevi i brojevni sustavi
Brojevni sustavi mogu biti pozicijski i nepozicijski.
Najpoznatiji nepozicijski brojevni sustav, koji se i danas upotrebljava, je sus-
tav rimskih brojeva, dok su vecina brojevnih sustava koji se i danas koriste,
upravo pozicijski sustavi.
Danas se najcesce koristi dekadski brojevi sustav cije su znamenke
0, 1, . . . i 9. Znacenje dekadskog zapisa p
s
p
s1
. . . p
1
p
0
, gdje su p
s
, . . . , p
0
23
24 Osnovne operacije na ra cunalu
dekadske znamenke je sljedece:
p
s
p
s1
p
1
p
0
= p
s
10
s
+ p
s1
10
s1
+ . . . + p
1
10
1
+ p
0
10
0
.
Na primjer 582532 = 5 10
5
+ 8 10
4
+ 2 10
3
+ 5 10
2
+ 3 10
1
+ 2 10
0
.
Dekadski brojevni sustav za bazu ima broj 10.
Opcenito, za bilo koji n N postoji brojevni sustav kojemu je baza broj n,
pri cemu se bilo koji broj moze zapisati pomocu n razlicitih simbola iz skupa
{0, 1, . . . , n 2, n 1}. Tada broj n zovemo baza sustava, a koecijente iz skupa
{0, 1, . . . , n 2, n 1} zovemo znamenke u danom brojevnom sustavu.
Kako je dekadski brojevni sustav u svakodnevnoj ljudskoj upotrebi, to su
njegova svojstva dobro poznata, pa provodenje osnovnih racunskih operacija nije
potrebno posebno opisivati. Istaknimo da se sve osnovne racunske operacije mogu
svesti na operaciju zbrajanja. Operacija oduzimanja moze se zamijeniti operaci-
jom zbrajanja komplementa umanjitelja. Potenciranje se moze provesti kao niz
mnozenja, a mnozenje kao niz zbrajanja. Dijeljenje se moze obaviti uzastopnim
oduzimanjem i slicno.
Medutim, buduci da racunala mogu prepoznati samo dvije znamenke, njima
je najprirodniji binarni brojevni sustav u kome je baza broj 2, a znamenke su
0 i 1. Binarnim znamenkama iskazuju se vrijednosti stanja bitova kao osnovnih
zickih jedinica podataka.
Osim spomenutih sustava, najcesce su u upotrebi oktalni sustav s bazom 8
i heksadecimalni sustav s bazom 16.
Sljedeca tablica prikazuje brojevne sustave i odgovarajuce znamenke.
sustav znamenke
Dekatski 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Binarni 0, 1
Oktalni 0, 1, 2, 3, 4, 5, 6, 7
Heksadecimalni 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Tablica 4.1: Znamenke brojevnih sustava
4.2 Prezentacija podataka u memoriji
Kao sto smo vec u nekoliko navrata rekli, podaci smjesteni u memoriju racunala
sastoje se od niza znamenaka 0 i 1. Postavlja se pitanje kako racunalo zna koju
vrstu podatka cita? Odnosno kako zna da dani niz, npr. 10000001 procita kao
zbroji, a ne kao broj 129. Odgovor je jednostavan: racunalo zna o kojoj vrsti
podatka se radi iz konteksta u kojem je koristen. Sljedeci primjer ce ilustrirati
Zapisivanje prirodnih brojeva 25
ovu cinjenicu tako sto ce pokazati kako se u razlicitim situacijama niz od 4 jednaka
bytea moze procitati na razlicite nacine.
Primjer 4.1 Dan je niz od 4 bytea.

Sto predstavlja taj niz ako ga citamo kao
a) individualne byteove
b) dvije rijeci, svaka sa po 2 bytea
c) dugu rijec od 4 bytea?
01100011 01100101 01000100 01000000
Rjesenje: a) citajuci s lijeva na desno, dobivamo:
01000000
(2
= 0 2
7
+ 1 2
6
+ 0 2
5
+ 0 2
4
+ 0 2
3
+ 0 2
2
+ 0 2
1
+ 0 2
0
= 64
(10
01000100
(2
= 0 2
7
+ 1 2
6
+ 0 2
5
+ 0 2
4
+ 0 2
3
+ 1 2
2
+ 0 2
1
+ 0 2
0
= 68
(10
01100101
(2
= 0 2
7
+ 1 2
6
+ 1 2
5
+ 0 2
4
+ 0 2
3
+ 1 2
2
+ 0 2
1
+ 1 2
0
= 101
(10
01100011
(2
= 0 2
7
+ 1 2
6
+ 1 2
5
+ 0 2
4
+ 0 2
3
+ 0 2
2
+ 1 2
1
+ 0 2
0
= 99
(10
b)
0100010001000000
(2
= 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

= 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

Cinjenica o ekvivalenciji ima za posljedicu da broj zapisan u jednom sustavu


mozemo pretvoriti u broj zapisan u nekom drugom sustavu, pri cemu je takav
zapis jedinstven.
4.3.1 Pretvaranje brojeva iz binarnog u heksadecimalni sustav i
obratno
Ako je broj zapisan u heksadecimalon sustavu, njegov binarni ekvivalent odredujemo
tako da svaku heksadecimalnu znamenku prikazemo kao 4 binarne znamenke (4
bita). Prisjetite se da sa 4 bita mozemo kodirati 16 razlicitih kombinacija (koliko
je i znamenaka u heksadecimalnom sustavu).
Zapisivanje prirodnih brojeva 27
Primjer 4.2 Odredite binarni zapis heksadecimalnog broja AF3B1.
Rjesenje: Uzimajuci u obzir vrijednosti iz Tablice 4.2 dobivamo
A F 3 B 1
1010 1111 0011 1011 0001
Tako da je AF3B1
(16
=10101111001110110001
(2
Za pretvaranje binarnih brojeva u heksadecimalne, potrebno je prvo binarni
broj podijeliti u grupe od po 4 znamenke (pocevsi s desna na lijevo). Ako nakon
tog postupka posljednja grupa ima manje od 4 znamenke, potrebno joj je dodati
nule na lijevo tako da i ta grupa ima 4 znamenke. Nakon toga, svaku od tih
grupa treba zapisati pomocu heksadecimalnih znamenki: 0, 1, 2, 3, 4, 5, 6, 7, 8,
9, A, B, C, D, E i F.
Primjer 4.3 Odredite heksadecimalni zapis binarnog broja
10101111101010
Rjesenje: Podijelimo prvo binarni broj u grupe od po 4 znamenke:
10 1011 1110 1010
Buduci da smo nakon podjele u posljednjoj grupi dobili broj 10, dodavanjem
dvije nule, broj koji cemo pretvarati u heksadecimalni ima oblik:
0010 1011 1110 1010
Uzimajuci u obzir vrijednosti iz Tablice 4.2, dobivamo
0 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0
2 B E A
Tako da je 10101111101010
(2
=2BEA
(16
.
4.3.2 Pretvaranje brojeva iz decimalnog u druge sustave
Pretvaranje decimalnog broja u broj baze n 2 izvodi se uzastopnim dijeljenjem
decimalnog broja brojem n i zapisivanjem ostatka sve dok rezultat dijeljenja ne
bude 0.
U sljedecem primjeru cemo ilustrirati taj postupak na pretvaranju decimalnog
u binarni broj.
28 Osnovne operacije na ra cunalu
Primjer 4.4 Odredite binarni zapis dekadskog broja 25.
Rjesenje: Postupak se svodi na uzastopno dijeljenje broja 25 brojem 2 i
zapisivanje ostatka dijeljenja.
Dakle, nakon djeljenja 25 sa 2 dobivamo 12 i ostatak je 1, dalje, 12 dijelimo
sa 2 i dobivamo 6, ostatak je 0. Zatim 6 dijelimo sa 2 i dobivamo 3, ostatak je 0,
a nakon djeljenja broja 3 s 2 dobivamo 1 s ostatkom 1, i, konacno, podijelimo li
1 sa 2, dobivamo 0 i ostatak 1.
Ovaj postupak je pregledniji ako ga zapisemo u tablicu:

Citajuci posljednji
Broj Kvocijent nakon Ostatak
dijeljenja s 2 dijeljenja
25 12 1
12 6 0
6 3 0
3 1 1
1 0 1
stupac u smjeru od dolje prema gore, dobivamo da je binarni zapis broja 25 dan
sa 11001
(2
.
Obratni postupak pretvaranja broja baze n u decimalni broj izvodi se direk-
tnim uvrstavanjem opisanim u poglavlju 4.1 i primjeru 4.1.
Na primjer, dekadsku vrijednost binarnog broja 1011001
(2
dobivamo na sljedeci
nacin:
1011001
(2
= 1 2
6
+ 0 2
5
+ 1 2
4
+ 1 2
3
+ 0 2
2
+ 0 2
1
+ 1 2
0
= 89
(10
Primjer 4.5 Odredite zapis dekadskog broja 123 u oktalnom sustavu i provjerite
rezultat.
Rjesenje: U ovom slucaju broj dijelimo s 8. Dobivene rezultate cemo prikazati
u tablici:
Broj Kvocijent nakon Ostatak
dijeljenja s 8 dijeljenja
123 15 3
15 1 7
1 0 1

Citajuci posljednji stupac od dolje prema gore, dobivamo da je binarni zapis


broja 123 dan sa 173
(8
Ra cunske operacije u binarnom, . . . 29
Provjerimo rezultat:
173
(8
= 1 8
2
+ 7 8 + 3 8
0
= 123
(10
.
4.4 Racunske operacije u binarnom, oktalnom i hek-
sadecimalnom sustavu
U ovom cemo poglavlju proucavati zbrajanje i oduzimanje brojeva danih u raznim
brojevnim sustavima (kao sto smo vec napomenuli, racunalo mnozenje i dijeljenje
izvodi kao niz uzastopnih zbrajanja, odnosno, oduzimanja). Kao sto cemo vid-
jeti, operacije zbrajanja i oduzimanja u binarnom, oktalnom i heksadecimalnom
sustavu izvode se analogno kao i u dekadskom pri cemu vrijede i ista svojstva
(komutativnost, asocijativnost, . . . )
4.4.1 Zbrajanje i oduzimanje u binarnom sustavu
Kao sto smo vec napomenili, zbrajanje u binarnom sustavu ima jednaka svojstva
kao i u dekadskom, a osnovna razlika je u tome da rezultat zbrajanja prikazujemo
pomocu dvije znamenke (0, 1).
Sljedeca tablica prikazuje nekoliko jednostavnih zbrojeva binarnih brojeva.
Primjetite da, ako brojevi koje zbrajamo imaju dvije ili vise znamenaka, za zbroj
1 + 1 cemo pisati 0 i prenijeti (pamtiti) 1, jer smo ispunili bazu (1 + 1 = 2).
Primjerice, u dekadskom sustavu to odgovara zbroju 2 + 8.
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10
Primjer 4.6 Izracunajte zbroj dvaju binarnih brojeva 101110 i 110101.
Rjesenje:
30 Osnovne operacije na ra cunalu
1 0 1 1 1 0 +
1 1 0 1 0 1
1 0 plus 1 je 1
1 0 1 1 10 +
1 1 0 1 01
11 1 plus 0 je 1
1 0 1 11 0 +
1 1 0 10 1
011 1 plus 1 je 0 i 1 prenosimo
1 0 11 1 0 +
1 1 01 0 1
0011 1 plus 0 je 1 i plus 1 (koji smo prenijeli) je 0;
a 1 prenosimo
1 01 1 1 0 +
1 10 1 0 1
00011 0 plus 1 je 1 i plus 1 (koji smo prenijeli) je 0;
a 1 prenosimo
10 1 1 1 0 +
11 0 1 0 1
1100011 1 plus 1 je 0 i plus 1 (koji smo prenijeli) je 1;
i 1 prenosimo
Primjetite da smo u posljednjem redu trebali prenijeti jednu 1-cu, ali to smo
zbog jednostavnosti uradili u istom redu, tako je dodatna jedinica stavljena ispred
do tada dobivenog rezultata 1100011.
Oduzimanje se takoder izvodi analogno kao i u dekadskom sustavu, samo
sto u slucaju kada oduzimamo vecu znamenku od manje, umjesto posudivanja
desetke, mi ovdje posudujemo 2.
Primjer 4.7 Izracunajte razliku binarnih brojeva 1001 i 11.
Ra cunske operacije u binarnom, . . . 31
1 0 0 1
1 1
0 1 minus 1 je 0
1 0 01
11
10 0 je manja od 1 pa moramo posuditi 2, tako da je 0 plus 2
jedanko 2 pa 2 manje 1 jednako 1 i pisemo 1
1
1 00 1
1 1
110 0 koju promatramo postaje 1 jer smo u gornjem redu posudili
2 i oduzeli 1 pa je ukupno ostalo 1, tako da je 1 minus 0
jednako 1 i pisemo 1. I dalje imamo posudeno 1
0
10 0 1
1 1
0110 posljednja znamenka 1 se ponistava jer smo
ju vec ranije posudili, tako da pisemo 0
4.4.2 Zbrajanje i oduzimanje u heksadecimalnom sustavu
Kao sto smo vidjeli u prethodnom poglavlju, kod racunanja u binarnom sustavu,
zbog velikog broja nula i jedinica, lako se moze doci do zabune. Zato je jednos-
tavnije takve racunske operacije izvoditi u heksadecimalnom sustavu, a onda ih
pretvoriti u binarni (ako nam je potreban binarni oblik rezultata). Operacije u
heksadecimalnom sustavu se izvode potpuno analogno kao i u dekadskom, samo
treba imati na umu da smo u sustavu s bazom 16, tako da kada posudujemo
jedan, to znaci da smo posudili 16 (a ne 10 kao u dekadskom sustavu).
Primjer 4.8 Izracunajte zbroj brojeva u heksadecimalnoj bazi 1A23 i 7C28.
32 Osnovne operacije na ra cunalu
1 A2 3 +
7 C2 8
B 3 plus 8 je 11, a znamenka za 11 je B
1 A23 +
7 C28
4 B 2 plus 2 je 4, a oznaka za 4 je 4
1 A2 3 +
7 C 2 8
64 B racunajuci u dekadskom sustavu: A=10 plus C=12 sto
daje 22, a 22 u heksadecimalnom zapisu je 16 (116 + 6),
zato pisemo 6 i jedan prenosimo
1 A2 3 +
7 C2 8
96 4 B 1 + 7 su 8 i plus 1 koji smo prenijeli je 9
zato pisemo 9
Primjer 4.9 Izracunajte razliku brojeva danih u heksadecimalnoj bazi 1F00A i
B2.
Ra cunske operacije u binarnom, . . . 33
1 F0 0 A
B 2
8 10 minus 2 je 8, a znamenka za 8 je 8
1 F0 0A
B 2
58 0 je manja od 11, zato moramo posuditi 16
pa imamo 16 minus 11 je 5, zato pisemo 5
F
1 F00 A
B2
F5 8 Promatrana 0 postaje F, jer smo bazu (16) umanjili za 1
koji smo posudili, a 15 minus 0 je 15, zato pisemo F
i opet smo posudili 1 (nismo mogli oduzeti 1 od 0)
i dalje ostaje 1 posudeno
E
1 F0 0 A
B2
EF, 5 8 F minus 1 (koji smo prenijeli) je E, (15 minus 1 je 14),
zato pisemo E
1F0 0 A
B2
1EF5 8 1 minus 0 je 1, pa pisemo 1
Zadatak 4.1 Odredite binarne ekvivalente slijedecih dekadskih brojeva:
43, 77, 115, 331, 1010.
Provjerite rezultat ponovnom pretvorbom u dekadski sustav.
Zadatak 4.2 Odredite dekadske ekvivalente slijedecih binarnih brojeva:
1001, 101001, 11001101, 1110011, 10010110.
Provjerite rezultat ponovnom pretvorbom u binarni sustav.
Zadatak 4.3 Koja je vrijednost svake znamenke binarnog broja 11010001
(2
? Kako
glasi decimalni zapis tog broja?
34 Osnovne operacije na ra cunalu
Zadatak 4.4 Odredite oktalni zapis slijedecih dekadskih brojeva:
126, 377, 485, 641.
Provjerite rezultat ponovnom pretvorbom u dekadski sustav.
Zadatak 4.5 Odredite dekadski ekvivalent oktalnih brojeva 147 i 555.
Zadatak 4.6 Pretvorite brojeve 5049 i 260137 iz dekadskog zapisa u heksadeci-
malni.
Zadatak 4.7 Brojeve 1AC7 i DCEF9 prebacite iz heksadecimalnog u dekadski
brojevni sustav.
Zadatak 4.8 Nacinite slijedece pretvorbe:
a) 711
(8
=?
(16
b) AC1
(16
=?
(8
c) 10101011
(2
=?
(8
(=?
(16
)
d) ABC23
(16
=?
(2
(=?
(8
)
Zadatak 4.9 Izvedite slijedece aritmeticke operacije:
a) 11011101
(2
+ 10101001
(2
b) 11100010
(2
10000111
(2
c) 267E2
(16
+ 4C10B
(16
d) 1F00A
(16
B21
(16
e) 17
(8
+ 376
(8
f ) 255
(8
66
(8
.
Zadatak 4.10 Izracunajte slijedecu razliku:
12A3E
(16
234
(8
11001101
(2
.
Rezultat izrazite u binarnom i dekadskom brojevnom sustavu.
Poglavlje 5
Pohranjivanje brojeva u
racunalu
U poglavlju 4.2 smo napomenuli da u ovisnosti o kontekstu racunalo niz nula
i jedinica prepoznaje kao neku od operaciju, kao broj ili slovo, ili neki drugi
podatak. To naravno vrijedi i za numericke podatke, ali problem koji se moze
pojaviti jest je li rezulat neke racunske operacije (npr. oduzimanja) pozitivan
ili negativan broj i kako to racunalo moze znati. Odgovor na to pitanje ovisi o
konvenciji koju koristimo pri zapisivanju brojeva.
U ovom poglavlju cemo proucavati dvije takve konvencije: konvenciju predz-
naka i konvenciju dvostrukog komplementa.
5.1 Konvencija predznaka
Pretpostavimo da za spremanje cijelih brojeva koristimo n mjesta (odnosno n
bitova). U konvenciji predznaka krajnji lijevi bit koristimo iskljucivo za predznak,
a ostalih n 1 bitova za apsolutnu vrijednost (iznos) broja. Primjetite da se u
ovoj konvenciji u rijec duljine n bitova mogu zapisati brojevi od (2
n1
1) do
+(2
n1
1).
Slika 5.1: Prikaz broja pomocu bytea
35
36 Pohranjivanje brojeva u ra cunalu
U ovoj konvenciji 0 na mjestu b
n1
predstavlja predznak +, a 1 na mjestu
b
n1
predstavlja predznak (vidi sliku 5.1).
Primjer 5.1 Broj 41 u binarnom zapisu je dan s 41
(10
= 0101001
(2
.
U konvenciji predznaka taj broj ima zapis 41
(10
= 00101001
(2
, dok se broj 41
zapisuje kao 41
(10
= 10101001
(2
.
Primjetite da smo 41 zapisali sa 7 znakova (bitova), a da je u konvenciji
predznaka dodan jos jedan bit za predznak (ukupno imamo 8 bit-ni zapis).
Problem koji se moze pojaviti jest, sto ako za rezultat neke racunske operacije
dobijemo broj koji je izvan intervala
_
2
n1
1, +2
n1
1

. 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

0101011001 0110100101 0110111101 0110110001 0110010101


0110010001 0111001111 0010000011 0110000111 0111001001
0110010101 0010000011 0110001011 0110110001 0111010111
0110010101 0010111001
48 Pohranjivanje brojeva u ra cunalu
Koristeci prethodnu tablicu provjeravamo svaki niz od 10 bitova (8 bit je 1
byte i dodatno imamo 1 bit za prekid poruke i jedan paritetni bit):

1. 010101100 2. 011010010 3. 011011110


4. 011011000 5. 011001010 6. 011001000
7. 011100111 8. 001000001 9. 011000011
10. 011100100 11. 011001010 12. 001000001
13. 011000101 14. 011011000 15. 011101011
16. 011001010 17. 001011100
Zadatak 5.1 Odredite decimalnu vrijednost razlike brojeva 11110000 i 00010111
ako su dani konvencijom predznaka i ako je osnavna jedinica byte.
Zadatak 5.2

Sto je dvostruki komplement broja 65
(10
?
Zadatak 5.3 Odredite dvostruki komplement brojeva 35
(10
i 56
(10
.
Zadatak 5.4 Odredite pozitivnu decimalnu vrijednost dvostrukog komplementa
broja
11100100
(2
.
Zadatak 5.5 Odredite decimalni zapis binarnog broja 10001100
(2
ako ga proma-
tramo kao:
a) binarni broj bez predznaka
b) dvostruki komplement.
Zadatak 5.6 Odredite decimalnu vrijednost rezultata zbrajanja brojeva
a) 11000111 i 11011101
b) 1100111 i 1110001
ako su oba broja zapisana u obliku dvostrukog komplementa.
Zadatak 5.7 Odredite rezultat oduzimanja brojeva zapisanih u obliku dvostrukog
komplementa:
a) 11011101 - 00111001
b) 00111001 - 11011101
ako su oba broja zapisana u obliku dvostrukog komplementa.
Binarni i alfanumeri cki kodovi 49
Zadatak 5.8 Odredite rezultat zbrajanja brojeva 10011011 i 11100011 pri cemu
su oba broja zapisana u obliku dvostrukog komplementa. Je li doslo do overow-a?
Zasto?
Zadatak 5.9 Odredite razliku brojeva 10001011 i 10101 pri cemu su oba broja
zapisana u obliku dvostrukog komplementa. Je li doslo do overow-a? Zasto?
Zadatak 5.10 Koliko je bitova potrebno da bi se predstavilo 10 dekadskih zna-
menki? A 17?
Zadatak 5.11 Nadite gresku koja nastaje kao posljedica suma u komunikaci-
jskom kanalu izmedu dva racunala, ako znamo da se za otkrivanje greske koristi
parni paritet i da poruka glasi ovako:
0110010001 0010101100 0111100000 0111101010 0100110000
0101010001
Zadatak 5.12 Nadite gresku koja nastaje kao posljedica suma u komunikaci-
jskom kanalu izmedu dva racunala, ako znamo da se za otkrivanje greske koristi
neparni paritet i da poruka glasi ovako:
0010111000 0111010101 0001110001 0111001001 0101101000
0000101101
50 Pohranjivanje brojeva u ra cunalu
Poglavlje 6
Planiranje i razvoj programske
potpore
6.1 Osnove pisanja programa
Stvaranje racunalnih programa je iterativni proces koji se sastoji u kreiranju niza
instrukcija (programski kod ili kod). Takav niz govori racunalu kako treba obraditi
pojedine informacije.
Osnovna struktura racunalne obrade prikazana je sljedecom shemom:
Ulazni podaci Obrada podataka Izlazni podaci
(Input) (Process) (Output)
Tablica 6.1: Shematski prikaz rada racuala
Dakle u postupku obrade podataka racunalo koristi niz instrukcija dobivenih od
programera. U sljedecem primjeru prikazati niz instrukcija, koji ilustriraju svaki
od tri osnovna dijela rada racunala, na jednostavnom problemu.
Primjer 6.1

Sto bi bili ulazni, a sto izlazni podaci i kako bi izgledala njihova
obrada, zelimo li odrediti prosjecnu ocjenu studenata 3. godine za prosli semestar
iz predmeta Uvod u numericku matematiku.
Ulaz: Popis svih pozitivnih ocjena iz Uvoda u numericku matematiku za
prosli semestar.
Obrada: Zbrojimo sve ocjene i podijelimo ih s ukupnim brojem ocjena.
Izlaz: Dobiveni broj je prosjecna ocjena za prosli semestar iz Uvoda u nu-
mericku matematiku.
51
52 Planiranje i razvoj programske potpore
6.2 Rjesavanje problema
Pisanje programa je puno jednostavnije ako znamo okvir u kojem cemo raditi
(rjesavati problem i planirati provedbu programa).
Pisanje programa (programiranje) mozemo podijeliti u pet osnovnih koraka.
Svaki od njih je bitan za pravilno provodenje procesa.
Istaknimo osnovne korake pri pisanju programa:
1. Korak Analiza problema i njegovih specicnosti.
Ovdje posebno treba obratiti paznju na sljedece:


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.

Sto je rjesenje iz 2. koraka temeljitije napravljeno, to je i kodiranje


(pisanje programa) jednostavnije. Najcesce, programer moze pisati pro-
gram prateci rjesenje korak po korak.
Vazan i sastavni dio kodiranja jest dokumentiranje (pisanje komentara o
svakom pojedinom koraku u programu).
4. Korak Testiranje programa.
Tijekom pisanja programa, valja postupno provjeravati dio po dio napisanog
koda, kako bi se mogla kontrolirati tocnost svakog dijela programa.
5. Korak Provjera ukupne kvalitete programa.
Algoritmi 53
Kada smo provjerili da svi dijelovi programa rade (Korak 4. ), potrebno
je program testirati na nizu razlicitih skupova podataka. Takoder, treba
provjeriti kako se ponasa na nepredvidenim skupovima podataka.
Ako npr. zelimo napisati program koji racuna geometrijsku vrijednost niza
podataka a
1
, . . . , a
n
, koristiti cemo formulu
n

_
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

ili end1 konstantni ubacuje karakter za novi red


manipulator tjera kursor da prijede u novi red
7.4.2 C I/O
U programskom jeziku C najcesce koristene funkcije za ispis i upis podataka
(byteova) su printf i scanf.
Za koristenje navedenih naredbi potrebno je ucitati standardnu I/O biblioteku
#include<stdio.h>
Naredbu printf koristimo za standardne uredaje za izlaz, kao sto su zaslon,
neki formatirani zapis (u datoteku) i slicno, dok scanf koristimo za ucitavanje
podataka sa standardnih uredaja, kao na primjer tipkovnice.
Oblik naredbe:
printf (kontrolni znak za oblikovanje izlaza, lista varijabli)
scanf (kontrolni znak za oblikovanje izlaza, lista varijabli)
kontrolni znak za oblikovanje izlaza pridruzeni argument koji ce
za printf() (karakter konverzije) biti ispisan
%c karakter
%d cijeli broj
%f oating-point broj
%s string
Pisanje cjelovitog programa 67
kontrolni znak za oblikovanje izlaza efekt koji ce
za printf() (znakovi prekida) se dogoditi
\a beep zvuk
\b backspace
\f nova stranica
\n novi red
\t horizontalni tabulator
Primjer 7.2 Ispisite na zaslonu poruku: Pozdrav Svijetu u C i C++.
Program 1:
#include<stdio.h>
void main()
{
printf("Pozdrav Svijetu");
}
Program 2:
#include <iostream.h>
int main (void)
{
cout << "Pozdrav Svijetu\n";
}
Postoji li razlika u ispisu Programa 1 i 2 ?
7.5 Pisanje cjelovitog programa
Svi pojmovi koje smo do sada navodili sluze pisanju cjelovitih programa (ulaz,
obrada, izlaz ) koje ce racunalo razumjeti. Svaki program posjeduje svoju posebnu
sintaksu koja ga razlikuje od ostalih, medutim, svim programima je zajednicko
to da moraju sadrzavati glavni dio programa koji ce biti izvrsen.
Glavni dio programa C i C++ (main na engleskom) nalazi se unutar
viticastih zagrada { }, sto ujedno oznacava i pocetak odnosno kraj glavnog
dijela programa.
Sljedeci primjer sadrzi kratki C ++ program s istaknutim osnovnim dijelovima:
1. Deklaracija varijabli
2. Ulaz
3. Obrada podataka
4. Izlaz
68 Pisanje programskog koda
Primjer 7.3 Napisite C++ program koji za ucitani cijeli broj ispisuje njegov
kvadrat.
// Prvi program napisan u C++-u (Komentar)
#include<isostream.h>
void main()
{
// (1. Deklaracija varijabli)
int num, square;
// 1. Upisujemo prirodne brojeve (2. Ulaz)
cout<<end1<<"Upisite prirodni broj koji zelite kvadrirati"=>";
cin>>num;
//2. Kvadriranje (3. Obrada)
square = num*num;
//3. Ispis rezultata (4. Izlaz)
cout<<num<<"kvadrat je">>square<<end1;
} // kraj programa
Sljedeci primjer je C program za problem iz Primjera 7.3.
Primjer 7.4 Napisite C program koji ucitava cijele brojeve i ispisuje njihove
kvadrate.
// Prvi program napisan u C-u (Komentar)
#include<stdio.h>
void main()
{
// (1. Deklariracija varijabli)
int num, square;
// 1. Upisujemo prirodne brojeve (2. Ulaz)
printf("\n Upisite prirodni broj koji zelite kvadrirati =>");
scanf("%d", &num);
//2. Kvadriranje (3. Obrada)
square = num*num;
//3. Ispis rezultata (4. Izlaz)
printf("\n %d na kvadrat iznosi %d\n", num, square);
} // kraj programa
Zadatak 7.1 Koji su od sljedecih naziva varijabli valjani: datumRodjenja, meusuma,
prvo_slovo, suma1, int, 2broj, JMBG, moja-varijabla?
Pisanje cjelovitog programa 69
Zadatak 7.2 Koju ce vrijednost imati cjelobrojna varijabla a nakon izvrsenja
naredbe:
a=((5%2)+3)*(5%2*3);
Zadatak 7.3 Napisite naredbu koja ce preracunavati stupnjeve Fahrenheita u
stupnjeve Celzija. Vrijednost temperature u stupnjevima Fahrenheita dana je u
realnoj varijabli fahr, a temperatura u stupnjevima Celzija treba biti u realnoj
varijabli cels.
Zadatak 7.4 Napisite naredbu u C-u koja ispisuje "Pozdrav svijetu!" u novom
redu, uvucenu za 1 tabulator.
Zadatak 7.5

Sto ce ispisati slijedece naredbe:
printf("Suma brojeva %5d i %5d je %7d.", 20, 25, 45);
printf("\n%3 d%6.2f", 1, 47.9);
Zadatak 7.6 Napisite naredbe u C-u za upit korisniku da upise dva cijela broja.
70 Pisanje programskog koda
Poglavlje 8
Struktura i pisanje programa
8.1 Booleove algebra
Racunalni programi izvode tocno ono sto im je receno. Oni dobivene insrukcije
izvode u nizu, izborom i ponavljanjem. Vecinom se instrukcije izvode jedna za
drugom (u nizu) kako su i napisane.
Ponekad programer ima dva ili vise moguca izbora koji se mogu izvesti u
ovisnosti o odredenoj varijabli, odnosno Booleovoj varijabli koja moze sadrzavati
jednu od dvije vrijednosti: istina ili laz.
Booleova algebra je dio matematicke logike - algebarska struktura koja sazima
osnovu operacija I (AND), ILI (OR) i NE (NOT) kao i skup teorijskih operacija
kao sto su unija, presjek i komplement. Booleova algebra je dobila naziv po
tvorcu, Georgeu Booleu, britanskom matematicaru iz 19. stoljeca. Booleova
algebra je, osim kao dio apstraktne algebre, izuzetno utjecajna kao matematicki
temelj racunarskih znanosti.
8.1.1 Booleove varijable i konstante
Booleov izraz moze imati Booleove varijable (istina ili laz ) ili konstante. Vazno
je takvim varijablama davati opisna imena kako bi se prilikom provjeravanja rada
programa lakse snalazili.
Sljedeci jednostavni primjer prikazuje kako mozemo koristiti Booleove vari-
jable:
const ISTINA=1; // deklaracija konstante Istina
const LAZ=0; // deklaracija konstante Laz
int PodaciOK, PosaoObavljen
71
72 Pisanje programskog koda
PodaciOk = LAZ; // postavljanje varijable PodaciOk na Laz (0),
// znaci da nam podaci nisu u redu
PosaoObavljen=ISTINA; // postavljanje varijable PosaoObavljen
// na ISTINA (1), znaci da je posao obavljen
8.1.2 Booleovi izrazi
Booleov izraz se sastoji od konstanti i varijabli povezanih relacijskim opera-
torima. Popis relacijskih operatora prikazan je u tablici 8.1.
Relacijski operator C/C++ hrvatski ekvivalent
< manje
<= manje ili jednako
> vece
>= vece ili jednako
== jednako
!= nije jednako
Tablica 8.1: Relacijski operatori
Jedan jednostavni Booleov izraz je
5 + 2 < 15
Primjetimo da prvo izvodimo standardne racunske operacije (u ovom slucaju
zbrajamo 5 i 2) a zatim usporedujemo izraze s lijeva na desno.
Vazno je napomenuti da mozemo usporedivati iskljucivo varijable iste vrste.
Sljedeca tablica sadrzi neke od mogucih Booleovih izraza.
Booleov izraz x = 4 , y = 8 x =b , y =b
x > y pogresno pogresno
x == y pogresno istinito
x! = y istinito pogresno
x < y istinito pogresno
x <= y istinito istinito
Primjetimo da nije moguce usporedivati izraze razlicite vrste, tako na primjer:
za x = 4 i y = 4.0 Booleov izraz x == y je pogresan (x je cijeli a y je broj
u zapisu s pomicnim zarezom odnosno realni broj )
Petlja za izbor 73
za x =a i y = 4.0 Booleov izraz x == y je pogresan (x znakovni simbol
(karakter) a y je broj u zapisu s pomicnim zarezom pa je izraz lazan jer x
i y nikako ne mogu biti jednaki)
Pojedinacni Booleovi izrazi mogu se kombinirati u slozenije izraze spajan-
jem koristeci logicke operatore.
Pregled logickih operatora za C i C++ se nalazi u sljedecoj tablici:
Logicki operatori znacenje
! NE (NOT)
&& I (AND)
|| ILI (OR)
Osnovni koraci u odredivanju (istinitosti) slozenijih Booleovih izraza su:
odrediti istinitost svakog posebnog izraza u relaciji
odrediti istinitost izraza u zagradama
odrediti istinitost cijelog slozenog izraza u odgovarajucem redoslijedu
Primjer 8.1 Odredite istinitost svakog od pojedinacnih kao i cijelog slozenog
Booleovog izraza
a) ako je x = 3 i y = 4
(x == 3) && (y! = 3)
b) ako je x = 3 i y = 3
(x == 3) && (y! = 3)
Rjesenje:
a) za x = 3 i y = 4
(x == 3)
. .
&& (y! = 3)
. .
ISTINA ISTINA
ISTINA
a) za x = 3 i y = 3
(x == 3)
. .
&& (y! = 3)
. .
LA

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.

Cinjenica je da nam je lakse doci do potrebne informacije iz niza podataka


ako su podaci slozeni. Uzmimo na primjer telefonski imenik. Buduci da su imena
slozena abecednim redom, tocno znamo nacin na koji cemo naci neciji telefonski
broj. Zamislite kako bi to izveli da su podaci u imeniku nabacani bez reda.
Da bi mogli govoriti o sortiranju, moramo za svaki skup podataka znati pri-
padni uredaj, tj. moramo moci reci za bilo koja dva podatka x i y kada je x y
ili y x.
Ovdje oznaka ima opcenito znacenje koje ovisi o vrsti (prirodi) podataka:
3 5
Babic Zrno
Sljedeci primjer detaljno opisuje algoritamsko rjesenje problema odredivanja
najveceg broja iz niza brojeva.
Primjer 9.3 Neka je n N i neka je zadan niz brojeva x
1
, x
2
, . . . , x
n
. Odredimo
najveci broj iz zadanog niza.
Rjesenje: Nas zadatak je odrediti
x
m
= max
1in
x
i
= max{x
1
, . . . , x
n
} .
To znaci da treba pronaci indeks najveceg broja iz danog niza.
Npr. neka je dan niz od n = 4 broja x
1
= 3, x
2
= 9, x
3
= 2 i x
4
= 71. Tada
je rijesenje naseg problema m = 2, odnosno x
2
9 max
1i4
x
i
.
Prije nego pocnemo konstruirati algoritam, moramo uzeti u obzir da moramo
napisati algoritam koji ce izvrsiti racunalo, a ono je jako ograniceno u svojim
mogucnostima. Dakle, ulazni niz podataka u racunalu je niz uzastopnih memo-
rijskih lokacija u kojima su upisane vrijednosti brojeva x
1
, . . . x
n
. Treba naglasiti
88 Numeri cki algoritmi
da se tom nizu moze pristupiti samo element po element, pa nas problem zahtijeva
novu, slicnu preformulaciju:
Zamislite da su nasi brojevi x
1
, . . . x
n
zapisani na kuglicama koje su stavljene
u kutije sa n pretinaca od kojih svaki ima svoj poklopac. Kutija se zove x. Na
pocetku su svi poklopci zatvoreni.
3 9 2 71
x
1
x
2
x
3
x
4
U svakom trenutku mozemo otvoriti samo jedan pretinac i procitati broj na
kuglici. Kako cemo odrediti pretinac u kojem je kuglica s najvecim brojem?
budu 2 ije 2 9 - < , m ostaje
71 4
buduije9 3 > , m 2 postaje
m postaje1
9
2
budu 4 ije71 9 > , m postaje
-2 2
Pseudokod za ovaj program glasi:
m 1 ; MAX = x
m
(ovo znaci da je MAX = x
1
)
ako je x
2
> x
m
, onda je x
m
= x
2
(odnosno m 2 )
ako je x
3
> x
m
, onda je x
m
= x
3
(odnosno m 3 )
ako je x
4
> x
m
, onda je x
m
= x
4
(odnosno m 4 )
.
.
.
ako je x
n
> x
m
, onda je x
m
= x
n
(odnosno m n )
Cijeli postupak mozemo krace zapisati u obliku:
m 1, (MAX = x
m
)
za i od 2 do n ponavljaj
ako je x
i
> x
m
(MAX)
onda m i, (MAX x
m
)
Ovo je algoritam za odredivanje maksimuma skupa brojeva.
Slozenost numeri ckih algoritama 89
9.1.1 Slozenost numerickih algoritama
Prisjetimo se: pod algoritmom podrazumijevamo tocan, precizan propis o izvrsavanju
niza operacija tocno odredenim redosljedom, za rjesavanje zadanog problema.
Kao sto smo u uvodnom dijelu naveli, danas je brzina racunala dosegla ogromne
brojeve. Sjetimo se da danas dobra racunala mogu izvesti 10
9
aritmetickih op-
eracija u sekundi (zbrajanja, oduzimanja, mnozenja i dijeljenja). Ilustrirajmo to
na primjeru brzine svjetlosti.
Brzina svjetlosti iznosi priblizno 300000
km
s
ili 3 10
9 m
s
. To znaci da dok
svjetlost prijede 1 metar, racunalo zbroji dva broja.
U primjenama, mi za odredene probleme razvijamo, razradujemo i imple-
mentiramo odgovarajuce algoritme i ocekujemo da ce za konkretne podatke nas
algoritam dati brzo i tocno rjesenje. Sve se cini jednostavno, no nije.
Primjer 9.4 Rjesenje kvadratne jednadzbe
ax
2
+ bx + c = 0 , a = 0 (9.1.1)
se moze zapisati u obliku
x
1
=
b +

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).

Sto je sa realnim brojevima ?


9.4.1 Aproksimacije realnih brojeva strojnim (oating-point) bro-
jevima
U primjenama se cesto racuna s pribliznim vrijednostima, sto moze biti posljedica
nemogucnosti tocnog mjerenja ili tocnog racuna ulaznih podataka.
Ako je neki realni broj a aproksimiran s brojema, onda se apsolutna vijednost
razlike a = a a ili |a a| naziva apsolutna pogreska aproksimacije. U slucaju
kada je a = 0, denirana je i tzv. relativna pogreska aproksimacije sa:
a =
|a|
a
=
|a a|
a
.
Jednosturka to cnost, 32 bitni zapis 97
Pisemo
a = a +a = a
_
1 +
|a|
a
_
Iz gornje jednakosti vidimo da ce nas zanimati koliko najvise mogu biti velicine
a i
|a|
a
Kako racuna racunalo ?
Racunala racunaju sa strojnim (oating-point) brojevima koji su pohranjeni
u njemu i pomocu kojih aproksimiramo skup realnih brojeva R. Oznacimo taj
skup sa F. Denicija skupa F ovisi o izboru baze b i broja znamenki t koje cemo
koristiti za prikaz brojeva iz F.
Neka je b baza i neka je t odabrani broja znamenki. Strojni broj tada ima
oblik
z = z
0
z
1
z
2
. . . z
t1
b
e
Dio broja z
0
z
1
z
2
. . . z
t1
zove se mantisa, a z
i
{0, 1, . . . b 1},
i = 0, 1 . . . t 1 su znamenke. Broje e nazivamo eksponent i vrijedi da je
e
min
e e
max
.
Gornji prikaz je jedinstven ako je mantisa normalizirana tj. ako je z
0
= 0.
Dakle, skup strojnih brojeva F je odreden cetvorkom parametara (b, t, e
min
, e
max
).
Obicno je b = 2 ili b = 10.
Dugo vremena je u racunalstvu vladao nered u smislu da su razliciti proizvodaci
imali razlicite implementacije skupa F i pripadnih racunskih operacija +, , , /.
Tako da je isti racun na razlicitim strojevima mogao dati ralicite rezultate.
Godine 1985. IEEE (Institute of Electrical and Electronics Engineers) i ANSI
(American National Standard Institute) objavile su dokument:
IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985)
te 1987. godine
IEEE Standard for Radix-Independent Floating-Point Arithmetic (ANSI/IEEE
Std 854-1987)
kojim je deniran standard koji propisuje kako treba izvoditi aritmeticke op-
eracije.
Standard propisuje vise razina tocnosti, osnovnu (jednostruku - singl preci-
sion) i dvostruku tocnost (double precision).
9.5 Jednosturka tocnost, 32 bitni zapis
Strojni broj (oating-point broj) je spremljen u 32 bitnu rijec:
98 Numeri cki algoritmi
1 2
....
31 0
0
1
+
0-tibitsadri
predznakbroja
....
1 8 su bitovi koji pripadaju eksponentu broja. Dozvoljene vrijednosti
eksponenta su
e
min
= 126 e
max
= 127.
Ovo je posljedica cinjenice da eksponent moze poprimiti 2
8
= 256 vrijednosti, a
dvije vrijednosti rezerviramo jednu za inf beskonacno i jednu za NaN (Not a
Number). Tada ostaje 254 mogucnosti (toliko je upravo brojeva izmedu e
min
i
e
max
).
9 31 su bitovi koji sadrze znamenke z
1
, . . . , z
23
(z
0
= 1)
Na ovaj je nacin prikazan broj
(1)
P
1.z
1
z
2
. . . z
23
2
e
Sada mozemo odrediti najveci i najmanji pozitivni broj koji racunalo raspoz-
naje.
Najveci pozitivni broj je
_
1 + 2
1
+ 2
2
+ + 2
23
_
2
127
3.4028 10
38
,
Slicno, za najmanji pozitivni broj dobivamo
(1 + 0 + 0 + + 0) 2
126
1.1755 10
38
.
Postavlja se pitanje sto je s brojevima manjim od 10
38
i onima koji su veci
od 3.5 10
38
???
9.5.1 Racunske operacije sa strojnim (oating-point) brojevima
Denormalizirani brojevi
Prisjetimo se da strojni brojevi najcesce predstavljaju aproksimaciju nekog
realnog broja. Sljedeci rezultat govori o relativnoj pogresci aproksimacije relanog
broja strojnim brojem.
Neka je x strojna reprezentacija broja x u bazi b. Tada vrijedi
| x x|
x
b
1t
,
gdje je t broj znamenaka u strojnoj reprezentaciji.
Jednosturka to cnost, 32 bitni zapis 99
Broj zovemo strojna preciznost i obicno iznosi 10
16
u dvostrukoj,
odnosno 10
8
u jednostrukoj tocnosti.
Na primjer, ako strojne brojeve prikazujemo u 32 bitnom prikazu kao u
proslom poglavlju, tada je strojna tocnost
= 2
23
1.2 10
7
,
a ako koristimo 64 bitni zapis, tada je strojna tocnost
= 2
52
2.2 10
16
.
9.5.2 Zakoni strojne aritmetike (oating-point aritmetika)
Treba imati na umu da kao sto su u racunalu pohranjene priblizne vrijednosti
realnih brojeva, tako se i racunske operacije izvode s odredenom tocnoscu ili s
greskom.
Oznaka , , , ce oznacavati stojne operacije zbrajanja, mnozenja , oduz-
imanja i djeljenja.
Pitamo se kolika je relativna razlika izmedu brojeva x + y i x y?
Oznacimo li najblizi manji i najblizi veci strojni broj broju x + y, tada
vrijedi
|(x + y) (x y)|
|x + y|

1/2| |


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.

Sto se dogodilo ??? Otkud tolika razlika ???


Mozemo li izbjeci oduzimanje ?!? (pretpostavljamo da smo tu nacinili gresku
ako su sva oduzimanja provedena tocno)
Jednosturka to cnost, 32 bitni zapis 101
Na srecu, cesto se oduzimanja mogu izbjeci, na primjer, prikazimo e
x
kao red
potencija:
e
x
= 1 + x +
x
2
2!
+
x
3
3!
+
x
4
4!
+
sada je ocito
f(x) =
x
2
2!
+
x
3
3!
+
x
4
4!
+
x
5
5!
+
ili
f(0.01) =
0.0001
2!
+
0.000001
3!
+
10
8
4!
= 0.000050167 .
Primjetite da ostali pribrojnici poslije x
4
/(4!) ne doprinose tocnosti rjesenja.
Pojava opisana u prethodnom primjeru spada u tzv. katastrofalno kracenje
(Catastrophic Cancelletion).
Do ove pojave dolazi kada oduzimamo bliske broje. Nazalost, kod takvog
oduzimanja cesto moze doci do velikih gresaka i gubljenja tocnosti, tj. mozemo
dobiti rezultat koji nema tocnu niti jednu znacajnu znamenku.
Primjer 9.12 Promotrimo jednostavan primjer rjesavanja kvadratne jednadzbe
ax
2
+ bx + c = 0 .
U srednjom skoli smo naucili da su rjesenja dana sa
x
1
=
b +

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

You might also like