You are on page 1of 137

Sadrzaj

1 Uvod 5
2 Povijesni razvoj racunalnih sustava 7
2.1 Prva racunalna pomagala . . . . . . . . . . . . . . . . 7
2.2 Mehanicka racunalna . . . . . . . . . . . . . . . . . . . 8
2.3 Moderna racunala . . . . . . . . . . . . . . . . . . . . . 11
2.4 Komercijalna primjena racunala . . . . . . . . . . . . . 13
2.5 Pojava mikroprocesora i osobnih racunala . . . . . . . 15
3 Osnove racunala 19
3.1

Sto je racunalo? . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Struktura racunala . . . . . . . . . . . . . . . . . . . . 21
3.2.1 Memorija velike brzine . . . . . . . . . . . . . . 21
3.2.2 Centralna jedinica za obradu . . . . . . . . . . . 24
3.2.3 Ulazno-izlazni sklopovi . . . . . . . . . . . . . . 24
4 Osnovne operacije na racunalu 27
4.1 Brojevi i brojevni sustavi . . . . . . . . . . . . . . . . . 28
4.2 Prezentacija podataka u memoriji . . . . . . . . . . . . 29
4.3 Zapisivanje prirodnih brojeva u raznim brojevnim sus-
tavima . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1
2 SADR

ZAJ
4.3.1 Pretvaranje brojeva iz binarnog u heksadecimalni
sustav i obratno . . . . . . . . . . . . . . . . . . 32
4.3.2 Pretvaranje brojeva iz decimalnog u druge sustave 33
4.4 Racunske operacije u binarnom, oktalnom i heksadeci-
malnom sustavu . . . . . . . . . . . . . . . . . . . . . . 35
4.4.1 Zbrajanje i oduzimanje u binarnom sustavu . . 35
4.4.2 Zbrajanje i oduzimanje u heksadecimalnom sus-
tavu . . . . . . . . . . . . . . . . . . . . . . . . 38
5 Pohranjivanje brojeva u racunalu 41
5.1 Konvencija predznaka . . . . . . . . . . . . . . . . . . . 41
5.2 Konvencija dvostrukog komplementa . . . . . . . . . . 43
5.3 Aritmeticke operacije u konvenciji dvostrukog komple-
menta . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.4 Binarni i alfanumericki kodovi . . . . . . . . . . . . . . 48
5.4.1 Tezinski kodovi . . . . . . . . . . . . . . . . . . 49
5.4.2 ASCII kod . . . . . . . . . . . . . . . . . . . . . 50
5.4.3 Kodovi za otkrivanje pogresaka . . . . . . . . . 52
6 Planiranje i razvoj programske potpore 59
6.1 Osnove pisanja programa . . . . . . . . . . . . . . . . . 59
6.2 Rjesavanje problema . . . . . . . . . . . . . . . . . . . 60
6.3 Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.4 Pseudokod i dijagram toka . . . . . . . . . . . . . . . . 64
7 Pisanje programskog koda (kodiranje) 67
7.1 Programski jezici . . . . . . . . . . . . . . . . . . . . . 67
7.2 Varijable i konstante . . . . . . . . . . . . . . . . . . . 69
7.2.1 Vrste jednostavnih podataka . . . . . . . . . . . 70
7.3 Pridruzivanje vrijednosti . . . . . . . . . . . . . . . . . 71
7.4 Aritmeticki izrazi . . . . . . . . . . . . . . . . . . . . . 74
7.5 Komentiranje . . . . . . . . . . . . . . . . . . . . . . . 75
SADR

ZAJ 3
7.6 Jednostavni unos i izlaz (Input/Output; I/O) . . . . . 76
7.6.1 Unos i izlaz; C++ . . . . . . . . . . . . . . . . . 77
7.6.2 C I/O . . . . . . . . . . . . . . . . . . . . . . . 77
7.7 Pisanje cjelovitog programa . . . . . . . . . . . . . . . 79
8 Struktura i pisanje programa 83
8.1 Booleove algebra . . . . . . . . . . . . . . . . . . . . . 83
8.1.1 Booleove varijable i konstante . . . . . . . . . . 84
8.1.2 Booleovi izrazi . . . . . . . . . . . . . . . . . . . 84
8.2 Petlja za izbor . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.1 Izbor izmedu dvije mogucnosti . . . . . . . . . . 87
8.2.2 Izbor izmedu vise mogucnosti . . . . . . . . . . 90
8.3 Petlje za ponavljanje . . . . . . . . . . . . . . . . . . . 92
8.3.1 Fiksna petlja (for petlja) . . . . . . . . . . . . . 93
8.3.2 Pretest petlja (Do petlja ) . . . . . . . . . . . . 95
8.3.3 Posttest petlja (Do while petlja ) . . . . . . . . 97
9 Numericki algoritmi 101
9.1 Primjeri numerickih algoritama i nekih struktura poda-
taka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
9.2 Numericki algoritmi. Slozenost . . . . . . . . . . . . . 107
9.3 Slozenost algoritama . . . . . . . . . . . . . . . . . . . 110
9.3.1 Kako ocjenjujemo slozenost algoritma ? . . . . . 113
9.4 Polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
9.4.1 Dvodimenzionalna polja . . . . . . . . . . . . . 116
9.5 Racunske operacije s oating-point brojevima . . . . . 117
9.5.1 Aproksimacije realnih brojeva strojnim (oating-
point) brojevima . . . . . . . . . . . . . . . . . 118
9.6 Jednosturka tocnost, 32 bitni zapis . . . . . . . . . . . 119
9.6.1 Racunske operacije sa strojnim (oating-point)
brojevima . . . . . . . . . . . . . . . . . . . . . 120
4 Sadrzaj
9.6.2 Zakoni strojne aritmetike (oating-point arit-
metika) . . . . . . . . . . . . . . . . . . . . . . 122
10 Funkcije i potprogrami 127
10.1 Funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . 128
10.2 Potprogrami . . . . . . . . . . . . . . . . . . . . . . . . 131
10.3 Djelokrug djelovanja i vrijeme trajanja odredenih okruzenja
(varijabli) . . . . . . . . . . . . . . . . . . . . . . . . . 132
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 nazvana 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 ma-
tematicke izracune (npr. rjesavanje linearnih sustava jednadzbi Jaco-
bijevom 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 dijeljenja, 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
7
8 Povijesni razvoj ra cunalnih sustava
Slika 2.1: Vrlo stara verzija abacusa
kao i na rucnom elektronickom kalkulatoru, dok se mnozenje i dijelje-
nje 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 objavljuje prve logaritamske tablice u knjizi Rabdologia. Ot-
krice logaritama bitno je pojednostavnilo operacije mnozenja i dije-
ljenja, koje su u to vrijeme bile vrlo slozene matematicke operacije.
Godine 1622. W. Oughtred
(1574.-1660.) i E. Gunter (1581.-1626.) izraduju cirkularno logari-
tamsko racunalo. Od 1654. godine u uporabi su ravna logaritamska
Mehani cka ra cunalna 9
Slika 2.2: Moderinja verzija abacusa
racunala ili pomicna racunala, u nas popularno zvana siber. Popu-
larnost pomicnih racunala naglo je porasla nakon 1850. godine kada je
francuski topnicki casnik A. Mannheim (1831.-1906.) racunalu dodao
klizni prozorcic s oznakama. Ta inacica pomicnog racunala nazvana
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 pot-
punosti zamijenili 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 po-
novno otkriven. Mnogo je poznatiji bio Pascalov kalkulator, pa je
slava za izum prvoga mehanickog kalkulatora pripala velikom francu-
10 Povijesni razvoj ra cunalnih sustava
skom 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 automo-
bilima. Ni Pascalov niti Schickardov kalkulator nisu bili prakticno pri-
mjenjivi 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 kal-
kulatora, bio je G.W.Leibnitz (1646.-1716.). On je znatno pridonio
napretku dvanaestak 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 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 me-
hanicki kalkulator koji je mogao izvoditi cetiri osnovne racunske ope-
racije: zbrajanje, oduzimanje, mnozenje i djeljenje. Razlicite inacice
tog modela poznatog pod engleskim nazivom arithmometer, proizvo-
dile 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 pro-
izvodnju 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 kalkula-
tor, koji je pokretao elektromotor, proizvodi se od 1920. godine.
2.3. MODERNA RA

CUNALA 11
2.3 Moderna racunala
Tokom drugog svjetskog rata kolicina potrebnog racunanja je toliko
porasla da je npr. 1944. godine u SAD-u kolicina proizvedenih to-
pova 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 strojevima.
U isto vrijeme u Engleskoj se gradi elektronicki programabilni kal-
kulator pod imenom Colossus.
Slika 2.3: Stroj za desifriranje Colossus
Prvo racunalo pocelo je raditi 1943. godine, a napravljeno ih je
ukupno deset. Racunala su se cuvala u najvecoj tajnosti. Na teme-
lju toga iskustva Englezi grade prvo posve elektronicko racunalo (s
12 Povijesni razvoj ra cunalnih sustava
elektronickom memorijom) pod nazivom Manchester Mark I, koje je
sadrzavalo 2400 elektronskih cijevi. Komercijalno i prakticno primje-
njivo 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 sveucilista 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.
Electronic Numerator, Integrator, Analyzer and Computer), koje se
opcenito smatra prvim elektronickim racunalom (engl. computer).
Razvijeno je na relativno malom i neuglednom americkom sveucilistu
Moore School na prijedlog Johna W. Mauchlya. Glavni inzinjer pro-
jekta bio je Presper Eckert Jr., tako da se Mauchly i Eckert smatraju
ocevima modernih racunala. Svakako valja spomenuti J.V.Atanasoa,
koji je prvi osmislio ideju suvremene grade racunala (nacin na koji je
gradena vecina suvremenih racunala i mikroprocesora), i velikog ma-
tematicara 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 elek-
tronickih 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.
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 RA

CUNALA 13
Slika 2.4: ENIAC: Electronic Numerical, Integrator, Analyzer and
Calculator
2.4 Komercijalna primjena racunala
Mauchly i Eckert u meduvremenu osnivaju vlastitu tvrtku za proizvod-
nju elektronickih racunala, ali ubrzo zapadaju u nepremostive nan-
cijske teskoce i prisiljeni su prodati tvrtku. Kupila ih je tvrtka Remin-
gton Rand, a Mauchly i Eckert 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 za vojne potrebe, UNIVAC se prodavao poslovnim tvrt-
kama i proizvelo ih se ukupno 46. Prvi primjerak racunala UNIVAC
I isporucen je u ozujku 1951. godine Uredu za popis stanovnistva
14 Povijesni razvoj ra cunalnih sustava
Slika 2.5: ILLIAC II nacinjen na Sveucilistu u Illinois-u
SAD-a.
Uz veliku promidzbu, racunalo UNIVAC je 1952. godine upotri-
jebljeno za predvidanje rezultata predsjednickih izbora u SAD-u. Na
temelju samo 7% izbrojenih glasova racunalo je predvidjelo tocan re-
zultat izbora. To je uveliko pridonijelo popularizaciji racunala i pobu-
dilo 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 Corporation. Osjetivsi potrebu za malim i pris-
tupacnim racunalima, primjerenima jednostavnim problemima malih
i srednjih tvrtki, Olsen se odlucuje za proizvodnju malih racunala na-
mijenjenih industrijskom upravljanju. Buduci da je radio na projektu
2.5. POJAVA MIKROPROCESORA I OSOBNIH RA

CUNALA 15
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, komerci-
jalno 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 pri-
mjeraka. Racunala su iz laboratorija i posvecenih prostora najvecih
tvrtki usla u siroku uporabu. Prakticno neometana u podrucju malih
racunala sve do potkraj 70-ih godina, tvrtka DEC dozivljava nevjero-
jatan 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 os-
novni elementi racunala mogli smjestiti na samo jednu plocicu polu-
vodica velicine nekoliko desetaka kvadratnih milimetara, pa je tako
nastao mikroprocesor. Jednostavno receno, to je racunalo na jednoj
plocici poluvodica. Iste godine, tvrtka INTEL trzistu nudi prvi mi-
kroprocesor pod nazivom 4004.
Godine 1973. ista tvrtka proizvodi mikroprocesor 8080, prvi 8-bitni
mikroprocesor, 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
16 Povijesni razvoj ra cunalnih sustava
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 pre-
kretnica kojom zapocinje vladavina osobnih racunala. Otada im ne-
prestano raste snaga i snizuje se cijena.
Do sada racunala dijelimo na 5 generacija. Svaku generaciju ka-
rakterizira veliki tehnoloski napredak koji pomaze izgradnju manjih,
jeftinijih i znatno ekasnijih 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 se-
kundi).
Pojava mikroprocesora i osobnih ra cunala 17
Primjeri racunala prve generacije su UNIVAC i ENIAC. Istak-
nimo da je ENIAC (Electronic Numerator, Integrator, Analyzer
and Computer) zauzimao
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 tran-
zistora smjestenih na jednom poluvodicu koji je nazvan silikon-
ski cip. To je omogucilo znacajno povecanje brzine i ucinkovitosti
racunala.
Ovu generaciju takoder karakterizira novi nacin unosenja i ispi-
sivanja podataka. Umjesto do tada koristenih busenih kartica,
korisnici s racunalom komuniciraju preko tipkovnice i monitora.
Razvijaju se i
Operacijski Sustavi (OS), sto omogucuje primjenu razlicitih
18 Povijesni razvoj ra cunalnih sustava
aplikacijska 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.


Mikroprocesor se sastoji od velikog broja (preko tisucu) integri-
ranih krugova 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. Sva-
kim danom ta kucna racunala postaju sve mocnija, a mogucnoscu
njihovog povezivanja pojavila se i mogucnost razvoja Interneta.

Cetvrta generacija je omogucila razvoj grackih sucelja (Grap-


hical User Interface - GUI), koristenje misa, . . . . Dolazi do
razvoja programskih jezika C, C++, Pascal, ldots.
Danasnja racunala
Danasnja racunala pripadaju tzv. petoj generaciji, koju karak-
terizira umjetna 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. Inten-
zivno se radi na primjenama kvantne, molekularne i nano tehno-
logije. Glavni cilj nove generacije racunala je glasovno unosenje
podataka i mogucnost samoorganiziranja racunala.
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 opera-
cije. Termin programpodrazumjeva skup instrukcija slozenih odredenim
redoslijedom u skladu sa kojima racunalo izvodi gore navedene opera-
cije 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 kontek-
stu podatak (data) odnosi se na bilo kakav neorganizirani, sirovi
19
20 Osnove ra cunala
materijal, sastavljen od rijeci, brojeva, slika ili njihovih kombi-
nacija.
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 ko-
jom 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 pouzda-
nost u izvodenju obrade.

Cak i najjeftinija racunala mogu godi-
nama izvoditi nekoliko milijuna operacija u sekundi bez greske
uzrokovane funkcioniranjem hardverskih komponenti. (Vecina
pogresaka racunala uzrokovane su logikom u programiranju 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 informa-
cija.
Pohranjivanje (storage):
Pri pohranjivanju racunalo sprema rezultate kako bi se mogli
kasnije koristiti. Kolicina podataka koju moze spremiti i doba-
viti jeftinije racunalo mogla bi se usporediti sa enciklopedijom
tiskanom u 32 volumena.
3.2. STRUKTURA RA

CUNALA 21
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
3.2.1 Memorija velike brzine
Memorija, o kojoj je ovdje rijec, ugradena je u samo racunalo. To je
ona memorija koju procesor (CPU) koristi za neposredno dobavljanje
i pohranjivanje podataka, 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.
22 Osnove ra cunala
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 uzastopnih bit-ova, ili binarnih znamenki. Pohranjiva-
nje 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 ko-
jih svaki ima svoju adresu. I ne samo da svaka memorijska jedinica
ima svoju adresu, nego i unutar pojedinog bytea zna se tocan redos-
lijed 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. Dije-
lovi tog dugog reda mogu se iskoristiti za pohranjivanje uzorka bitova
Struktura ra cunala 23
koji je dulji od 1 bytea. Obicno ga spremamo u string koji je cjelo-
brojni visekratnik osnovne memorijske celije.
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
Osim toga, ovakav nacin organiziranja memorije omogucava nam
direktni pristup sadrzaju svake memorijske lokacije, bez obzira gdje
se ona nalazi (kaoticno 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). Ka-
pacitet 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 memo-
rije. 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 po-
hranilo sto vise podataka, sto nadalje omogucava brzi pristup vecoj
24 Osnove ra cunala
kolicini podataka pa je racunalo sa vecim RAM-om pogodnije (brze)
za koristenje.
Druga vrsta memorije je tzv. ROM memorija (Read Only Me-
mory) ispisna memorija, tj. memorija u koju se podatak moze upisati
samo jednom. Nakon upisa, podatak se moze citati onoliko puta ko-
liko 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. Jed-
nom 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 redos-
lijeda izvodenja operacija.
Centralna je jedinica za obradu (CPU) ili obicno procesor, sastav-
ljena od dva osnovna dijela: aritmeticko logicke jedinice (AL) u kojoj
su sklopovi za manipulaciju sa podacima i upravljacke jedinice koja
koordinira aktivnostima unutar racunala. Za privremeno cuvanje po-
dataka CPU koristi registre tzv. opce i posebne namjene. Registri opce
namjene sluze kao privremeni spremnici podataka 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 povezivanje racunala s okolinom. Pod okolinom se podrazu-
Struktura ra cunala 25
mijeva 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 vanj-
skih jedinica pomocu kojih je moguce iz okoline podatke predavati
racunalu. Podaci na taj nacin ulaze u racunalo, pa se takvi sklo-
povi nazivaju ulaznim sklopovima. Izlazni sklopovi omogucuju pri-
kljucivanje vanjskih jedinica pomocu kojih je moguce podatke 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 jedinica, 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 pi-
sanje. Slijedom ovih uputa, zadatak zbrajanja dvaju pohranjenih vri-
jednosti iz RAM-a ukljucuje puno vise od provodenja same operacije
zbrajanja. Proces ukljucuje koordiniranu akciju upravljacke jedinice
koja upravlja prijenosom informacija izmedu radne memorije i regis-
tra unutar CPU-a, i aritmeticko logicke jedinice koja izvodi operacije
zbrajanja u trenutku kada joj upravljacka jedinica da znak da ih iz-
vede. Cjelokupan 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.
26 Osnove ra cunala
Korak 2: Uzmi drugu vrijednost koja se zbraja i pohrani je u
drugi registar.
Korak 3: Aktiviraj sklopove za zbrajanje sa vrijednostima koje
su pohranjene u registrima tijekom prva dva koraka.
Korak 4: Rezultat operacije pohrani u memoriju.
Korak 5: Stani.
Ukratko, podaci se moraju prenijeti iz memorije u CPU, a rezultat
se na kraju ponovno pohranjuje u memoriju.
Poglavlje 4
Osnovne operacije na
racunalu
Operacije s podacima koje izvodi racunalo kontrolira kontrolna je-
dinica 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 zbra-
janja, mnozenja, dijeljenja, usporedbe, . . . , dok operand
i
, i = 1, 2, 3,
predstavlja dio informacije na kojoj ce biti obavljena operacja. Nada-
lje, 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
27
28 Osnovne operacije na ra cunalu
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 upotreb-
ljava, je sustav 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
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, . . . , n2, n1. Tada broj n zovemo baza sus-
tava, a koecijente iz skupa 0, 1, . . . , n2, n1 zovemo znamenke
u danom brojevnom sustavu.
Kako je dekadski brojevni sustav u svakodnevnoj ljudskoj upo-
trebi, 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 operacijom zbrajanja kom-
plementa umanjitelja. Potenciranje se moze provesti kao niz mnozenja,
a mnozenje kao niz zbrajanja. Dijeljenje se moze obaviti uzastopnim
oduzimanjem i slicno.
4.2. PREZENTACIJA PODATAKA U MEMORIJI 29
Medutim, buduci da racunala mogu prepoznati samo dvije zna-
menke, 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 zna-
menke.
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 ovu cinjenicu tako
sto ce pokazati kako se u razlicitim situacijama niz od 4 jednaka bytea
moze procitati na razlicite nacine.
Primjer 4.2.1 Dan je niz od 4 bytea.

Sto predstavlja taj niz ako ga
citamo kao
30 Osnovne operacije na ra cunalu
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
4.3. ZAPISIVANJE PRIRODNIH BROJEVA U RAZNIM BROJEVNIM SUSTAVIMA31
4.3 Zapisivanje prirodnih brojeva u raz-
nim brojevnim sustavima
U ovom poglavlju cemo proucavati veze izmedu zapisa brojeva u razlicitim
brojevnim sustavima. Kao sto se moze vidjeti u Tablici 4.2, svakom bi-
narnom nizu (broju u binarnom sustavu) odgovara jedan i samo jedan
broj u jednom od preostalih 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
heksadecimalnom sustavu
32 Osnovne operacije na ra cunalu

Cinjenica o ekvivalenciji ima za posljedicu da broj zapisan u jed-


nom sustavu mozemo pretvoriti u broj zapisan u nekom drugom sus-
tavu, pri cemu je takav zapis jedinstven.
4.3.1 Pretvaranje brojeva iz binarnog u heksade-
cimalni sustav i obratno
Ako je broj zapisan u heksadecimalon sustavu, njegov binarni ekviva-
lent 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 heksadeci-
malnom sustavu).
Primjer 4.3.1 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.2 Odredite heksadecimalni zapis binarnog broja
10101111101010
Zapisivanje prirodnih brojeva 33
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, do-
davanjem 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.
Primjer 4.3.3 Odredite binarni zapis dekadskog broja 25.
Rjesenje: Postupak se svodi na uzastopno dijeljenje broja 25 bro-
jem 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.
34 Osnovne operacije na ra cunalu
Broj Kvocijent nakon Ostatak
dijeljenja s 2 dijeljenja
25 12 1
12 6 0
6 3 0
3 1 1
1 0 1
Ovaj postupak je pregledniji ako ga zapisemo u tablicu:

Citajuci
posljednji 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 direktnim uvrstavanjem opisanim u poglavlju 4.1 i primjeru 4.2.1.
Na primjer, dekadsku vrijednost binarnog broja 1011001
(2
dobi-
vamo 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.3.4 Odredite zapis dekadskog broja 123 u oktalnom sus-
tavu 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
4.4. RA

CUNSKE OPERACIJE U BINARNOM, OKTALNOM I HEKSADECIMALNOM SUSTAVU35

Citajuci posljednji stupac od dolje prema gore, dobivamo da je


binarni zapis broja 123 dan sa 173
(8
Provjerimo rezultat:
173
(8
= 1 8
2
+ 7 8 + 3 8
0
= 123
(10
.
4.4 Racunske operacije u binarnom, ok-
talnom i heksadecimalnom 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 vidjeti, operacije zbrajanja i
oduzimanja u binarnom, oktalnom i heksadecimalnom sustavu izvode
se analogno kao i u dekadskom pri cemu vrijede i ista svojstva (komu-
tativnost, asocijativnost, . . . )
4.4.1 Zbrajanje i oduzimanje u binarnom sustavu
Kao sto smo vec napomenili, zbrajanje u binarnom sustavu ima jed-
naka 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
36 Osnovne operacije na ra cunalu
Primjer 4.4.1 Izracunajte zbroj dvaju binarnih brojeva 101110 i 110101.
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
Ra cunske operacije u binarnom, . . . 37
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.4.2 Izracunajte razliku binarnih brojeva 1001 i 11.
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
38 Osnovne operacije na ra cunalu
4.4.2 Zbrajanje i oduzimanje u heksadecimalnom
sustavu
Kao sto smo vidjeli u prethodnom poglavlju, kod racunanja u binar-
nom sustavu, zbog velikog broja nula i jedinica, lako se moze doci
do zabune. Zato je jednostavnije 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.4.3 Izracunajte zbroj brojeva u heksadecimalnoj bazi 1A23
i 7C28.
Ra cunske operacije u binarnom, . . . 39
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.4.4 Izracunajte razliku brojeva danih u heksadecimalnoj
bazi 1F00A i B2.
40 Osnovne operacije na ra cunalu
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
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: ko-
nvenciju predznaka i konvenciju dvostrukog komplementa.
5.1 Konvencija predznaka
Pretpostavimo da za spremanje cijelih brojeva koristimo n mjesta (od-
nosno 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
41
42 Pohranjivanje brojeva u ra cunalu
mogu zapisati brojevi od (2
n1
1) do +(2
n1
1).
Slika 5.1: Prikaz broja pomocu bytea
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.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.1.2 Odredite decimalnu vrijednost zbroja brojeva 10100011
i 00010110 ako su dani konvencijom predznaka i ako je osnavna je-
dinica 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 43
5.2 Konvencija dvostrukog komplementa
Zbog svoje jednostavnosti, ova je konvencija najpopularnija medu
proizvodacima racunala diljem svijeta.
U konvenciji dvostrukog komplementa pozitivne brojeve za-
pisujemo na jednak nacin kao i kod konvencije predznaka, a za
negativne brojeve koristimo sljedecu proceduru (u 3 koraka):
1. Korak: Izrazimo apsolutnu vrijednost promatranog broja bi-
narno
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.2.1 Kako glasi reprezentacija broja 31 u konvenciji dvos-
trukog komplementa?
Rjesenje:
1. Korak: Apsolutna vrijednost broja je 31, tj. 31
(10
= 00011111
(2
.
2. Korak: Promjenimo 0 1 i 1 0, dobivamo 11100000
(2
.
3. Korak: Broju iz koraka 2. dodajemo 1, tj.
11100000 +
1

11100001
44 Pohranjivanje brojeva u ra cunalu
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 zapisati brojeve od (2
n1
) do +(2
n1
1). Primjetite da
se u ovoj konvenciji mogu zapisati manji negativni brojevi nego u ko-
nvenciji predznaka (veci po apsolutnoj vrijednosti).
Primjer 5.2.2 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 dvos-
trukog komplementa
Zakon zbrajanja: Brojeve zbrajamo tako da ih tretiramo kao bro-
jeve bez predznaka, tj. najznacajniji bit (lijevi bit), odnosno, bit s
Aritmeti cke operacije u konvenciji . . . 45
predznakom smatramo da je dio broja. Ako nakon zbrajanja ostane
dio koji bi trebali prenijeti (1), nakon lijevog bita, to zanemarujemo.
Zakon oduzimanja: Brojeve oduzimamo takoder smatrajuci ih
brojevima bez predznaka, tj. najznacajniji bit (lijevi bit), odnosno,
bit s predznakom smatramo da je dio broja. Ako nam za oduzimanje
treba 1 iza lijevog bita, to posudimo i nakon operacije oduzimanja
tu jedinicu zanemarujemo.
Primjer 5.3.1 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
46 Pohranjivanje brojeva u ra cunalu
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 vrijednost zbroja brojeva 11000111
(2
= 57
(10
i 11011101
(2
=
35
(10
.
Primjer 5.3.2 Odredite rezultat oduzimanja broja 11011101 od broja
00111001, ako su brojevi dani u konvenciji dvostrukog komplementa.
Aritmeti cke operacije u konvenciji . . . 47
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.
48 Pohranjivanje brojeva u ra cunalu
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 upo-
trebljavaju 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.
U svrhu rjesavanja tog problema razvijeno je nekoliko vrsta do-
govora 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 abe-
ceda, koja zajedno s pripadnim binarnim (ili nekim drugim) kom-
binacijama tvori kod. Pojedini 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).
Binarni i alfanumeri cki kodovi 49
5.4.1 Tezinski kodovi
Broj kodnih elemenata u apstraktnoj abecedi naziva se obim koda.
Medu popularnije 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 ko-
dovima BCD (8-4-2-1), 8-2-4-1 i 2-4-1-2 kodu.
Primjer 5.4.1 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 jedins-
tven:
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 koristimo? 2. Moze li se istovremeno koristiti vise razlicithih
kodova?
50 Pohranjivanje brojeva u ra cunalu
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 9N dobije komplementiranjem (zamjenom 0
u 1 i obratno) zapisa broja N. Sljedeca tablica prikazuje kako izgleda
zapis broja N i 9 N u samokomplementirajucem kodu.
Primjer 5.4.2 U sljedecoj tablici prikazani su zapisi dekadskih zna-
menaka u kodu 2-4-2-1 koji je samokomplementirajuci. Primjetite da
se komplemetni brojeva N (9N) dobivaju jednostavnim komplemen-
tiranjem pripadnog niza binarnih znamenaka.
5.4.2 ASCII kod
Racunala danas intenzivno koriste, osim numerickih podataka, i al-
fanumericke podatke (slova, specijalne znakove, . . . .) Da bi racunala
Binarni i alfanumeri cki kodovi 51
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
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).
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
52 Pohranjivanje brojeva u ra cunalu
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.4.3 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 ovom cemo 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.
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.
Binarni i alfanumeri cki kodovi 53
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 %
54 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 55
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
56 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 57
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 informacije 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.
58 Pohranjivanje brojeva u ra cunalu
Primjer 5.4.4 Petpostavimo da dva racunala medusobno komunici-
raju po konvenciji parnog pariteta u smjeru strelice

0101011001 0110100101 0110111101 0110110001 0110010101


0110010001 0111001111 0010000011 0110000111 0111001001
0110010101 0010000011 0110001011 0110110001 0111010111
0110010101 0010111001
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
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 she-
mom:
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 do-
bivenih od programera. U sljedecem primjeru prikazati niz instrukcija,
59
60 Planiranje i razvoj programske potpore
koji ilustriraju svaki od tri osnovna dijela rada racunala, na jednos-
tavnom problemu.
Primjer 6.1.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 mate-
matiku 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 numericku matematiku.
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 osnov-
nih 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.
Rjesavanje problema 61
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 dokumentiranje.
Ako su prva dva koraka pazljivo napravljena, onda je ovaj korak
relativno jednostavan.

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


diranje (pisanje programa) jednostavnije. Najcesce, programer
moze pisati program 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.
Kada smo provjerili da svi dijelovi programa rade (Korak 4. ),
potrebno je program testirati na nizu razlicitih skupova poda-
taka. Takoder, treba provjeriti kako se ponasa na nepredvidenim
skupovima podataka.
62 Planiranje i razvoj programske potpore
Ako npr. zelimo napisati program koji racuna geometrijsku vri-
jednost 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 algo-
ritma.
U svakodnevnom zivotu pri obavljanju bilo kakvih zadataka, nes-
vjesno koristimo odredene algoritme. Pod pojmom algoritam podrazu-
mjevamo uredeni skup jednoznacnih (nedvosmislenih) izvedivih koraka
koji opisuju odredenu aktivnost (npr. provodenje niza racunskih
operacija koje izvodi racunalo ili pravljenje sendvica za uzinu).
Sljedeci primjer ilustrira kako bi mogao izgledati algoritam koji
opisuje nacin pravljenja sedvica sa sunkom i sirom.
Primjer 6.3.1 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
Algoritmi 63
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
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 pred-
stavlja 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 sekvenci-
jalno, 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 jednoznacno i potpuno denira akciju koja sli-
jedi. Drugim rijecima, izvodenje (napredovanje) algoritma ne smije se
temeljiti na kreativnosti (procesora, osobe koja ga slijedi), nego mora
biti rezultat slijeda uputa.
64 Planiranje i razvoj programske potpore
6.4 Pseudokod i dijagram toka
Zamijenimo li formalnu, strogu strukturu programskog jezika, manje
formalnim sustavom oznacavanja, dobili smo sustav za predstavlja-
nje 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 izostav-
ljanje pravila iz naredbi koja prate svaki formalni programski jezik.
Ovaj se nacin obicno koristi kada znamo koji cemo programski je-
zik 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 predstavljanje algo-
ritma neovisan o programskom jeziku, tada formaliziramo oznake za
ponavljajuce semanticke strukture i deniramo pseudo kod kao intu-
itivni nacin predstavljanja algoritma kod kojeg ipak postoje odredena
pravila zapisa. Primjer 6.3.1 je napisan u pseudokodu, pri cemu svaki
korak ima specicni (odredeni) glagol (uzmi, stavi, namazi, . . . )
Primjer 6.4.1 Napisite algoritam za racunanje povrsine pravokut-
nika stranica a i b.
Algoritam:
1. ucitajte velicine stranica a i b.
2. ako je jedan od brojave negativan, javi pogresku da uneseni bro-
jevi nisu duljine stranica.
3. pomnozi brojeve a i b
4. ispisite: trazena povrsina iznosi ab
Pseudokod i dijagram toka 65
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.2 Nacinite dijagram toka algoritma za pravljenje sen-
dvica sa sunkom i sirom (vidi 6.4.1).
66 Planiranje i razvoj programske potpore
Slika 6.2: Dijagram toka algoritma za pravljenje sendvica
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 (pseudo-
kod), prelazimo na pisanje programa. Programe cemo pisati u pro-
gramskim jezicima C i C++, pri cemu cemo uvijek istaknuti razliku
u obliku programa, ako ona postoji.
Osvrnimo se prvo na povijesni razvoj programskih jezika. Najsta-
rija racunala zahtijevala su da programer prevede sve algoritme na
strojni jezik. Taj je pristup dao jos vecu vaznost izucavanju algori-
tama, jer je ucinkovitiji algoritam smanjivao 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,
67
68 Pisanje programskog koda
strojni jezik smatran je prvom generacijom jezika, a asembler 2. ge-
neracijom. 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 na-
pisan 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 problem opisa
gradnje kuce ako bismo morali razmisljati o polozaju svake cigle, da-
ske 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 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 lozo-
je, poceli su se razvijati novi programski jezici prilagodeniji razvoju
softwarea od asemblerskih jezika. Tako su nastali jezici trece gene-
racije 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 pre-
vesti na jezik racunala. Postoje dvije osnovne vrste prevoditelja pro-
grama (transleter-a) koji prevode nizove naredbi u strojevni 0, 1
jezik:
7.2. VARIJABLE I KONSTANTE 69
Compiler-i i Interpreteri
Compiler to je prevoditelj koji prevodi neki od visih program-
skih 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 Interpre-
teri, 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 tije-
kom izvodenja programa.
Racunalo treba unaprijed znati koju memorijsku lokaciju ce po-
vezati s kojom varijablom, odnosno konstantom, pa se i varijable i
konstante moraju deklarirati unaprijed.
70 Pisanje programskog koda
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 primjer, rijec od 2 bytea
[00000000 01000001]
moze predstavljati broj 65 ako ju citamo kao cijeli broj ili moze pred-
stavljati 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 unarijed reci cemu je ona namjenjena, varijabli ili konstanti.
Tada racunalo rezervira 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++
7.3. PRIDRU

ZIVANJE VRIJEDNOSTI 71
dozvoljavaju programeru da se koristi odredenom memorijskom loka-
cijom, no, taj nacin programiranja prelazi predvideni materijal ove
knjige.
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++
Izbor imena varijable ovisi o programeru.

Cesto se koristi ne-
pisano 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.
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
72 Pisanje programskog koda
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 programski jezik:
i ) Samo jedno ime varijable moze biti s lijeve strane znaka jed-
nakosti 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.
Primjer 7.3.1 Odredite sadrzaj svake od varijabli: initial (charac-
ter), lenght (integer, cjelobrojna varijabla) areaOfSquare (oating po-
int, realna varijabla), nakon svakog od sljedeceg niza pridruzivanja:
a) prije nego se bilo sto pridruzi;
b) lenght=5;
Pridruzivanje vrijednosti 73
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. Pri-
mjetite da u redu d) cjelobrojna vrijednost 5 moze biti spremljena u
realnu (oating point) varijablu, pri cemu je vrijednost varijable are-
aOfSquare realni broj 5.0. Nadalje, u redu e) se umjesto slova P
74 Pisanje programskog koda
realnoj varijabli areaOfSquare pridruzuje ASCII vrijednost slova P.
U redu g) je realan broj pridruzen cjelobrojnoj varijabli pa je rezultat
toga zaokruzivanje na 37. U posljednjem redu h) rezultat spremanja
cjelog broja u slovnu varijablu (character) dalo je za rezultat odgova-
rajuci ASCII znak (character) koji pripada broju (kodu) 37.
7.4 Aritmeticki izrazi
U dosadasnjim razmatranjima proucavali smo nacine na koje se po-
jedinacne vrijednosti (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 stan-
dardnom aritmetickom 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++
7.5. KOMENTIRANJE 75
Primjetite da u C/C++ nema operatora potenciranja, za to se
koristi posebno denirana funkcija koja se moze koristiti samo uz do-
datnu 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)
dekadski logaritam broja a: log10(a)
Napomena: Programski jezici (C i C++) tretiraju djeljenje s
cijelim brojevima 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.5 Komentiranje
Svaki programski jezik, pa tako i C/C++, omogucuje programeru da
u samom programu zapisuje objasnjenja pojedinih dijelova programa
76 Pisanje programskog koda
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 ispravljati nas kod ili da nakon duljeg vremena
sami moramo ispravljati vlastiti kod (sto je cesta pojava), komen-
tari 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 program 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 dato-
teke u kojoj se nalazi osnovni kod i nacin (sintaksa) na koji se program
izvrsava, kratki opis sto program radi, popis varijabli, konstanti i funk-
cija koje koristi i slicno.
7.6 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 rezultata na ekran.
Jednostavni unos i izlaz 77
7.6.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

ili end1 konstantni ubacuje karakter za novi red


manipulator tjera kursor da prijede u novi red
7.6.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 ko-
ristimo za ucitavanje podataka sa standardnih uredaja, kao na primjer
tipkovnice.
78 Pisanje programskog koda
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
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.6.1 Ispisite na zaslonu poruku: Pozdrav Svijetu u C i
C++.
Program 1:
#include<stdio.h>
void main()
{
printf("Pozdrav Svijetu");
}
7.7. PISANJE CJELOVITOG PROGRAMA 79
Program 2:
#include <iostream.h>
int main (void)
{
cout << "Pozdrav Svijetu\n";
}
Postoji li razlika u ispisu Programa 1 i 2 ?
7.7 Pisanje cjelovitog programa
Svi pojmovi koje smo do sada navodili sluze pisanju cjelovitih pro-
grama (ulaz, obrada, izlaz ) koje ce racunalo razumjeti. Svaki pro-
gram 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 osnov-
nim dijelovima:
1. Deklaracija varijabli
2. Ulaz
3. Obrada podataka
4. Izlaz
Primjer 7.7.1 Napisite C++ program koji za ucitani cijeli broj ispi-
suje njegov kvadrat.
80 Pisanje programskog koda
// 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.7.1.
Primjer 7.7.2 Napisite C program koji ucitava cijele brojeve i ispi-
suje 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)
Pisanje cjelovitog programa 81
square = num*num;
//3. Ispis rezultata (4. Izlaz)
printf("\n %d na kvadrat iznosi %d\n", num, square);
} // kraj programa
82 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 instruk-
cije 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, britan-
skom matematicaru iz 19. stoljeca. Booleova algebra je, osim kao
dio apstraktne algebre, izuzetno utjecajna kao matematicki temelj
racunarskih znanosti.
83
84 Pisanje programskog koda
8.1.1 Booleove varijable i konstante
Booleov izraz moze imati Booleove varijable (istina ili laz ) ili kons-
tante. Vazno je takvim varijablama davati opisna imena kako bi se
prilikom provjeravanja rada programa lakse snalazili.
Sljedeci jednostavni primjer prikazuje kako mozemo koristiti Bo-
oleove varijable:
const ISTINA=1; // deklaracija konstante Istina
const LAZ=0; // deklaracija konstante Laz
int PodaciOK, PosaoObavljen
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
operatorima. Popis relacijskih operatora prikazan je u tablici 8.1.
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.
Booleove algebra 85
Relacijski operator C/C++ hrvatski ekvivalent
< manje
<= manje ili jednako
> vece
>= vece ili jednako
== jednako
!= nije jednako
Tablica 8.1: Relacijski operatori
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
86 Pisanje programskog koda
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 )
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 iz-
raze spajanjem 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 iz-
raza su:
odrediti istinitost svakog posebnog izraza u relaciji
odrediti istinitost izraza u zagradama
odrediti istinitost cijelog slozenog izraza u odgovarajucem redos-
lijedu
Primjer 8.1.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)
8.2. PETLJA ZA IZBOR 87
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 ponavlja-
njem pojedinih dijelova.
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 go-
vori 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.
88 Pisanje programskog koda
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.
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.1 Napisite if i if, . . . else petlje pomocu kojih ce te
odluciti, u ovisnosti o vremenu (suncano S, kisno K), hocete li po-
nijeti 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 89
#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
90 Pisanje programskog koda
8.2.2 Izbor izmedu vise mogucnosti
Ponekad programer mora odluciti izmedu vise mogucnosti. Na pri-
mjer: 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..
Sintaksa za visestruku if naredbu u C i C++:
Petlja za izbor 91
if (Booleov izraz)
. . .
Naredba(e)

else
if (Booleov izraz)
. . .
Naredba(e)

else
if (Booleov izraz)
. . .
Naredba(e)

else
. . .
Naredba(e)

Primjer 8.2.2 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 ujedno provjerava ispravnost upisa
(je ste li upisali mozda neki karakter razlicit od S i K).
#include<iostream.h>
void main()
{
// deklariramo varijable
92 Pisanje programskog koda
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.
Petlje za ponavljanje 93
Svako ponavljanje kontrolirano je takozvanom kontrolnom varija-
blom koja ima pocetnu i konacnu vrijednost. Kontrolna varijabla
pocinje s odredenom vrijednoscu i u svakom 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
94 Pisanje programskog koda
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 kon-
trolne varijable obavlja se prije ulaska u petlju. Nakon izvrsenja svih
naredbi unutar petlje, kontrolna varijabla se automatski povecava.
Primjer 8.3.1 Nacinite C++ program koji ce u svakom koraku is-
pisivati vrijednost kontrolne varijable. Ukupan broj koraka neka bude
10.
// vjezba za konstrukciju jednostavne for petlje
#include<iostream.h>
void main() {
int a, lcv; // deklariramo varijable
Petlje za ponavljanje 95
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 va-
rijablu, a zatim se izvodi glavni dio petlje (sve naredbe koje se trebaju
izvrsiti u promatranoj 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 kontrolni izraz
Svojstva karakteristicna samo za pretest petlje su:
Prije pocetka petlje, mora se zadati pocetna vrijednost u Boole-
ovom izrazu
U slucaju da je Booleov izraz pogresan, petlja ce biti preskocena.
96 Pisanje programskog koda
Sintaksa za standardnu While petlju u C, C++:
Postavljamo kontrolnu varijablu
na inicijalnu vrijednost
while (Booleov izraz )
naredbe
promjena kontrolne varijable

Dok( )je
Boole-ovizraz
istinit
while
Izvrenje
naredbe 2
Izvrenje
naredbe 1
NE
DA
Primjer 8.3.2 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
Petlje za ponavljanje 97
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
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 kontrolni izraz
Svojstva karakteristicna samo za posttest petlje su:
98 Pisanje programskog koda
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
Primjer 8.3.3 Napisite jednostavni C++ program koji ce zbrajati sve
pozitivne brojeve koje unosi korisnik do trenutka kada on odluci pres-
tati (odnosno upise 1).
Petlje za ponavljanje 99
#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
100 Pisanje programskog koda
Poglavlje 9
Numericki algoritmi
Cilj ovog poglavlja jest upoznati studente s dijelom racunarske zna-
nosti koji prirodno pripada matematickim strucnjacima i znanstveni-
cima. 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 formula-
cija za probleme iz primjene.
Zahtjevi danasnje tehnologije su visoki, koriste se sosticirane me-
tode (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 pro-
blema iz primjene u odnosu na druge struke.
9.1 Primjeri numerickih algoritama i ne-
kih struktura podataka
Za pocetak promotrimo niz jednostavnih primjera koji ilustriraju neke
numericke algoritme te vrste podataka koji se u njima pojavljuju.
101
102 Numeri cki algoritmi
Primjer 9.1.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.
Dakle, rjesenje cini cjelinu. Oznacimo ju sa x, pri cemu su kom-
ponente 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
Primjeri numeri ckih algoritama 103
Vidimo da se gornji brojevi prirodno mogu organizirati u tablicu (od-
nosno matricu)
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 in-
deks 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
_
_
dvodimenzionalno polje, dvodimenzionalni niz, za razliku od vek-
tora
A
_
_
0
7
3
_
_
x =
_
_
x
1
x
2
x
3
_
_
koji su jednodimenzionalni nizovi, tj. jednodimenzionalna polja.
104 Numeri cki algoritmi
Dakle, neki su podaci organizirani jednodimenzionalno, a neki dvo-
dimenzionalno.
Sljedeci primjer ilustrira vaznost deniranja uredenja ulaznih po-
dataka.
Primjer 9.1.2 U rjesavanju mnogih slozenih problema vrlo je korisno
ako su podaci 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 pripadni 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.1.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
= maxx
1
, . . . , x
n
.
To znaci da treba pronaci indeks najveceg broja iz danog niza.
Primjeri numeri ckih algoritama 105
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

9max
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 memorijskih lokacija u kojima su upisane
vrijednosti brojeva x
1
, . . . x
n
. Treba naglasiti 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?
106 Numeri cki algoritmi
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.
9.2. NUMERI

CKI ALGORITMI. SLO

ZENOST 107
9.2 Numericki algoritmi. Slozenost
Prisjetimo se: pod algoritmom podrazumijevamo tocan, precizan pro-
pis 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 operacija 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 implementiramo odgovarajuce algoritme i ocekujemo da ce za kon-
kretne podatke nas algoritam dati brzo i tocno rjesenje. Sve se cini
jednostavno, no nije.
Primjer 9.2.1 Rjesenje kvadratne jednadzbe
ax
2
+ bx + c = 0 , a ,= 0 (9.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).
Za a = 0 jednadzba (9.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.
108 Numeri cki algoritmi
Vidimo da u slucaju a ,= 0 jednadzba (9.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!!!
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) dobivamo
puno jednostavnije.
Promotrimo na slican nacin problem rjesavanja sustava od dvije
linearne jednadzbe s dvije nepoznanice:
Primjer 9.2.2
3x + 2y = 7
6x y = 4
Numeri cki algoritmi. Slozenost 109
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
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 nepoz-
110 Numeri cki algoritmi
nanice 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 oduzima-
nja, dva dijeljenja).
Dakle razmisljajuci na gore navedeni nacin (odnosno konstruirajuci
odgovarajuce algoritme) mi mozemo opisati odredene klase problema,
pri cemu za svaki pojedini problem iz klase (problem s konkretnim
podacima) znamo elementarni postupak koji daje rijesenje.
9.3 Slozenost algoritama
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.3.1 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.
Slozenost algoritama 111
Gornja igra odgovara sljedecem binarnom stablu
112 Numeri cki algoritmi
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 (pri-
mjetimo da je usporedivanje takoder jedna od operacija na racunalu),
odnosno
2
100
= 2
10
10
= (1024)
10
> (1000)
10
= 10
30
operacija
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.
Slozenost algoritama 113
Dakle, upravo smo pokazali da se moze dogoditi da je neki algori-
tam neizvodiv, iako smo pokazali da daje rjesenje.
9.3.1 Kako ocjenjujemo slozenost algoritma ?
Radi ilustracije odredimo broj racunskih operacija algoritma za sorti-
ranje 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 (ni)+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
)
114 Numeri cki algoritmi
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.
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.3.2 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.3.3 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
+ .
9.4. POLJA 115
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.4 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 (vektori), dvostruka (matrice), ali mogu biti i
visestruka.
Deklariranje jednodimenzionalnih polja u C i C++:
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 gor-
njem primjeru 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 ostvaruje
preko petlji.
Primjer 9.4.1 Kako ce izgledati C++ program koji ce u 6-dimenzionalno
polje upisivati brojeve dvostuko vece od indeksa pojedinog elementa po-
lja.
#include<iostream.h> void main() {
const int MAX=6;
116 Numeri cki algoritmi
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.4.1 Dvodimenzionalna polja
Kao sto smo ranije naveli, polja mogu biti i dvodimenzionalna, od-
nosno adresa polja sadrzi dvije komponente (kao u tablici broj retka
odnosno broj stupca).
Primjer 9.4.2 Kako ce izgledati C++ program kojim cemo, pomocu
dvodimenzionalnog polja, konstruirati Hilbertovu matricu n-tog reda
koja je denirana:
H
ij
=
1
i + j
i, j = 1, . . . n.
9.5. RA

CUNSKE OPERACIJE S FLOATING-POINT BROJEVIMA117


#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.5 Racunske operacije s oating-point bro-
jevima
Prisjetimo se da smo na pocetku rekli da racunala posjeduju konacan
skup brojeva reprezentiranih 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 za cijele brojeve, odnosno izvode
se bez pogreske.
Sa dijeljenjem je problem. Pri djeljenju dobivamo cijeli broj koji
je dobiven zaokruzivanjem na manji cijeli broj (1/2 = 0).

Sto je sa realnim brojevima ?


118 Numeri cki algoritmi
9.5.1 Aproksimacije realnih brojeva strojnim (oating-
point) brojevima
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 brojem a, onda se apso-
lutna vijednost razlike a = aa ili [aa[ naziva apsolutna pogreska
aproksimacije. U slucaju kada je a ,= 0, denirana je i tzv. relativna
pogreska aproksimacije sa:
a =
[a[
a
=
[a a[
a
.
Pisemo
a = a +a = a
_
1 +
[a[
a
_
Iz gornje jednakosti vidimo da ce nas zanimati koliko najvise mogu
bitivelicine
a i
[a[
a
Kako racunaju racunala?
Racunala racunaju sa strojnim (oating-point) brojevima koji su
pohranjeni u njemu i pomocu kojih aproksimiramo skup realnih bro-
jeva R. Oznacimo taj skup sa T. Denicija skupa T ovisi o izboru
baze b i broja znamenki t koje cemo koristiti za prikaz brojeva iz T.
Neka je b baza i neka je t odabrani broj 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
.
9.6. JEDNOSTURKA TO

CNOST, 32 BITNI ZAPIS 119


Gornji prikaz je jedinstven ako je mantisa normalizirana tj. ako je
z
0
,= 0.
Dakle, skup strojnih brojeva T je odreden parametrima (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 T i pripadnih racunskih
operacija +, , , /. Tako da je isti racun na razlicitim strojevima mo-
gao dati ralicite rezultate. Godine 1985. IEEE (Institute of Electrical
and Electronics Engineers) i ANSI (American National Standard Ins-
titute) 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 arit-
meticke operacije.
Standard propisuje vise razina tocnosti, osnovnu (jednostruku -
singl precision) i dvostruku tocnost (double precision).
9.6 Jednosturka tocnost, 32 bitni zapis
Strojni broj (oating-point broj) je spremljen u 32 bitnu rijec:
1 2
....
31 0
0
1
+
0-tibitsadri
predznakbroja
....
120 Numeri cki algoritmi
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
raspoznaje.
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.6.1 Racunske operacije sa strojnim (oating-point)
brojevima
Prisjetimo se da strojni brojevi najcesce predstavljaju aproksimaciju
nekog realnog broja. Sljedeci rezultat govori o relativnoj pogresci
aproksimacije relanog broja strojnim brojem.
Jednosturka to cnost 121
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.
Strojnu preciznost mozemo iskoristiti za deniciju: broja znacajnih
(signikantnih) znamenki. (vidi [3]).
Broj znacajnih znamenki broja x koji je aproksimiran brojem x se
denira kao najveci pozitivni broj n za koji vrijedi
[ x x[
x

1
2
10
n+1
.
Ako je broj dan u tako zvanom denormaliziranom obliku, tj.
ako je
z = ()0.z
1
z
2
. . . z
23
2
e
onda je strojna preciznost 10
16
za dvostruku i 10
8
jednos-
truku preciznost.
Provjerimo istinitost posljednje tvrdnje. Neka je broj z = 0.z
1
z
2
. . . z
23

2
e
priblizna vrijednost broja z = 0.z
1
z
2
. . . z
23
z
24
. . . 2
e
u 32-bitnom
zapisu (jednostruka preciznost, denormalizirani oblik). Vidimo da je
apsolutna pogreska aproksimacije broja z brojem z jednaka
[ z z[ 2
24
2
e
Zapisemo li z = z
1
.z
2
. . . z
23
z
24
. . . 2
e1
, vidimo da se relativna po-
greska moze ocijeniti sa
[ z z[
[z[

2
24
2
e
z
1
.z
2
. . . z
23
z
24
. . . 2
e1
2
23
1.2 10
7
Primjetite da je broj u nazivniku normaliziran, tj. da mu je mantisa
veca od 1. Stoga vidimo da ce u vecini slucajeva strojna preciznost za
jednostruku tocnost biti broj 1.2 10
7
.
Primjetimo, da je broj znacajnih znamenki n = 8 u jednostrukoj,
odnosno n = 16 u dvostrukoj preciznosti.
122 Numeri cki algoritmi
9.6.2 Zakoni strojne aritmetike (oating-point arit-
metika)
Treba imati na umu da kao sto su u racunalu pohranjene priblizne vri-
jednosti realnih brojeva, tako se i racunske operacije izvode s odredenom
tocnoscu ili s greskom.
Oznaka , , , ce oznacavati stojne operacije zbrajanja, mnozenja
, oduzimanja 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 .
Oznacimo li tu pogresku sa
x+y
= e, mozemo pisati
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 pogreske pri izvodenju racunskih operacija
uvijek zadovoljavaju sljedecu nejednakost
[
x+y
[ e = ,
pri cemu je 10
8
u jednostrukoj odnosno 10
16
u dvostrukioj
tocnosti.
Odredimo najvecu mogucu pogresku zbrajanja dvaju strojnih bro-
jeva x, y T.
Jednosturka to cnost 123
1. za relativnu gresku
x+y
zbrajanja brojeva x, y T 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
)) ,
odnosno za relativnu gresku
x+y
zbrajanja brojeva x, y T vrijedi
[(x + y) (x y)[
[x + y[

1
+
2

x+y
To znaci da je relativna greska
x+y
zbrajanja brojeva x, y T 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 T funkcija ABS(x) = x se izracunava
egzaktno jer je to jednostavna operacija promjene bita predznaka.
124 Numeri cki algoritmi
Vazno je biti svjestan da za strojne operacije opcenito ne vrijede
neki od standardnih 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.6.1 Promotrimo racunanje funkcije f(x) = e
x
x 1 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?


Ocito je pogreska nastala pri oduzimanju, odnosno za pretpostaviti
je da smo oduzimajuci dva bliska broja 0.00101 i 0.001 nacinili gresku.
Mozemo li izbjeci oduzimanje? Ili mozemo li izbeci pogresku?
Na srecu, oduzimanja se cesto 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!
+ .
Jednosturka to cnost 125
Ako pretpostavimo li da radimo na stroju s pet znacajnih znamenki,
mozemo pisati:
f(0.01) =
0.0001
2
+
0.000001
6
+
10
8
4!
= 0.00005 + 0.00000167 + 0.00000 = 0.000050167 .
Primjetite da ostali pribrojnici poslije x
4
/(4!) ne doprinose tocnosti
rjesenja.
Pojava opisana u primjeru 9.6.1 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 gublje-
nja tocnosti, tj. mozemo dobiti rezultat koji nema tocnu niti jednu
znacajnu znamenku. Stoga jedini nacin da poboljsamo tocnost racunanja
jest da izbjegavamo oduzimanja.
Primjer 9.6.2 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.
126 Numeri cki algoritmi
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
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 pot-
programa, buduci da omogucuju programeru da podijeli program na
manje logicke jedinice i module.
Potprogramje samostalna programska struktura koja je ukljucena
u glavni program. Koriti se za rjesavanje posebnog problema (npr.
mnozenje matrice i vektora ili vektora s vektorom, . . . ) ; namjena
potprograma se posebno odreduje.
Funkcija je takoder (kao i potprogram) samostalna programska
struktura konstruirana da rijesi ksni problem. Za razliku od potpro-
grama, funkcija vraca jednu vrijednost odredenog tipa.
Prije nego prijedemo na upoznavanje pojedinosti o konstrukciji
funkcija i potprograma, obrazlozimo pojam modularnog progra-
miranja (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 pro-
bleme (potprobleme) za koje cemo lakse naci rjesenje. Naravno, to
dijeljenje moze ici skroz do podjele (razbijanja) problema na elem-
127
128 Funkcije i potprogrami
ntarne 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 elementarne) funkcije i potprograme, onda ih mozemo
koristiti u bilo kojem programu pa s vremenom mozemo pojedine pot-
programe usavrsavati i zamjenjivati stare potprograme u nekom pro-
gramu s novim, brzim i jednostavnijim potprogramima koji ce nam
omoguciti i bolje izvrsavanje naseg programa.
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 potprograma 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 (Ameri-
can National Standards Institue) svaka funkcija posjeduje dva glavna
dijela:
zaglavlje programa header (function header)
glavni dio programa body (function body)
(1) zaglavlje programa function header istice:
(i) ime funkcije
Funkcije 129
(ii) tip podataka koji se koriste
(iii) broj ulaznih argumenata.
(2) glavni dio programa function body istice:
(i) deklaracija lokalnih varijablii
(ii) instrukcije, odnosno niz naredbi koje treba provesti da se pos-
tigne zeljeni rezultat.
Primjer 10.1.1 Razlicitim brojevima smo oznacili zaglavlje i glavni
dio ove jednostavne funkcije koja od tri broja odreduje najveci
int max_od_tri_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);
}
Funkcija iz gornjeg primjera za ulaz ima tri podatka i sva tri su
cijeli brojevi int. U glavnom je 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:
130 Funkcije i potprogrami
Primjer 10.1.2 Objasnite koji dio programa poziva funkciju, sto radi
funkcija, te sto radi cijeli program:
#include<iostream.h>
int max_od_tri_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_tri_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_tri_broja(int a, int b,int c)
{ int maximum;
maximum=a;
if (b > maximum)
maximum=b;
// else
if (c > maximum)
maximum=c;
return(maximum);}
Napomenimo da parametre koje koristi funkcija val1, val2, val3
nazivamo stvarni (aktualni) parametri i oni odgovaraju formalnim
10.2. POTPROGRAMI 131
parametrima (s kojima je funkcija denirana int a, int b, int c)
uvazavajuci njihov poloaj.
max=max_od_tri_broja( val1, val2, val3 );

int max_od_tri_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 parame-
tara) mora biti jednak broju formalnih parametara u deniciji
funkcije.
(2) Vrste aktualnih parametara mora biti jednak vrsti formalnih pa-
rametara
(3) Aktualni parametri su formalno povezani s formalnim parame-
trima po poziciji.
Kao sto se vidi u primjeru, funkciju moramo deklarirati prije njenog
koristenja. To cemo uraditi tako da deniramo tzv. prototip funk-
cije. To znaci da moramo deklarirati vrstu varijable koju ce funkcija
dati kao rezultat, te broj i vrstu parametara koje funkcija koristi. U
nasem primjeru to smo ucinili naredbom:
int max_od_tri_broja(int a, int b,int c);
a mogli smo koristiti i
int max_od_tri_broja(int, int, int);
10.2 Potprogrami
Kao sto smo naveli u uvodu, potrprogrami su kao i funkcije samos-
talne programske strukture, ali za razliku od funkcija potprogrami ne
moraju vratiti neku vrijednost, a kada to cine, za to koriste drugaciji
mehanizam.
132 Funkcije i potprogrami
Primjer 10.2.1 Prikazimo program koji pomocu potprograma Pretvaranje
pretvara 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;
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 tra-
janja odredenih okruzenja (varijabli)
Za potpuno razumijevanje medusobne interakcije pojedinih dijelova
programa potrebno je poznavati djelokrug djelovanja odgovarajuceg
Djelokrug djelovanja i vrijeme trajanja . . . 133
okruzenja. Pod ovim pojmom podrazumijevamo vidljivost (dos-
tupnost) 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, di-
jela programa (potprograma), tada kazemo da se radi o lokalnom
djelokrugu (lokalnoj dostupnosti). U suprotnom, ako je vidljivost
odnosno dostupnostost moguca u svakom trenutku unutar cijelog pro-
grama, kazemo da se radi o globalnom djelokrugu (globalnoj dostup-
nosti).
Na primjer, ako za vrijeme izvrsavanja odredenog programa de-
niramo varijable kojima mozemo pristupiti u bilo kojem trenutku tije-
kom izvodenja programa iz bilo kojeg potprograma ili funkcije, onda
takve varijable zovemo globalne varijable. S druge strane, ako se va-
rijabli 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 potprograma, funkcije ili potprograma
u kojem koristimo odredenu lokalnu varijablu, nakon cega se te po-
zicije oslobadaju. Vidimo da, tijekom izvodenja glavnog programa,
globalne i lokalne varijable imaju razlicito vrijeme trajanja (li-
fetime) u memoriji. Drugim rijecima, vrijeme trajanja pojedine
varijable ili konstante odreduje koliko dugo ce pridruzena vrijednost
odredenoj varijabli ostati spremljena.
Mozemo reci da je vrijeme trajanja globalne varijable cijelo
134 Funkcije i potprogrami
vrijeme izvodenja programa, dok je vrijeme trajanja lokalne vari-
jable 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 vari-
jabli treba drzati sto je moguce uze. Nekontrolirano koristenje
globalnih varijabli moze prouzrokovati razne probleme, od nepo-
trebnog opterecenja memorije sve do velike mogucnosti pogreske
radi nepravilne promjene sadrzaja globalne varijable. Da bi se
izbjegli takvi problemi, treba strogo minimizirati upotrebu glo-
balnih varijabli. Idealno bi bilo da se globalne varijable mijenjaju
samo jednom prilikom izvodenja programa.
(2) Treba optimizirati broj globalnih varijabli jer one ostaju u me-
moriji 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.3.1
#include<iostream.h>
Djelokrug djelovanja i vrijeme trajanja . . . 135
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 ";
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;
}
136 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] L. Scitovski, Numericka matematika, Sveuciliste u Osijeku, 2005.
137

You might also like