Professional Documents
Culture Documents
C Programiranje Za Srednje Škole PDF
C Programiranje Za Srednje Škole PDF
2. Programski Pristup
2.1. O proceduralnom i neprceduralno programiranju ...............................................................10
2.2. Osn ov e f az e raz voja p rog ramiran ja . .. ... ..... .... ... ... .. . .... . .. ... ... .... ... ... ... .... ... 1 2
3 .Algoritmi
3.1.Uvod u algoritme ..........................................................................................................13
3.2.Dijagram toka ..................................................................................................................14
3.3.Pravolinijske algoritamske strukture.....................................................................................18
3.4.Grananje..........................................................................................................................19
3.5.Petlje...............................................................................................................................23
4. Pseudo Jezik
5 .Kako zapoeti?
5 . 1.M S Vis ual C++.. .... ... ... ... .... ... ... ... .... ... ... ... . ... ... ... ... .... ... ... ... .... .. . ... ... . ... .3 4
5.2.Programski paket DEV C++..............................................................................................37
Pitanja za utvrivanje ......................................................................................................41
6.Uvod u C++
6.1 Proces kompajliranja. .......................................................................................................42
6.2. Rijei u C++ programskom jeziku ......................................................................................44
6.3.Struktura programa...........................................................................................................45
6.4. Varijable .........................................................................................................................47
6.5. Memorija ........................................................................................................................48
6.6. Ulazno/izlazni usmjerivai toka ..........................................................................................49
6.7. Komentari .....................................................................................................................50
4.1.Varijable..........................................................................................................................28
4.2. Operatori........................................................................................................................29
4.3.Funkcije...........................................................................................................................33
7.Operatori
7.1 Aritmetiki operatori .......................................................................................................56
7.2 Relacijski operatori .....................................................................................................58
7.3 Logiki operatori .............................................................................................................59
7.4 Bitovni operatori .............................................................................................................59
7.5 Inkrementalni i dekrementalni operatori .............................................................................59
7.6 Operatori pridruivanja .....................................................................................................60
7.7 Operator razdvajanja (zarez-operator) ...............................................................................61
7.8 typedef imena ................................................................................................................61
7.9 sizeof operator ...............................................................................................................62
7.10 Hijerarhija operatora ......................................................................................................62
Pitanja za utvrivanje ............................................................................................................63
8.Naredbe
8.1 Jednostavne i sloene naredbe ...........................................................................................64
8.2 Naredba if........................................................................................................................66
8.3 Naredba switch-case .........................................................................................................72
8.4 Naredba for .....................................................................................................................75
8.5 Naredba while . ................................................................................................................78
8.6 Naredba do ......................................................................................................................79
Pitanja za utvrivanje .............................................................................................................81
9. Funkcije
11. Pointeri
11.1. Osnovno o pointerima ....................................................................................................97
11.2. Dinamika memorija ......................................................................................................97
11.3. Pointeri i polja ...............................................................................................................99
11.4. Aritmetika sa pointerima .................................................................................................99
11.5. Funkcijski pointeri ........................................................................................................101
Pitanja za utvrivanje ........................................................................................................102
12. Datoteke
12.1. Standardna biblioteka fstream .......................................................................................103
12.2. Otvaranje datoteka ......................................................................................................103
12.3. Zatvaranje datoteka .....................................................................................................107
12.4. Pisanje na datoteke ......................................................................................................108
12.5. itanje sa datoteka ......................................................................................................110
13.Zbirka zadataka
113
14.Rjeenja
123
Literatura
157
Autor ove knjige je pokuao na osnovu jako puno literature, dostupne u raznim formatima i na mnogim
jezicima, na temu C++ programiranje , da u skladu sa nastavnim planom i programom za srednje
kole izdvoji i obradi osnovne teme iz ove oblasti.Teme su uraene uz potovanje pedagokih nastavni
principa.Cilj ove knjige je lake shvatanje predvienog gradiva ,postupno rjeavanja zadataka
,stjecanje rutina,navika,upornosti,preciznosti,analize i sinteze....Ovu knjigu prati projekat u html-u
C++ programiranje za srednje kole na www.mssbusovaca.com.ba. ,takoer je u pripremi
muldimedijalni DVD koji prati ovu knjigu.
Uraeni materijal moe biti od koristi za sve one koji ele da naine prve korake u programiranju u
programskom jeziku C++.Knjiga predstavlja radnu verziju i podlona je izmjenama,dopunama te se
kao takva koristi interno i nije planirana komercijalizacija i umnoavanje.Zbirka rijeenih zadataka
ima za cilj da motivie uenike za rad analizu,sintezu,da pokuaju da urade rjeenja na drugi nain.
Autor je naveo koritene izvore za ovaj projekat,izvore nekih od tema je naveo kroz footnote, tako da
je u potpunosti zatitio autorska prava navedene literature.
Autor zahvaljuje menadmentima Mjeovite srednje kole Busovaa, direktoru Admiru Hodiu i
menadmentu Mjeovite srednje kole Vitez direktor Hrusti Seadu na razumjevanju i podrci za ovaj
projekat.
Neke ideje,sugestije i primjedbe koje su ugraene u ovu knjigu predloili su moji dragi prijatelji;
Dipl.prof. informatike Almin Halilovi,
Prof.informatike i matematike Junuz Junuzovi,
Dipl.ing.mainstva prof.abanovi Latif,
Prof.Haski Selvedin.
Rje autora
R aun ari ok o n as
Danas se raunar nalazi u svakom novijem automobilu,u svakom mobitelu, ak i u najobinijem
televizoru ili videorekorderu. Svi ti ureaji u sebi sadre raunar koji ima je potrebno naloiti to da
rade. Tako e se televizor sam iskljuiti nakon nekog vremena,ako mu vi tako zadate, videorekorder e
u 20:15 snimiti utakmicu na drugom programu u trajanju od 120 minuta, maina za pranje rublja e
ukljuiti program za pranje osjetljivog rublja,a automobil e upotrijebiti neki od ugraenih sistema za
sprjeavanje zanoenja na cesti. Spomenimo i obine line raunare. Oni su sposobnI obavljati mnogo
kompliciraniji skup radnji nego raunari ugraenI u npr. kuanske ureaje. Unato tome, svi raunari
imaju jednu zajedniku injenicu - ne mogu samostalno zakljuivati i donositi odluke. Zato im
programer treba rei ta da rade. Programer to ini koristei poseban programski jezik i posebne
naredbe pomou kojih komunicira s raunarom i opisuje mu to i kako treba raditi .Raunarski program
je skup naredbi koji govori raunaru na koji nain da obavi odreeni zadatak. Tekst programa koji je
itljiv programeru i korisniku zove se izvorni kod programa, dok je izvrna verzija programa binarna, i
moe je itati i izvoditi samo raunar. Programski jezik je skup leksikih, sintaksnih i semantikih
pravila koja uobliuju strogu strukturu pisanja izvornog koda. Svaki program sastoji se od naredbi.
Naredbe se sastoje, u ovisnosti o programskom jeziku, od izraza, konstanti, identifikatora i
poziva.Openito postoji vie nivoa programskih jezika, i podijeljeni su u generacije jezika. Do danas
postoje jezici od prve do pete generacije, no to nije jedina podjela programskih jezika, oni se takoer
razlikuju po namjeni, nainu izvravanja, strukturiranosti i proceduralnosti.1
1 .2 .Pod je l a pro gram sk ih jez i ka
Prosjeni raunar ba i nije pametna naprava . Ono nema mogunost samostalnog odluivanja,
zakljuivanja , nema ono po emu se ljudi razlikuju od svih ostalih - pamet i iskustvo.Da bismo
natjerali raunar da radi ono to mi elimo, moramo ga tome nauiti. Budui da raunari ne znaju
samostalno misliti , programeri moraju u njih ugraditi upustva koji im govore to trebaju raditi.U
situaciji slinoj programerovoj nalazi se roditelj kada svoje dijete eli nauiti jesti kaikom.Dijete je u
ovom sluaju, slino kao i raunar , "prazna ploa" - treba ga nuiti i najsitnijim detaljima. Dijete prvo
mora podii kaiku (ali da ne prospe njen sadraj), prinijeti je ustima, paziti da u kaici juha nije
prevrua , otvoriti usta, staviti kaiku u usta (a ne pored usta), progutati sadraj kaike (ali ne i
kaiku). Zapravo, ovo uope nije jednostavan postupak.Tako je i s raunarima. Njih takoer treba
nauiti da rade ono to bismo mi eljeli. No ovdje je problem malo vei nego s djetetom jer raunari
komuniciraju na razne naine - koriste, tj. razumiju razliite raunarske jezike.
Zanimljivo je to se i danas svaki program na kraju svodi na ovaj nivo, jer to je jedini oblik programa
koji raunar razumije. Za prevoenje jezika vieg nivoa jezike nieg nivoa koriste se programi zvani
p revod ioci ili comp il er i .
D rug u ge ne rac i ju programskih jezika predstavljaju simboliki programski jezici ili Assembli. Od
jezika prve generacije razlikuje se u tome to su uvedena simbolika imena adresa (labeli) i
jednostavniji pristup adresiranjima putem mnemonikih kodova pojedinih naredbi. Mnenonik ili
mnemoniki kod je simboliki prikaz binarne naredbe, npr. Naredba 001011 predstavlja se
mnemonikom MOV.
Primjer programa pisanog u jeziku druge generacije:
Jezici p e te ge ne raci je su uglavnom usko specijalizirani jezici koji esto kreiraju cijele aplikacije
potpuno automatski putem raznih Wizarda i slino. Razvoj ovakvih jezika je u poetnoj fazi.
2. Programski pristup
Za bilo koji problem vjerovatno postoji jednako puno naina da se isti analizira i rijei . Tako se sa
programerskog aspekta, na primjer, problem moe podijeliti (dekompozirati) algoritamski ili
proceduralno, tj. u odnosu na sekvencu ili proceduru dogaaja koji se moraju desiti. Alternativno,
problem se moe rijeiti pomou "objektno-orijentisanog"pristupa, posmatrajui razne cjeline koje
utjeu jedne na druge i uzimajui u obzir njihovo meusobno djelovanje. Ova dva pristupa u
dekompoziranju problema algoritamski i objektno-orijentisani su dva pristupa koji programeri
najee koriste. Pristupi su figurativno prikazani na Sl.2.1.
Algoritamski pristup poinje optim zadatkom koji treba izvriti (kao to je "omoguiti korisniku da
izvri opte bankarske funkcije"), zatim dijeli opti zadatak na naredne nivoe specificiranijih
podzadataka (kao to je "proces podizanja novca", te "proces stavljanja depozita"), te na dalje nivoe
jo specifinijih zadataka (kao to su "upitaj korisnika na vrijednost depozita" ili "verifikuj unesenu
vrijednost kao vaeu").
10
Kada se zadatak prikae u obliku dijagrama, najoptiji zadatak je obino na vrhu, a najspecifiniji
zadaci se granaju prema dnu. Razni pravougaonici u takvom "stablu" odgovaraju raznim procedurama i
podprocedurama koje treba programirati, kao to je prikazano na Sl.2.2.
Algoritamske ili proceduralne metode u dizajniranju softvera su razvijene u kasnim 60tim kako bi se
ukazalo na probleme u kojem se u to vrijeme nalazilo opte stanje u razvijanju softvera. Poto su novi
pristupi omoguili strukturni pristup programiranju (u odnosu na haotini "hack and run" pristup, koji
su koristili neki programeri), moe se naii i na podatak da se algoritamski ili proceduralni pristup
programiranju zove "strukturno programiranje". S obzirom da ovaj pristup poinje na vrhu (opti
zadatak koji treba izvriti) i dijeli najvii zadatak na naredne nivoe specifinijih podzadataka prema
dnu,ovaj pristup se ponekad naziva i "top-down" pristup. Neki autori ga zovu i proceduralni pristup,
imajui u vidu da se algoritamski pristup fokusira na procedure koje izvravaju zadatak. Dakle, ovaj
pristup dizajniranju softvera ima razliite nazive, i to:
Funkcionalna dekompozicija
Algoritamska dekompozicija
Strukturno programiranje
"top-down" programiranje
proceduralno programiranje
Bez obzira na naziv, ovaj pristup se fokusira na funkcionalnost programa,poinjui sa vrha (najoptija
funkcija), i idui prema dnu ka najspecifinijim funkcijama. Mnogi programeri i danas koriste ovaj
pristup, a jo uvijek je koristan za izradu kvalitetnih softvera , naroito za manje programe ili
softverske module. Bez obzira na injenicu da je C++ u osnovi OOP jezik, ovaj tekst se bavi osnovama
C++ sintakse u oblasti proceduralnog programiranja, kao uvod u OOP paradigmu.
Nep ro ced ura lno p rogram ira n je
Ovaj pristup programiranju temelji se na slijednom izvoenju nekog programa. Uglavnom se sastoji od
jednostavnog niza naredbi gdje je izvedeno grananje putem goto ili sline naredbe. Ne postoje pozivi
metoda i funkcija. Ovi jezici su zastarjeli i nedovoljno razvijeni za dananje potrebe.
Modularno programiranje
11
Modularno programiranje omoguava fragmentaciju koda na module koji mogu biti pisani u razliitim
datotekama, i tako pojednostavljuje programe i poveava njihovu itljivost. Unesen je pojam dijeljenja
koda izmeu aplikacija.
2 .2 .O snove faze razvo ja prog rami ran ja
Analiza problema
Postavljanje modela
Izrada algoritma
Izrada dijagrama toka
Kodiranje programa
Prevoenje programa
Testiranje programa
Dokumentiranje programa
Eksploatacija programa
Svrha programa je rjeavanje problema, najei nain rjeavanja je pomou tri modela
model podataka
model procesa i
model resursa.
Model podataka sadri definiciju podataka (nazive, vrste, dimenzije, ogranienja vrijednosti...) te
strukture podataka (nizovi, skupovi, datoteke, tablice...).
Model procesa moe biti prikazan razliitim tehnikama (dijagram toka, dijagram strukture procesa,
dijagrami akcija....), ali svi oni, na svoj nain, prikazuju slijed odvijanja procesa.
Model resursa sadri definiciju raunarskih resursa i njihovih svojstva (operativni sistem, vrsta
programskog prevodioca, svojstva jedinica raunara...) koje su potrebne da bi program uredno radio.
MODEL
PODATAKA
MODEL
PROCESA
MODEL
RESURSA
12
3.Algoritmi
3.1.Uvod u algoritam
Pojam algoritama (dijagram toka) je jedan od najstarijih i najvanijih pojomova u matematici. Teko je
da se precizno definie algoritma, jer pripada grupi osnovnih pojmova kao to su skup ili taka. U
poetku algoritmom se nazivaju samo pravila raunanja s brojevima, kasnije i pravila obavljanja ostalih
zadataka u matematici, u XX vjeku, pojavom raunara, pojam se proiruje na informatiku, a zatim i na
druga podruja. Precizan opis svih pravila i postupaka potrebnih za postizanje eljenog rezultata. Evo
nekih definicija koje blie opisuju algoritam.
Definicija 1.
Algoritam je taan opte razumljiv propis koji definie proces transformacije poetnih podataka u
traeni rezultat.
Definicija 2.
Algoritam je taan propis o tome koje operacije nad kojim brojevima i u kom redosljedu treba izvriti
da bi se rjeili svi zadaci nekog zadatog tipa.
Definicija 3.
Priu o algoritmima zapoeti emo onako kako poinju sve klasine prie.Nekada davno ivio je u
Bagdadu pisac, matematiar, astronom i geograf po imenu Muhammed ibn Musa al Khowarizmi
.Vjerojatno nije niti sanjao tamo daleke 852. godine kada je pisao knjigu Kitab al jabr w'al-muqubala
da e od toga nastati ak dva uzroka glavobolje uenicima deset-jedanaest vijekova nakon toga.
Njegov al jabr je postala algebra. Isto tako pravila rjeavanja iz poetka prvenstveno matematiki
problema su iskrivljavanjem imena al Khowarizmi nazivana algoritmi. No, tu grekama nije kraj. Prema
korijenu rijei bilo bi pravilno umjesto algoritmi koristiti algorizmi. Ali kako jezik nije nauka nego skup
dogovora, izgleda da je dogovoreno da najee greke postaju jezika pravila.Tako mi danas imamo
algoritme, a oni su niz preciznih uputa koje nas korak po korak vode do rjeenja nekog problema.To su
zapravo toliko precizne upute da za njihovo izvravanje nije potrebna inteligencija.Zato bi se mi bavili
stvarima za koje ne treba nimalo pameti?Zato to izrada algoritma u programiranju prethodi samom
pisanju programa. Pri pisanju programa prvo nam mora biti jasno to se zapravo od programa
oekuje.Kao i kod rjeavanja zadataka u bilo kom podruju prvo moramo znati postaviti problem.Drugi
korak je gruba skica rjeenja.Trei korak je izrada algoritma. Ako smo dobro napravili algoritam, tada
pisanje programa nije nita drugo negoli prepisivanje algoritma u neki programski jezik.Kada smo to
uinili dobili smo program, a program "tjera" raunar da radi ono to mi zapravo elimo.Neko je rekao
da je raunar idiot velike brzine. To je ustvari bit prie o algoritmima. Mi put do rjeenja moramo toliko
rascjepkati i detaljno napisati da bi ga mogao razumjeti i taj "idiot velike brzine".Drugim rijeima,
upute moraju biti jednostavne i precizne tako da ih moe izvravati i maina. Pokuajte se sjetiti gdje
ste zadnji put proitali neko detaljno uputstvo. Moda vam je i bilo u rukama,ali niste itali jer to ve
znate napamet, kao npr.Dopuniti raun mobitela putem bona.Ili moda da probamo obrnuto. Da li ste
se nedavno nali u situaciji da niste neto znali napraviti jer su upute bile toliko loe i nerazumljive ili
uope niste imali upute? U svakodnevnom ivotu smo zapravo stalno u doticaju s algoritmima, a esto i
postupamo po algoritmima da toga nismo niti svjesni. Znati "algoritamski" razmiljati dobro je bez
obzira bavili se vi poslije programiranjem ili ne.
13
Algoritam je precizan,ureeni i nedvosmisleni niz koraka koji u konanom vremenu vodi do rjeavanja
problema ako problem ima rjeenje,odnosno u konanom vremenu kae da nema rjeenja ako problem
nema rjeenja.
Definicija 4.
Algoritam je konani skup pravila koja daju redosljed operacija za rjeavanje specifinog problema.
Najbitnije osobine algoritma su:
Odreenost- je osobina algoritma da za iste poetne podatke daje uvjek iste rezultate.
Razumljivost. -algoritam treba da bude razumljiv ovo je relativni pojam i zavisi od nivoa
obrazovanja korisnika.
Masovnost- je osobina algoritma da se mogu rjeavati svi zadaci istog tipa.
Rezultativnost- je osobina algoritma da on mora da vodi ka rjeenju zadatka ako su poetni
podaci iz skupa moguih podataka.
Konanost- je osobina algoritma da se algoritam realizuje sa konano mnogo koraka. Pri tome
ta konanost treba da je ostvarljiva, tj. da moe da se realizuje za neko razumno vrijeme.
Primjer algoritma
Bilo koji problem se moe rijeiti izvravanjem serije akcija u odreenom redosljedu. Akcije koje e se
izvriti i redosljed u kojem e se to odvijati nazivamo algoritam. Iskustvo pokazuje da je najtei dio
rijeavanja programerskog problema na raunaru upravo razvijanje algoritma za rijeenje. Jednom kad
je odreen ispravan algoritam, razvoj programa za sam alorgitam je poprilino jednostavan.
Sljedei primjer pokazuje korektan i nekorektan sljed dogaaja za algoritam kojim elimo opisati
pokretanje automobila:
otkljuavanje automobila
sjedanje u automobil
paljenje motora
otputanje rune konice
pokretanje automobila
zaustavljanje
NEKOREKTAN SLIJED:
otkljuavanje automobila
sjedanje u automobil
paljenje motora
pokretanje automobila
zaustavljanje
otputanje rune konice
KOREKTAN SLIJED:
14
Dijagram toka je reprezentacija kojom ilustrirate sekvencu operacija koje je potrebno izvriti kako bi se
dolo do rjeenja problema. Dijagram toka se crta u ranoj fazi formuliranja kompjuterskog rjeenja.
Dijagram toka olakava komunikaciju izmeu programera i poslovnih ljudi. Takoe,dijagram toka igra
znaajnu ulogu u procesu programiranja jer olakava razumijevanje logike kompliciranih i opsenih
problema. Jednom kad ste nacrtali dijagram toka postaje jednostavno napisati program u bilo kojem
programskom jeziku. Vrlo esto je nemogue objasniti logiku programa bez dijagrama toka. Osim
toga,dijagram toka je neizostavan dio dokumentacije bilo kojeg programa.
Smjernice za crtanje dijagrama toka
Za crtanje dijagrama toka koriste se standardni simboli. Neke od esto koritenih simbola moete
pogledati u sljedeoj tabeli:
15
Kad je u pitanju simbol odluke moe postojati samo jedan ulaz podataka, ali mogu postojati dva ili tri
izlaza podataka (jedan za svaki mogui odgovor).
16
Terminalni simbol (start, kraj) takoder moe imati samo jedan ulazno, odnosno jedan izlazni tok
podataka.
Ukoliko je dijagram toka kompleksan bolje je koristiti simbole konektora kako bi ste
reducirati broj linija toka. Izbjegavajte presijecanje (krianje) linija.
Vodite rauna da vam dijagram toka ima logian poetak i kraj.
Prednosti
Prednosti dijagrama toka su:
Komunikacija(Dijagram toka olakava komunikaciju svih koji su zainteresirani za rjeavanje
problema).
Efektivna analiza(Uz pomo dijagrama toka problem se moe efektivnije analizirati).
Odgovarajua dokumentacija( Dijagram toka je dio obavezne programske dokumentacije, koja moe
sluiti u razliite svrhe).
Efikasno kodiranje( Korektan dijagram toka olakava pisanje programa (bez obzira u kojem
programskom jeziku).
Otklanjanje greaka( Dijagram toka olakava pronalaenje greaka).
Efikasno odravanje programa( Olakava odravanje programa).
Ogranienja
Kompleksnost Ponekad je problem kompleksan, pa je i dijagram toka kojim ga pokuavate predstaviti
kompleksan i nezgrapan.
Alternative i odravanje( U sluaju potrebe za alternativnim rjeenjima vrlo esto je neophodno
dijagram toka nacrtati ponovno (iz poetka).
Ukoliko elite jasnije opisati podatke ili korake koristite simbol za napomene/komentare
(annotation symbol).
17
Iz osnovne kole sjeamo se da je brzina nekog tijela zapravo prijeeni put u jedinici vremena.
Matematiki bismo to zapisali kao V = s / t, gdje je V brzina, s prijeeni put i t vrijeme. To je tako
jednostavno da nam nije potrebna nikakva priprema i gruba skica rjeenja. Moemo odmah raditi
algoritam.
Za vjebu: Pokuajmo prema ovom primjeru nacrtati dijagram toka za izraunavanje povrine
pravougaonika, a zatim dijagram za izraunavanje obima pravougaonika.
Evo jo jednog primjera za izraunavanje obima i povrinu kruga. Kako na tastaturi nemamo na
raspolaganju grka slova, nau formulu za izraunavanje obima pisati emo kao
Isto tako za sada jo ne znamo funkciju za kvadriranje pa emo formulu za povrinu kruga pisati
ovako:
P = r * r * Pi
gdje je r * r zapravo r2.
O = 2 * r * Pi.
18
Za vjebu: Po uzoru na obim i povrinu kruga, pokuajte algoritme za izraunavanje obima i povrine
pravougaonika spojiti tako da u jednom algoritmu bude i obim i povrina pravougaonika.
3 .4 . Gra nan je
Pr imjer 1
Sjetimo se zadataka iz prethodne lekcije za izraunvanje brzine ako su poznati put i vrijeme:
V = s / t.
Ako se na raunaru dogodi situacija da dijelimo s nulom program e nam izbaciti greku. Da bismo
sprijeili "ispadanje" programa, prije izraunavanja brzine provjeriti emo da li je upisano vrijeme vee
od 0.
Na alost, u stvarnom ivotu zbivanja ne teku tako jednostavno kao to su to pravolinijski algoritmi.
Ponekad treba stati, razmisliti, usporediti neke stvari i donijeti odluku kako dalje. Takovo mjesto u
algoritmu zove se grananje.
19
Prepravite dijagram toka iz gornjeg primjera tako da ako upisano vrijeme t nije vee od nula da se na
grani NE ispisuje poruka 'Vrijeme mora biti vee od nula' i tek tada odlazi na kraj. Pojedine znakove ili
nizove znakova kao to je ova poruka u dijagramu toka piemo unutar navodnika koji ovisno o
programskom jeziku koji emo poslije koristiti mogu biti jednostruki ili dvostruki.
Pr im je r 2
Idemo rijeiti jo jedan zadatak. Prisjetimo se zadatka obima i povrine pravougaonika iz prethodnih
vjebi koji emo jo malo proiriti. Preko tastature upisuju se stranice pravouganika a i b. Treba
izraunati obim i povrinu pravougaonika te ispisati poruku o tome da li je upisani lik pravouganik ili
kvadrat.
20
Da objasnimo:
Nakon to smo upisali stranice a i b,
izraunali smo obim O i povrinu P
pravougaonika.
Dobivene rezultate moemo odmah
ispisati.Kako emo utvrditi da li moda
upisane stranice pripadaju kvadratu?
Ako su stranice a i b jednake tada je to
kvadrat.
Ispisujemo poruke i odlazimo na kraj.
Kraj.
Pr im je r 3
Obratite panju na konstrukciju ispisa. Pogledati emo lijevu granu koja se izvrava ako je odgovor na
logiki uvjet NE. Imamo dio poruke u navodnicima 'Broj ' pa zatim odvojeno zarezom varijablu a i
T reba up is at i c ijeli b roj a i isp is at i poruk u d a li je u p isan i b roj p aran ili n ep aran.
21
nakon toga opet iza zareza drugi dio poruke u navodnicima 'je neparan.' Ako je upisan npr. broj 9 tada
e naredba za ispis 'Broj ',a,' je neparan' rezultirati porukom koja izgleda kao reenica u komadu: Broj
9 je neparan.
Pr im je r 4
Treba upisati dva broja a i b i ispisati poruku o tome koji je vei.
3 .5 . Pe tlje
Stvar je zapravo vrlo jednostavna. Ali pokuajte sada zamisliti da neko upie dva ista broja, npr. 7 i 7.
U uvjetu emo imati pitanje da li je 7 vee od 7. Odgovor je NE. Izvriti e se lijeva grana i kao
rezultat dobiti emo poruku:
Broj 7 je vei od broja 7.
Ova poruka ba i nema logike i dokaz je da na raunar od milja zvani idiot velike brzine i ne
razmilja ba puno. Zato ljudi koji rade na razvoju informacijskih sistema moraju predvidjeti puno vie
situacija, pa i onih najekstremnijih koje bi se pri radu programa mogle dogoditi. Kau da dobra kontrola
podataka pri unosu sprjeava ak 90% greaka koje bi se naknadno u radu programa mogle dogoditi.
Zato emo mi rjeenje naeg zadatka malo promijeniti:
22
Naslov ove lekcije govori da sve ovo to smo do sada radili nije dovoljno zapetljano, pa emo stvari jo
malo dodatno zapetljati.
Nekada su nastavnici imali obiaj nestane uenike kanjavati tako da su im zadali 100 puta
napisati u biljenicu: "Neu nikada vie brbljati na asu informatike!". Zamislite da je nama neko dao
takvu kaznu. Mi emo se probati izvui tako da to raunar odradi umjesto nas. Treba mu samo zadati
da 100 puta ispie jednu te istu poruku. Nita jednostavnije. Evo rjeenja:
Hm, ve nakon tree upute raunaru da ispie
poruku sam odustao jer mi je dosadilo. Morate
priznati da ovo rjeenje ba i nije neto s ime bi
se mogli pohvaliti.
Nakon to se i 100-ti puta izvre naredba grananja i naredbe ispod grananja i e postati 101. Tada je
odgovor na pitanje u grananju da li je i vei od 100 konano DA i tada bi program trebao zavriti s
radom. Dio programa, niz istih naredbi koje se ponavljaju dok je neki uvjet zadovoljen ili dok ne
23
postane zadovoljen, naziva se petlja. U naem se primjeru ispis poruke i poveanje varijable i za jedan
ponavljaju dok i nije postao vei od 100. Varijabla i je u naem primjeru broja jer svakim prolaskom
kroz petlju i postaje i vie 1.
Neki ljudi tvrde da napredak moemo zahvaliti samo ljudskoj lijenosti. Naime, ljudi e svata
izmisliti samo da ne moraju raditi. Tako je neko izmislio jo jednostavnije rjeenje za na primjer s
ispisom 100 poruka.
Pravougaonik ispod simbola za poetak je naredba for koja je sama po sebi petlja. Broja i kao i uvjet
ve su sadrani u naredbi pa ne moramo mi voditi brigu oko odbrojavanja. Taj red u algoritmu itali
bismo kao: "Za i koji ide od 1 do 100 uini slijedee:".
Broj ponavljanja u petlji za rjeenje odreenih problema se zna unaprijed, prije poetka
ponavljanja, a za neke se ne zna unaprijed, ve ovisi o izvravanju niza naredbi koje se ponavljaju. Za
sada emo se samo baviti petljama u kojima unaprijed znamo broj ponavljanja, dakle petljom for.
Koliko vremena vam treba da saberete sve brojeve od 1 do 100? Prava sitnica.
Za na zbir svih brojeva do 100 koristiti emo
varijablu zbir koju na poetku algoritma moramo
postaviti na vrijednost 0.
Svakim prolaskom kroz petlju i se poveava za 1 i njegova vrijednost pridodaje sadraju varijable zbir.
U prvom prolazu kroz petlju zbir je 0, a i je 1, pa prema tome zbir postaje 1. U drugom prolazu zbir
je 1, a i je 2. Zbir postaje 1+2, dakle sada je 3. I tako 100 puta.
Idemo jo malo zapetljati neto to znamo raunati jo od petog osnovne, a to je prosjek ocjena.
Prosjek je zbir svih ocjena podijeljen s brojem predmeta.
24
U drugom prolazu upisujemo ocjenu iz drugog predmeta, u treem iz treeg i tako 15 puta. Po izlazu iz
petlje izraunavamo prosjek i ispisujemo ga.
Ovo je bilo prejednostavno da bi bilo stvarno. U stvarnom ivotu desiti e se da je neko npr.
osloboen nastave tjelesnog i zdravstvenog odgoja pa ima 14 predmeta. Neko moda ima 16 predmeta
jer je izabrao i fakultativnu nastavu. Isto tako u drugom, treem ili etvrtom razredu sigurno neete
imati 15 predmeta. Ve smo napomenuli da se programi piu im openitije tako da bi se mogli
primjenjivati za rjeavanje im vie slinih problema. Zato emo na algoritam prepraviti tako to emo
umjesto 15 uvesti varijablu brpred koja e predstavljati na broj predmeta.
25
Za vjebu: Pokuajte po uzoru na prosjek ocjena za jednog uenika napraviti dijagram toka za
izraunavanje prosjene ocjene razreda.
Jo nekoliko primjera petlji
26
Uenici su na satu fizike nauili Ohmov zakon po kojem otpor u istosmjernom strujnom kola moete
izraunati tako da podijelite napon sa jakou struje:
R=U/I
gdje je otpor R, napon U i jakost struje I. Naueno su odmah provjerili mjerei veliine u strujnom
kolu, ako su mjerili napon i jakost mogli su po gornjoj formuli izraunati otpor, ako su mjerili otpor i
napon mogli su izraunati jakost struje I = U / R, a ako su mjerili otpor i jakost struje mogli su
izraunati napon U = I * R. Treba napraviti algoritam po kome je mogue za odreeni broj mjerenja
na temelju dvije izmjerene veliine izraunati treu. Za broj mjerenja emo koristiti varijablu brmjer.
Uvest emo jo jednu varijablu koju emo zvati izbor i dogovoriti emo se da u nju upiemo 1 ako
elimo raunati otpor, 2 ako elimo raunati napon i 3 ako elimo raunati jakost struje. Ako upisani
broj ne bude 1, 2 ili 3 ne treba poduzimati nita. Poto slovo I koristimo kao varijablu za jakost struje,
u petlji for emo ovaj puta kao broja upotrijebiti slovo k.
27
blokovima. Problemi se mogu lako analizirati, lako se uoavaju slinosti i razlike izmeu vie rjeenja i
odabire najbolje.
Moda nakon ovih vjebi vidite dijagrame toka i tamo gdje ih do sada niste uoavali - razliiti
shematski prikazi nekih postupaka, hodogrami nekih aktivnosti...
I na kraju to je bio cilj nae izrade algoritama - pisanje programa. Kada je jednom algoritam
gotov pisanje programa u nekom programskom jeziku je prepisivanje simbola iz dijagrama toka u
naredbe programskog jezika. Obino svaki simbol u dijagramu toka predstavlja jednu naredbu u
programu. Dijagram toka bi trebao biti dio svake dobre programske dokumentacije.
Uenicima je crtanje dijagrama toka ponekad nerazumljivo, a sve to je nerazumljivo je i
dosadno. Oni bi najradije sjeli za raunar i odmah pisali program. Kod jednostavnih problema to i
moemo napraviti. Ali kod sloenijih... Jednom sam sreo svog biveg uenika koji se u svom poslu
intenzivno bavi programiranjem. alio mi se da nekad nekoliko sati provede za raunarom
pokuavajui rijeiti neki problem, ali ne ide i gotovo. Pitao sam ga to tada uini. Odgovorio je: "Pa
uzmem olovku i papir i nacrtam algoritam..."
4.Pseudo jezik
Pseudokod je neoficijelan jezik koji pomae programerima u razvijanju algoritama.
Pseudokod nije programerski jezik.
Njegova svrha je rijeiti program prije pisanja u programerskom jeziku kao to je C++.
Pseudokod se sastoji jedino od izvrnih naredbi onih koje se izvravaju kada program
pseudokoda pretvorimo u C++ i pokrenemo.
iz
Ne postoji ope prihvaena norma naina pisanja pseudo jezika ve svaki autor moe u naelu koristiti
svoj nain pisanja.
Mjesto u memoriji rezervisano za pohranu podatka naziva se varijabla. Svaka varijabla ima ime koje ju
jednoznano odreuje kako bi se razlikovala od ostalih varijabli. Ime varijable se u pseudo jeziku moe
zadati proizvoljno, npr. x, a, TX, B_Pod, AmPe.
Vrijednost varijable
Varijabli se vrijednost pridruuje uz pomo operatora pridruivanja. Operator pridruivanja koji se
koristi u ovoj verziji pseudo jezika je znak (:=). Tim se operatorom varijabli pridruuje ili u varijablu
upisuje vrijednost.Npr.
izraz x:=3 se moe itati "varijabli x se pridruuje broj 3".
Kraj naredbe
Algoritam zapisan pseudo jezikom sastoji se od niza naredbi. Svaka naredba ove verzija pseudo jezika
zavrava znakom taka-zarez (;).
4.2.Operatori
4.1.Varijable
28
Operatori su simboli koji predstavljaju (zamjenjuju) odreene funkcije. Operatori se mogu svrstati u
grupe prema vrsti funkcije koju prestavljaju, npr.:
aritmetiki operatori,
logiki operatori,
Za ispravno zapisivanje algoritma pseudo jezikom izmeu ostalog treba poznavati i znaenje pojedinih
operatora. Pri tom moe zbunjivati slinost izgleda operatora pseudo jezika i operatora kojima se
koristimo u matematici (ponekad izgledaju isto a imaju razliita znaenja).
Aritmetiki operatori
Opis
Pseudo jezik
Pascal
C/C++
Sabiranje
Oduzimanje
Mnoenje
Dijeljenje
Cjelobrojno dijeljenje
DIV
DIV
Ostatak cjelobrojnog
dijeljenja
MOD
MOD
x:= 5;
y:=2;
a:=x/y;
b:=x DIV y;
c:=x MOD y;
Rezultat e biti:
a=2,5 ;b=2;c=1 (5:2=2 cijela i 1 ostatak).
Logiki operatori
Logiki podaci su podaci koji mogu poprimiti samo jednu od dvije mogue vrijednosti. To su na primjer
true/false, da/ne, istina/la, 1/0. Varijabla u koju se pohranjuju podaci ove vrste moe poprimiti
vrijednosti true (1) ili false (0). Za rad s logikim podacima, postoje logike funkcije. Logike se
funkcije zapisuju logikim operatorima. Rezultat rada logikih operatora je podatak logikog tipa.
29
Opis
Pseudo jezik
Pascal
C/C++
Logiki I
AND
&&
Logiki ILI
ILI
OR
||
Logiki NE
NE
NOT
ILI
30
Opis
Pseudo jezik
Pascal
C/C++
Manje
<
<
<
<=
<=
<=
Vee
>
>
>
>=
>=
>=
Jednako
Razliito
<>
<>
!=
Redosljed izraavanja
Operatori
d=0.
Kod poetnika zabunu moe stvoriti operator jednakosti (=). Operator jednakosti NE pridruuje
vrijednost varijabli ve samo provjerava da li je vrijednost njegove lijeve i desne strane jednaka.
Npr. Izraz
x=3 se moe itati: "da li je vrijednost varijable x jednaka 3?".
Tim izrazom se vrijednost varijable ne mijenja i ostaje kakva je bila i prije izraza. Operator jednakosti
ne mijenja vrijednost varijable.
31
()
NE
*/ DIV MOD I
+ - ILI
<,<=,>=,<>,=
22 DIV 5 = 4
4 * 11 = 44
44 MOD 3 = 2 (ostatak dijeljenja 44/3)
x=2
1.
2.
3.
4.
22 DIV 5 = 4
11 MOD 3= 2
4*2=8
x=8
4.3.Funkcije
32
Opis
Pseudo jezik
Pascal
C/C++
Apsolutna vrijednost
realnog broja
Abs(x)
Abs(x)
abs(x)
Sqrt(x)
Sqrt(x)
sqrt(x)
Zaokruivanje ralnog
brojana najblii cijeli
broj
Round(x)
Round(x)
round(x)
Trunc(x)
Trunc(x)
ceil(x)
5.Kako zapoeti?
Izdvojeni nizovi naredbi koji ine logike cjeline a obavljaju tano utvrene zadatke nazivaju se
funkcije. Mogue je stvoriti vlastite funkcije pa ih zatim koristiti u svom programu ili koristiti ve
postojee i za upotrebu pripremljene funkcije. U ovoj verziji pseudo jezika od uenika se oekuje
poznavanje nekoliko pripremljenih matematikih funkcija.
33
Da bismo napravili program koji treba da obavi neki zadatak, neophodna su nam dva specijalizirana
programa: jedan koji koristimo da napiemo izvornu datoteku (editor), i drugi sa kojim dobijemo
izvrnu datoteku (kompajler).
Ova dva programa se najee kombiniraju u jedinstven paket - tzv. razvojno okruenje. Danas,
najpoznatije C++ okruenje predstavlja Microsoftov proizvod Visual C++ .NET. Meutim, ovaj, kao i
veina ovakvih programa, je komercijalan i nije dostupan svim korisnicima. Ipak, mogue je nai veliki
broj besplatnih C++ okruenja. Jedno od takvih okruenja je i Dev-C++ .
5.1.MS Visual C++
Nakon pokretanja MS Visual C++ razvojnog okruenja otvorit e se prozor programa. Ovisno o
podeenosti programa raspored i sadraj cjelina unutar prozora programa moe biti i drugaiji.
Slika 5.1.
Novi projekt se pokree naredbom File/New.Nakon odabira naredbe File/New otvara se prozor New u
kojem treba na kartici Projects odabrati vrstu projekta te zadati osnovne podatke za projekt.
34
Slika 5.2.
U popisu projekata treba birati Win32 Console Application. Projektu treba dati ime (engl. Project name)
i mjesto pohrane (engl. Location). Nakon unosa potrebnih podataka otvara se prozor Win32 Console
Application Step 1 of 1.
Slika5.3.
Slika5.4.
Sada u stvorenom projektu (okviru za izradu programa) treba otvoriti novu datoteku izvornog
kda. Potrebno je kliknuti na karticu FileView, a potom oznaiti mapu Source Files koja se nalazi pod
nazivom projekta. Na kraju birati naredbu File/New.
Odabirom An empty project i klikom na dugmi Finish stvoren je i pohranjen novi projekt obiljeja
prikazanih u prozoru New Project Information.
35
Slika 5.5
Slika 5.6.
Otvorit e se prozor New u kojem treba na kartici Files izabrati vrstu datoteke. Bira se vrsta datoteke
C++ Source File.
36
Na kraju treba zadati ime datoteci (engl. File name). Izvorni kd programa C++ sprema se u datoteku
izabranog imena i nastavka cpp.
5.2.Programski paket Dev-C++
Najnoviju verziju programa mogue je nai na web stranici firme BloodshedSoftware
(http://bloodshed.net/download.html). Instalacija Dev-C++ programa ni u emu se ne razlikuje od
koritenja veine instalacionih datoteka u Windows okruenjima. Dovoljno je dvostrukim klikom
pokrenuti instalacionu datoteku (npr. devcpp-4.9.9.2 setup.exe) i pratiti
poruke na ekranu. Nakon zavretka ovog postupka, u traci sa alatima pojavljuje se ikona za pokretanje
programa Dev-C++ .
Korak po korak prvi program u Dev C++
37
38
39
40
1.
2.
3.
4.
Definii Algoritam?
Kako se jo naziva proceduralno programiranje i zbog ega?
Koje su najbitnije osobine algoritma?
Nabroj nekoliko programskih paketa koji omoguavaju pisanje i kompajliranje programa
napisanih u C++ ?
5. Programski jezik C++ pripada ........... jezicima.
6. ta je osnovna karakteristika proceduralnog programiranja?
7. ta je pseudo jezik?
C++ je vii programski jezik ope namjene. Ovo je kratka reenica sa dosta nerazumljivih ojmova.Prvi
od njih je programski jezik. Ljudi u svakodnevnom ivotu koriste govorne jezike, i bilo bi idealno kada
bi mogli na naem maternjem jeziku kazati raunaru da nam neto uradi, npr. Molim te nai mi
rjeenja kvadratne jednaine
x2 +5x+6=0!.
To bi nam itekako olakalo ivot iz matematike, ali naalost stvari sa raunarima nisu jo uvijek tako
jednostavne, iako bi jednog dana mogle biti upravo takve. Govorni jezici ne koriste se za komuniciranje
sa raunarom jer su preobimni, dvosmisleni i neprecizni.
Tako npr. na ulazu u jedan ribnjak stoji natpis Gostima zabranjeno hraniti ribe!. Svima je jasno da se
misli na to da posjetioci ribnjaka ne smiju bacati hranu ribama, ali se reenica moe tumaiti i na nain
da se ribe ne smiju hraniti sa gostima! Takva reenica je sigurno dvosmislena.Primjer nepreciznosti se
moe vidjeti u reenici: Odi u prodavnicu i kupi mlijeko!. Na koju prodavnicu se misli? Koju masnou
mlijeka? Od kojeg proizvoaa?
Primjer preobimnosti jezika moemo nai u bilo kojem knjievnom djelu, gdje je ljepota izraavanja
poeljna, ali u informatici je to nepotrebno ako nema u sebi nekih korisnih informacija.Dakle
programski jezik je precizan i nedvosmislen jezik razvijen za komuniciranje i kontrolu nad
raunarom.Kae se da je C++ jezik ope namjene, to znai da nije specijaliziran u npr. matematike
ili neke druge svrhe.
C++ je vii programski jezik, ali to nema nikakve veze sa visinom, jer jezici nemaju visinu, niti
duinu.Ovo vii (eng. highlevel) stoji uz C++ jer postoje jezici i nieg nivoa (eng. lowlevel).Ako je jezik
vieg nivoa to ne znai da je automatski bolji od jezika nieg nivoa. To znai samo vei nivo apstrakcije
od mainskog jezika, koji je jedini jezik koji procesor razumije bez prevoenja. On se sastoji od nula i
jedinica i moe se rei da je za ljudska bia gotovo nerazumljiv i neupotrebljiv. Vei nivo apstrakcije
znai jednostavniji rad ali i manju kontrolu nad raunarom.
6.Uvod u C++
41
C++ je programski jezik za koji se slobodno moe rei da je C programski jezik sa dodatim klasama i
svim ostalim osobinama modernih jezika. Dokaz za to je i prvo ime ovog jezika koje je glasilo C sa
klasama! Tvorac C programskog jezika je Dennis Ritchie, koji je tad radio u AT&T Bell Laboratories. C
je nastao da bi zamijenio jezik B(postojao je i jezik A, a poetkom 2007 je izdat i jezik D) iji tvorac je
otac Unix operativnog sistema Ken Thompson i prvenstvena mu je namjena bila odravanje Unix
operativnog sistema. C je udan jezik koji ima osobine i viih i niih programskih jezika, pa kao takav
ima sve prednosti i mane takvih jezika. Da bi prevaziao mane i iskoristio prednosti C jezika, Bjarne
Stroustrup zaposlenik AT&T Bell Laboratories je razvio C++ programski jezik. Da li je u tome uspio ili je
samo jo doprinio zbrci oko u sutini vrlo snanog programskog jezika je rasprava koja se esto vodi u
programerskim krugovima.
6.1. Proces kompajliranja
42
Izvorni kod
Kombinacijom naredbi programskog jezika nastaje izvorni kod (engl. source code). Izvorni je kod
mogue pisati u bilo kojem programu za ureivanje teksta (engl. text editor). Danas se uglavnom
programi za pisanje izvornog koda objedinjuju u cjelinu sa prevodiocem i povezivaem (integrirana
razvojna okolina, IDE). Izvorni kod programa C++ sprema se u datoteku izvornog koda pod smislenim
imenom i nastavkom *.cpp
Izvrni oblik
Programi se mogu izvriti na raunaru samo ako su u binarnom obliku. Takav se oblik programa naziva
izvrni oblik (engl. executable). Izvorni se kod mora prevesti u izvrni. Prevodi se pomou programa
koji se nazivaju prevodioc (engl. compiler) i poveziva (engl. linker). Program prevodioc prevodi izvorni
kod iz vieg programskog jezika u mainski oblik te provjerava sintaksu napisanog izvornog koda. Ako
pronae pogreke (engl. compile-time error), ispisuje poruke i upozorenja o njima. Otkrivene pogreke
treba ispraviti pa ponovo pokrenuti program za prevoenje.
Prevoenjem nastaje datoteka objektnog koda (engl. object code), nastavka *.obj. Objektni kod nije
izvrni program i ne moe se direktno izvriti na raunaru. Objektni kod je meukorak do izvrnog
koda i uz ostalo omoguava ukljuivanje gotovih dijelova programa iz drugih datoteka.
Datoteke koje sadravaju gotove dijelove programa nazivaju se biblioteke (engl. libraries).
gotovi dijelovi programa mogu koristitit u drugim programima. Kada se koriste biblioteke
potrebno uvijek iznova zapisivati radnje (funkcije) koje se esto koriste. Takve se radnje u
ukljuuju iz postojeih biblioteka. Npr. moe postojati biblioteka formula za izraunavanje
geometrijskih likova ije formule mogu koristiti drugi programi.
Poveziva
Program koji povezuje objektnu datoteku s bibliotekama i drugim potrebnim
datotekama naziva se poveziva (engl. linker). Ako se pri povezivanju pojavi
greka (engl. link-time error), bit e ispisana poruka o tome.Greku valja
ispraviti pa ponovno pokrenuti prevoenje i povezivanje. Rezultat uspjenog
povezivanja je izvrna datoteka (*.exe). U naelu,izvrnoj datoteci nisu
potrebni nikakvi dodaci pa se moe izvravati i bez izvornog programa,
objektnih datoteka, prevodioca, povezivaa itd.
Takvi se
vie nije
program
povrina
Biblioteke
43
Programski jezici koriste imena kako bi se oznaile razliite cjeline koje ine program. Osim imena
varijabli, ovdje spadaju i imena funkcija, tipova, te makroa. C++ postavlja sljedea pravila za pravilno
kreiranje imena (ili identifikatora). Ime traba da se sastoji od jednog ili vie karaktera, od kojih bilo
koji moe biti slovo (tj, slova engleske abecede a-z i A-Z), broj (0-9) i znak "_", priemu na prvom
mjestu ne moe da bude broj. Uz to, velika i mala slova se razlikuju, tako da se, na primjer, varijable
zarada i Zarada razlikuju.
C++ ne postavlja nikakvo ogranienje na broj karaktera u nekom identifikatoru. Meutim, veina
implementacija ima ovo ogranienje, ali je ono toliko veliko da ne predstavlja nikakav problem (npr. i
do 255 karaktera). Treba imati na umu da postoje odreene rijei u C++ koje su rezervisane, tako da
identifikatori ne mogu uzimati njihova imena.
Te rijei se nazivaju rezervisane ili kljune rijei i date su u tabeli:
Tabela 1: Kljune (rezervisane) rijei u C++
6.3.Struktura programa
44
skupinu naredbi koje ine jednu cjelinu.Tijelo funkcije sainjavaju naredbe svaka naredba zavrava
taka-zarezom; Naredbe su niz instrukcija koje govore raunaru ta treba da radi.
Cout je skraenica od consol out predstavlja objekat tzv. izlaznog toka podataka output stream koji je
povezan sa standardnim ureajima za ispis tpino ekran. '<<' prestavlja znak redirekcije odnosno
umetanja koji pojednostavljeno moemo itati kao alji Sretan pocetak na ekran to ustvari
predstavlja niz znakova koje aljemo na ekran, takav niz znakova nazivamo string. System("PAUSE");
zaustavlja izvrenje programa, kako bismo mogli vidjeti rezultat njegovog rada. Bez ove linije program
bi se nakon pokretanja izvrio, a konzola bi se zatvorila veoma brzo, tako da bismo imali osjeaj kao da
program nije nita ni uradio.
Return 0 znai da naa funkcija vraa cijelobrojnu vrijednost 0. } zatvrena vitasta zagrada zatvara
tijelo funkcije.
Primjer2;
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 cout << " Sretan pocetak u C++ zeli Vam prof Smajo \n";
6 system("PAUSE");
7 return 0;
8 }
Naredba u datom primjeru alje string1 " Sretan pocetak u C++ zeli Vam prof Smajo " na tok
cout(output stream). Posljednji karakter u datom stringu (n) je karakter koji oznaava
novi red .Za istu svrhu moe se koristiti i funkcija endl, odnosno:
cout << " Sretan pocetak u C++ zeli Vam prof Smajo " << endl;
Tok (stream) je objekat koji izvrava ulazne i izlazne naredbe. Tok cout je standardni izlazni tok
(obino ekran) u C++ . Simbol << je izlazni operator (usmjeriva toka) kojem je lijevi operand izlazni
tok, a desni izraz. Ovaj operator upuuje desni operand na lijevi. Dakle, u ovom sluaju string "Sretan
pocetak u C++ zeli Vam prof Smajo /n" se alje na cout, tj. uzrokuje njegov ispis na ekranu i
pomjeranje usljedei red.
45
Prvi korak, C++ predprocesor ide kroz program i izvodi instrukcije koje su specificirane
predprocesorskim direktivama (npr. #include). Rezultat ovoga je modificirani tekst programa koji vie
ne sadri nikakve direktive.
Drugi korak, C++ kompajler prevodi programski kod. Kompajler moe biti pravi C++ kompajler, koji
pravi osnovni (asemblerski ili mainski) kod,ili samo prevodilac, koji kod prevodi u C jezik. U drugom
sluaju, rezultujui C kod se zatim prevodi kroz C kompajler kako bi se napravio osnovni kod. U oba
sluaja, rezultat moe biti nepotpun zbog toga to program poziva podprogramske biblioteke koje nisu
definisane u samom programu.
Trei korak, linker zavrava objektni kod njegovim povezivanjem sa objektnim kodom bilo kojeg
modula biblioteka, koji program moe pozvati.
Konaan rezultat je izvrna datoteka.
6.4.Varijable
Varijabla je simboliko ime za memorijsku lokaciju u koju se mogu pohraniti podaci, koji se naknadno
mogu pozvati. Varijable se koriste za uvanje vrijednosti podataka tako da se iste mogu koristiti u
raznim proraunima u programu. Sve varijable imaju dvije vane osobine:
Tip, koji se postavlja kada se varijabla definie (npr. cijeli broj, realni broj, karakter, ...). Kada
se jednom definie, tip varijable u C++ se ne moe promijeniti.
Vrijednost, koja se moe promijeniti davanjem nove vrijednosti varijabli.
Vrsta vrijednosti koja se moe pridruiti nekoj varijabli zavisi od njenog tipa. Na primjer, cjelobrojna
varijabla (int) moe uzeti samo vrijednosti cijelih brojeva (npr. -5, 13, ...).
Kada se varijabla definie, njena vrijednost je nedefinisana sve dok joj se ne pridrui neka.
Pridruivanje vrijednosti nekoj varijabli po prvi put naziva se inicijalizacija. Neophodno je da se svaka
varijabla inicijalizira prije nego se koristi. C++ podrava dvije vrste inicijalizacije: (i) inicijalizaciju
kopiranjem (eng. copy-initialisation) i (ii) direktna inicijalizacija (eng. directinitialisation).
Inicijalizacija kopiranjem koristi znak jednakosti, =, dok se direktna inicijalizacija izvodi pomou malih
zagrada, (), kao u sljedeim primjerima:
U oba sluaja varijabla broj je inicijalizirana na vrijednost 10. Treba napomenuti da inicijalizacija ne
predstavlja pridruivanje (iako se u inicijalizaciji kopiranjem koristi znak jednakosti), nego se deava
onda kada se varijabla definie i kada joj se da poetna vrijednost. S druge strane, pridruivanje
predstavlja ponitavanje trenutne vrijednosti varijable i zamjene novom.
Takoer je mogue da se varijabla definie i inicijalizira u isto vrijeme,to je vrlo praktino. Naredni
primjer pokazuje razlicite naine definisanja i inicijaliziranja varijabli.
1 #include <iostream>
2 using namespace std;
3 main()
4 {
5
int a,b,c;
6
float x = 4.32;
7
int e,f,g;
8
char ime;
9
e = 4;
10
f = g = 12;
11
ime = C
12 }
Da objasnimo
Linije 5, 7 i 8 pokazuju primjere definisanja varijabli a, b, c, zatim e, f, g i ime, respektivno. Varijable
e, f i g su inicijalizirane linijama 9 i 10, a varijabla ime u liniji 11. Istovremeno definisanje i
46
inicijalizacija data je u liniji 6 za varijablu x. Na kraju, treba napomenuti da veina autora proces
definisanja varijabli poistovjeuje sa procesom deklarisanja. Meutim, neki autori prave razliku izmeu
ovih pojmova. Naime, zbog situacija u kojima se u vie datoteka jednog te istog programa pristupa
istoj varijabli, C++ razlikuje pojmove definisanja i deklarisanja. Tako, definisanje varijable predstavlja
alociranje prostora za nju, te moguu inicijalizaciju. U jednom programu moe biti samo jedna
definicija varijable. S druge strane, deklaracija upoznaje program sa tipom i imenom varijable.
Definicija je time i deklaracija. Deklarisanje se izvrava na taj nain da se ispred tipa doda kljuna rije
extern. Sljedei primjer pokazuje razliku izmeu definisanja i deklarisanja neke varijable:
extern int broj;
int broj;
Osnovna razlika je u tome da se sa extern, odnosno procesom deklaracije,ne alocira prostor za datu
varijablu, nego samo upuuje na to da je varijabla definisana negdje u programu.
6.5.Memorija
Za pohranjivanje izvrnog koda kao i podataka sa kojima program manipulira,kompjuter ima na
raspolaganju RAM memoriju (eng. Random AccessMemory). Pri tome, memorija se moe zamisliti kao
neprekidan niz bita, od kojih svaki moe da pohrani binarni broj (0 ili 1). Memorija se obino dijeli na
grupe od 8 uzastopnih bita (ovo predstavlja bajt). Bajtovi su uzastopno adresirani, tako da je svaki bajt
jedinstveno predstavljen svojom adresom .C++ kompajler generie izvrni kod, koji mapira ulazne
veliine na memorijske lokacije. Na primjer, definicija varijable
int zarada = 500;
47
Treba napomenuti da je organizacija memorije i koritenje adresa koji se odnose na podatke veoma
vano za programera, dok tana binarna reprezentacija podataka koje on koristi to nije.Da bi program
bio koristan, mora komunicirati s ulazno/izlaznim ureajima (tastaturom, monitorom, diskom i sl.).
Komunikacija s ulazno/izlaznim ureajima se u programu C++ ostvaruje ulazno-izlaznim tokovima
(engl. input and output streams).
Svaki program prima podatke posredstvom ulazno-izlaznih tokova i rezultat predaje okolini
posredstvom ulazno-izlaznih tokova. S gledita programa sasvim je svejedno o kojem je ulaznom ili
izlaznom ureaju rije pa se svi podaci u program unose i iz programa predaju okolini na isti
nain.Ulazno-izlaznim tokovima se rukuje funkcijama biblioteka iostream.
Biblioteka iostream
iostream je biblioteka koja sadri niz ulazno-izlaznih funkcija koje omoguavaju rukovanje ulaznoizlaznim tokovima. Dvije funkcije koje su najee u upotrebi su cout i cin.
Cin ulazni tok
cin>>a>>b;
Posljedica funkcije unosa cin je prekid izvrenja programa sve dok se ne unese podatak i pritisne tipka
Enter (program "eka" da korisnik upie podatak). Vie ulaznih podataka moe se upisati u istome
redu, odvojeni prazninama (tek na kraju treba pritisnuti tipku Enter).
Funkcija cin usmjerava podatke s tastature na ulazni tok. Podaci se u ulazni tok umeu operatorom
unosa (>>).
48
Ispisat e broj 17
endl
U prethodnom bi se primjeru svi podaci ispisali u istome redu. Ako korisnik eli pregledniji ispis, tj.
nakon zavrenog ispisa jednog podatka pokaziva prebaciti na poetak sljedeeg reda treba koristiti
konstantu endl (takoer pohranjenu u biblioteci iostream).
Upotreba konstante endl
cout<<34<<endl;
cout<<a<<endl;
cout<<Mogu je i ispis niza znakova<<endl;
Cout<<34<<endl<<a<<endl<<Mogu je ispis niza znakova;
U oba primjera rezultat(ispis) e biti isti:
a
Mogu je ispis znakova
6.7.Komentari
Komentar je dio opisnog teksta koji objanjava neke aspekte programa. Kompajler u potpunosti
ignorie komentare u programu, tako da je jedina svrha koju komentar ima, da pomogne onome koji
ce itati program. C++ daje dvije mogunosti pisanja komentara:
34
49
Prvi nain se moe koristiti za komentar jedne i samo jedne linije (ili dijela jedne linije), kao to je to
demonstrirano u linijama 14 (cijeli red), te linijama 9-12 (dio reda). Drugim nainom se (koristei /* i
*/), pak, moe komentarisati tekst upisan u vie linija (linije 4-5).
Programski jezici koriste imena kako bi se oznaile razliite cjeline koje ine program. Osim imena
varijabli, ovdje spadaju i imena funkcija, tipova, te makroa. C++ postavlja sljedea pravila za pravilno
kreiranje imena (identifikatora):
ime treba da se sastoji od jednog ili vie karaktera, od kojih bilo koji moe biti slovo (tj, slova
engleske abecede a-z i A-Z), broj (0-9) i znak " ", pri emu na prvom mjestu ne moe da bude
broj.
velika i mala slova se razlikuju (zarada nije isto to i Zarada).C++ ne postavlja nikakvo
ogranienje na broj karaktera u nekom identifikatoru.
Meutim, veina implementacija ima ovo ogranienje, ali je ono toliko veliko da ne predstavlja nikakav
problem (npr. i do 255 karaktera). Ipak, treba imati na umu da postoje odreene rijei u C++ koje su
rezervisane, tako da identifikatori ne mogu uzimati njihova imena. Te rijei se nazivaju rezervisane
ili kljune rijei i neke od njih su date u Tabela 1: Kljune (rezervisane) rijei u C++.
Pored navedenih pravila o davanju imena varijablama, postoji i veliki broj prihvaenih konvencija, koje
se uglavnom koriste radi lakeg praenja programa.
Neke od vanijih su:
imena varijabli se obino piu malim slovima
6.8.Imena (identifikatori)
50
za davanje imena se obino koriste mnemonika imena, tj. imena koja poblie opisuju varijablu
ime moe da ima i vie rijei, koje su obino razdvojene donjom crtom,ili su direktno povezane
sa poetnim velikim slovom rijei koja se dodaje imenu.
No, bez obzira na konvencije, opte je pravilo da se jedna odreena konvencija konstantno koristi.
6.9.Tipovi podataka2
6.9.1.Organizacija numerikih brojeva u raunarskoj memoriji
Brojni sistemi
Da bi shvatilli tipove podataka neophodne za uenje programskog jezika,potrebno je osvrnuti se na
organizaciju numerikih podataka u raunarskoj memoriji.
Prvi pojam koji je potrebno savladati je brojni sistem.
Postavimo pitanje:ta predstavlja broj 342,i po emu se on razlikuje od brojeva 423 i 234 koji su
sastavljeni od istih cifara? Poznato je da svaka cifra unutar broja ima odreenu "teinu" (ovisno o
poziciji unutar broja) ,te moemo rei da je broj 342 skraeni zapis sljedeeg broja:
Ako o razmislimo zato je baza 10, shvati emo da ovakav izbor nema posebnog argumenta. Jedini
razlog je zapravo historijski zbog injenice da ovjek ima 10 prstiju i da je shvatio da za brojeve vee
od deset ne moe vie raunati na prste,nego mora izmisliti neki nain zapisa veih brojeva.
Brojni sistem s bazom 10 naziva se decimalni ili dekadski brojni sistem.
U digitalnim elektronskim sklopovima(u koje spadaju i raunari) brojni sistem sa bazom 10 se pokazao
nepogodnim za praktinu realizaciju.Baza 2 je,s druge strane,bila mnogo "laka" za implementaciju;
jer se dvije znamenke-0 i 1-mogu predstaviti kao "odsustvo" i prisustvo"neega(npr.ima struje-nema
struje ).
Ovaj brojni sistem od svega dvije znameke naziva se binarni.
Pokuajmo predstaviti neki broj u binarnom brojnom sistemu(po bazi 2).
npr.142=128+14=128+8+6=27 +23 +21 =(10001110)2
Dakle, 142 se u binarnom brojevnom sistemu pie kao 1001110.Gore opisana metoda pretvorbe
brojeva iz dekadskog u binarni brojni sistem nije pogodna za pretvaranje veih brojeva.
Baza je mogla biti bilo koji broj,jer se lako moe dokazati da se pozitivan broj moe zapisati u obliku.
Preuzeto i obraeno Diplomski rad Poreenje Pascala i C++ u nastavi Smajo Mekic
51
71
35
17
2
1
0
1
U C++ su ugraena dva osnovna tipa brojeva, i to: cijeli i realni brojevi.
Cijeli brojevi
Cijeli broj (engl. integer) se moe definisati pomou tipova short, int i long.
Jedina razlika je u tome to int koristi vie ili barem isto bajta kao short, a long koristi vie ili barem
isto bajta kao int . Ovo zavisi od kompjutera na kojem se radi.Konvencija je da cjelobrojne varijable
uzimaju u obzir i pozitivne i negativne brojeve (tada se kae da su oni tipa signed). Meutim, u sluaju
kada se koriste samo pozitivne vrijednosti, ukljuujui i 0, koriste se sa predznakom unsigned.Ovo
vrijedi i za realne brojeve.
Najee se pri definisanju cijelih brojeva koristi tip int, koji u kompjuteru obino zauzima 4 bajta
(mada kod nekih starijih kompjutera zauzima 2 bajta).
S obzirom da 4 bajta predstavlja 4*8 = 32 bita, i da prvi bit odreuje predznak broja, preostaje nam
31 bit da pohranimo vrijednost nekog broja. Na taj nain se tipom int mogu pohraniti svi brojevi vei
od najmanjeg negativnog broja
-231 = -2147483648
i manji od najveeg mogueg pozitivnog broja
-231 1 = 2147483647
Treba napomenuti da se cjelobrojne veliine u izvornom kodu mogu prikazati u jednom od tri brojna
sistema, i to: dekadskom, oktalnom i heksadecimalnom.
Pri tome, naravno, dekadski brojni sistem je sistem brojeva od 0-9,oktalni 0-7, i heksadecimalni (0-9,
A-F).
U jeziku C++ oktalne vrijednosti se piu tako da se ispred prve cifre broja napie broj 0, nakon ega
slijedi oktalni zapis broja, kao npr.
int broj = 010;
// broj 8 u dekadskom zapisu
U sluaju heksadecimalnog zapisa u C++ , ispred broja se pie 0x ili 0X,tj.
int broj = 0x0C; // broj 12 u dekadskom zapisu
Ipak, bez obzira koji od prikaza koristimo pri pridruivanju neke vrijednosti,na ekranu se ispisuje broj u
dekadskom brojnom sistemu.
Tako u sljedeem primjeru za svaki sluaj ispis je jednak broju 32:
int broj = 32;
cout << broj;
int broj = 040;
cout << broj;
U C++ su ugraeni prosti i sloeni tipovi podataka,ovdje emo objasniti proste tipove podataka.
6.9.2.Brojevi
52
Realni brojevi
Da bismo operisali sa realnim, tj. decimalnim, brojevima moemo koristiti varijable tipa float i double.
Tip double koristi vie bajta i time omoguuje vei opseg i veu tanost pri predstavljanju realnih
brojeva.
Naredni primjeri pokazuju upotrebu tipa float (analogno je za ostale tipove koji predstavljaju realne
brojeve):
float pi = 3.1415926;
float brzinaSvjetlosti = 2.997925e8;
float naboj = -1.6E-19;
U prvom sluaju koristi se klasini nain prikaza broja sa decimalnim zarezom,dok je u drugom i
treem sluaju koriteno nauno oznaavanje (eng.scientific). Pri tome, u naunom oznaavanju je
mogue koristiti i malo i veliko slovo "e", ali ne smije biti nikakvih praznina unutar broja (izmeu cifri i
slova e, te iza predznaka).
U sluaju da nam tanost na sedam decimala nije dovoljna, koristimo brojeve sa dvostrukom tanou,
tj. brojeve tipa double. U principu, za prikaz decimalnih brojeva najbolje je uvijek koristiti tip double,
jer je brzina obavljanja operacija sa ovim tipovima na dananjim kompjuterima podjednako velika
kao i sa tipom float.
Ogranienja brojevnih tipova
cout
cout
cout
cout
cout
cout
<<
<<
<<
<<
<<
<<
Simbolike konstante
Prethodni brojevni tipovi se koriste za definisanje varijabli koje mijenjaju svoju vrijednost u toku
izvravanja programa. Meutim, u C++ je mogue definisatii konstante, tj. veliine koje ne treba da
mijenjaju svoju vrijednost u toku izvrenja programa. Takve su na primjer, vrijednost brzina
svjetlosti, naboj elektrona, itd.Osnovni razlog zbog koritenja simbolikih konstanti je osiguranje od
promjene njihove vrijednosti. Naime, moe se desiti da u toku pisanja programa napiemo naredbu
koja mijenja vrijednost konstante (npr. broja ) i na taj nain napravimo veliku greku u daljem
proraunu.
Kako bismo izbjegli ovakve probleme, na raspolaganju nam je kvalifikator const, koji nam govori da se
radi o varijabli koja ne mijenja svoju vrijednost.
Ovaj kvalifikator se koristi na taj nain da se postavlja ispred tipa varijable, kao u primjeru:
const float pi = 3.1415926;
Ako bismo pokuali promijeniti vrijednost varijable pi (na primjer sa pi = 2*pi;) kompajler bi prijavio
greku.
Drugi nain definisanja neke konstante je pomou predprocesorske naredbe #define, kao u:
#define PI 3.1415926
Kao to je pokazano u dijelu o cijelim brojevima, na osnovu veliine memorije koju neki brojevni tip
zauzima, mogue je odrediti maksimalan i minimalan broj koji se sa njim moe prikazati. O tome kako
se odreuje veliina memorije koju zauzima neki objekat ili tip.
Ipak, koritenjem datoteka climits(Datoteka mora biti pozvana naredbom #include), za cjelobrojne, i
cfloat, za decimalne brojeve, mogue je nai ove vrijednosti. Na primjer, konstante INT_MIN i
INT_MAX daju najmanju i najveu vrijednost brojeva tipa int. Sline konstante postoje i za ostale
tipove, a sljedei dio programa daje njihovu primjenu:
53
Jedina razlika u koritenju ova dva pristupa je u tome to varijanta sa const omoguuje i simboliko
lociranje pogreaka pri debagiranju, dok to nije mogue sa drugom varijantom.
Takoer, bitno je napomenuti da se sve simbolike konstante moraju i inicijalizirati prilikom definisanja,
tj. pogreno je napisati:
const float pi; // greka!!!
Logiki tipovi
Logiki tipovi su vrlo kasno uvedeni u standardni jezik C++ . Prije nego se uveo tip za ovu vrstu
podataka, bool (od engleske rijei boolean, po matematiaru Booleu), u ovu svrhu su se koristili cijeli
brojevi 0 i 1 (mada se umjesto 1 mogao koristiti bilo koji broj razliit od 0).
Osnovna karakteristika logikih tipova je da mogu imati dvije vrijednosti,i to: tano i netano (eng.
true i false). Primjer definisanja logikih varijablije:
bool jaSamUcenik = true;
bool autoLeti = false;
Prilikom manipulisanja sa logikim varijablama (ispis, aritmetike operacije,i sl.), oni se predstavljaju
cjelobrojnim tipom int, i to: true se pretvara u 1,a false u 0. No, logikim varijablama se mogu
pridruiti i aritmetiki tipovi,tako da se svim brojevima razliitim od nule pridruuje true, a jednakim
nuli
false.
Karakteri (znakovi)
#include <iostream>
2 using namespace std;
3 main()
4{
5 char ch;
6 do
7{
8 cout << "Pritisnite K ili k za kraj,
9 a bilo koju tipku za nastavak \n";
10 cin >> ch;
11
12 if (ch != K && ch != k)
13 cout << "Zelite nastaviti?\n";
14 else
15 cout << "Kraj programa";
16 }while (ch != K && ch != k);
17 }
Pri pokretanju, ovaj program se nastavlja ako se unese bilo koji drugi karakter osim k ili K. Ako se,
pak, unese k ili K, program se zaustavlja. Problem nastaje ako korisnik programa pritisne samo tipku
ENTER. U tom sluaju objekat cin oekuje da se unese neka vrijednost, pa tek onda pritisne ENTER.
Varijabla karakter (znak) se definie tipom char (od engleske rijei character -karakter, znak) i
uglavnom se pie kao samo jedan znak upisan izmeu jednostrukih znaka navoda . Ona obuhvata
jedan jedini bajt koji sadri kod datog karaktera. Ovaj broj je numerika vrijednost i zavisi od sistema
kodiranja karaktera koji se koristi (to je zavisno od kompjutera). Najei sistem je ACSII
(eng. American Standard Code for Information Interchange). Na primjer,karakter A ima ASCII kod 65,
a karakter a 97.
Kao i cijeli broj i karakter moe da bude signed i unsigned. Tako, signed karakter moe da sadri
numerike vrijednosti izmeu -128 i 127, a unsigned 0do 255.
Sljedei primjer pokazuje upotrebu tipa char za jednoznakovne varijable:
54
Pitanja za utvrivanje:
1. Da li je mogue definisati vie varijabli jednom naredbom? Ako jeste,
dati primjer.
2. Koja je razlika izmeu tipova podataka unsigned int i int?
3. Koja je uloga include direktive?
4. Koliko main funkcija moe biti u programu?
5. ta predstavlja varijabla?
6. ta radi kompajler?
7. ta radi linker?
8. ta radi predprocesor?
9.ta je od navedenog ispravna definicija varijable:
a. int n=-100;
b. unsigned int i =-100;
c. signed int = 2.9;
d. long m=2,p=4;
10.Koje od navedenih rijei predstavljaju pravilne nazive varijabli:
a. identifier
b. dva 15
c. ukupna-plata
d. ukupna_plata
e) default
f) proc.program
11. Definii varijable koje predstavljaju sljedee veliine:
a. visina neke osobe
b. zarada neke osobe
c. broj rijeci u rjeniku
d. slovo u abecedi
12. Dati primjer starog (jedan red) i novog naina pisanja komentara.
13. Koju datoteku (header file) moramo pozvati u izvornoj datoteci da bi se koristile cout i cin?
14. Napisati naredbu koja dobiva numeriku vrijednost sa tastature i pridruuje je varijabli temp.
15. Kako se definiu brojevi u C++ ?
16. Kako se definiu znakovi u C++ ?
17. Kako se u C++ definiu logike varijable?
7.Operatori
Osim klasinih karaktera (slova i sl.), postoje i karakteri koji imaju posebnu namjenu (ne predstavljaju
karaktere koji se ispisuju). Oni se predstavljaju pomou tzv. escape-sekvenci, kao npr:
\n - novi red
\t - novi tabulator
\v - novi vertikalni tabulator
\b - backspace
\ - znak navoda (apostrof)
\" - dvostruki znak navoda
\\ - backslash (/)
\a - zvuni signal
Znakovne varijable se, ipak, najee koriste kao nizovi karaktera (eng. string)za ispis tekstova.
55
7.1.Aritmetiki operatori
C++ nudi pet osnovnih operatora, koji su sumirani u Tabeli.
Osim ostatka pri dijeljenju (%) svi aritmetiki operatori prihvataju mijeanje cijelih i realnih brojeva.
Openito, ako su oba operanda cijeli brojevi,i rezultat je cijeli broj. Meutim, ako je jedan od
operanada realan, onda je i rezultat realan (na primjer, tipa double; Ovakav nain konverzije u C++
naziva se implicitna konverzija).
Kada su oba operanda pri dijeljenju cijeli brojevi, rezultat je takoer cijeli broj (tzv. cjelobrojno
dijeljenje). U tom sluaju rezultat se zaokruuje na donju vrijednost, tj..
9/2 daje 4, a ne 4.5!
-9/2 daje -5, a ne -4.5!
ak i u sluaju kada je rezultat dijeljenja definisan kao realan broj, kao u sljedeem primjeru
int cijena = 100; int volumen = 80;
56
Ipak, stari nain pisanja se ne preporuuje u pisanju programa koji e se kompajlirati na C++
kompajlerima.
Operator % daje ostatak pri dijeljenju dva cijela broja (oba operanda moraju biti cijeli brojevi!!!), npr.
13%3 daje 1.
Prilikom koritenja aritmetikih operatora veoma vano mjesto zauzima pojam preljeva. Naime, u
sluaju da zbir brojeva prelazi maksimalno dozvoljenu vrijednost, dobivena vrijednost moe biti
negativna. Ovaj fenomen se lako moe pokazati na slici ako se za tip int pretpostavi da ima 2 bajta, tj.
16 bita (to znai da je maksimalan pozitivan broj jednak 215 = 32767).
7.2.Relacijski operatori
C++ nudi est relacijskih operatora za raunanje brojnih veliina.
Pri tome, treba zapamtiti da se operatori <= i >= mogu koristiti samo u tom obliku, a da =< i => ne
znae nita u ovom kontekstu.
Operandi nekog relacijskog operatora moraju biti brojevi. No, i karakteri su ispravni operandi poto
predstavljaju brojnu vrijednost .
Relacijski operatori se ne smiju korisiti za poreenje stringova, poto se u tom sluaju porede njihove
adrese, a ne sadraj. U tom sluaju, rezultat je neodreen. Ipak, postoje funkcije koje mogu porediti i
leksikografsku razliku dva stringa.
Dakle, ukoliko neku varijablu koja ima vrijednost 32767 uveamo za samo 1, vrijednost koju dobivamo
je -32768 (!!!), odnosno za jedan vea od najvee mogue u smjeru kazaljke na satu na slici.
57
7.3.Logiki operatori
Za kombinovanje logikih izraza C++ nudi tri logika operatora.
Slino relacijskim operatorima, rezultat pri koritenju logikih operatora je 0 (false) ili 1 (true).
Za razliku od logikog i i logikog ili operatora, koji su binarni operatori, logika negacija je unarni
operator, tj. ima samo jedan operand kojem daje negaciju vrijednosti koju posjeduje.
C++ obezbijeuje est bitovnih (eng. bitwise) operatora koji se koriste za manipulisanje pojedinanim
bitovima cjelobrojnih podataka.
Bitovni operatori su definisani samo za cjelobrojne (int, long int) operand i tretiraju ih kao sekvence
bita. Tako, binarna negacija ( - tilda) predstavlja unarni operator koji mijenja stanje bita operanda, tj.
svi bitovi koji su jednaki 0 postavlja u 1, a sve bitove koji su jednaki 1 u 0. Binarno i uporeuje
odgovarajue bitove svojih operanada i kao rezultat daje 1 ako su oba bita 1, a 0 u ostalim
sluajevima. Binarno iskljuivo ili uporeuje odgovarajue bitove svojih operanada i kao rezultat daje 1
ako su oba bita razliita, a 0 u ostalim sluajevima.
7.4.Bitovni operatori
58
Operatori pomaknuti lijevo i pomaknuti desno kao lijevi operand uzimaju sekvencu bitova, a kao desni
neki cijeli broj n. Prvi operator daje kao rezultat sekvencu bita koja je jednaka lijevom operandu, ali
koja je pomjerena n bitovnih pozicija ulijevo. Drugi operator ima istu funkciju, s tom razlikom to
pomjera sekvencu bita za n pozicija udesno.
7.5.Inkrementalni i dekrementalni operatori
Takozvani auto inkrementalni (++) i auto dekrementalni () operatori obezbijeuju prigodan nain za
poveavanje, odnosno smanjivanje brojne varijable za 1. Upotreba ovih operatora je sumirana u
Tabeli, pri emu se pretpostavlja da je
int k = 5;
Kao to se vidi, oba operatora se mogu koristiti u prefiksnom i postfiksnom obliku. Razlika je velika, jer
kada se operator koristi u prefiksnom obliku prvo se primjenjuje operator, a onda se u izrazu koristi
rezultat. Kada se koristi u postfiksnom obliku, prvo se rauna izraz, a onda se primjenjuje operator.
Oba operatora se mogu primijeniti kako na cjelobrojne, tako i na realne brojeve, iako se ova
karakteristika veoma rijetko koristi na realnim brojevima.
7.6.Operatori pridruivanja
Kako operator pridruivanja sam po sebi predstavlja izraz ija se vrijednost pohranjuje u lijevi operand,
on se moe koristiti kao desni operand za narednu operaciju pridruivanja, odnosno moe se napisati:
Operator pridruivanja (=) se koristi za pohranjivanje vrijednosti na neku memorijsku lokaciju (koja je
obino pridruena nekoj varijabli). Lijevi operand operatora treba biti neka vrijednost, npr.
lijevaVrijednost, dok desni operand moe biti proizvoljni izraz. Desni operand se izrauna i pridrui
lijevoj strani.
Pri tome lijevaVrijednost predstavlja bilo ta to zauzima neku memorijsku lokaciju na koju se moe
pohraniti neka veliina; moe biti varijabla, te zasnovana na pointerima i referencama.
Operator pridruivanja moe imati mnogo varijanti, koje se dobivaju njegovim kombinovanjem sa
aritmetikim operatorima (mogua je kombinacija i sa bitovnim operatorima).
59
Dakle, typedef definicija poinje kljunom rijei typedef, nakon ega se ispisuje tip podatka i
identifikator. Pri tome, identifikator ne uvodi novi tip podatka, nego samo sinonim (nadimak) za
postojei tip. Ovaj identifikator se moe koristiti bilo gdje u programu u kojem bi se mogao koristiti i
sam tip.
Na primjer, sljedei primjer pokazuje koritenje sinonima prirodni, za prirodne, tj. nenegativne cijele
brojeve.
typedef unsigned int prirodni;
Ukoliko bismo eljeli definisati prirodni broj N koritenjem imena prirodni, piemo:
prirodni N;
Treba napomenuti da se u posljednjem primjeru identifikator prirodni moe koristiti kao tip u nekoj
drugoj typedef deklaraciji. Inae, typedef imena se koriste kako bi se smanjila kompleksnost ispisivanja
pojedinih tipova, kao to su kompleksne deklaracije imenika, pointera na funkcije, te pointera na
funkcijske lanove klasa.
7.9.sizeof operator
Sizeof operator slui za raunanje veliine bilo kojeg podatka ili tipa. To je unarni operator, koji za
operand moe imati tip (npr. int, char, . . . ) ili izraz, a kao rezultat daje broj bajtova koji operand
zauzima u memoriji raunara.
Ovaj rezultat je u potpunosti zavisan od raunara na kojem se radi. Naredni primjer ilustruje koritenje
ovog operatora za raunanje veliine osnovnih tipova podataka.
#include <iostream>
2 using namespace std;
3
4 int main (void)
5{
Kljuna rije typedef omoguava definisanje novih imena (sinonima) za postojee tipove podataka.
Opta formula ima oblik:
typedef tip novo_ime_tipa;
60
6 cout << "char size = " << sizeof(char) << " bytes\n";
7 cout << "short size = " << sizeof(short) << " bytes\n";
8 cout << "int size = " << sizeof(int) << " bytes\n";
9 cout << "long size = " << sizeof(long) << " bytes\n";
10 cout << "float size = " << sizeof(float) << " bytes\n";
11 cout << "double size =" << sizeof(double) << " bytes\n";
12 cout << "HELLO size = " << sizeof("HELLO") << " bytes\n";
13 system("pause");
14 }
7.10.Hijerarhija operatora
Na primjer, u izrazu
61
Pitanja za utvrivanje:
1. Koji od logikih operatora su unarni, a koji su binarni?
2. ta radi inkrement operator?
3. ta radi dekrement operator?
4. Objasni ta radi sljedea naredba:
cout >> --broj!
5.Dodati zagrade sljedeim izrazima tako da se pokae kojim redom se izraunavaju
pojedini operatori:
a) (n <= p + q && n >= p - q || n == 0)
b) (++n * q / ++p - q)
c) (n | p & q p 2 + q)
d) (p < q ? n < p ? q * n - 2 : q / n + 1 : q - n)
6. ta e biti vrijednost sljedeih varijabli nakon inicijalizacije:
a) double d = 2 * int(3.14);
b) long k = 3.14 - 3;
c) char c = a + 2;
d) char c = p + A - a;
7. Tano ili netano: u naredbi pridruivanja, vrijednost sa lijeve strane od znaka jednako je uvijek
jednako vrijednosti na desnoj strani.
8. Tano ili netano: potpuno je normalno koristiti razliite tipove podataka
u istom aritmetikom izrazu.
9. Objasniti pojam preljeva?
10. Napisati naredbu koja pomou operatora pridruivanja poveava vrijednost varijable temp za 23.
Napisati istu naredbu bez operatora pridruivanja.
11. Relacijski operator;
a) Pridruuje jedan operator drugom
b) Daje Boolean rezultat
c) Poredi dva operanda
d) Logiki kombinuje dva operanda
12. Napisati izraz koji koristi relacijski operator koji ima vrijednost true ako varijabla var1 nije jednaka
varijabli var2.
13. Operatori && i ||:
a) Porede dvije numerike vrijednosti
a=b+c*d;
prvo se rauna c*d, jer znak mnoenja * ima vei prioritet od znaka sabiranja + i znaka pridruivanja
=. Rezultat mnoenja se zatim dodaje varijabli b, jer operacija sabiranja ima vei prioritet od operacije
pridruivanja.
Ovakav nain definisanja hijerarhije je neophodan, jer se pojedini operatori koriste za vie namjena.
Takav primjer je znak plus, +, koji se moe koristiti kao binarni operator za sabiranje, unarni operator
za promjenu znaka nekog broja, ali i kao operator za uveavanje (postfiks i prefiks inkrement). Ako, na
primjer, elimo sabrati dva broja, pri emu je drugi broj prethodno uvean za
jedan, imamo izraz:
c=a+ ++b;
No, moe se desiti da umjesto prethodnog izraza napiemo:
c=a+++b;
to bi, imajui na umu hijerarhiju operatora, kompajler razumio kao:
c=a++ +b;
U ovom sluaju, prvo se izvrava sabiranje brojeva a i b, a zatim se broj a povea za jedan, to
naravno nismo eljeli uraditi.
Treba napomenuti da u sluaju dvoumljenja oko prioriteta operatora, najbolje je koristiti zagrade, i na
taj nain zaobii ugraenu hijerarhiju. Tako bi ranije primjere mogli napisati u obliku:
a=b+(c*d);
odnosno
c=a+(++b);
62
8.Naredbe
Ovim naslovom opisat emo razne oblike C++ naredbi koje slue za pisanje programa.
Kao i veina ostalih programskih jezika, C++ nudi razliite vrste naredbi koje se koriste u razliite
svrhe. Tako se deklaracione naredbe koriste za definisanje varijabli, naredbe pridruivanja za
jednostavne proraune, itd.
8.1.Jednostavne i sloene naredbe3
Jednostavna naredba je svaka naredba koja zavrava taka-zarezom (;). Definicije varijabli i izrazi koji
zavravaju sa taka-zarezom su samo neki od primjera, kao u sljedeim sluajevima:
int i;
// deklaraciona naredba
++i;
// naredba sa popratnom pojavom
double d = 10.5;
// deklaraciona naredba
d + 5;
// beskorisna naredba
Najjednostavniji oblik naredbe je linija koja sadri samo taka-zarez, tzv.null-naredba. No, i ovakva
naredba ponekad ima smisla.
Mnogostruke naredbe se mogu kombinovati u sloene naredbe kada se grupiu izmeu velikih zagrada
({}), kao na primjer:
63
8.2.Naredba if
Ponekad je poeljno da se izvri odreena naredba koja zavisi od ispunjenja nekog uslova. Upravo tu
mogunost prua if naredba, iji je opti oblik:
if (izraz)
naredba;
Prvo se izvrava izraz, i ako je rezultat razliit od nule izvrava se naredba. U suprotnom, nita se ne
deava.
64
Pored prethodno navedenih varijanti, postoji i ugnijedena if naredba, u kojoj se javlja vie od dvije
alternative. Primjer takve varijante je, recimo,
izraunavanje cijene telefonskog rauna:
if (vrijemePoziva > 7 && vrijemePoziva < 19) {
if (duzinaPoziva <= 60)
cijena = duzinaPoziva * tarifa1;
else
cijena = 60 * tarifa + (duzinaPoziva - 60) * tarifa2;
} else
cijena = osnovnaCijena;
Kao to se vidi unutar prve if naredbe, koja provjerava uslov da li je poziv izvren u periodu 7.00-19.00
sati, nalazi se jo jedna if naredba. Ova naredba ima za cilj da provjerava duinu poziva, i na osnovu
toga formira cijenu istog.
U sluaju da je poziv izvren izvan perioda 7.00-19.00, cijena se formira na osnovu osnovne cijene
poziva.
Primjer 2
Treba unijeti cijeli broj razliit od 0 pa provjeriti da li je negativan ili pozitivan. U oba sluaja ispisati
apsolutnu vrijednost broja.
65
to ako korisnik ne proita uputu paljivo, pa unese broj 0? Rezultat nee biti ispravan:
Ako je vrijednost uvjeta logika istina izvodi se prvi blok. Nakon njegova zavretka izvoenje se
nastavlja od prve naredbe iza drugog bloka.
Ako je vrijednost uvjeta logika neistina, preskae se prvi blok i izvodi se drugi blok (iza naredbe else).
Nakon njegova zavretka izvoenje se nastavlja od prve naredbe iza drugog bloka.
Primjer3.
Primjer je rijeen uz pomo if else naredbe.
Ako je (a<0) izvrit e se prvi blok naredbi.
Ako je (a>0), preskae se prvi blok i izvodi se drugi blok naredbi.
66
Uneseni broj treba provjeriti. Ako je unesena 0, korisnika valja upozoriti, a potom korisnik mora unijeti
novi broj koji je razliit od 0.
Da bi to bilo mogue, potrebna je naredba koja omoguava nastavak odvijanja programa od odabrane
naredbe.
Naredba goto
Naredba goto omoguava nastavak odvijanja programa od odabrane naredbe.
Naredba na koju se eli skoiti, od koje se eli nastaviti odvijanje programa, moe biti bilo gdje u
programu.
Opi oblik naredbe:
goto oznaka_naredbe;
estom upotrebom naredbe goto teko je slijediti tok odvijanja programa to oteava otkrivanje
pogreaka.
Naredbu goto stoga treba izbjegavati i nastojati zadatak rjeiti na drugi nain, pomou petlji koje e
biti objanjene kasnije.
Nredba if-else if-else
Naredbu od koje se eli nastaviti odvijanje programa treba oznaiti oznakom iza koje dolazi znak
dvotake.
oznaka_naredbe:naredba;
goto oznaka_naredbe;
67
Za viestruko uvjetno grananje koristi se naredba if else if - else.Broj pustavljenih uvjeta nije
ogranien.
Primjer4
Ako je vrijednost prvog uvjeta logika istina, izvodi se prvi blok naredbi. Nakon njegova zavretka
izvoenje se nastavlja od prve naredbe iza zadnjeg bloka naredbi.
Ako je vrijednost prvog uvjeta logika neistina, provjerava se drugi uvjet.
Ako je on logika istina, izvodi se drugi blok naredbi, a potom prva naredba iza zadnjeg bloka naredbi.
Ako je vrijednost drugog uvjeta logika neistina, provjerava se trei uvjet, i td.
Provjere se tako redom nastavljaju sve do naredbe else.
Ako do tada niti jedan od uvjeta nije imao vrijednost logike istine, izvrit e se zadnji blok naredbi koji
se nalazi iza naredbe else.
68
Treba upisati prirodni broj pa provjeriti da li je vei ili manji od 100, te da li je paran ili neparan.
8.3.Naredba switch
Naredba switch-case omoguava jednostruko grananje koje ovisi o vrijednosti postavljenog uvjeta.
Za razliku od viestrukog grananja naredbom if u kojoj su uvjeti logiki izrazi, u naredbi switch-case
uvjet je cjelobrojan izraz ili cjelobrojna varijabla.Grananje swich-case.
Viestrukim uvjetnim grananjem provjerava se da li je broj vei, manji ili jednak 100.
Dvostrukim uvjetnim grananjem (neovisno o tome da li je broj vei ili manji od 100) provjerava se
parnost broja.
Parnost se provjerava operatorom modulo (ostatak dijeljenja s 2 se usporeuje s 0).
69
Prvo se rauna izraz (switch tag), a zatim se rezultat poredi sa svakom od numerikih konstanti
(labele), po redu kako se javljaju, dok se ne poklopi sa jednom od komponenti. Nakon toga se
izvravaju naredbe koje slijede.
Izvravanje se izvodi sve dok se ne naie na naredbu break ili dok se ne izvre sve naknadne naredbe.
Posljednji sluaj (default) moe, a i ne mora da se koristi, i pokree se ako nijedna od prethodnih
konstanti nije zadovoljena.
Koritenje ove naredbe dat je u sljedeem primjeru, koji odreuje opseg osvojenih bodova na ispitu na
osnovu dobijene ocjene.
70
#include <iostream>
using namespace std;
main()
{
int ocj;
cout << "Unesite ocjenu: ";
cin >> ocj;
switch (ocj)
{
case 5:
cout << "Imate 90 100 bodova" << endl;
break;
case 4:
cout << "Imate 80 89 bodova" << endl;
break;
case 3:
cout << "Imate 70 79 bodova" << endl;
break;
case 2:
cout << "Imate 60 69 bodova" << endl;
break;
default:
cout << "Imate ispod 60 bodova" << endl;
system(Pause);return 0;
}
}
Primjer 5
Treba izraunati ukupni otpor za otpore R1 i R2, ovisno o tome da li su spojeni serijski ili paralelno.
Za odabir serijskog spoja korisnik upisuje 1, a za paralelnog 2.
Valja nainiti dvije grane (serijski spoj-1, paralelni-2).
Ovisno o tome to korisnik upie (broj 1 ili broj 2) izvrit e se jedna od dvije grane.
U sluaju da korisnik unese vrijednost koja nije 1 ili 2, ispisat e se upozorenje.
71
8.4.Naredba for
72
For petlja se najee koristi ako se dijelovi programa trebaju ponoviti unaprijed poznati broj puta.
Svaka for petlja ima svoju kontrolnu varijablu.Njena se vrijednost svakim prolaskom kroz petlju
mijenja ovisno o vrijednosti prirasta. Kontrolnu varijablu petlje potrebno je prije ulaska u petlju
deklarirati. U petlji se najprije zadaje vrijednost poetnog stanja kontrolne varijable petlje (poetno
stanje). Po zadavanju poetnog stanja kontrolne varijable petlje zapisuje se uvjet.
Rezultat uvjeta je podatak tipa bool (0 ili 1).Blok naredbi se izvrava sve dok je vrijednost uvjeta
jednaka logikoj istini (1).
Kad vrijednost uvjeta postane neistina (0) petlja se prekida.
Naredba for (for petlja) je slina naredbi while, ali ima dvije dodatne komponente:
(i) izraz koji se izraunava samo jednom prije nekog prorauna koji se ponavlja, i (ii) izraz koji se
izraunava jednom na kraju svake iteracije. Opti oblik naredbe for je:
for (izraz1; izraz2; izraz3)
naredba;
Prvo se izraunava izraz1. Svakim prolaskom kroz petlju se izraunava izraz2.
Ako je rezultat razliit od nule izraunava se izraz3. U suprotnom petlja se zaustavlja. Oblik while
petlje koja je ekvivalentna do petlji je:
izraz1;
while (izraz2) {
naredba;
izraz3;
}
Naredba for se najee koristi u situacijama kada se neka varijabla poveava ili smanjuje za neku
veliinu u svakoj iteraciji, odnosno kada je broj iteracija unaprijed poznat. Sljedei primjer rauna zbir
svih brojeva od 1 do n:
Prvo se vrijednost zbira inicijalizira na vrijednost nula (sum=0;). Prvi izraz u petlji for predstavlja
poetnu vrijednost brojaa i, koja je jednaka 1. Nakon toga, provjerava se uslov i <= n. Ako je uslov
ispunjen, izraunava se naredba.
U ovom sluaju, radi se o jednostavnoj naredbi (sum += i;), tako da nema potrebe za koritenjem
velikih zagrada. Nakon izvrenja naredbe, izraunavase trei izraz, ++i, i postupak nastavlja sve dok
se ne ispuni uslov i <= n.
Treba naglasiti da se umjesto prefiks inkrementa, kao trei izraz mogao staviti i postfiks inkrement
(i++).
Bilo koja od komponenti u petlji moe biti prazna. Na primjer, ako se uklone prvi i trei izraz, onda je
do petlja
for (; i != 0;)
bilo-sta;
ekvivalentna sa while petljom
. while (i != 0)
bilo-sta;
Uklanjanje svih izraza u petlji daje beskonanu petlju:
for (;;) // beskonana petlja
bilo-sta;
Poto petlje predstavljaju naredbe, mogu se pojaviti unutar drugih petlji (tzv. ugnijedene petlje).
Klasini primjer je koritenje dvostruke petlje pri ispisu tablice mnoenja brojeva do 10:
for (int i = 1; i <= 10; ++i){
for (int j = 1; j <= 10; ++j)
cout << setw(5)<< i*j;
cout << endl;
sum = 0;
for (int i = 1; i <= n; ++i)
sum += i;
73
}
U liniji sa ispisom (cout << setw(5)<< i*j;) koriten je operator za manipulisanje setw(), koji se koristi
za formatirano ispisivanje. Naime, brojka unutar zagrada (u gornjem primjeru to je broj 5) predstavlja
najmanji prostor predvien za ispis podataka u izlaznom toku.
Primjer 1: Ispii prvih 20 prirodnih brojeva, svaki u svom redu.
Na kraju ispii i vrijednost varijable i nakon izvoenja petlje.
Rjeenje:
74
Rjeenje:
75
Naredba while (naziva se i while petlja) omoguuje ponavljanje neke naredbe sve dok je ispunjen neki
uslov. Opti oblik ove naredbe je:
while (izraz)
naredba;
Prvo se izraunava izraz (naziva se i uslov petlje). Ako je rezultat razliit od nule tada se izvrava
naredba (naziva se i tijelo petlje) i cijeli proces se ponavlja.
U suprotnom, proces se zaustavlja.
Na primjer, ako elimo izraunati zbir svih brojeva od 1 do n, upotreba while naredbe ima oblik:
i = 1;
sum = 0;
while (i <= n)
sum += i++; \\ili {sum = sum + i; i = i + 1;}
Tijelo petlje while moe biti prazno, tj. sa null-naredbom, ali to nije uobiajeno.
Ipak, sljedei primjer, problem nalaenja najveeg neparnog faktora nekog broja, pokazuje i jedan
takav sluaj.
while (n % 2 == 0 && n /= 2)
Ovdje uslov petlje izvrava sve neophodne kalkulacije, tako da nema potrebe za tijelom.
Primjer:Za niz od 5 razliitih brojeva ispii zbir.
8.5.Naredba while
76
Naredba do (naziva se i do petlja) je slina naredbi while, osim to se prvo izvrava tijelo petlje, a
zatim se provjerava uslov. Opti oblik naredbe je:
do
naredba;
while (izraz);
Prvo se izvrava naredba, a zatim provjerava izraz. Ako je izraz razliit od nule cijeli proces se
ponavlja. U suprotnom, petlja se zaustavlja.
Naredba do se manje koristi nego while petlja. Obino se koristi kada se tijelo petlje mora izvriti
najmanje jedanput bez obzira na ispunjenje uslova. Takav primjer je, recimo, ponovljeno unoenje
nekog broja u primjeru izraunavanja njegovog kvadrata sve dok se ne unese broj 0:
do {
cin >> n;
cout << "Kvadrat broja " << n << " je" << n * n << "\n";
} while (n != 0);
Za razliku od while petlje, do petlja se nikada ne koristi sa praznim tijelom prvenstveno zbog jasnoe.
Primjer:Za niz prirodnih brojeva od 1-N ispii sumu (zbir) neparnih.
8.6.Naredba do
77
Pitanja za utvrivanje:
1. Koja od petlji (for, while, do) se izvrava barem jednom?
2. Koja od petlji je najbolji izbor kada je broj iteracija poznat?
3. Napii naredbe za sljedee:
a) provjera da li je broj neparan,
b) provjera da li je broj neparan i negativan,
c) dati apsolutnu vrijednost nekog broja.
4. Pretpostavljajui da je n = 20, ta e biti rezultat sljedeeg koda:
if (n >= 0)
if (n < 10)
cout << "n je malo\n";
else
cout << "n je negativno\n";
5. Opii svrhu tri naredbe unutar for petlje.
6. Tano ili netano: inkrementalni izraz unutar for petlje moe smanjiti varijablu petlje.
7. Blok nekog koda je odvojen .....
8. Koliko puta se izvrava tijelo do petlje?
9. Dati sintaksu naredbe switch!
78
9.Funkcije
1
2
3
4
5
6
7
int rezultat = 1;
for (int i = 0; i < eksponent; ++i)
rezultat *= baza;
return rezultat;
Linija 1 definie interfejs funkcije. Ona poinje tipom funkcije koji se vraa;u ovom sluaju radi se o
cjelobrojnoj vrijednosti, int . Nakon toga je dato ime funkcije, Stepen, a zatim lista njenih parametara.
Funkcija Stepen ima dva parametra (baza i eksponent) koji su tipa int. Pri tome, uzeto je da varijabla
eksponent ima samo pozitivne vrijednosti (unsigned int), jer je i funkcija Stepen cjelobrojnog tipa int1.
Sintaksa parametara je slina sintaksi definisanja varijabli, tj. nakon tipa daje se ime parametra, osim
to se parametri ne odvajaju zarezom, kao u:
Funkcije obezbijeuju prikladan nain pakovanja nekog numerikog "recepta", koji se moe koristiti
koliko god je to puta potrebno, i predstavljaju okosnicu tehnike proceduralnog programiranja.
Na primjer Ja u vam dati jedan broj. Vi trebate tom broju dodati 2 i proizvod pomnoiti sa datim
brojem .
Sline instrukcije moete dati i kompjuteru izraene na nekom programskom jeziku. Tada oekujete
da broj x unesete, da maina izrauna x + 2, zatim (x + 2) * x.
Za dati ulaz x maina e proizvesti jedinstven izlaz
broj ((x + 2) * x).
U matematici, proces koji, za dati ulaz (odreenog tipa), proizvodi jedinstven izlaz naziva se funkcija.
Efekt procesa obrade na raunaru moe se posmatrati kao evaluacija funkcija. Zato su funkcije
najvanija matematika tema u oblasti kompjuterske obrade.
9.1.Definicija
79
Zagrada { u liniji 2 predstavlja poetak tijela funkcije. U liniji 3 definisana je lokalna varijablu rezultat.
Stepen varijable baza na varijablu eksponent pomou for petlje se rauna u linijama 4 i 5. Rezultat se
pohranjuje u varijablu rezultat
(linija 5). U liniji 6 vraa se vrijednost rezultat kao rezultat funkcije. Zagrada } u liniji 7 predstavlja
kraj tijela funkcije.
Naredni primjer pokazuje kako se funkcija poziva (bez definicije funkcije).
Posljedica poziva funkcije je da se vrijednosti argumenata 2 i 8 pridruuju parametrima baza i
eksponent, respektivno, a zatim se rauna tijelo funkcije.
1 #include <iostream>
2 using namespace std;
3
4 main(void){
5 cout << "2 ^ 8= " << Stepen(2,8) << \n;
6}
80
1 #include <iostream>
2 using namespace std;
3
4 double Stepen (int baza, int eksponent);
5 // deklarisanje funkcije
6
7 /* moguce je funkciju daklarisati i na sljedeci nain
8 double Stepen (int, int);
9 */
10
11 main ()
12 {
13 int a,b;
14 cout << "Unesi bazu:";
15 cin >> a;
16 cout << "\nUnesi eksponent:";
17 cin >> b;
18 cout << a<<"^" <<b<<" = " << Stepen(a,b) << \n;
19 system("PAUSE");
20 }
21
22 double Stepen (int baza, int eksponent)
23 {
24 double rezultat = 1;
25
26 for (int i = 0; i < eksponent; ++i)
27 rezultat *= baza;
28 return rezultat;
29 }
Dakle, funkcija je definisana u liniji 4, koristei njen potpis. Vano je napomenuti da je u ovom sluaju
neophodno staviti taka-zarez (;) nakon definisanja, jer linija 4 predstavlja naredbu. Sjetimo se da se
nakon definisanja funkcije ne stavlja taka-zarez nakon zagrade }, koja zatvara tijelo funkcije.
itava definicija funkcije data je linijama 22-29.
Primjer 3.
Radi preglednosti veoma je korisno sakupiti sve funkcije u posebne datoteke, i umjesto njihovog
definisanja u sklopu izvrne datoteke, treba samo proitati tu datoteku. Na primjer, ako je definicija
funkcije Stepen data u datoteci
StepenInt.h,tj.
\\ sadrzaj datoteke StepenInt.h
int Stepen (int baza, int eksponent)
{
int rezultat = 1;
for (int i = 0; i < eksponent; ++i)
rezultat *= baza;
kao to je pokazano u narednom primjeru. Takoer je mogue izostaviti nazive parametara u definiciji,
ali to
nije preporuljivo.
81
return rezultat;
}
onda prethodni program ima oblik:
#include <iostream>
#include StepenInt.h
using namespace std;
main ()
{
int a,b;
cout << "Unesi bazu:";
cin >> a;
cout << "\nUnesi eksponent:";
cin >> b;
cout << a<<"^" <<b<<" = " << Stepen(a,b) << \n;
system("PAUSE");
}
Ovdje treba paziti gdje se datoteka StepenInt.h nalazi. U primjeru koji je dat, ona se nalazi u istom
direktoriju kao i izvrna datoteka. U suprotnom, treba dati tanu lokaciju iste (eng. path).
C++ podrava dva oblika parametara: vrijednost i referencu. Parametar po vrijednosti prima kopiju
vrijednosti argumenata koja im se prenosi. Kao posljedica toga, ako funkcija napravi bilo kakvu
promjenu na parametrima, ovo nee promijeniti vrijednosti argumenata. Na primjer, u programu:
#include <iostream>
using namespace std;
void Funkcija (int broj)
{
broj = 0;
cout << "broj = " << broj << \n;
}
int main ()
{
int x = 10;
Funkcija(x);
cout << "x = " << x << \n;
system("PAUSE");
return 0;
}
kao lokalna varijabla u funkciji. Kada se funkcija pozove i vrijednost x se prenese,
varijabla broj primi kopiju vrijednosti varijable x. Kao rezultat toga, iako varijabla broj u funkciji
mijenja vrijednost na 0, to nece utjecati na varijablu x. Program e dati sljedei izlaz:
broj = 0;
x = 10;
Za razliku od parametra po vrijednosti, parametar po referenci prima argumentkoji se prenosi i sve
obavlja direktno na njemu. Bilo koja promjena parametra po referenci u samoj funkciji,direktno se
odnosi i na argument, tj. i on se mijenja. Da bismo definisali parametar po referenci, potrebno je
dodati simbol & (ampersand) ispred varijable koja je parametar u interfejsu funkcije, tj. u prethodnom
primjeru interfejs funkcije. Funkcija ima oblik:
void Funkcija (int &broj)
9.2.Parametri i argumenti
82
Mogue je simbol & staviti i iza tipa varijable broj, kao u void Funkcija (int& broj),i na programeru je da
odabere nain koji mu vie odgovara. U principu, vano se uvijek drati istog pravila, ako ni zbog cega
drugog onda zbog preglednosti programa.
U kontekstu pozivanja funkcija, a na osnovu prethodno iznesenog, razlikujemo dvije vrste
pridruivanja: pridruivanje prema vrijednosti i pridruivanje prema referenci. U praksi (u pogledu
funkcija) se mnogo vie koristi pridruivanje prema vrijednosti.
9.3.Globalne i lokalne varijable
Za sve to se definie izvan programskog podruja (scope) se kae da ima globalni karakter. Tako, sve
funkcije koje smo do sada koristili predstavljaju globalne funkcije. No, i varijable se mogu definisati u
globalnom podruju, tj.izvan svih funkcija koje se koriste u programu, ukljuujui i funkciju main.
Na primjer:
int godina = 1994;
// globalna varijabla
int Maksimum (int,int);
// globalna funkcija
int main (void){
// globalna funkcija
//...
}
Treba zapamtiti da su globalne varijable automatski inicijalizirane na vrijednost nula.
Poto su globalni entiteti "vidljivi" na svim programskim nivoima, oni moraju biti jedinstveni na nivou
programa. To znai da se globalne varijable ili funkcije na globalnom podruju ne mogu definisati vie
nego jedanput, iako se ime funkcije moe definisati vie puta sve dok su im parametri (njen potpis)
jedinstveni . Globalni entiteti su openito pristupani bilo gdje u programu.Svaki blok u programu
definie lokalno podruje. Na taj nain, tijelo funkcije predstavlja lokalno podruje. Parametri funkcije
imaju isto podruje kao i tijelo funkcije. Varijable koje su definisane unutar lokalnog podruja su
vidljive
samo u tom podruju. Lokalno podruje moe da bude ugnijedeno, pri cemu unutranje podruje
ponitava vanjsko.
Na primjer:
Funkc {
if (xyz > 0) {
double xyz;
}
}
imamo tri razliita podruja, od kojih svaki ima razliitu varijablu xyz.Openito, ivotni vijek varijable je
ogranien na podruje iste. Tako, na primjer, globalne varijable traju svo vrijeme izvrenja programa,
dok se lokalne varijable kreiraju kada se ue u njihovo podruje, a unitavaju kada se iz njega
izae. Memorijski prostor za lokalne varijable je rezervisan prije izvrenja programa, dok je memorijski
prostor za lokalne varijable alociran "u hodu" u toku izvrenja programa.
Poto lokalno podruje ponitava globalno, to lokalne varijable sa istim imenom kao globalne varijable
onemoguavaju pristup globalnim varijablama unutar lokalnog podruja.
Na primjer, u
int greska; \\globalna varijabla
void Greska (int greska) { \\lokalna varijabla
//...
}
globalna varijabla greka je, kao to se i oekuje, nepristupana unutar funkcije.
Greska, poto je ponitena lokalnim parametrom greka.Ovaj problem se moe prevazii koritenjem
unarnog operatora podruja (unary scope operator), koji globalni entitet uzima kao argument, kao u
primjeru
int xyz;
void Funkc (int xyz)
83
int greska;
void Greska (int greska) {
//...
if (::greska != 0) // odnosi se na globalnu varijablu
// greska
//...
}
9.4.Rekurzivne funkcije
Pitanja za utvrivanje:
1. Da li funkcija moe imati vie od jednog argumenta?
2. Da li funkcija mora imati return vrijednost?
3. Da li funkcija moe imati vie od jedne return vrijednosti?
4. Da li je mogue da funkcija nema ni argumente ni return vrijednost?
5. Da li funkcija moe imati i argumente i return vrijednosti?
6. Nakon imena funkcije slijedi .....
7. Tijelo funkcije je odvojeno ....
8. Skup naredbi koji obavlja radnje neke funkcije predstavlja ..... funkcije.
9. Opis funkcije dat jednom naredbom, koja zapoinje definiciju funkcije,
naziva se ....
10. Tano ili netano: kada se argumenti funkcije prenose po vrijednosti,funkcija radi sa originalnim
argumentima iz programa koji poziva funkciju.
11. Varijabla definisana unutar bloka je vidljiva:
a) od take definisanja nadalje u programu,
b) od take definisanja nadalje u funkciji,
c) od take definisanja nadalje u bloku,
d) u cijeloj funkciji.
Za funkciju koja poziva samu sebe kaemo da je rekurzivna. Rekurzija je opta programska metoda
koja se primjenjuje na probleme koji se definiu u odnosu na same sebe.
Na primjer, problem raunanja faktorijela je primjer rekurzivne funkcije.
Faktorijel je definisan sa:
Faktorijel od 0 je 1.
Faktorijel pozitivnog broja n je n puta faktorijel od n-1, tj. n!=n(n-1)!
Posljednji dio definicije jasno pokazuje da je faktorijel definisan u odnosu na samog sebe, te se stoga
moe predstaviti rekurzivnom funkcijom, npr.
int Faktorijel (unsigned int n) {
return n == 0 ? 1 : n * Faktorijel(n-1);
}
U principu, sve rekurzivne funkcije se mogu napisati koristei iteracije. Naime, treba imati u vidu da u
sluaju velikog broja poziva funkcija (u primjeru faktorijela je to veliki broj n), dolazi do zauzimanja
velikog memorijskog prostora (tzv. runtime stack ), pa je upotreba iteracija bolje rjeenje. No, u nekim
sluajevima elegantno i jednostavno rekurzivno rjeenje moe da bude bolja opcija.
U sluaju faktorijela, na primjer, iterativna opcija je bolja, pa bi funkcija imala oblik:
int Faktorijel (unsigned int n) {
int rezultat = 1;
while (n > 0) rezultat *= n--;
return rezultat;
}
84
Polje se sastoji od niza objekata (nazivaju se i elementi polja), koji su istog tipa i zauzimaju neprekidan
memorijski prostor. Openito, samo polje ima simboliko ime, a ne njegovi elementi. Svaki element je
identificiran njegovim indeksom, koji pokazuje poloaj nekog elementa u polju. Broj elemenata u polju
naziva se dimenzija polja.Dimenzija polja je fiksirana i prethodno odreena, i ne moe se promijeniti u
toku izvrenja programa.
Polja su pogodna za predstavljanje podataka koji se sastoje od mnogo slinih, individualnih objekata.
Primjeri za to su lista imena, tabela gradova i njihovih sezonskih temperatura, i slino.
Tipovi poput int, double i sl.dozvoljavaju predstavljanje samo pojedinanih vrijednosti.
esto pri rjeavanju problema iz stvarnog svijeta trebamo predstaviti skupinu vrijednosti koje su sve
istog tipa, na primjer:
Prosjene koliine padavina za svaki mjesec
Ocjene svih uenika u razredu
Stanje prodaje za svaki dan u sedmici, itd
U jeziku C++ takve skupine vrijednosti predstavljamo pomou nizova.Niz je struktura podataka koja
omoguava pohranu niza vrijednosti. Vrijednosti su pohranjene u kontinuirani blok memorije. Nizovi
omoguavaju brz (random access) pristup pojedinim elementima.
Kao i varijable, niz moramo deklarirati prije nego ga upotrijebimo. Sintaksa deklaracije niza izgleda
ovako:
tip ime_niza [broj_elemenata];
tip moe biti bilo koji validni tip podatka u C++(npr. int, float...)
ime niza je bilo koji validan identifikator u C++
u uglatim zagradama[] se nalazi broj elemenata niza tj. veliina niza (obavezno neka
konstantna vrijednost).
Na primjer:
int rezultati [9];
niz rezultati koji se sastoji od 5 elemenata tipa int moemo grafiki predstaviti ovako:
10.1.Jednodimenzionalni niz
85
Svaki element niza je varijabla , odreena svojim indeksom. Bilo koja operacija koja se moe vriti nad
varijablama obinog tipa, moe se vriti i nad individualnim elementima niza.
Indeks se navodi nakon imena niza, u uglatim zagradama:
Na primjer:
rezultati [5]= 21;
cout<<rezultati [5];
10.2.Deklaracija nizova4
Prilikom deklaracije nizova, unutar uglastih zagrada mora se nalaziti neto ija je vrijednost
konstantna, poput broja ili konstante deklarirane sa const. Tako, ako je n varijabla,deklaracija
poput double prosjek[n]; nije dozvoljena, dok je ista deklaracija dozvoljena u sluaju da je n
konstanta. S druge strane, kada pristupamo elementima niza, indeks u zagradi moe biti proizvoljan
cjelobrojni aritmetiki izraz, tako da je uz pretpostavku da je n cjelobrojna varijabla, sljedei izraz
potpuno legalan:
prosjek [2*n-3] = 13.7;
Nizovi su sloeni tipovi (non-scalar types) podataka. Kod nizova iskljuivo pristupamo pojedinanim
elementima, a nikad nizu kao cjelini. Ne moemo jednom naredbom ispisati itav niz na ekran, niti
jednom naredbom unijeti cijeli niz sa tastature.
Indeksi niza koji ima n elemenata se kreu od 0 do n-1.
Procesiranje bilo kojeg polja obino ukljuuje koritenje petlje, koja ide kroz polje od elementa do
elementa. Sljedei primjer pokazuje funkciju koja rauna srednju vrijednost elemenata nekog polja od
tri cjelobrojna elementa:
const int velicina = 3;
double Srednja (int broj[velicina]) {
double srednja = 0;
for (int i = 0; i < velicina; ++i)
srednja += broj[i];
return srednja/velicina;
}
Kad deklariramo niz lokalno (npr u funkciji), kao i kod obinih varijabli, elementi niza nemaju nikakvu
precizno odreenu vrijednost sve dok se eksplicitno ne izvri dodjela, bilo pomou operatora dodjele
=, bilo pomou unosa sa tastature.
Meutim, kod globalno deklariranih nizova lanovi niza se automatski inicijaliziraju nulama.
U oba sluaja ( i lokalno i globalno) pri deklaraciji niza imamo mogunost dodijeliti inicijalne vrijednsti
svakom elementu niza.
Na primjer:
int rezultat [9] = { 16, 2, 77, 40, 1207, 18, 103, 22, 49 };
Jo jedan primjer u kojem se dimenzija polja moe izostaviti je kada je neko polje parametar u nekoj
funkciji. Na primjer, funkcija Srednja se moe napisati na bolji nain, ako se postavi da dimenzija polja
nije fiksirana na neku konstantnu vrijednost, nego se doda jo jedan parametar, tj.
double Srednja (int broj[], int velicina) {
double srednja = 0;
for (int i = 0; i < velicina; ++i)
srednja += broj[i];
return srednja/velicina;
}
Preuzeto i prilagoeno by Motik, B. and ribar, J. Demistificirani C++. Element, Zagreb, 2. izdanje
edition, 2001.
10.3.Inicijalizacija niza
86
Vidi se da se pomou definicije int broj[] omoguava vea fleksibilnost dimenzije polja, pa je kompletan
program u tom sluaju:
1#include <iostream>
2 using namespace std;
3 int main ()
4{
5 // DEFINISANJE
6 int x[10];
7 int y[10];
8 int i, j, n;
9 // UNOSENJE
10 cout << "Unesite broj clanova polja (<10): ";
11 cin >> n;
12 for (i = 0; i < n; i++)
13 {
14 cout << "Unesite clan br. " << i << ": ";
15 cin >> x[i];
16 y[i] = x[i];
17 }
18 // SORTIRANJE
19 for (i = 0; i < n-1; i++)
Sljedei program predstavlja primjer pomou kojeg se unosi, sortira i ispisuje neki niz. Pri tome,
sortiranje je izvedeno od najveeg prema najmanjem elementu niza.
87
20
21
22
23
24
25
26
27
28
29
30
31
32
{
for (j = i+1; j < n; j++)
{
if (y[i] < y[j]) swap(y[i],y[j]);
}
}
// STAMPANJE
cout << "x:" << \t << "y:" << endl;
for (i = 0; i < n; i++)
{
cout << x[i] << \t << y[i] << endl;
}
}
U ovom primjeru je za zamjenu vrijednosti varijabli koritena funkcija swap (linija 23), mada
programer sam moe definisati slinu funkciju.
Kao to je ranije reeno, za pohranjivanje testova se koriste znakovna polja (eng. string). To su, u
stvari, polja iji elementi imaju tip char. Prilikom inicijalizacije ovakvih polja, sadraj se stavlja izmeu
znaka dvostrukih navoda
. Na primjer:
Broj elemenata navednih u vitiastim zagradama mora biti jednak broju elemenata koje smo naveli u
uglatim zagradama.
C++ dozvoljava i sljedee: ukoliko pri inicijalizaciji ostavite uglate zagrade prazne kompjaler e
pretpostaviti da je veliina niza jednaka broju vrijednosti navedenih u vitiastim zagradama.
int rezultat [ ] = { 16, 2, 77, 40, 1207, 18, 103, 22, 49 };
Kao i kod ostalih varijabli, vrijednosti elemenata polja se mogu inicijalizirati.U tu svrhu koriste se
zagrade {}, izmeu kojih se specificira lista poetnih vrijednosti elemenata polja koje su odvojene
zarezom. Na primjer,
int broj[3] = {5, 10, 15};
definie polje broj, i inicijalizira tri elementa ovog polja na vrijednosti 5, 10, 15, respektivno. Ovo je
tzv. eksplicitno inicijaliziranje. Kada je broj vrijednosti u inicijalizatoru manji od dimenzije polja, ostali
elementi su inicijalizirani na nulu, kao u sluaju:
int broj[3] = {5, 10}; // broj[2] je inicijaliziran na 0
88
Kada se koristi potpuni inicijalizator (broj poetnih vrijednosti odgovara dimenziji polja), dimenzija
polja postaje suvina i moe se izostaviti, tj. broj elemenata je implicitan u inicijalizatoru implicitna
inicijalizacija. U ovom sluaju inicijalizacija polja broj se moe izvriti i na sljedei nain:
int broj[] = {5, 10, 15}; // dimenzija nije potrebna
10.4.Pristup elementima niza
Na primjer, ako elite pohraniti vrijednost 75 kao trei elment niza billy moete napisati sljedee:
rezultati[2] = 77;
a ako elite dodijeliti vrijednost treeg elementa niza varijabli a, moete pisati:
a = rezultati[2];
Primjeujete da je trei elment niza rezultati specificiran sa rezultati[2]. Zato indeks treeg elementa
ima vrijednost 2?
Prvi element niza ima vrijednost indeksa .
Dakle, polje ili niz je najjednostavnija struktura podataka . Niz je uredeni skup koji sadi odreeni
broj elemenata istoga tipa T. S nizom se moe manipulisati kao sa cjelinom, ali se takoer moe i
pristupati pojedinim njegovim elementima.
Nekom se elementu niza pristupa navoenjem njegovoga indeksa; pritom vrijeme pristupa
ne ovisi o vrijednosti indeksa. U jezicima C i C++ za pristup i_tom elementu niza a piemo a[i].
Vano je upamtiti da prvi element niza koji sadri n elemenata ima indeks 0, a posljednji indeks n-1.
Elementi niza se u memoriji raunala pohranjuju u n uzastopno smjetenih varijabli odreenoga tipa T.
U znanstvenim i tehnikim primjenama esto se pojavljuju velike koliine podataka (naprimjer
rezultata raznih mjerenja) koje treba srediti i klasificirati. Najee su to nizovi podataka istog tipa
(realni ili cijeli brojevi), pa su nizovi prikladne strukture za njihov prikaz.
Vidjeli smo osnovne karakteristike jednodimenzionalnog niza.
Sada emo objasniti osnovne elemente upotrebe niza kao parametra funkcije:
Navedimo nekoliko primjera:
1. Trebamo nai element niza koji ima maksimalnu vrijednost
2. Neka se bitna svojstva niza statistikih podataka mogu izraziti pomou nekoliko statistikih
parametara:
a) za dani se niz podataka n-1
Mogue je pristupiti bilo kojem pojedinanom elementu niza (kao bilo kojoj obinoj varijabli)
jednostavnim navoenjem imena niza i indeksa eljenog elementa:
ime [indeks]
89
90
10.5.Multidimenzionalna polja(nizovi)
91
Polje moe da ima i vie nego jednu dimenziju (dvije, tri, i vie). Ipak, organizacija polja u memoriji je
ista kao i prije, tj. neprekidna sekvenca elemenata,pa je percepcija programera neto drugacija od one
koja se namee na prvi pogled (kao multidimenzionalna). Na primjer, pretpostavimo da je srednja
vrijednost temperatura po godinjim dobima za tri bosanskohercegovaka grada data tabelom:
Kao i kod jednodimenzionalnih polja (nizova), i ovdje se elementima pristupa preko indeksa. No,
neophodan je dodatni indeks za svaku dimenziju.
Na primjer, srednja temperatura u Zenici u toku ljeta, data je elementom
godDobTemp[2][1].
Inicijalizacija polja se moe obaviti pomocu ugnijedenog inicijalizatora, kao u:
Poto se ovo dvodimenzionalno polje mapira kao jednodimenzionalni niz od 12 elemenata, mogue je
koristiti i sljedei nain:
int godDobTemp[3][4] = {
10, 20, 10, 1, 13, 21, 12, 3, 14, 23, 11, 4
};
Ipak, bolja opcija je koritenje ugnijedenog inicijalizatora, poto ne samo da je pregledniji, nego daje i
dodatne mogunosti. Na primjer, ako je samo prvi element svakog reda razliit od nule, a ostali su
jednaki nuli, moemo koristiti:
int godDobTemp[3][4] = {{26}, {24}, {28}};
int godDobTemp[3][4] = {
{10, 20, 10, 1},
{13, 21, 12, 3},
{14, 23, 11, 4}
};
92
#include <iostream>
using namespace std;
const int redovi = 3;
const int kolone = 4;
int godDobTemp[redovi][kolone] = {
{72, 20, 10, 11},
{13, 21, 66, 3},
{14, 56, 11, 4}
};
int najTemp (int temp[redovi][kolone])
{
int najveca = temp[0][0];
for (int i = 0; i < redovi; ++i)
for (int j = 0; j < kolone; ++j)
if (temp[i][j] > najveca)
najveca = temp[i][j];
return najveca;
}
main ()
{
cout << najTemp(godDobTemp) << "\n";
system("PAUSE");
}
Napomena: Treba paziti kako se inicijalizira vrijednost kontrolne varijable najvea u prethodnom
primjeru; pravilno je postaviti na prvi lan polja,umjesto pretpostaviti neku konanu vrijednost (na
primjer 0).
Primjer 1: Unesi N lanova niza X pomou for petlje te ih zatim ispii na ekranu raunara, takoer
petljom for
93
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int i,N;
int X[10];
/*deklaracija niza od 10 cijelih brojeva*/
cout<<"Zadaj 0<N<10 = ";
/*broj N mora biti manji od 10 jer je
deklariran niz od maksimalno 10 lanova*/
cin >>N;
for (i=0;i<N;i++)
/*upis lanova niza*/
{
cin>>X[i];
/*upis i-tog lana niza*/
}
for (i=0;i<N;i++)
{
cout << X[i];
cout <<endl;
}
system ("PAUSE");
return 0;
}
11.Pointeri(Pokazivai)
11.1.Osnovno o pointerima5
5
Pitanja za utvrivanje
1. Da li neko polje moe sadravati i cijele brojeve, realne brojeve i karaktere?
2. Koji je indeks prvog elementa u nizu?
3. Koji je indeks posljednjeg elementa u nizu?
4. Koja je razlika izmeu inicijalizacije i pridruivanja?
5. Koja su dva naina inicijalizacije polja?
94
Pointeri (pokazivai) predstavljaju adresu neke memorijske lokacije i omoguuju indirektni nain
pristupa podacima u memoriji. Pointer varijabla se definie pokazivanjem na podatak odreenog tipa.
Na primjer,
int *ptr1; // pointer cijelog broja
char *prt2; // pointer karaktera
Vrijednost pointera varijable je adresa na koju pokazuje. Na primjer, ako se uzme da je:
int num;
moemo pisati:
ptr1 = #
Simbol & (ampersand, znak i) je adresni operator; on uzima varijablu kao argument i vraa
memorijsku adresu te varijable. Efekt prethodnog pridruivanja je da je adresa varijable num
pridruena pointeru ptr1. Na taj nain, kaemo da ptr1 pokazuje na num. Dijagramski prikaz ovog
pridruivanja datje na slici
*ptr1
95
U linija 1, kao to je ve poznato, poziva se standardna biblioteka string koja definie mnotvo funkcija
za manipulisanje sa stringovima. Funkcija strlen (definisana u string), u liniji 4, daje broj karaktera
njenog argumenta (koji je tipa string) do posljednjeg null-karaktera, koji nije uzet u obzir. Kako
nullkarakter nije ukljuen u brojanje, treba dodati jo jedan karakter i alocirati niz karaktera te velicine
(sa tim brojem karaktera). Funkcija strcpy, koja je takoer definisana u string, kopira drugi argument
na prvi, karakter po karakter, ukljuujui i posljednji null-karakter.
Zbog ogranienih memorijskih resursa, uvijek postoji mogunost da se dinamika memorija "potroi" u
toku izvrenja programa, naroito ako se alocira veliki prostor, ali se i ne oslobodi. U sluaju da
operator new ne moe da alocira prostor potrebne veliine, vratie vrijednost nula. Na programeru je
da sebavi ovakvim problemima. Jedna od osnovnih karakteristika jezika C++ , rad
sa iznimkama, daje praktian primjer ta i kako raditi sa ovim problemima.
11.3.Pointeri i polja
Pointeri i polja su u jeziku C++ povezani. Naime, lanovima polja se pristupa preko pointera. Tako na
primjer, naredbom
int cijeliBroj[10];
definiemo jednodimenzionalno polje cijelih brojeva tipa int sa deset lanova.Ime varijable cijeliBroj
ima smisao pointera na prvi elemenat polja cijeliBroj[0]. Prilikom pristupa elementima polja, kompajler
vrijednost indeksa dodaje pointeru na prvi elemenat, tako da se naredba
int broj = cijeliBroj[3];
prevodi kao
int broj = *(cijeliBroj+3);
1
2
3
4
5
6
7
96
Posljednja naredba se moe shvatiti kao: uzmi adresu prvog elementa polja,poveaj je za 3, pogledaj
ta se nalazi na toj adresi, te pridrui tu vrijednost varijabli broj. Dakle, ako imamo definisano polje
int cijeliBroj[] = {1,2,3};
onda imamo sljedea znaenja:
cout << cijeliBroj << endl;
// adresa pocetnog elementa
cout << *cijeliBroj << endl;
// vrijednost pocetnog elementa polja
cout << &(cijeliBroj[1]) << endl;
// adresa elementa cijeliBroj[1]
cout << (cijeliBroj + 1) << endl;
// adresa elementa cijeliBroj[1]
Stoga se elementima polja moe pristupati i preko pointera i preko indeksa, i na programeru je koji e
pristup koristiti. Ipak, treba naglasiti da se definicijom
int cijeliBroj[10];
ne stvara pointer na varijablu cijeliBroj koji pokazuje na polje, nego je cijeliBroj samo sinonim za
pointer na prvi elemenat polja. Vrlo slina diskusija se moe primijeniti i na viedimenzionalna polja, s
obzirom da su u memoriji raunara ista predstavljena jednodimenzionalnim poljima.
11.4.Aritmetika sa pointerima
Na osnovu prethodno reenog slijedi da se elementi niza "VOZDRA" mogu predstaviti i sa *str,
*(str+1), *(str+2), itd.. Na slian nain, elementi niza broj se mogu predstaviti sa
*ptr, *(ptr+1), *(ptr+2) i *(ptr+3).
Jo jedan vid aritmetike sa pointerima koji je dozvoljen u C++ je oduzimanje pointera istog tipa.
Na primjer,
int *ptr1 = &broj[1];
int *ptr2 = &broj[3];
int n = ptr2 - ptr1; // n postaje 2
Aritmetika sa pointerima je veoma korisna kada se pristupa elementima nekog niza. Sljedei primjer
pokazuje funkciju za kopiranje rijei slinu funkciji strcpy.
U C++ je mogue neku cjelobrojnu vrijednost dodati i oduzeti od pointera.Programeri esto koriste ovu
mogunost, koja se jo naziva i aritmetika sa pointerima. Ova aritmetika, pak, nije ista kao ona sa
cjelobrojnim vrijednostima, jer rezultat zavisi od veliine objekta na koji se pokazuje.
Na primjer,
pretpostavimo da je int predstavljen sa 4 bajta. Ako se uzme da je
char *str = "VOZDRA";
int broj[] = {10, 20, 30, 40};
int *ptr =&broj[0];
str++ e "napredovati" str za jedan karakter char, tj. za jedan bajt, tako da pokazuje na drugi karakter
niza karaktera "VOZDRA", dok e ptr++ "napredovati"ptr za jedan int, tj. 4 bajta, tako da pokazuje na
drugi elemenat niza.
97
1
2
3
4
5
U ovom sluaju, umjesto da se na funkciju prenosi niz (linija 1), prenosi se int pointer i dva dodatna
parametra koja specificiraju dimenzije niza. Na ovaj nain, funkcija nije ograniena na niz odreene
duine. Izraz *(temp+i * kolone+ j) u liniji 8, je ekvivalentan izrazu temp[i][j] koji je koriten u
prethodnom poglavlju.
Funkcija najTemp se moe dalje pojednostaviti, ako se temp tretira kao jednodimenzionalni niz od
redovi*kolone cijelih brojeva. Ovo je pokazano u sljedeem primjeru.
1 int najTemp (const int *temp, const int redovi,
2 const int kolone)
3{
4 int najveca = 0;
5 for (int i = 0; i < redovi * kolone; ++i)
6 if (*(temp + i) > najveca)
7 najveca = *(temp + i);
8 return najveca;
9}
11.5.Funkcijski pointeri6
Pored svega do sada reenog o pointerima, mogue je uzeti i adresu funkcije i pohraniti je kao pointer
funkcije. Tada se pointer moe koristiti da indirektno pozove funkciju.
Na primjer,
int (*Uporedi)(const char*, const char*);
U liniji 3, uslov petlje pridruuje sadraj src sadraju dest, a zatim inkrementalno povecava oba
pointera. Ovaj uslov postaje jednak nuli kada je posljednji null-karakter pointera src kopiran u dest.
Pokazuje se da je varijabla koja predstavlja niz, kao to je to sluaj sa broj sama po sebi adresa prvog
elementa niza koji predstavlja. Stoga se elementima varijable broj moe pristupiti i preko aritmetike sa
pointerima na broj, tj. broj[i] je ekvivalentno *(broj+i). Razlika izmeu broj i ptr je u tome to je broj
konstanta, tako da ne moe pokazivati ni na ta, dok je ptr varijabla i moe se iskoristiti da pokazuje
na bilo koji drugi cijeli broj.Sljedei primjer pokazuje kako funkcija najTemp, koja je pokazana u
prethodnom poglavlju moe da se pobolja koritenjem aritmetike sa pointerima.
1 int najTemp (const int *temp, const int redovi,
2 const int kolone)
3{
4 int najveca = 0;
5 for (int i = 0; i < redovi; ++i)
6 for (int j = 0; j < kolone; ++j)
7 if (*(temp + i * kolone + j) > najveca)
8 najveca = *(temp + i * kolone + j);
9 return najveca;
10 }
98
definie pointer funkciju koja se naziva Uporedi koja moe zadrati adresu bilo koje funkcije koja kao
argumente uzima dva konstantna pointera tipa char i vraa cjelobrojnu vrijednost. Takva je, na
primjer, funkcija strcmp, koja slui za uporeivanje stringova.
Na taj nain imamo:
Uporedi = &strcmp; // funkcija Uporedi pokazuje na strcmp
// funkciju
Operator & nije neophodan i moe se izostaviti:
Uporedi = strcmp; // funkcija Uporedi pokazuje na strcmp
// funkciju
Kao alternativa, mogue je definisati i inicijalizirati pointer odjednom, kao
int (*Uporedi)(const char*, const char*) = strcmp;
Kada se adresa funkcije pridruuje pointeru funkcije, dva tipa se moraju poklapati. Prethodna definicija
je ispravna jer se prototip funkcije strcmp poklapa
int strcmp(const char*, const char*);
Sa definicijom funkcije Uporedi datom prethodno, strcmp se moe koristiti direktno, ili indirektno preko
Uporedi. Sljedea tri poziva su ekvivalentna:
strcmp("Suljo","Mujo"); // direktni poziv
(*Uporedi)("Suljo","Mujo"); // indirektni poziv
Uporedi("Suljo","Mujo"); // indirektni poziv (skraceno)
est sluaj koritenja pointer funkcije je da se prenese kao argument nekoj drugoj funkciji; obino zbog
toga to posljednja trai razliite oblike prve u razliitim okolnostima. Dobar primjer je binarna
pretraivaka funkcija koja pretrauje kroz ureeni niz stringova. Ova funkcija moe koristiti funkciju
uporeivanja (kao to je strcmp) radi uporeivanja stringa koji se trai i niza stringova. No, ovo ne
mora da bude prigodno za sve sluajeve. Na primjer,strcmp razlikuje mala i velika slova. Ako bismo
eljeli da izvrimo pretraivanje bez razlikovanja malih i velikih slova, onda bismo trebali koristiti drugu
funkciju za uporeivanje.
Kao to je pokazano u sljedeem primjeru, postavljajui funkciju uporeivanja kao parametar funkcije
pretraivanja, imamo mogunost da ih postavimo nezavisno jednu od druge.
99
Pitanja za utvrivanje
1. ta su pointeri ili pokazivai?
2. Koja je razlika u definisanju cjelobrojne varijable i cjelobrojne pointer varijable?
3. Koje je znaenje tipa podatka u definiciji pointera?
4. ta je to null-pointer?
5. Koji operator se koristi da bi se pointer pridruio adresi neke druge varijable ili konstante?
6. Da li pointer moe pokazivati na razliitu memorijsku lokaciju u razliitim vremenskim periodima u
programu?
7. Da li na istu memorijsku lokaciju moe da pokazuje vie od jednog pointera?
8. ta je rezultat inkrementiranja pointer varijable?
9. ta je to dinamika memorija?
10. Koja je veza pointera i polja?
11. ta predstavljaju aritmetike operacije sa pointerima?
12. Objasni pojam funkcijskih pointera?
12.Datoteke
Ovo poglavlje pokazuje kako se podaci dobiveni pokretanjem nekog programa mogu sauvati
(pohraniti) na neku datoteku. S obzirom da uvanje podataka nema svrhu ako tim podacima ne
moemo da pristupamo, bie objanjeno i kako proitati podatke sa neke datoteke.
Datoteka, pri tome, predstavlja skup podataka koji su snimljeni na neku formu trajne memorije (hard
disk, CD-ROM, floppy disk, itd.). Datoteci se pristupa preko njenog imena (filename), u ijem sastavu
se obino nalazi ekstenzija (dio imena iza take), koja oznaava tip podataka u datoteci (npr. .doc
za Microsoft Word, .xls Microsoft Excel, .cpp za C++ izvornu datoteku, itd.).
Linije 1 i 2 predstavljaju potpis funkcije BinTrazi, koja predstavlja poznati algoritam za traenje kroz
sortiranu listu podataka. Lista traenja je, u ovom sluaju, tabela koja predstavlja polje stringova sa
dimenzijom n. Podatak koji se trai je pod imenom podatak. Linija 2 predstavlja pointer funkciju koja
treba da se koristi za uporeivanje podatka podatak sa elementima polja.
Algoritam za pretraivanje zapoinje u liniji 7 koristei while petlju, i u svakom koraku opseg
pretraivanja polovi. Postupak se zaustavlja kada se granice opsega, oznaene sa dole i gore, poklope,
ili dok se podatak ne nae.
Podatak se poredi sa srednjim elementom polja (linija 9), i ako se sa njim poklapa, vraa se indeks
istog (linija 10). Ako je, pak, podatak manji od srednjeg podatka, pretraivanje se ograniava na donju
polovinu polja (linija 11-12). U suprotnom, pretraivanje se ograniava na gornju polovinu polja
(linija 13-14).
U sluaju da nije pronaen podatak koji se poklapa sa traenim, funkcija vraa vrijednost 1.
Sljedei primjer pokazuje kako se funkcija BinTrazi moe pozvati sa strcmp,koji se prenosi kao funkcija
za uporeivanje.
char *gradovi[] = {"Doboj","Kakanj","Sarajevo","Zenica"}
cout << BinTrazi("Zenica", gradovi, 4, strcmp) << endl;
Rezultat posljednje naredbe bio bi, naravno, 3.
100
U osnovi, postoje dvije vrste datoteka: tekstualne i binarne. Tekstualne datoteke sadre tekst, dok
binarne mogu sadravati i kompleksnije vrste podataka, kao to su slike, izvrni programi, baze
podataka, itd. Tekstualnim datotekama je neto jednostavnije pristupiti, pisati podatke u njih, te itati
sa
njih. Upravo to je i razlog zbog ega ce se primjeri u ovom poglavlju odnositi samo na njih.
12.1.Standardna biblioteka fstream
Datoteka prvo mora da se otvori. Ovo otvara put u komunikaciji izmeu datoteke i objekta toka
u programu (fstream, ifstream, ofstream), koji se koristi u pristupu datoteci.
Nakon otvaranja, program ita sa datoteke, pie na nju, ili ini oboje.
Na kraju, program zatvara datoteku. Ovo je bitan korak, poto odravanje komunikacije izmeu
datoteke i objekta toka zahtijeva resurse, tako da zatvaranje datoteke oslobaa ove resurse kada vie
nisu potrebni. Uz to,postoji mogunost da se kasnije u programu ne moe pristupiti datoteci ako
prethodno nije zatvorena.
12.2.Otvaranje datoteka
Bez obzira da li se sadraj datoteke treba proitati ili se na datoteku trebaju ispisati neki podaci,
datoteka prvo treba da se otvori. Naredna poglavlja pokazuju kako se to obavlja.
Otvaranje datoteke za pisanje
Datoteke za pisanje se mogu otvoriti pomou fstream i ofstream objekata na dva naina:
(i) pomou metode open, ili (ii) pomou konstruktora (constructor1).
Otvaranje pomou funkcije open Ovaj nain otvaranja datoteke postiemo na sljedei nain:
1 ofstream izlaz;
2 izlaz.open("ucenici.txt");
Prvom linijom je kreiran objekat izlaz tipa ofstream, dok se u drugoj liniji kreira datoteka ucenici.txt.
Kao to se vidi, argument funkcije open je ime i lokacija datoteke koja se treba otvoriti. Meutim,
U ranijim poglavljima koristili smo standardnu biblioteku iostream (io se odnosi na input/output), koja
pored ostalog, daje mogunost ispisivanja na standardni izlaz (ekran, monitor) pomou cout, te itanje
sa standardnog upisa (tastatura) pomou cin. Meutim, ova datoteka nam ne omoguava da podatke
trajno sauvamo. U tu svrhu se koristi standardna biblioteka fstream (f se odnosi na datoteku, tj. file),
koja omoguava pisanje na i itanje sa datoteka. Ovo se postie pozivanjem sadraja datoteke fstream
sa:
#include <fstream>
Biblioteka fstream definie tri nova tipa podataka:
ofstream. Ovaj tip podataka predstavlja tok za izlazne datoteke (o se odnosi na output). Pravac
izlaza je sa programa na datoteku. Ovaj tip podataka se koristi za kreiranje datoteka i pisanje
informacija na njih. Ne moe se koristiti za itanje datoteka.
ifstream. Ovaj tip podataka predstavlja tok za ulazne datoteke (i se odnosi na input). Pravac
ulaza je sa datoteke prema programu. Ovaj tip podataka se koristi za itanje informacija sa datoteka.
Ne moe se koristiti za kreiranje datoteka i pisanje na njih.
fstream. Ovaj tip podataka predstavlja openito tok za datoteke, ima karakteristike i ofstream i
ifstream objekata. Pomou ovog tipa, datoteke se mogu kreirati, moe se pisati na njih ali i itati sa
njih.
101
mogue je dodati i drugi argument zavisno od toga da li je funkcija open lan objekta fstream ili
ofstream,
ili se eli neki drugi modul od onog koji se daje .
Datoteka u koju elimo pisati podatke ne mora postojati. U sluaju da ne postoji, ona e se automatski
kreirati pod imenom i na lokaciji koju smo upisali.
Lokacija se moe dati kao relativna (relative path) ili apsolutna (absolute path). Pri tome, relativni put
predstavlja lokaciju u odnosu na lokaciju programa, tj.direktorij u kojem se nalazi izvorna datoteka.
Za razliku od relativnog puta, apsolutni put predstavlja lokaciju koja zapoinje slovom drajva,
sadravajui sve direktorije i poddirektorije, dok se ne doe do datoteke. Na primjer, ako je datoteka
ucenici.txt u direktoriju Srednja, a ovaj je poddirektorij direktorija Mssbusovaca, a sve se nalazi na
tvrdom disku sa slovom C, onda bi se datoteka otvorila na sljedei nain:
ofstream izlaz;
izlaz.open("C:\\MFZE\\Busovaca\\ucenici.txt");
Vidimo da se u tom sluaju koriste po dva znaka n, jer samo jedan izmeu navodnika predstavlja
escape-sekvencu.
Bez obzira da li koristimo relativni ili apsolutni put, argument za funkciju open ne mora da bude neko
ime (rije), nego i (string) varijabla, kao to je to u sljedeem primjeru:
ofstream izlaz;
char imeDatoteke[80];
cout << "Unesite ime datoteke: ";
cin >> imeDatoteke;
izlaz.open(imeDatoteke);
Vano je zapamtiti da je koritenje relativnog puta bolja opcija, jer se moe desiti da neki direktorij u
apsolutnom putu ne postoji, naroito ako se program koristi na nekom drugom kompjuteru (sa
drugaijim rasporedom direktorija).
Koritenje drugog argumenta u funkciji open definie modul u kojem se datoteka treba otvoriti. Neke
od opcija (tzv. file mode flag), koje se mogu koristiti date su u Tabeli:
102
Meutim, ako se za otvaranje datoteke za pisanje koristi fstream objekat, treba dodati jo jedan
argument, tj. opcija za pisanje ios::out. U ovom sluaju imamo:
fstream izlaz;
izlaz.open("ucenici.txt", ios::out);
Otvaranje pomou konstruktor
Konstruktori su funkcije koje se automatski pozivaju kada se pokuava kreirati primjerak (eng.
instance) nekog objekta (primjerak je prema objektu isto to i varijabla prema tipu podatka). Oni mogu
biti optereeni (eng. overloaded), tako da isti objekat moe imati konstruktor sa nijednim, jednim, dva,
ili vie argumenata. U prethodnim primjerima (npr. fstream izlaz;) koritene su naredbe sa
konstruktorima bez argumenata.
Naredni primjeri pokazuju upotrebu konstruktora sa jednim i dva argumenta, respektivno:
ofstream izlaz("ucenici.txt");
fstream izlaz("ucenicii.txt",ios::out);
Prvi sluaj zamijenjuje izraz:
ofstream izlaz;
izlaz.open("ucenici.txt");
a drugi
fstream izlaz;
izlaz.open("ucenici.txt", ios::out);
Primjena konstruktora, u stvari, omoguava definisanje i inicijalizaciju primjerka nekog objekta. Kao i u
sluaju definisanja (deklarisanja) i inicijalizacije varijabli, koritenje jednog od naina otvaranja
datoteke zavisi od samog programa i naih potreba.
103
104
12.3.Zatvaranje datoteka
Svaka otvorena datoteka se treba zatvoriti prije nego se napusti program. To je zbog toga to svaka
otvorena datoteka zahtijeva sistemske resurse. Osim toga, neki operativni sistemi imaju ogranienje
na broj otvorenih datoteka sa kojima se ne "manipulie".
Zatvranje datoteka se vri pomou funkcije close. Sljedei primjeri pokazuju njenu upotrebu pri
zatvaranju datoteka za pisanje i itanje:
ofstream izlaz;
izlaz.open("ucenici.txt");
// skup naredbi
outfile.close();
Za razliku od ifstream objekta, ofstream objekat koji pokuava otvoriti datoteku koja ne jo postoji nije
NULL, a njegova fail funkcija ima vrijednost false(0). To je zbog toga to operativni sistem kreira
datoteku, ako ona ne postoji. Ipak, i u ovom sluaju je korisno provjeriti da li datoteka postoji.
Naime, ako datoteka postoji, ali ima osobinu read-only2, dobiemo negativan odgovor o njenom
postojanju (vrijednost iostream objekta je NULL, a funkcije fail je true, tj. 1).
105
ifstream ulaz;
ulaz.open("ucenici.txt");
// skup naredbi
ulaz.close();
12.4.Pisanje na datoteke
Pisanje podataka na datoteku se izvodi pomou operatora za ispisivanje (<<),
kao to je to bio sluaj sa ispisivanjem na ekran (cout<<). Jedina razlika je utome to se ovdje koristi
fstream ili ofstrem objekat, a ne cout objekat.
Sljedei program pokazuje primjer upisivanja podataka na datoteku ucenici.txt:
1 #include <fstream>
2 #include <iostream>
3 using namespace std;
4
5 int main (){
6 char podaci[80];
7 ofstream izlaz;
8 izlaz.open("ucenici.txt");
9 cout << "Zapisivanje u datoteku" << endl;
10 cout << "=======================" << endl;
11 cout << "Upisite razred: ";
12 cin.getline(podaci, 80);
13 izlaz << podaci << endl;
14 cout << "Unesite broj ucenika: ";
15 cin >> podaci;
16 cin.ignore();
17 izlaz << podaci << endl;
18 izlaz.close();
19 return 0;
20 }
106
#include <iostream>
U ovom primjeru upis teksta sa tastature je obavljen pomou funkcijskog lana objekta cin getline()
(linija 12), koji kao prvi argument uzima znakovni niz, a kao drugi duinu istog. Ovim se tekst koji je
upisan preko tastature,pridruuje varijabli podaci, koja je data kao niz od 80 elemenata. U liniji
16 koritena je funkcija ignore() (i ovo je funkcijski lan klase iostream), koja u ovom obliku (bez
argumenata) ima za cilj da proita sljedei karakter pri upisu, ali ga ne pridrui nijednoj varijabli. To je
zbog toga to nema potrebe za pridruivanjem karaktera, koji oznaava novu liniju, koji je ostao pri
itanju u ulaznom meuspremniku (eng. input buffer) nekoj varijabli.
Upotrebom drugog argumenta pri otvaranju datoteke za pisanje (ios::app)
moemo dodavati sadraj na postojeu datoteku kao to to pokazuje sljedei primjer. U ovom primjeru
zapisivanje se prekida nakon unosa znakova ***.
107
#include <string>
#include <fstream>
using namespace std;
int main ()
{
char x[100];
ofstream izlaz;
izlaz.open("podaci.txt", ios::app);
while (x != "***")
{
cout << "Unesite neki tekst
(za kraj unesite ***):" << endl;
cin >> x;
izlaz << x << endl;
}
izlaz.close();
}
Analogno prethodnom poglavlju, itanje podataka sa datoteka obavlja se pomou operatora za itanje
(>>) kao to je to sluaj sa ispisivanjem sa tastature (cin>>). Sljedei primjer nadopunjava onaj iz
prethodnog dijela, tj. nakon to korisnik upie informacije na datoteku, program ita iste podatke sa
datoteke i ispisuje ih na ekran.
1 #include <fstream>
2 #include <iostream>
3 using namespace std;
4
5 int main (){
6 char podaci[100];
7 ofstream izlaz;
8 izlaz.open("ucenici.txt");
9 cout << "Upisivanje u datoteku" << endl;
10 cout << "=====================" << endl;
11 cout << "Unesite razred: ";
12 getline(cin,podaci);
13 izlaz << podaci << endl;
14 cout << "Unesite broj ucenika: ";
15 cin >> podaci;
16 cin.ignore();
17 izlaz << podaci << endl;
18 izlaz.close();
19
20 ifstream ulaz;
21 cout << "Citanje sa datoteke" << endl;
22 cout << "===================" << endl;
23 ulaz.open("ucenici.txt");
24 getline(ulaz,podaci);
25 cout << podaci << endl;
26 getline(ulaz,podaci);
27 cout << podaci << endl;
28 ulaz.close();
29 return 0;
12.5.itanje sa datoteka
108
Slino primjeru iz prethodnog dijela, podaci se unose pomou funkcije getline (linija 13) sa neto
drugaijom sintaksom. Ovdje pomenuta funkcija (definisana je kao funkcija, a ne funkcijski lan) ima
dva argumenta:
prvi tipa iostream (cin), a drugi varijabla podaci. Na slian nain se pomou iste funkcije podaci itaju
sa datoteke (linije 23 i 25), pri emu je prvi lan objekat ulaz tipa ifstream.
Prethodni primjer se moe napisati i na programerski adekvatniji nain upotrebom funkcija za itanje i
pisanje na datoteku.
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
bool upisiDatoteku (ofstream&, char*);
bool citajDatoteku (ifstream&, char*);
int main (){
char podaci[100];
bool status;
ofstream izlaz;
status = upisiDatoteku(izlaz, "ucenici.txt");
if (!status)
{
cout << "Datoteka za ispisivanje se ne moze otvoriti\n";
cout << "Program se zavrsava\n";
system("PAUSE");
return 0;
}
else
{
cout << "Pisanje u datoteku" << endl;
cout << "==================" << endl;
cout << "Upisite razred: ";
getline(cin, podaci);
izlaz << podaci<< endl;
cout << "Unesite broj ucenika: ";
cin >> podaci;
cin.ignore();
izlaz << podaci<< endl;
izlaz.close();
}
ifstream ulaz;
status = citajDatoteku(ulaz, "ucenici.txt");
if (!status)
{
cout << "Datoteka za citanje se ne
moze otvoriti\n";
cout << "Program se zavrsava\n";
system("PAUSE");
return 0;
}
else
{
cout << "Citanje se datoteke" << endl;
30 }
109
110
}
Linije petlja while, omoguavaju sukcesivno itanje podataka sa datoteke podaci.txt. Kada se doe do
posljednje linije sa nekom informacijom, funkcija eof vraa vrijednost true i automatski se izlazi iz
petlje. Na analogan nain se mogu itati podaci rasporeeni u kolone.
Pitanja za utvrivanje
1. Nabrojati formate datoteka u kojima se mogu pohraniti podaci!
2. Koja standardna datoteka treba da se pozove kada program pie na datoteku ili ita sa nje?
3. Koji od tri objekta iostream, ifstream, fstream, moe sluiti i za upis i za ispis na datoteke?
4. U emu se sutina zatvaranja datoteke?
5. ta je konstruktor?
6. Da li se stream objekti trebaju proslijediti po vrijednosti ili referenci, i zato?
13.Zbirka Zadataka
111
Zadatak 12
Na izvor napona U su prikljuena tri serijski spojena otpornika: R1, R2 i R3. Potrebno je izraunati
ukupni otpor R,snagu struje I i pojedine padove napona na otporima: U1, U2 i U3. Ispis neka bude
oblika:
U (V)=
R1 (om)=
R2 (om)=
R3 (om)=
112
Zadatak 17
Treba izraunati koliko bi vremena bilo potrebno zvuku da pree razmak izmeu dva mjesta ako taj isti
razmak svjetlost pree za t sekundi. Ispis neka bude oblika:
Upisi vrijeme (u sek):
Svjetlost pree razmak izmedju dva mjesta za ... s, a zvuk je sporiji pa mu za isti razmak treba ... s.
13.2.Zadaci struktura grananja
Zadatak 1
Treba unijeti cijeli broj pa provjeriti da li je >=0. Ako nije, treba izraunati apsolutnu vrijednost
unesenog broja. Potom treba provjeriti da li je broj paran. Ako je paran treba izraunati i ispisati
njegovu treu potenciju, a ako nije treba ispisati: Broj je neparan.
113
Zadatak 4
U pravougli je trouglu poznat ugao alfa (izraen u stepenima) i kateta a (u cm).Treba izraunati
vrijednost hipotenuze c.
Unesi broj :
Broj ... je paran, a njegova treca potencija iznosi ...
ili
Broj ... je neparan.
Zadatak 2
Treba unijeti dva realna broja pa izraunati i ispisati njihov cjelobrojni kolicnik i ostatak dijeljenja.
Potrebno je nainiti i provjeru. Ako je djelitelj 0 treba ispisati odgovarajuu poruku. Ispis neka bude
oblika:
Upisi djeljenik :
Upisi djelitelj :
... / ... = ... cijelih i ... ostatka.
Provjera: ... * ... + ... = ...
ili
Ne moze se dijeliti sa 0.
Zadatak 3
Treba unijeti koeficijente kvadratne jednaine, pa zavisno o njihovim vrijednostima izraunati i ispisati
rjeenja.
Vano je provjeriti vrijednost koeficijenta a, ako je a=0, jednaine nije kvadratna.
Treba provjeriti predznak diskriminante jer on odreuje hoe li rjeenja kvadratne jednaine bit realni
ili kompleksni brojevi. Ispis neka bude oblika:
Upisi koeficijent a:
Upisi koeficijent b:
Upisi koeficijent c:
Rjesenja su realni brojevi:
x1=... i x2=...
ili
Rjesenja su kompleksni brojevi:
z1=...+...i, z2=...-...i
ili
Ako je koeficijent a=0, jednaina nije kvadratna.
114
115
116
...
...
... * 10 = ...
Zadatak 3
Potrebno je ispisati prvih N neparnih brojeva. Ispis neka bude oblika:
Upisi zeljeni broj neparnih brojeva:
Prvih ... neparnih brojeva su: ... ... ... ....
Zadatak 4
Potrebno je sabrati prvih 100 prirodnih brojeva. Ispis neka bude oblika:
Zbir prvih 100 prirodnih brojeva je ...
Zadatak 5
Treba prebrojiti koliko brojeva unutar raspona od M do N ima cifru jedinice vrijednosti 9. Ispis neka
bude oblika:
Raspon pocinje od broja:
Raspon zavrsava brojem:
U rasponu od ... do... ima ... brojeva sa cifrom jedinice vrijednosti 9.
Zadatak 6
Treba provjeriti djeljivost brojeva iz odabranog raspona od M do N sa zadanim brojem B. Ispis neka
bude oblika:
Pocetna vrijednost raspona:
Zavrsna vrijednost raspona:
Provjerava se djeljivost s brojem:
Brojevi djeljivi sa ... iz raspona od ... do ... su:
... ... ... ... ...
Zadatak 7
Potrebno je sabrati sve prirodne trocifrene brojeve. Ispis neka bude oblika:
Zbir svih prirodnih trocifrenih brojeva je ....
Zadatak 8
Potrebno je sabrati N odabranih cijelih brojeva. Ispis neka bude oblika:
Upisi koliko brojeva zelis sabirati:
Upisi broj:
Upisi broj:
.......
.......
Zbir unesenih brojeva je ...
Zadatak 9
Potrebno je sabrati N lanova niza :
(1 + 1/2 + 1/3 + 1/4 + 1/5 +....+ 1/N). Ispis neka bude oblika:
Upisi zeljeni broj clanova niza:
Zbir ... clanova ovog niza iznosi ... .
Zadatak 10
Potrebno je ispisati i sabrati sve prirodne brojeve djeljive s 3 iz raspona od 1 do N. Ispis neka bude
oblika:
Upisi zavrsnu vrijednost raspona:
U intervalu od 1 do ... brojevi djeljivi sa 3 su:
.... ... ...
Zbir brojeva djeljivih s 3 iz intervala od 1 do... je ...
Zadatak 11
117
Zadatak 18
Potrebno je ispisati tekst "***" u obliku slova V, kao na slici (koristiti manipulator setw(int):
Zadatak 19
Treba unijeti N realnih brojeva pa izraunati njihovu srednju vrijednost. Unos brojeva traje sve dok
korisnik ne upie 0. Primjer rijeiti do-while petljom. Ispis neka bude oblika:
Nakon posljednjeg broja unesi nulu.
Unesi broj:
Unesi broj:
...
Uneseno je ... brojeva. Srednja vrijednost je ....
Zadatak 20
Potrebno je unesenom prirodnom broju ispisati vrijednosti pojedinih cifara poevi od cifre najmanje
teinske vrijednosti, jednu ispod druge. Ispis neka bude oblika:
Upisi prirodni broj:
Njegove cifre su:
...
Potrebno je prebrojiti i sabrati sve parne prirodne brojeve iz raspona od 1 do N . Ispis neka bude
oblika:
Upisi gornju granicu raspona:
U intervalu od 1 do ... ima ... brojeva djeljivih sa 2. Njihov zbir je ... .
Zadatak 12
Potrebno je provjeriti da li je odabrani prirodni broj prost (prost broj je djeljiv samo sa 1 i sa samim
sobom). Ispis neka bude oblika:
Upisi prirodni broj:
... je/nije prost.
Zadatak 13
Potrebno je provjeriti da li je odabrani prirodni broj savren (broj je savren ako je jednak zbiru svih
svojih djelitelja, osim njega samog). Ispis neka bude oblika:
Upisi prirodni broj:
Broj ... je/nije savrsen.
Zadatak 14
Potrebno je ispisati sve savrene prirodne brojeve iz raspona od 1 do 3000. Ispis neka bude oblika:
Savrseni brojevi iz zadanog raspona su ... ... .... ...
Zadatak 15
Potrebno je ispisati sve etverocifrene brojeve iji je proizvod cifara 100. Ispis neka bude oblika:
Brojevi ciji je proizvod cifara 100 su:... ... ... ...
Zadatak 16
Potrebno je ispisati sve trocifrenee brojeve koji su djeljivi sa 7, a zadnja im je cifra 7. Ispis neka bude
oblika:
Brojevi koji zadovoljavaju uslov su:
... ... ... ...
Zadatak 17
Potrebno je ispisati dekadske ASCII vrijednosti (od 32 do 255) i njihove odgovarajue znakove.Da bi
ispis bio u pravilnim stupcima, koristi manipulator setw.
118
...
...
Zadatak 21
Potrebno je unesenom prirodnom broju sabrati vrijednosti njegovih cifara. Ispis neka bude oblika:
Upisi prirodni broj:
Zbir cifara broja ... je ... .
Zadatak 22
Korisnik unosi prirodne brojeve. Nakon posljednjeg broja unosi 0. Program ispisuje najvei uneseni
broj. Ispis neka bude oblika:
Upisi prirodni broj:
Upisi prirodni broj:
...
Najveci broj je ...
Zadatak 23
Program rauna ukupni otpor N otpora spojenih u paralelu. Nakon posljednje vrijednosti otpora unosi
se 0. Ispis neka bude oblika:
Upisi vrijednost otpora u omima:
Upisi vrijednost otpora u omima:
...
Ukupni otpor ... otpora spojenih u paralelu je ... oma.
Zadatak 24
Zadatak 25
Potrebno je ispisati N lanova Fibonaccijevog niza. Fibonaccijev niz je niz u kome su prva dva lana
jednaka jedan, a svaki sljedei lan je zbir prethodna dva lana niza (1, 1, 2, 3, 5, 8, 13, 21, 34,
......). Ispis neka bude oblika:
Upisi koliko clanova niza zelis:
lanovi niza: 1, 1, ..., ..., ..., .....
Zadatak 26
Potrebno je izraunati najveu zajedniku mjeru dva prirodna broja. Najvea zajednika mjera dva
broja je najvei prirodni broj kojim su djeljiva oba broja. Ispis neka bude oblika:
Unesi prvi broj:
Unesi drugi broj:
Najveca mjera brojeva ... i ... je ...
Zadatak 27
Potrebno je unijeti odabrani broj cifara poevi od cifre najvee teinske vrijednosti, pa od njih sastaviti
i ispisati prirodni broj. Unos cifara se prekida kada se unese broj manji od 0 ili vei od 9. Ispis neka
bude oblika:
Upisi cifru:
Upisi cifru:
Program rauna srednju ocjenu uspjeha uenika. Nakon posljednje ocjene treba unijeti 0. U sluaju da
je bilo koja od ocjena 1, ispisuje se poruka: Negativan uspjeh. Ako se unese vrijednost koja nije iz
raspona od 1-5, ispisat e se poruka: Pogrean unos. Ispis neka bude oblika:
Srednja ocjena uspjeha je ...
119
Upisi cifru:
...
Broj sastavljen od zadanih cifara je ...
14.Rjeenja
120
int a;
cout<<"Unesi broj:";
cin>>a;
cout<<endl<<"Kada se broju "<<a<<" promijeni predznak, on postaje
"<<-a<<endl;
system("PAUSE"); return 0;
}
121
int main()
{
int god,god1,god2;
cout<<"Upisi godinu svog rodjenja: ";
cin>>god1;
cout<<"Koja je godina sada? ";
cin>>god2;
god=god2-god1;
cout<<endl<<"Sada imas "<<god<<" godina."<<endl;
system("PAUSE");
return 0;
}
122
}
Pravolinijska struktura - Rjeenje9
#include<iostream>
using namespace std;
int main()
{
int s, sek, min, sat, ostatak;
cout<<"Upisi vrijeme u sekundama:";
cin>>s;
sat=s/3600;
ostatak=s%3600;
min=ostatak/60;
sek=ostatak%60;
cout<<s<<" sekundi je "<<sat<<" sati, "<<min<<" minuta i "<<sek<<"
sekundi."<<endl; system("PAUSE");
return 0;
}
cin>>v1;
cout<<"Upisi konacnu brzinu (u m/s):";
cin>>v2;
a=(v2-v1)/t;
F=m*a;
cout<<endl<<"Na tijelo je djelovala sila od "<<F<<" N."<<endl;
system("PAUSE");return 0;
123
124
int main()
{
float Mc,Ms,Gs,Gc,X,F,S,s1,p;
const double g=9.81;
cout<<"Upisi masu stolice u kg:";
cin>>Ms;
cout<<"Upisi masu covjeka u kg:";
cin>>Mc;
cout<<"Unesi iznos stranice kvadrata u cm:";
cin>>X;
Gs=Ms*g;
Gc=Mc*g;
//ukupna sila koja djeluje na pod
F=Gs+Gc;
//povrsina presjeka jedne noge stolice
s1=X*X;
//ukupna povrsina na koju djeluje sila
S=4*s1;
S=S/10000;
//pretvaranje cm2 u m2
p=F/S;
//pritisak u paskalima
cout<<"Pritisak kojim covjek mase "<<Mc<<" kg, koji sjedi na stolici
mase "<<Ms;
cout<<" kg, djeluje na pod je "<<p<<"paskala";
system("PAUSE");return 0;
}
#include<iostream>
using namespace std;
int main()
{
float v1, v2, udaljenost;
float put1, put2, vrijeme;
cout<<"Upisi brzinu prvog voza (u km/h):";
cin>>v1;
cout<<"Upisi brzinu drugog voza (u km/h):";
cin>>v2;
cout<<"Upisi udaljenost izmedju dva mjesta (u km):";
cin>>udaljenost;
//put1/brzina1=put2/brzina2
//udaljenost=put1+put2
put1=udaljenost*v1/(v1+v2);
put2=udaljenost-put1;
vrijeme=put1/v1;
cout<<"Susret ce se dogoditi nakon "<<put1;
cout<<" km. Preostali dio puta je "<<put2;
cout<<" km (vrijedi za prvi voz, za drugi su iznosi
obrnuti)."<<endl;
cout<<"Vozovi ce se susresti nakon "<<vrijeme<<" sati."<<endl;
system("PAUSE");return 0;}
Pravolinijska struktura - Rjeenje14
#include<iostream>
using namespace std;
125
126
127
#include <iostream>
#include <cmath>
using namespace std;
int main ()
{
int i,rez;
cout<<"Unesi broj:";
cin>>i;
if (i<0)
{
i=abs(i);
}
if (i%2==0)
{
rez=pow(i,3);
cout<<"Broj "<<i<<" je paran, a njegova treca potencija
iznosi"<<rez<<endl;
}
else
{
cout<<"Broj "<<i<<" je neparan."<<endl;
} system("PAUSE");
return 0;
}
128
return 0;
129
#include<cmath>
using namespace std;
int main()
{
float ugaoalfa,a,c,ugaoalfa1;
const float PI=3.14;
cout<<"Unesi vrijednost ugla alfa u stepenima: ";
cin>>ugaoalfa;
cout<<"Unesi vrijednost katete a: ";
cin>>a;
ugaoalfa1=ugaoalfa*PI/180;
c=a/sin(ugaoalfa1);
cout<<endl<<"Ako je vrijednost ugla alfa " <<ugaoalfa;
cout<<" stepeni, a vrijednost katete a="<<a;
cout<<" cm, hipotenuza ima vrijednost c="<<c<<" cm."<<endl;
system("PAUSE");return 0;
}
Struktura grananja - Rjeenje5
#include<iostream>
#include<cmath>
using namespace std;
int main()
float vc,vr,v,ugao;
const double PI=3.14159265;
cout<<"Unesi brzinu camca u m/s: ";
cin>>vc;
cout<<"Unesi brzinu rijeke u m/s: ";
cin>>vr;
v=sqrt(pow(vc,2)+pow(vr,2));
ugao=atan(vr/vc);
ugao=ugao*180/PI;
cout<<endl<<"Ako je brzina rijeke "<<vr<<" m/s, a brzina camca
"<<vc;
cout<<" m/s camac se u odnosu na obalu giba brzinom "<<v<<"
m/s."<<endl;
130
131
float a,b,c,min,mid,max;
cout<<"Upisi prvi broj:";
cin>>a;
cout<<"Upisi drugi broj:";
cin>>b;
cout<<"Upisi treci broj:";
cin>>c;
min=a;
if (b<min)
{
min=b;
}
if (c<min)
{
min=c;
}
max=a;
if (b>max)
{
max=b;
}
if (c>max)
{
}
mid=a;
if ((b!=max)&&(b!=min))
{
mid=b;
}
if ((c!=max)&&(c!=min))
{
mid=c;
}
cout<<"Brojevi: "<<a<<", "<<b<<" i "<<c<<" poredani od
najmanjeg ka najvecem:";
cout<<endl<<min<<", "<<mid<<", "<<max<<endl;
max=c;
132
system("PAUSE");return 0;
}
Struktura grananja - Rjeenje8
#include <iostream>
using namespace std;
int main ()
{
cout<<"Omov zakon"<<endl;
cout<<"Za racunanje jacine struje upisi 1, za racunanje napona upisi
2, a za otpor 3: ";
int i;
float U,I,R;
cin>>i;
switch (i)
{
case 1:
cout<<"U (V)=";
cin>>U;
cout<<"R (om)=";
cin>>R;
I=U/R;
cout<<I<<" A."<<endl;
break;
case 2:
cout<<"I (A)=";
cin>>I;
cout<<"R (om)=";
cin>>R;
U=I*R;
cout<<"Ako je jacina struje "<<I<<" A, a otpor "<<R<<"
oma, napon iznosi ";
cout<<U<<" V."<<endl;
break;
case 3:
133
cout<<"U (V)=";
cin>>U;
cout<<"I (A)=";
cin>>I;
R=U/I;
cout<<"Ako je napon "<<U<<" V, a jacina struje iznosi ";
cout<<I<<" A, otpor iznosi "<<R<<" oma."<<endl;
break;
default:
cout<<"Pogresan unos. Treba upisati 1, 2 ili 3.";
}
system("PAUSE");return 0;
}
Struktura grananja - Rjeenje9
#include<iostream>
using namespace std;
int main()
{
int i;
cout<<" Program na osnovu unesenog rednog broja mjeseca
ispisuje";
cout<<" koliko taj mjesec ima dana"<<endl;
cin>>i;
switch (i)
{
case 4:
case 6:
case 9:
case 11:
cout<<i<<". mjesec ima 30 dana."<<endl;
break;
case 1:
case 3:
case 5:
case 7:
134
case 8:
case 10:
case 12:
cout<<i<<". mjesec ima 31 dan."<<endl;
break;
case 2:
cout<<i<<". mjesec ima 28 dana (ili 29 ako
je godina prestupna).";
break;
default:
cout<<"Pogresan unos.";
cout<<" Redni broj mjeseca moze biti iz raspona
od 1 do 12.";
} system("PAUSE");
return 0;
}
Struktura grananja - Rjeenje10
#include<iostream>
#include<cmath>
using namespace std;
int main()
cout<<"Program na osnovu unesenih vrijednosti stranica
trougla racuna ";
cout<<" obim ili povrsinu, ovisno o zelji korisnika"<<endl;
float a,b,c,o,p,p1,pov;
int i;
cout<<"Za racunanje obima upisi 1, a za povrsinu 2:";
cin>>i;
cout<<"a = ";
cin>>a;
cout<<"b = ";
cin>>b;
cout<<"c = ";
cin>>c;
if((a<=0)||(b<=0)||(c<=0))
135
{
cout<<"Vrijednost stranice trougla ne moze biti
<=0 " <<endl;
goto kraj;
}
if((a+b<=c)||(b+c<=a)||(c+a<=b))
{
cout<<" Unesene vrijednosti nisu stranice
trougla." <<endl;
goto kraj;
}
switch(i)
{
case 1:
o=a+b+c;
cout<<"Obim trougla je O= "<<o<<endl;
break;
case 2:
cout<<"Povrsina se racuna po Heronovoj formuli";
p=(a+b+c)/2;
p1=p*((p-a)*(p-b)*(p-c));
pov=sqrt(p1);
cout<<" Povrsina trougla je P= "<<pov<<endl;
default:
cout<<" Pogresan unos. Valja unijeti 1 ili 2! "
<<endl;
} system("PAUSE");
kraj:return 0;
}
Struktura grananja - Rjeenje11
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
break;
136
{
float p,i,b, po;
cout<<"Program na osnovu osvojenog broja bodova na testu,
ispisuje ";
cout<<" odgovarajucu ocjenu."<<endl;
upis:cout<<"Upisi maksimalni broj bodova na testu: ";
cin>>i;
if (i<=0)
goto upis;
p=i/100;
cout<<endl<<setw(35)<<"Odlican od 89% do 100%: ";
cout<<floor(89*p)<<" - "<<i<<" bodova."<<endl;
cout<<setw(35)<<"Vrlo dobar od 77% do 88%: ";
cout<<floor(77*p)<<" - "<<floor(88*p)<<" bodova."<<endl;
cout<<setw(35)<<"Dobar od 64% do 76%: ";
cout<<floor(64*p) <<" - "<<floor(76*p)<<" bodova."<<endl;
cout<<setw(35)<<"Dovoljan od 51% do 63%: ";
cout<<floor(51*p)<<" - "<<floor(63*p)<<" bodova."<<endl;
cout<<setw(35)<<"Nedovoljan za manje od 50%: ";
cout<<floor(50*p)<<" i manje bodova."<<endl;
upis2:cout<<endl<<endl<<"Upisi osvojeni broj bodova na testu: ";
cin>>b;
if (b<0 || b>i)
cout<<"Neispravan unos, ponovi.";
goto upis2;
}
po=b/p;
if (po>=0 && po<=50)
cout<<b<<" bodova je "<<po<<" %, ocjena
nedovoljan." <<endl;
else if (po<=63)
cout<<b<<" bodova je "<<po<<" %, ocjena
137
dovoljan." <<endl;
else if (po<=76)
cout<<b<<" bodova je "<<po<<" %, ocjena dobar."
<<endl;
else if (po<=88)
cout<<b<<" bodova je "<<po<<" %, ocjena vrlo
dobar. " <<endl;
else
cout<<b<<" bodova je "<<po<<" %, ocjena odlican.
" <<endl; system("PAUSE");
return 0;
}
138
{
goto kraj;
}
else
{
dj1:if(br%prbr==0)
{
cout<<" * "<<prbr;
br=br/prbr;
goto dj2;
}
else
{
prbr=prbr+1;
goto dj1;
}
}
}
kraj:cout<<endl; system("PAUSE");
return 0;
int brojac,m,n;
cout<<"ispis pocinje od broja:";
cin>>m;
cout<<"ispis zavrsava brojem:";
139
cin>>n;
for (brojac=m;brojac<=n;brojac++)
{
cout<<brojac<<" ";
}
cout<<endl;
system("PAUSE"); return 0;
}
Struktura petlje - Rjeenje2
#include<iostream>
using namespace std;
int main()
{
int b, brojac;
cout<<"Upisi broj sa kojim zelis mnoziti:";
cin>>b;
for (brojac=1;brojac<=10;brojac++)
cout<<b<<" * "<<brojac<<" = "<<b*brojac<<endl;
system("PAUSE"); return 0;
140
x2=(-b-sqrt(pom1))/(2*a);
cout<<"Rjesenja su realni brojevi x1= "<<x1<<" i x2="<<x2<<endl;
}
else
{
xR=-b/(2*a);
xi=sqrt(-pom1)/(2*a);
cout<<"Rjesenja su kompleksni brojevi:";
cout<<endl<<"z1="<<xR<<"+"<<xi<<"i, z2= "<<xR<<"-"<<xi<<"i"<<endl;
}
}
else
{
cout<<"Ako je koeficijent a=0,jednadzba nije kvadratna"<<endl;
} system("PAUSE");
return 0;}
Struktura petlje - Rjeenje4
#include<iostream>
using namespace std;
int main()
{
int brojac,zbrir;
zbir=0;
for (brojac=1;brojac<=100;brojac++)
{
zbir=zbir+brojac;
}
cout<<zbir<<endl;
system(Pause);
return 0;
}
141
142
return 0;
}
143
144
}
cout<<"U intervalu od 1 do "<<N<<" ima "<<broj<<" parnih brojeva "<<endl;
system("PAUSE");return 0;
}
145
146
147
cout<<setw(s)<<"***"<<setw(p)<<"***"<<endl;
s=s+2;
p=p-4;
} system("PAUSE");
return 0;
}
148
#include<iostream>
using namespace std;
int main()
{
int b,i,s,br;
s=0;
cout<<"Upisi prirodni broj: ";
upis:cin>>b;
if(b<0)
{
cout<<"Upisi prirodni broj"<<endl;
goto upis;
}
br=b;
while(b>0)
{
i=b%10;
s=s+i;
b=b/10;
}
cout<<"Zbir cifara broja "<<br<<" je "<<s<<endl; system("PAUSE");
return 0;
149
cin>>b;
}
cout<<endl<<"Najveci broj je: "<<max<<endl; system("PAUSE");
return 0;
}
#include<iostream>
using namespace std;
int main()
{
float R,br,Ruk1,Ruk;
cout<<"Nakon posljednje vrijednosti otpora unijeti 0" <<endl;
br=0;
Ruk1=0;
upis:cout<<"Upisi vrijednost otpora u omima: ";
cin>>R;
if(R<0)
{
cout<<"Vrijednost otpora mora biti >0."<<endl;
goto upis;
}
while(R>0)
{
br=br+1;
Ruk1=Ruk1+1/R;
cout<<"Upisi vrijednost otpora u omima: ";
cin>>R;
}
Ruk=1/Ruk1;
cout<<"Ukupni otpor "<<br<<" otpora spojenih u paralelu je "<<Ruk<<" oma.";
system("PAUSE");
return 0;
}
Struktura petlje - Rjeenje24
#include<iostream>
using namespace std;
int main()
{
cout<<"Program racuna srednju ocjenu uspjeha ucenika."<<endl;
cout<<"Nakon posljednje ocjene unosi se 0."<<endl;
float b,suma,br;
suma=0;
150
br=0;
do
{
cout<<"Unesi ocjenu: ";
cin>>b;
if(b==1)
{
cout<<"Negativan uspjeh."<<endl;
goto kraj;
}
else if(b<0)
{
cout<<"Pogresan unos."<<endl;
goto kraj;
}
else
{
suma=suma+b;
br=br+1;
}
}
while(b>0);
br=br-1;
cout<<"Srednja ocjena uspjeha je " <<suma/br<<endl; system("PAUSE");
kraj:return 0;
}
#include<iostream>
using namespace std;
int main()
{
int prvi,drugi,treci,brojac,N;
cout<<"Program ispisuje N clanova Fibonaccijevog niza."<<endl;
prvi=1;
drugi=1;
upis:cout<<"Upisi koliko clanova niza zelis: ";
cin>>N;
if(N<2)
{
cout<<"Broj clanova niza mora biti veci ili jednak 2"<<endl;
goto upis;
}
cout<<prvi<<" "<<drugi;
for(brojac=3;brojac<=N;brojac++)
{
151
treci=prvi+drugi;
cout<<" "<<treci;
prvi=drugi;
drugi=treci;
}
cout<<endl; system("PAUSE");
return 0;
152
br=0;
cout<<endl<<"Upisi cifru: ";
cin>>ci;
while((ci>=0)&&(ci<=9))
{
br=br*10+ci;
cout<<"Upisi cifru: ";
cin>>ci;
}
cout<<"Broj sastavljen od zadanih cifara je " <<br<<endl; system("PAUSE");
return 0;
}
LITERATURA
Efikasno programiranje na jeziku C++/Praktini primjeri/-Andrew Koenig,Barbara E.Moo,
Predavanja sa FIT-a Mostar/Uvod u programiranje/Programiranje 1 i 2,
Osnove programiranja u C++ -Aleksandar Kara;
Uvod u programiranje dr.Senad Rahimi;
C++ za apsolutene poetnike
153