Professional Documents
Culture Documents
Uvod U C++ Programiranje
Uvod U C++ Programiranje
Savo Stupar
Sarajevo, 2020.
Naziv djela:
Uvod u C++ programiranje
Autor:
Prof. dr. Savo Stupar
Izdavač:
Ekonomski fakultet Univerziteta u Sarajevu
Za izdavača:
Dekanesa, Prof. dr. Jasmina Selimović
Recenzenti:
Prof. dr. Mario Spremić
Prof. dr. Aida Habul
Dizajn i tehnička priprema:
Sanela Stupar
Godina izdanja:
2020.
______________________________________________________________________________
CIP - Katalogizacija u publikaciji
Nacionalna i univerzitetska biblioteka
Bosne i Hercegovine, Sarajevo
004.43C++(075.8)
STUPAR, Savo
Uvod u C++ programiranje [Elektronski izvor] / Savo Stupar. - El. knjiga. - Sarajevo :
Ekonomski fakultet, 2020
ISBN 978-9958-25-150-4
COBISS.BH-ID 39374086
______________________________________________________________________________
2
PREDGOVOR
Kada danas govorimo o brzom razvoju nauke i tehnologije i pitamo se šta je tome najviše
doprinijelo, nameće se neizbježan zaključak da je tome najviše doprinio eksplozivni rast
informaciono-komunikacionih tehnologija. Automatizacija poslovanja nije moguća bez
softverskih proizvoda, a jedna od najvažnijih aktivnosti u keriranju softvera je svakako
programiranje. Zbog toga je već dugo vremena, kao što je i sada i kao što će biti i budućnosti,
jedna od veoma aktuelnih tema, tema programiranja. Knjiga „Osnove C++ programiranja“ ima za
cilj da posluži bržem i sveobuhvatnijem savladavanju osnovnih, kako teorijskih koncepata tako i
praktičnih aspekata programiranja u jeziku C++. Namijenjena je prije svega studentima II godine
Ekonomskog fakulteta u Sarajevu, koji slušaju predmet Programiranje i baze podataka na
odsijeku Visoka poslovna škola i smjeru Razvoj poslovnih informacionih sistema, kao i svima onim
koji se počinju baviti programiranjem a nemaju prethodnih znanja i iskustava o tome, kao i onima
koji se trenutno bave programiranjem koristeći tradicionalne programske jezike, a imaju namjeru
usavršavati vještine programiranja korišćenjem savremenih programskih jezika, kao što su C
jezik, C++, Java, C# itd. Teorijski koncepti na kojima su zasnovani C i C++ jezik, čine osnovu na
kojoj su izgrađeni najsavremeniji programski jezici, tako da savladavanje tih koncepta,
predstavlja više od polovine cjelokupnog truda oko usvajanja i korišćenja novih programskih
jezika. Da bi se ostvario osnovni cilj objavljivanja knjige, bilo je neophodno realizovati sljedeće
zadatke:
3
Knjiga se sastoji iz 15 poglavlja u kojima su detaljno objašnjeni osnovni elementi i osnovni
programski koncepti programskog jezika C++, čije usvajanje čitaocima omogućava da pišu
ispočetka veoma jednostavne programe, a kasnije poslije upoznavanja sa naprednijim
konceptima i mnogo složenije programe. Knjiga se mnogo više bazira na programskim
konstrukcijama nego na nekim složenim algoritmima. Opštepoznato je da u svim oblastima
ljudskog djelovanja, koje se bave spoznajom, učenjem i prihvatanjem kako znanja tako i vještina
naročito u nauci, „da slika govori više od hiljadu riječi“. Upravo ova misao je autoru bila i osnovna
ideja vodilja kada je trebalo „teške stvari pokušati objasniti na lak način“. Zbog toga se u svakom
dijelu knjige mogu pronaći, za svaku programsku konstrukciju odgovarajući praktični primjeri iz
prakse, koji su pored napora u pronalaženju pravih riječi za jednostavnije objašnjavanje složenih
koncepata, izuzetno ilustrativni i u vizuelnom smislu. Tri su bitne stvari oko kojih smo se posebno
potrudili u ovoj knjizi, a to su izbor pravih primjera za ilustraciju teorijskih koncepata, izbor načina
izlaganja i objašnjavanja tematike bez nepotrebne i pretjerane upotrebe stručnih termina i izbor
vizuuelnih elemenata prezentacije pojmova počevši od različitih vrsta dijagrama pa do
raznobojnog obilježavanja svakog programskog elementa u prezentiranju programskog koda.
Savo Stupar
4
IZVOD IZ RECENZIJE
Moderno poslovanje teško možemo zamisliti bez potpore informacijskih sustava i
primjerene tehnologije. Informacijski sustavi i pripadajući softver u sve većoj mjeri
automatizmom provode poslovne transakcije, omogućuju izvođenje poslovnih procesa,
podupiru ključne dijelove poslovanja svake organizacije i pružaju podršku odlučivanju. Knjiga
Uvod u C++ programiranje na jasan i prepoznatljiv način obrađuje sveobuhvatnu temu razvoja
softvera i njegove primjene u modernu poslovanju i predstavlja jednu od mnogo knjiga, koje su
napisane na temu programiranja uopće, ali i programiranja u C++ programskom jeziku. Mnogi
autori sličnih knjiga ili publikacija su na različite načine pokušavali 'dočarati' kako izgleda proces
programiranja i na koji se način ta specifična znanja i logičke rutine mogu usvojiti.
Kada je ova knjiga u pitanju, već na osnovu nekoliko početnih stranica, vidljiv je napor i
pokušaj autora da složenu problematiku računalnog programiranja na što lakši i jednostavniji
način prezentira onima kojima je knjiga prvenstveno i namijenjena – početnicima u računalnom
programiranju. Zbog tog napora, koji nije ostao samo na pokušaju, smatram da je upravo to ono
po čemu se ova knjiga razlikuje od velikog broja sličnih knjiga.
Knjiga obrađuje uvijek aktualnu temu, a odlikuje je jasan, terminološki korektan i
razumljiv stil. Sistematizacija će doprinijeti razumijevanju i preglednosti, a metodički pristup
temeljen na primjerima i konkretnim primjenama zasigurno olakšati savladavanje i razumijevanje
sadržaja. Posebna 'dodana vrijednost' knjizi su brojni praktični primjeri, ilustracije i slike.
Knjiga „Uvod u C++ programiranje“ ima sličan koncept kao i većina knjiga pisanih na temu
programiranja kao što su obrazlaganje teorijskih elemenata i tehnika programiranja sa malo ili
nedovoljno praktičnih primjera ili nedovoljno adekvatnih primjera, koji bi poslužili za brže i lakše
usvajanje vještine programiranja. Ono po čemu se ova knjiga razlikuje od ostali pisanih na istu
temu, jeste jednostavan i početnicima ili nedovoljno upućenima u ovu oblast, prilagođen način
na koji autor biranjem adekvatnih primjera, kao i nekim posebnim tehnikama postiže lakoću
razumijevanja kod čitaoca. Jedna od tih posebnih tehnika osobito u dijelu knjige koji objašnjava
logiku rada programa jeste obilježavanje ključnih riječi u rečenici bilo boldiranjem
(podebljavanjem zapisa) ili upotrebom različitih boja za razlikovanje različitih objekata u
kompjuterskom programu u skladu sa bojama koje se za istu stvar koriste u editoru, kao jednoj
od osnovnih komponenti razvojnog okruženja (Code::Block), što svakako ubrzava i povećava
stepen razumijevanja gradiva koje je potrebno usvojiti.
Bez obzira na to što je knjiga namijenjena prije svega početnicima u programiranju, zbog
činjenice da se ne bavi samo osnovnim konceptima, nego u značajnoj mjeri i naprednijim
konceptima, može poslužiti i onim iskusnijim programerima, koji se bave programiranjem u
drugim programskim jezicima.
5
UVOD............................................................................................................................................................ 9
1. BROJNI SISTEMI I ZAPISIVANJE ZNAKOVA U MEMORIJI ........................................................................ 12
1.1. Pretvaranje brojeva iz bilo kojeg brojnog sistema u decimalni ...................................................... 14
1.2. Pretvaranje brojeva iz decimalnog brojnog sistema u bilo koji drugi brojni sistem ....................... 15
1.3. Hijerarhija logičkih jedinica memorije ............................................................................................ 16
2. PROGRAMSKI JEZICI ............................................................................................................................... 17
3. FAZE PROGRAMIRANJA .......................................................................................................................... 20
3.1. Analiza i definisanje problema ........................................................................................................ 21
3.2. Izrada algoritma .............................................................................................................................. 21
3.3. Izrada dijagrama toka...................................................................................................................... 22
3.4. Pisanje pseudokoda ........................................................................................................................ 23
3.5. Pisanje izvornog programa (kodiranje) ........................................................................................... 23
3.6. Prevođenje izvornog koda (kompajliranje) ..................................................................................... 24
3.7. Linkovanje (povezivanje) ................................................................................................................. 25
3.8. Testiranje programa........................................................................................................................ 26
3.9. Implementacija programa............................................................................................................... 27
3.10. Dokumentovanje programa .......................................................................................................... 27
3.11. Eksploatacija programa................................................................................................................. 27
3.12. Održavanje programa ................................................................................................................... 28
4. PROGRAMIRANJE U PRAKSI ................................................................................................................... 30
4.2. Pisanje drugog program u C++ jeziku.............................................................................................. 33
4.3. Pisanje trećeg programa ................................................................................................................. 35
4.4. Pisanje četvrtog programa .............................................................................................................. 36
5. VARIJABLE I DEKLARISANJE VARIJABLI ................................................................................................... 37
6. KONSTANTE ............................................................................................................................................ 39
7. OSNOVNI TIPOVI PODATAKA ................................................................................................................. 41
7.1. Realni tip podataka ......................................................................................................................... 43
7.3. Logički tip podataka ........................................................................................................................ 45
7.4. Nabrojivi (engl. enumerated) tip podataka .................................................................................... 45
7.5 Void tip podataka ............................................................................................................................. 47
8. OPERATORI............................................................................................................................................. 48
6
8.1. Operatori pridruživanja ................................................................................................................... 48
8.2. Relacioni operatori ili operatori poređenja i operatori jednakosti ................................................. 49
8.3. Aritmetički operatori....................................................................................................................... 50
8.4. Logički operatori ............................................................................................................................. 54
8.5. Uslovni operator grananja .............................................................................................................. 55
8.6. Stream operatori ............................................................................................................................. 56
8.7. Comma (zarez) operatori ili operatori razdvajanja ......................................................................... 57
8.8. Dodatni operatori ........................................................................................................................... 57
8.9. Operator sizeof ............................................................................................................................... 59
8.10. Identifikatori (imena) .................................................................................................................... 61
9.0. NAREDBE ZA KONTROLU TOKA PROGRAMA (KONTROLNE STRUKTURE) ........................................... 63
9.1. Sekvencijalne strukture u C++ jeziku (sekvenca ili blok) ................................................................. 64
9.2. If iskaz izbora ................................................................................................................................... 66
9.3. Struktura selekcije if...else .............................................................................................................. 69
9.4. Struktura selekcije višestruki izbor (switch).................................................................................... 73
10. STRUKTURE PONAVLJANJA (REPETICIJE) ............................................................................................. 78
10.1. Petlja while do............................................................................................................................... 79
10.2. Petlja do while............................................................................................................................... 83
10.3. Petlja for ........................................................................................................................................ 86
11. NAREDBE ZA PROMJENU TOKA IZVRŠAVANJA PETLJI .......................................................................... 93
11.1. Naredba continue ......................................................................................................................... 94
11.2. Naredba break .............................................................................................................................. 97
11.3. Naredba goto ................................................................................................................................ 98
12. FUNKCIJE U C++ PROGRAMSKOM JEZIKU .......................................................................................... 103
12.1. Definicija, poziv i parametri funkcija u C++ ................................................................................. 104
12.1.1. Definicija (deklarisanje) funkcije .............................................................................................. 104
12.1.2. Poziv funkcije ........................................................................................................................... 105
12.1.3. Parametri ili argumenti funkcije .............................................................................................. 107
12.2. Prototip funkcije ......................................................................................................................... 110
12.3. Povratak iz funkcije ..................................................................................................................... 112
12.4. Funkcija exit() .............................................................................................................................. 113
13. OBLAST VAŽENJA VARIJABLI (SCOPE) ................................................................................................ 114
13.1. Lokalna oblast važenja varijabli .................................................................................................. 115
7
13.2. Globalna oblast važenja varijabli (global scope) ......................................................................... 118
13.3. Memorijske (storage) klase......................................................................................................... 118
13.4. Statička varijabla ......................................................................................................................... 119
13.5. Pravila vidokruga identifikatora (scope rules) ............................................................................ 120
13.6. Rekurzija ...................................................................................................................................... 123
13.7. Funkcije sa praznom listom parametara..................................................................................... 128
13.8. Inline funkcije .............................................................................................................................. 129
13.9. Podrazumijevani (default) argumenti ......................................................................................... 130
13.10. Preklapanje (overloading) funkcija ........................................................................................... 131
13.11. Reference i referentni parametri .............................................................................................. 132
14. NIZOVI ................................................................................................................................................ 134
14.1. Manipulacije sa nizovima ............................................................................................................ 136
14.2. Prekoračenje granica niza ........................................................................................................... 137
14.3. Korišćenje nizova karaktera (polja) za manipulaciju sa stringovima .......................................... 138
14.4. Predaja nizova funkcijama .......................................................................................................... 142
14.5. Višedimenzionalni nizovi............................................................................................................. 144
15. SLOGOVI PODATAKA (STRUKTURE) ................................................................................................... 148
15.1. Pristup članovima strukture ........................................................................................................ 150
15.2. Inicijalizacija ili punjenje struktura.............................................................................................. 151
15.3. Predaja parametara struktura funkcijama .................................................................................. 152
8
UVOD
Računar se smatra najvećim izumom 20. vijeka, odnosno najvećim izumom do tada. Tu se
prije svega misli na računar opšte (univerzalne) namjene, odnosno digitalni računar, koji za
razliku od analognih računara, koji pretvaraju određene fizičke veličine u druge, funkcioniše na
osnovu određenih stanja (zapisa) na memorijskom mediju. Uz pomoć digitalnih računara
obrađujemo određene vrste podataka. Kako se podaci memorišu u računaru? Koristeći osobinu
računarskih elemenata da mogu poprimati samo dva stanja (struja u nekoj žici ili teče ili ne teče;
struja u nekom elektronskom elementu teče u jednom smjeru npr. smjeru kazaljke na satu ili
drugom, obrnutom smjeru; na magnetnim medijima tipa trake ili diska, podaci se upisuju po
određenim zamišljenim kanalima ili koncentričnim krugovima u obliku namagnetisanih ili
nenamagnetisanih tačaka), koja se simbolički predstavljaju sa 0 ili 1, uz pomoć jednog
elektronskog elementa mi možemo memorisati vrijednost samo jednog najnižeg elementa u
hijerarhiji memorijskih zapisa, koji nazivamo bit.
Podaci su organizovani u hijerarhiju koja započinje bitom i nastavlja se sve do baze
podataka (slika 1). Bit (binarna cifra - binary digit) je najmanja jedinica podatka, koja se može
predstaviti u memoriji računara i koju računar može da obradi. Pojam binarna označava da bit
može da se sastoji samo od nula ili jedinica. Niz od osam bita čini bajt (Byte) i predstavlja jedan
alfanumerički znak. Zašto baš osam bita? Da bi se jedan znak razlikovao od drugih znakova, on
mora biti predstavljen jednistvenom kombinacijom nula i jedinica.
Koliko se različitih znakova (slova, brojeva i specijalnih znakova) može predstaviti ako je
dužina te kombinacije 2, a na raspolaganju nam stoje 2 binarna znaka (0 i 1), a svaki od njih se
može ponavljati u toj kombinaciji onoliko puta koliko je dužina te kombinacije? Dakle, koje su
kombinacije moguće? One su prikazane na tabeli 1.
10
izračunavanje kombinacija je sasvim drugačija. Dakle ono što je u radu prethodno nazivano
kombinacijama, u statistici se zove varijacije sa ponavljanjem.
Broj koji se kodira Varijacije sa ponavljanjem Cifre
u decimalnomom od 4 binarna znaka heksadecimalnog
brojnom sistemu brojnog sistema
1 0000 0
2 0001 1
3 0010 2
4 0011 3
5 0100 4
6 0101 5
7 0110 6
8 0111 7
9 1000 8
10 1001 9
11 1010 A
12 1011 B
13 1100 C
14 1101 D
15 1110 E
16 1111 F
Kao što se iz tabele 3. vidi, prvih 10 binarnih varijacija se može koristiti za predstavljanje
10 brojeva u decimalnom brojnom sistemu (0 do 9). Posljednjih šest varijacija, predstavlja višak
kodnih kombinacija ili redundantnost koda. Na ovaj način se odvijao i razvoj kodiranja. Kodovi sa
4 binarna znaka, nazivali su se tetradni kodovi, a računari koji su radili na bazi njih, mogli su
predstavljati samo brojeve (od 0 do 9) i raditi (obrađivati) samo računske operacije kao
kalkulator. Sa dužinom varijacije od 5 (25=32) i 6 (26=64), povećao se broj jedinstvenih varijacija,
ali ni jedan ni drugi kod nisu obezbjeđivali dovoljan broj varijacija da bi svi potrebni znakovi imali
jedinstvenu identifikaciju. To se desilo tek sa 7-bitnom, odnosno definitivno sa 8-bitnom
kombinacijom (27=128 i 28=256), tako da je svaki znak predstavljen jedinstvenom 8-bitnom
identifikacijom, koja predstavlja jedan byte.
Kao što je već rečeno, računar “razumije” ili može “prepoznati” ili “pročitati” samo onaj
podatak, koji mu je kodiran (zabilježen na nekom mediju) uz pomoć samo dva različita stanja,
koja se simbolički predstavljaju kao 0 ili 1. Ista je stvar ako se radi o instrukcijama, koje
predstavljaju osnovne elemente kompjuterskog programa. Kada je riječ o kompjuterskom
11
programu, treba razlikovati binarni zapis izvornog programa od binarnog zapisa izvršnog
programa, koji se dobije kompajliranjem izvornog programa (o čemu će biti malo detaljnije riječi
u nastavku), ali i jedan i drugi su faktički samo nizovi nula ili jedinica, odnosno stanja fizičkih
elemenata memorije, kojima su reprezentovani. To drugim riječima znači da bez obzira na to o
koliko moćnom, pametnom i modernom računaru se radi, sve što je u njemu memorisano (kako
u internoj ili eksternoj memoriji), bilo da se radi o numeričkim ili tekstualnim podacima,
fotografijama, audio ili video zapisima, o sistemskim ili aplikativnim programima (izvornim ili
izvršnim), predstavlja samo odgovarajući niz nula i jedinica. Pošto su najmanje dva znaka
neophodna da bi se kreirao neki zapis, kojem se može dodijeliti neko značenje, binarni brojni
sistem, čiju osnovu (bazu) čine 2 znaka (0 i 1), nametnuo se kao jedino rješenje za konstruktore
uređaja (računara), čiji je primarni cilj bio memorisanje i automatska obrada podataka.
Brojni sistem predstavlja skup pravila pomoću kojih se jedinstveno identifikuju i zapisuju
brojevi i skupa cifara, koje se koriste u konkretnom brojnom sistemu. Brojne sisteme dijelimo na:
1) Nepozicione brojne sisteme i
2) Pozicione brojne sisteme
Nepozicioni brojni sistemi su oni kod kojih vrijednost cifre (težina pozicije te cifre) u zapisu
brojne vrijednosti (broj sastavljen od osnovnih cifara konkretnog brojnog sistema) ne zavisi od
pozicije te cifre (jedan od osnovnih znakova iz tog brojnog sistema) u tom zapisu. Oni se danas
uglavnom ne koriste, osim rimskog brojnog sistema (tabela 4).
Ako uzmemo primjer 1957. godina se piše uz pomoć rimskih brojeva MCMLVII ili
MDCCCCLVII ili MDCDLVII (https://www.periodni.com/hr/pretvaranje_rimskih_brojeva.html).
Pravila za njihovo zapisivanje su:
ukoliko nekoliko istih cifara stoji jedna pored druge, onda im se vrijednosti
sabiraju (npr. ako je zapis brojne vrijednosti (broj) VVVV, izračunava se njegova
vrijednost kao V + V + V + V, što znači da je vrijednost tog zapisa 20, a može i XX,
a može i IVIVIVIVIV)
ukoliko su u zapisu brojne vrijednosti, jedna pored druge zapisane dvije različite
cifre od kojih je prvo zapisana ona sa većom vrijednošću, tada se njihove
12
vrijednosti (težine pozicija) sabiraju (npr. MDL, njegova vrijednost je M + D + L,
radi se o broju 1550)
ukoliko se u broju (zapisu brojne vrijednosti) nalaze dvije različite cifre od kojih
lijevo ona sa manjom vrijednošću, tada se težina njene pozicije (vrijednost)
oduzima od cifre napisane desno (npr. CM, njegova vrijednost je M - C, a to je
900).
Pozicioni brojni sistemi su oni kod kojih vrijednost cifre u zapisu brojne vrijednosti zavisi
od pozicije te cifre u zapisu.
Ako bazu svakog brojnog sistema definišemo kao broj znakova, koji se koristi u tom
sistemu, onda možemo reći da je bazu decimalnog brojnog sistema, koji je univerzalno prihvaćen
u matematici, predstavlja broj 10, jer ima 10 osnovnih znakova (cifara) od kojih je sastavljen svaki
zapis brojne vrijednosti u tom brojnom sistemu. To su cifre 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 i kao što se
vidi ima ih ukupno 10. Dakle, baza binarnog brojnog sistema je 2, jer imamo samo dva znaka (0 i
1), od kojih su sastavljeni svi brojevi (zapisi brojne vrijednosti) u tom sistemu. U skladu s tim, baza
brojnog sistema, koji sadrži 3 znaka (0, 1, 2) je 3, baza brojnog sistema koji sadrži 4 znaka (0, 1,
2, 3) je 4 itd. Brojni sistemi koji se koriste u informatici osim binarnog brojnog sistema su oktalni
sa bazom 8 i heksadecimalni sa bazom 16 ili F.
13
Decimalni broj Binarni ekvivalent Oktalni Hexdecimalni
Ekvivalent ekvivalent
0 0000 00 0
1 0001 01 1
2 0010 02 2
3 0011 03 3
4 0100 04 4
5 0101 05 5
6 0110 06 6
7 0111 07 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
Ako posmatramo bilo koji broj (zapis brojne vrijednosti) u bilo kojem pozicionom brojnom
sistemu, svaka cifra u tom zapisu ima svoju poziciju i težinu pozicije. Pozicije počinju od 0 i broje
se zdesna ulijevo. Npr. za broj 3327(10), koji je broj sa bazom 10, cifra 7 se nalazi na 0. poziciji,
cifra 2 na 1. poziciji, cifra 3 na 2. poziciji i druga cifra 3 (redom slijeva udesno) na 3. poziciji.
Broj 3 3 2 7
Pozicija cifre u broju 3 2 1 0
Pozicija cifre
Težina pozicije = Baza 10 3
102 101 101
Vrijednost težine pozicije 1000 100 10 1
Tekstualno Hiljadarke Stotice Desetice Jedinice
Vrijednost cifre = cifra x težina
3x1000=3000 3x100=300 2x10=20 7x1=7
pozicije
Vrijednost broja 3000 + 300 + 20 + 7 = 3327(10)
Treba zapaziti da broj 3 na poziciji 3 ima vrijednost 3000, a isti broj na poziciji 2 ima
vrijednost 300.
14
Uzmimo drugi primjer: Broj 10101(2)
Broj 1 0 1 0 1
Pozicija cifre 4 3 2 1 0
Težina pozicije = BazaPozicija cifre 24 23 22 21 20
Vrijednost težine pozicije 16 8 4 2 1
Tekstualno Šesnaestice Osmice Četvorke Dvice Jedinice
Vrijednost cifre = cifra x težina
1x24=16 0x23=0 1x22=4 0x21=0 1x20=1
pozicije
Vrijednost broja 16 + 0 + 4 + 0 + 1 =21(10)
Na isti način se vrši pretvaranje brojeva iz bilo kojeg drugog brojnog sistema (npr. iz
oktalnog i heksadecimalnog) u decimalni brojni sistem.
1.2. Pretvaranje brojeva iz decimalnog brojnog sistema u bilo koji drugi brojni sistem
Ovo pretvaranje se vrši tako što se decimalni broj dijeli sa bazom onog brojnog sistema u
koji se pretvara. Ukoliko se pretvara u binarni, dijeli se sa 2, ukoliko se pretvara u oktalni,
decimalni broj se dijeli sa 8 i u slučaju pretvaranja u heksadecimalni broj, dijeli se sa 16. Prvo
dijeljenje sa bazom ima neki rezultata, ali ostatak dijeljenja su cifre 0 i 1 (a to su cifre binarnog
brojnog sistema, ako se dijeli sa 2, zatim 0, 1, 2, 3, 4, 5, 6 i 7, ukoliko se dijeli sa 8 (a to su upravo
cifre oktalnog brojnog sistema. Nakon prvog dijeljenja sa 2, 8 ili 16, rezultat se ponovo dijeli sa 2,
8 ili 16, zavisno od toga u koji brojni sistem želimo pretvoriti decimalni broj. Nakon drugog
dijeljenja imamo neki rezultat, a bilježi se ostatak. Dijeljenje dobivenog rezultata i bilježenje
ostatka dijeljenja se vrši sve dok rezultat dijeljenja ne postane 0. Nakon posljednjeg dijeljenja i
bilježenja posljednjeg ostatka dijeljenja, taj ostatak postaje prva cifra broja u koji pretvaramo
decimalni broj. Ostatak pretposljednjeg dijeljenja postaje druga cifra tog broja, zatim ostatak
prethodnog (predpredposljednjeg) dijeljenja postaje 3 cifra i tako sve do ostatka prvog dijeljenja.
Npr. želimo broj 27(10) pretvoriti u binarni broj, što znači da dijelimo broj sa bazom
binarnog brojnog sistema (2).
15
Ukoliko želimo provjeriti tačnost rezultata:
Broj 1 1 0 1 1
Pozicija 4 3 2 1 0
Baza 2 2 2 2 2
Težina 24 2 3 2 2 21 20
Vrijednost 16 8 4 2 1
Decimalni broj 1x16 + 1x8 + 0x4 + 1x2 + 1x1 = 27
Bajt može biti broj, slovo ili simbol. Logičko grupisanje karaktera u riječi, grupe riječi ili
identifikacioni broj naziva se polje (Field). Na primjer, ime studenta u fajlovima univerzitetskih
računara pojaviće se u polju „ime", a JMBG studenta u polju „JMBG". Polja takođe mogu
sadržavati podatke koji nisu brojevi ili slova, odnosno sliku ili bilo koji multimedijalni zapis. Na
primjer, baza podataka ustanove za registrovanje motornih vozila može da sadrži i slike vlasnika
motornih vozila. Logičko grupisanje srodnih polja (kao što su ime studenta, koji nastavu pohađa,
datum ispita i ocjenu) naziva se zapis (Record). Logičko grupisanje srodnih z.apisa naziva se
datoteka ili tabela (File ili Table). Na primjer, zapisi određenog predmeta na fakultetu (koji se
sastoji od broja predmeta, imena profesora i ocena studenata) čine datoteku o tom predmetu.
Logičko grupisanje srodnih datoteka čini bazu podataka (Database). Po istom principu, datoteka
studenata o predmetima može se grupisati sa datotekom koja sadrži lične podatke o studentu i
datotekom koja sadrži finansijske podatke o studentu da bi se na taj način stvorila baza podataka
o studentima.
1
Kelly Rainer Jr, Efraim Turban Uvod u informacione sisteme, Data status, Beograd, 2009, str. 109
16
2. PROGRAMSKI JEZICI
17
boljeg razumijevanja programskih jezika i programiranja, programiranje, odnosno pisanje
programa, predstavlja analogiju sa prevodom na engleski, koji mora obezbijediti Španac, kada
nešto saopštava Italijanu, engleski jezik predstavlja programski jezik, a prevođenje sa engleskog
na Italijanski, predstavlja proces kompajliranja. Tek tada je zatvoren krug, odnosno uspostavljena
komunikacija.
Programski jezik mora da uvaži sljedeće zahtjeve:
1) Da obezbijedi što je moguće veći konfor za čovjeka pri prenošenju algoritama na računar
2) Da omogući što većem broju ljudi lako praćenje i razumijevanje programskog algoritma
3) Da omogući formalizovanje (automatizaciju) postupka prevođenja sa programskog na
mašinski (računarski) jezik. (Parezanović, 1979.)
Prvi zahtjev znači da programski jezik mora obezbijediti što lakše i jednostavnije
izražavanje o problemu, koji se želi riješiti uz pomoć računara. Pa pošto se radi o različitim
vrstama problema, koji se rješavaju uz pomoć računara, definišu se i različiti programski jezici za
pojedine oblasti primjene računara. Većina savremenih programskih jezika su opšte namjene, ali
imaju i svoje specifične namjene. C jezik se najčešće primjenjuje u programiranju sistemskog
softvera. Java je jezik, koji se najčešće koristi u programiranju za Internet, mobilne telefone i
poslovne aplikacije. C# se koristi u razvoju video-igara, a Pyton i C++ u razvoju aplikacija Vještačke
inteligencije. Tvorac jezika C++ jezika je okarakterisao C++ programski jezik kao jezik opšte
namjene i srednjeg nivoa (Stroustrup, 1996).
Drugi navedeni zahtjev za programski jezik treba da omogući razmjenu programskih
algoritama među programerima, projektantima i drugim stručnjacima, koji rade na sličnim
oblastima. Drugim riječima, programski jezik mora da bude nezavisan od konstrukcije računara.
Treći zahtjev treba da omogući stvaranje posebnog sistemskog programa, koji će
obezbijediti da računar vrši prevođenje izvornog programa napisanog u konkretnom
programskom jeziku na mašinski, odnosno izvršni jezik. Ovaj program se zove kompajler
(compiler) ili prevodilac. Ulazni podaci u ovaj program su konstrukcije iz programskog jezika, koje
on prevodi u skup naredbi mašinskog jezika. Tek kada je cijeli izvorni program preveden na
mašinski jezik, onda može početi izvršavanje programa na računaru.
Danas je u upotrebi veliki broj programskih jezika, od kojih su neki opštenamjenski, a neki
imaju specijalne majene. Jedan od najpoznatijih podjela programskih jezika prema kriteriju
složenosti za čovjeka programera, kao i vremenu nastanka programskog jezika je podjela na:
1. Niže programske jezike (niskog nivoa) u koje spadaju:
a. Mašinski jezici
b. Asembleri
2. Više programske jezike (visokog nivoa)
Šta znače pojmovi jezik niskog, odnosno visokog nivoa? Osnovna karakteristika jezika
niskog nivoa (nižih programskih jezika), koja ih razlikuje od jezika visokog nivoa (viših programskih
jezika) jeste njihova prilagođenost arhitekturi svakog konkretnog računara, a to znači da
18
programer mora do najsitnijih detalja poznavati arhitekturu računara, da bi na njemu napravio
program, koji ima svoju namjenu. Pošto svaki računar direktno razumije samo svoj mašinski jezik,
programiranje u tom jeziku bi značilo da čovjek mora da nauči jezik računara, dakle jezik dva
stanja, odnosno dva znaka. Kao što je za ljude njihov nacionalni jezik, predstavlja “prirodni” jezik,
tako je mašinski jezik “prirodni jezik” za računare i kao takav dizajniran je tako da ima svoju
jedinstvenu hardversku arhitekturu. Mašinski jezik se često naziva izvršnim ili objektnim kodom,
koji jedini može obavljati neku funkciju u računaru. Mašinski jezici se u principu sastoje od niza
bitova (0 ili 1). Na samom početku pojave računara, ljudi su programirali računare u mašinskom
jeziku, ali zbog teškoće savladavanja tog jezika i dužine trajanja tog procesa, brzo se uvidjelo, da
je takav jezik neprihvatljiv za programere. Poseban problem, koji je u vezi sa mašinskim jezicima
jeste da su oni zavisni od računara (mašine) odnosno program isprogramiran u mašinskom jeziku
na jednoj vrsti (arhitekturi) računara, može se koristiti samo na toj vrsti računara.
Nakon što se pokazalo potpuno neprimjerenim učiti jezik računara i pisati programe na
mašinskom jeziku, programeri su počeli da koriste riječi engleskog jezika da bi prikazali osnovne
(elementarne) operacije računara, što je predstavljalo osnovu za nastanak asemblera kao nove
vrste programskih jezika. Asemblerski jezik ili jednostavno asembler je jezik nižeg nivoa, slično
mašinskom jeziku, orijentisan računaru, odnosno prilagođen arhitekturi računara. Svaki binarni
kod zamijenjen je riječima engleskog jezika (load, add, store, move) tako da je ovaj programski
jezik bio značajno razumljiviji i bliži čovjeku. Asembler i asemblerski jezici imaju osobinu da se
njihove instrukcije (operacioni kod i operandi) pišu simbolima, koje nazivamo mnemonici. U
principu, odnos između takvih mnemoničkih instrukcija i mašinskih instrukcija (a to znači i
operacija u kompjuteru) je 1:1. Svakoj instrukciji u asembleru odgovara jedna instrukcija
mašinskog jezika. Iako je ovo postalo malo jasnije i jednostavnije za programere i predstavljalo
napredak u odnosu na mašinsko programiranje i dalje je bilo veoma teško programirati u
asembleru.
Da bi se pojednostavio i ubrzao proces programiranja za programere, korišćene su nove
ideje i pronalazili su se novi načini programiranja, tako je došlo i do nastanka i razvoja viših
programskih jezika gdje je osnovna ideja bila objedinjavanje više asemblerskih instrukcija u
jednu. Zbog te činjenice su bili bliži ljudskom razmišljanju, odnosno razmišljanju programera, pa
se on mogao više fokusirati na algoritamsko rješavanje problema, a manje vremena trošio na
pisanje konkretnog programskog koda. Zato se može reći da što je neki programski jezik na višem
nivou, on ostavlja više vremena programeru za fokusiranje na problem, a istovremeno je
potrebno neuporedivo manje znati o principima rada računara. Dakle postoji potpuna
nezavisnost konkretnog programskog računara od hardverske arhitekture na kojoj će se program
izvršavati. Ako su niži programski jezici više orjentisani računaru, viši programski jezici su više
orjentisani čovjeku i njegovom načinu razmišljanja.
19
Osnovne prednosti korišćenja viših programskih jezika:
1. Efikasniji proces programiranja
2. Razumljivost naredbi i programskih konstrukcija zbog toga što se izražavaju riječima i
rečenicama malo modificiranog engleskog jezika, a mogu sadržavati i matematičku
notaciju
3. Potpuna nezavisnost od arhitekture računara
4. Prilagođenost rješavanju specifičnih problema
3. FAZE PROGRAMIRANJA
20
11. Eksploatacija i
12. Održavanje programa
Izrada algoritma je sljedeća faza u razvoju programa. Nakon definisanja problema, treba
pristupiti izboru jedne ili više metoda njegovog rješavanja. Najznačajnije metode, koje se tu
koriste su logičke i/ili aritmetičke metode. Njihovom primjenom, koja zahtijeva posjedovanje
odgovarajućeg metodološkog znanja, stvara se algoritam. (Panian, 1999)
Riječ „algoritam“ dolazi od riječi Alchwarizmi (što je bio nadimak perzijskog pisca, koji se
zvao Abu Ja’far Mohammed Ibn Musa al Khowarizmi iz 825. prije n.e.) i njome se označava skup
pravila, koji vode rješenju nekog matematičkog problema. Ovim pravilima se u procesu
programiranja definiše proces transformacije ulaznih podataka u izlazne podatke (rezultate). Uz
pomoć algoritma se ustvari definiše procedura i redoslijed izvršavanja određenih operacija. U
ručnoj (manualnoj) obradi podataka, algoritam je uputstvo (skup postupaka) kako riješiti neki
zadatak ili obaviti neki posao.
21
3.3. Izrada dijagrama toka
Izrada dijagrama toka (flow chart) predstavlja narednu fazu procesa programiranja, čiji
se značaj može objasniti jednom rečenicom: „Slika govori više od hiljadu riječi“. Dijagram toka se
može definisati kao grafički prikaz toka programa, odnosno algoritma. Osnovni elementi
dijagrama toka su standardizirani grafićki simboli funkcija, operacija, nosilaca podataka i
informacija, prikazani na slici. (Slika 2.)
22
3.4. Pisanje pseudokoda
Pisanje pseudokoda je faza programiranja koja nije neophodna, ali predstavlja specifičan
alat koji pomaže u boljem razumijevanju algoritma i povećanju produktivnosti programiranja. To
je vještački i neformalni jezik koji pomaže programerima prilikom razvoja algoritama, jer ne
moraju da brinu o detaljnim i strogo propisanim pravilima nekog programskog jezika. Pseudokod
je sličan svakodnevnom prirodnom jeziku, konvencionalan je i veoma koristan kao podloga
razvoju programa u svim fazama, jer pomaže programerima da više vremena troše na
razmišljanje o algoritmu i rješenju problema a manje o programskom jeziku. Pseudokod je
tobožnji program (grč. pseudos znači laž) jer iako je sličan (opisno) računarskom programu,
ustvari nije napisan ni u kojem programskom jeziku koji bi se mogao direktno ili indirektno (nakon
prevođenja) primijeniti (izvoditi) na bilo kojemu računaru. Pseudokod se sastoji od riječi i
rečenica na govornom jeziku koji opisuju i ukratko objašnjavaju pojedine zadatke algoritma.
Prije početka pisanja izvornog koda, neophodno je odabrati jedan od programskih jezik u
kojem će program biti pisan. Pošto programerima na raspolaganju danas stoji veoma veliki broj
programskih jezika, izbor jezika će prvenstveno zavisiti od karakteristika samog problema kojeg
je potrebno riješiti, ali i od znanja, vještina i pregferencija programera. Najveći broj problema,
ako ne i svi, najvjerovatnije se može riješiti primjenom praktično bilo kojeg jezika, samo je pitanje
koliko bi to bilo brzo i elegantno. Pisanje izvornog programa predstavlja pisanje (unos putem
editora) svih potrebnih elemenata nekog od viših programskih jezika u skladu sa razvijenim
algoritmom, odnosno dijagramom toka, poštujući određena formalna pravila (sintaksu), koja su
različita za svaki od njih. Izvorni kod se može upisivati u bilo kojem programu za obradu teksta
(engl. text editor), ali najveći broj današnjih vendora sistemskog softvera, kompajlere i linkera
(povezivače) isporučuje u paketu, zajedno sa ugrađenim editorom, kao sastavnim dijelom tog
paketa, koji omogućava upis i ispravljanje izvornog koda programa. Ti su programski paketi
poznatiji pod nazivom integrisano razvojno okruženje (engl. integrated development
environment, ili skr. IDE).
Kada se završi pisanje i eventualno ispravljanje izvornog koda, on se pohranjuje u
datoteku izvornog koda na disku (sa ekstenzijom koja označava jezik naprimjer .bas za BASIC,
.pas za PASCAL, .for za FORTRAN, .cbl za COBOL, .c za C jezik, cpp za jezik C++ itd. ).
23
3.6. Prevođenje izvornog koda (kompajliranje)
Prevođenje izvornog koda (kompajliranje) je sljedeća faza u razvoju programa. Ova faza
se obavlja uz pomoć specijalnih sistemskih programa, koji se zovu kompajleri ili prevodici (engl.
Compiler) ili interpreteri (engl. Interpreters). Osnovna funkcija kompajlera i interpretera je
prevođenje programa napisanog u nekom višem programskom jeziku (izvornog programa) u
mašinski jezik (objektni jezik). Osnovna razlika između kompajlera i interpretera je ta što
kompajler prevodi cijeli izvorni program na mašinski jezik odjednom, dok interpreter prevodi
naredbu po naredbu, ili preciznije “čita” naredbu izvornog programa, “prevodi je”, odnosno
“interpretira” na mašinski jezik i “izvodi”, zatim sve te 3 operacije radi sa drugom naredbom
izvornog koda, pa sa trećom itd. Dakle, interpreter ne kreira mašinski program kao rezultat
prevođenja, nego svaki put kada ga pustimo u rad on se obraća izvornom programu, pa čita,
prevodi i izvršava naredbu po naredbu izvornog programa dok ne dođe do kraja. Zbog toga on
radi mnogo sporije od kompajlera. Kada je riječ o C++ jeziku, ulaz u postupak kompajliranja,
predstavlja izvorni program u C++ jeziku, smješten u datoteku na disku, koja ima neko ime i
ekstenziju .cpp, a kao izlaz, odnosno rezultat kompajliranja, ukoliko nema formalnih grešaka,
nastaje datoteka sa istim imenom kao .cpp, ali sa ekstenzijom .o, što znači da se u njoj nalazi
objektni kod. Pored te funkcije, kompajler ima zadatak da provjerava i formalnu ispravnost
napisanog programa, odnosno da otkriva greške, koje nisu u skladu sa sintaksom (formalnim
pravilima) svakog konkretnog programskog jezika. Npr. u C++ jeziku definisano je pravilo da se
svaka naredba treba da se završi sa znakom ”;”. Ukoliko to nije tako, kompajler će prijaviti
formalnu grešku i “tražiti” da se ona ispravi.
U integrisanim razvojnim okruženjima (IDE), kompajler se pokreće se pokreće pritiskom
na neki taster na tastaturi ili odgovarajućom komandom iz nekog menija. Ukoliko kompajler nije
integrisan, poziv se obavlja sa komandne linije operativnog sistema u kojoj se propisanom
procedurom navodi naziv kompajlera, naziv datoteke izvornog programa, naziv datoteke
objektnog programa i eventualno još neke opcije vezane za način kompajliranja.
Kompajler tokom prevođenja izvornog programa, provjerava ispravnost sintakse
napisanog izvornog koda i u slučaju pronađenih ili naslućenih sintaksnih grešaka prikazuje na
ekranu ili štampa na štampaču odgovarajuće poruke o greškama, odnosno poruke o mogućim
greškama (upozorenjima). Greške koje prijavi kompajler nazivaju se formalnim greškama ili
greškama u sintaksi napisanog programa ili greške pri kompajliranju (engl. compile-time errors).
Nakon toga programer putem editora teksta, treba da ispravi sve prijavljene greške i ponovo
poziva u rad kompajliranje ispravljenog izvornog programa. Ovaj se postupak ponavlja sve dok
prevođenje koda ne bude uspješno završeno, odnosno sve dok kompajler ne prijavi poruku da
nema formalnih grešaka. Rezultat prevođenja izvornog koda programa je datoteka objektnog
24
koda (engl. object code), koja se lako prepoznaje po tome što obično ima ekstenziju .o ili .obj.
Nakon što su ispravljene sve prijavljene greške i naslućena upozorenja kompajlera i nakon što je
je kod preveden bez grešaka i upozorenja, prelazi se u sljedeću fazu procesa programiranja, a to
je faza linkovanja.
25
ni oni najiskusniji i najvještiji programeri ne mogu i ne smiju nikada biti sigurni da će program koji
su napisali ispravno proraditi iz prvog pokušaja. Naime, logično je očekivati da će u prvoj, a često
i u naknadnim verzijama programa postojati određene formalne i/ili logičke greške. Formalne
greške (compile-time-errors and/or link-time-errors) proizilaze iz nepridržavanja pravila sintakse
nekog programskog jezika, a logičke (run-time-errors) iz nedosljedne primjene metoda rješavanja
problema (Panian, 1999).
26
predviđeni funkcionisanjem programa budu pouzdani i tačni. Sve dok se ne postigne taj cilj,
postupak testiranja će se ponavljati.
27
programa u rad (izvođenje), izvršni program se prenosi sa eksterne memorije, gdje je stalno
pohranjen u radnu memoriju računara i tada počinje obavljanje funkcije zbog koje je napravljen.
Tokom eksploatacije programa, oni koji ga koriste dužni su bilježiti eventualne neregularnosti u
radu programa, obavještavati programera o tome i tražiti od njega da se one poprave. Dobivanje
povratnih informacija o radu programa u eksploatacionim uslovima ima za programera
neprocjenjivu vrijednost, zbog toga što mu omogućava da “iz prve ruke” sazna o eventualnim
greškama u radu programa.
Eksploatacija programa pretpostavlja rješavanje problema sa kojima su se korisnici
susretali prije nego što su naručili pomenuti program. Jednom razvijeni program davaće jednako
dobre rezultate sve dok se situacija vezana za njegovo korišćenje ne promijeni. Ukoliko se radi o
manjim promjenama, one se mogu ugraditi u programe manjim intervencijama (korekcijama,
prilagodbama ili jednom riječi softverskim “zakrpama”). U tom slučaju se govori o održavanju
programa. Međutim, ako se radi o radikalnim promjenama, onda je neophodno pristupiti
razvijanju potpuno novog programa.
28
Programiranje u užem smislu se sastoji iz 4 faze (slika 3):
29
4. PROGRAMIRANJE U PRAKSI
4.1. Pisanje prvog programa u C++ jeziku: Prikaz na ekranu jedne linije teksta
30
Slika 3b. Poruka nakon kompajliranja i rezultat izvršenja programa.
Da bi smo shvatili šta to ovaj jednostavni program radi, detaljno ćemo objasniti liniju po
liniju izvornog koda programa. Linije sa rednim brojem 1 i 2, počinju sa znakovima // ili slash
slash. Kada linija u izvornom kodu programa, počinje sa ova dva znaka, to znači da se ona neće
kompajlirati (prevoditi) kada se pozove kompajliranje programa, niti izvršavati kada se pozove
izvođenje programa, nego predstavlja komentar u programu (što bi trebalo koristiti u smislu
dobre prakse), koji objašnjava kod programa ili pruža neke druge veoma važne informacije o
programu, kao što su npr. informacije o tome koje autor programa, kada je kreiran taj program,
koja je verzija programa, šta je njegova namjena, šta je funkcija pojedinih dijelova programa,
objašnjenje koda neke linije, funkcije itd. Drugim riječima, komentar sa svim ovim podacima o
programu, predstavlja minimalnu dokumentaciju programa. Komentar koji počinje sa //, naziva
se još i linijski komentar i završava sa završetkom tekuće linije, što znači da mu je dužina
ograničena dužinom linije (reda). Ukoliko želimo napisati komentar sa više linija, imamo dvije
opcije na raspolaganju: 1. opcija je da svaki red komentara počinje sa // i 2. opcija – korišćenjem
notacije /* na početku komentara */ na kraju komenatara.
Treća linija koda:
#include <iostream> // Bez ove linije ne bi bio moguć prikaz na ekranu niti unos sa tastature
je pretprocesorska naredba, koja predstavlja poruku za C++ pretprocesor. Sve linije koje počinju
sa # (hash) procesiraju se prije nego što se program kompajlira. Ova linija ima funciju da prenosi
pretprocesoru poruku da uključi u program sistemsku biblioteku (library): <iostream>
(input/output stream header file), koji mora biti dio koda za svaki program koji koristi prikaz
podataka na ekran ili ima potrebu za ulaznim podacima (unos podataka) preko standardnog ulaza
(tastature). Ili ukratko rečeno, ova naredba ima zadatak da obezbijedi ulazno-izlazni tok
podataka. Veoma često, početnici u programiranju zaborave da uključe u program ovu naredbu,
pa im tada program neće korektno raditi prilikom pozivanja naredbi koje zahtijevaju ulaz ili izlaz
podataka.
Linija // Funkcija main – početak izvršenja svakog C++ programa, predstavlja još jednu liniju
komentara, koji se odnosi na sljedeću (ne praznu) liniju koda, a pokazuje liniju od koje počinje
izvršavanje programa.
Linije 5. I 10. Su prazne linije, koje imaju samo “estetsku” funkciju i predstavljaju primjer dobre
prakse programiranja, koji obezbjeđuje bolju preglednost i čitljivost koda programa. Šesta linija
31
koda: int main(), predstavlja glavni dio svakog C++ programa. Ovom linijom počinje stvarni
program sa funkcijom koja se naziva main(). Generalno rečeno, funkcija predstavlja dio koda koji
je zadužen obavlja određeni zadatak (radnju). Kada smo kod funkcija, o kojima će detaljnije
kasnije biti riječi, na ovom mjestu treba reći da program u C++ jeziku, može da ima proizvoljan
broj različitih vrsta funkcija, pri čemu je funkcija main() ima specifičan zadatak. To je funkcija koja
se samostalno izvršava. Ostale funkcije se pozivaju iz glavnog programa. Kada god se program
starta, ona se automatski poziva, pa zato možemo reći da je main funkcija u stvari gradivni blok
svakog programa. Lijevo od riječi main (glavna funkcija), u svakom C++ programu, piše se
rezervisana riječ int, (nastala kao skraćenica od engleske riječi integer, što znači cijeli broj) koja
se može koristiti u dva značenja: a) da deklariše (označi) neku varijablu (promjenljivu) kao
cjelobrojnu varijablu, odnosno varijablu u koju je moguće pohranjivati samo cijele brojeve i b) da
označi da će main funkcija, kao rezultat rada, "vratiti" cjelobrojnu vrijednost (int) i pohraniti je u
neimenovani dio memorije, kojem može pristupiti main funkcija. Trenutno govorimo o ovom
drugom značenju.
U svakom programskom jeziku, pa tako i u C++ jeziku, postoji spisak ključnih ili
rezervisanih riječi, (jedna od njih je int), kojima samo ime govori da se te riječi ne mogu koristiti
(jer su rezervisane za specijalne namjene) kao imena koja definiše korisnik, kao što su imena
varijabli, funkcija, labela itd. Ključna riječ je riječ u kodu koja je rezervisana sa C++-om za
specifične namjene.
Kao i sve druge funkcije, tako i main funkcija počinje sa otvorenom vitičastom zagradom
{, i završava zatvorenom vitičastom zagradom }, a sve što se nalazi između ovih zagrada
predstavlja tijelo funkcije ili blok funkcije. U našem primjeru to su 7. i 11. linija koda.
Linija 8: std::cout << "\n\nDobro došli u C++ programiranje!\n"; //Prikazuje poruku
“naređuje” kompjuteru da na standardnom (skraćenica std) izlazu (ekranu ili monitoru) prikaže
(cout izlaz iz C programa, koji se čita “Ce Out”) niz znakova (karaktera), koji se nalaze između
duplih navodnika i koji se često nazivaju string, literal ili poruka. Linija 8 uključuje std, dvije
dvotačke ::, cout, operator <<, string "\n\nDobro došli u C++ programiranje!\n" i tačku zarez ;, i
naziva se iskaz ili statement. Svaki C++ iskaz mora se završiti sa ;. Za pretprocesorske naredbe
(kao što je #include), bitno je da počinju znakom # i da se ne završavaju ukucavanjem bilo kojeg
znaka. Za prikaz stringa na ekranu, korišćena je komanda std::cout, a moguće je koristiti i
komandu cout (bez std:: ispred) u slučaju ako je prethodno navedena komanda: using
namespace std;. Pisanje komande za prikaz niza znakova u formi std::cout, označava da se koristi
funkcija cout, koja pripada imenovanom prostoru (namespace-u) std. Imena cin (standardni
ulazni tok, odnosno tastatura) i cerr (standardni tok za greške, odnosno ekran ) također pripadaju
imenovanom prostoru (namespace-u) std. O tome malo kasnije.
Dakle, ukoliko u kod programa ne uključimo using namespace std;, prije svake upotrebe cout,
cin i cerr u programu, moramo koristiti komandu std::. Ukoliko u kod programa uključimo using
namespace std;, to će omogućiti da izostavimo std:: pri korišćenju cin, cout ili cerr.
32
Operator << (čita se “manje, manje”) se naziva stream insertion operator i koristi se prikaz na
standardnom zlazu, odnosno u trenutku kada se program izvršava, vrijednost desno od operatora
(izlazni string) se insertuje (ubacuje) na izlazni stream (ekran) i to uzrokuje prikaz poruke odnosno
stringa niza znakova (karaktera), koji se nalaze između navodnika i to u redosljedu kako su
napisani u stringu. Ako analiziramo string iz programa: "\n\nDobro došli u C++ programiranje!\n"
i rezultate prikaza, vidjećemo da se znak \n ne prikazuje na ekranu. Karakter \ (backslash) se još
naziva i escape karakter ili esape znak i njegovo navođenje u stringu koji se prikazuje, označava
da iza njega u stringu, slijedi "specijalni" znak, koji treba prikazati na standardnom izlazu. \
(backslash) i taj sljedeći znak u stringu, zajedno predstavljaju escape sekvencu. Escape sekvenca
\n znači skok kursorana početak sljedeće linije. U našem primjeru, kada počne izvršavanje
programa, odnosno prikaz stringa na standardnom ekranu, prije poruke “Dobro došli u C++
programiranje!”, kursor će skočiti sa 1. Reda, gdje mu je inicijalna pozicija, na početak drugog
reda (\n), a onda na početak trećeg reda (drugi escape znak \n), gdje će se tek sada prikazati tekst
poruke. Neke od escape sekvenci su prikazane u tabeli 10.
Escape Značenje
sequence
\n Novi red. Pozicionira kursor na ekranu na početak sljedećeg reda
\t Novi horizontalni tabulator. Pomjera kursor na ekranu na sljedeću tab poziciju
\v Novi vertikalni tabulator. Pomjera kursor na ekranu na sljedeću vertikalnu poziciju
\b Backspace. Vraća kursor za jednupoziciju ulijevo
\’ Jednostruki navodnik (apostrof). Uzrokuje prikaz jednostrukog navodnika
\” Dvostruki navodnik. Uzrokuje prikaz dvostrukog navodnika
\\ Backslash. Uzrokuje prikaz znaka \ (odnosno, silazne kose linije)
\a Alert. Zvučni signal
\r Carriage return. Pozicionira kursor na početak tekućeg reda.
Linija 9: return 0; // Pokazuje da je program izvršen uspješno, predstavlja jedan od više načina
koji se koriste da bi se završilo izvođenje funkcije. Kada se return iskaz koristi na kraju tijela main
funkcije, vrijednost 0, označava da je program uspješno završen. I na kraju: linija 11 se sastoji iz
jednog znaka: } (zatvorena vitičasta zgrada). Ona označava kraj main funkcije, odnosno kraj
programa.
33
U ovom dijelu teksta, objašnjavamo na primjerima još dvije opcije prikaza teksta na
ekranu: a) prikaz teksta (stringa) u jednom redu ekrana uz pomoć dvije programske linije i b) i to
i prikaz striga znakova na više linija sa jednom programskom linijom, odnosno jednim iskazom.
Slika 4. Prikaz jedne linije teksta sa više iskaza [(slučaj pod a)]
Ovdje treba primjetiti da su u programu korišćena dva std::cout iskaza, a cijeli tekst je prikazan u
jednom redu prilikom izvršenja. Nakon prikaza stringa navedenog u prvom std::cout iskazu,
kursor je ostao na mjestu iza prikaza teksta “… kojim se”, pa se tu nastavlja prikaz stringa iz
drugog std::cout iskaza, koji počinje sa “ilustruju ….”. Vidljivo je da su na tom mjestu spojene
dvije riječi “se” i “ilustruju” i prikazane u poruci kao “…seilustruju…”, pa ih je potrebno razdvojiti
jednim space-om. Taj se space (prazan znak) može dodati na kraju stringa, koji se prikazuje prvim
std::cout iskazom “…kojim se “ ili na početku stringa, koji se prikazuje drugim std::cout iskazom
“ ilustruju…”, pa onda to nakon modifikacije programa, kompajliranja i izvršenja, izgleda ovako:
34
4.3. Pisanje trećeg programa
Primjer trećeg programa (prikaz više linija teksta jednim cout iskazom)
Slika 5. Prikaz više linija teksta sa jednim cout iskazom [(slučaj pod b)]
Nakon kompajliranja i izvođenja, prikazuje se sljedeći rezultat (slika 5). Ovdje je ukratko potrebno
objasniti liniju 10. programskog koda:
10 std::cout << "\n Ovo je program \n kojim se\n ilustruju karakteristike cout iskaza\n";
U stringu (tekst između navodnika) nalaze se 4 escape sekvence \n, koje kada se pošalju na izlazni
tok (konzolu) uz pomoć std::cout iskaza, tekst koji slijedi iza njih prikazuju od prve kolone
sljedećeg reda. Prva escape sekvenca u stringu, pozicionira kursor na prvu kolonu drugog reda i
počevši od nje, prikazuje nastavak stringa sve do drugog pojavljivanja te iste sekvence, koja opet
pozicionira kursor na prvu kolonu trećeg reda, prikazuje nastavak stringa do trećeg pojavljivanja
oznake za novi red, nakon čega se u četvrtom redu prikazuje tekst “ilustruju karak ….”, a zatim
nakon četvrtog pojavljivanja u stringu, znak za novi red prebacuje kursor u 1. kolonu 5. reda i
program se završava.
35
Deseti red Treceg programa, možemo napisati i ovako:
10 std::cout << "Ovo je program\n” << “kojim se\n“<< “ilustruju karakteristike cout iskaza\n"; ili
ukoliko želimo prikaz stringa u jednom redu, možemo i ovako:
10 std::cout << "Ovo je program,” << “ kojim se“<< “ ilustruju karakteristike cout iskaza";, gdje
se stream insertation operator (<<), a čita se “manje - manje”, pojavljuje 3 puta. Prilikom
izvođenja biće prikazana cijela rečenica, koja je spojena iz 3 dijela teksta: “Ovo je program, kojim
se ilustruju karakteristike cout iskaza”.
Kao što je već ranije rečeno, umjesto std::cout iskaza, može stajati iskaz cout, ukoliko prije main
funkcije u program uvrstimo naredbu using namespace std;, pa ćemo u narednim primjerima
umjesto komandi std::cout, std::cin i std::cerr, koristiti komande cout, cin i cerr.
Umjesto escape sekvence za novi red, možemo koristiti iskaz endl. U tom slučaju bi 10. linija
posljednjeg primjera (gdje jedan tekst treba napisati u tri reda na ekranu), izgledala ovako:
cout<<"Ovo je program”<<endl<<“kojim se“<<endl<<“ilustruju karakteristike cout
iskaza"<<endl;
Slika 6. Kod programa, koji sabira dva cijela broja, unesena sa tastature
36
5. VARIJABLE I DEKLARISANJE VARIJABLI
Prije nego što se u programu upotrijebi bilo koja varijabla, potrebno ju je prethodno deklarisati.
Varijabla je simboličko ime ili simbolički naziv (definiše ga programer) za memorijsku lokaciju
interne meorije u koju se mogu smjestiti podaci, kojima se može naknadno pristupiti i naknadno
ih mijenjati. Varijable se koriste za privremeno čuvanje (čuvanje za vrijeme izvođenja programa)
vrijednosti podataka. Sve varijable imaju dvije važne karakteristike:
a) Tip, koji se dodjeljuje varijabli kada se ona definiše (npr. cijeli broj, realni broj, karakter,
bool itd.). Kada se jednom definiše, tip varijable u C++ programu se ne može promijeniti.
b) Vrijednost, koja se može promijeniti dodjeljivanjem nove vrijednosti varijabli. Vrsta
vrijednosti koja se može pridružiti nekoj varijabli zavisi od prethodno definisanog tipa
varijable. Npr. varijabla tipa integer može da uzima samo vrijednosti cijelih brojeva (npr.
3, 6, 9, -13 itd.)
Prilikom definisanja varijable, najčešće joj se dodjeljuje samo ime i tip, a njena vrijednost ostaje
nedefinisana sve dok joj se nekom novom komandom ne pridruži neka vrijednost. Dodjeljivanje
vrijednosti nekoj varijabli prvi put naziva se inicijalizacija. Dozvoljena je i veoma praktična
mogućnost da se varijabla prilikom definisanja i inicijalizira. Pošto se dodjeljivanjem nove
vrijednosti varijabli, briše njen prethodni sadržaj (ukoliko nije inicijalizirana, taj sadržaj je preuzet
iz memorije), nije neophodno obezbijediti da se svaka varijabla inicijalizira prije nego se koristi,
osim u slučajevima kada je za prvo korišćenje te varijable u programu, bitan njen trenutni sadržaj.
Primjer različitih načina definisanja i inicijaliziranja varijabli, prikazan je na slici 7.
37
Kada se radi o primjeru sa slike 6, objasnićemo detaljnije svaku od linija programa u kojima se
uvode novi pojmovi. Poći ćemo od linija 9 do 11.
Ove linije predstavljaju način deklarisanja varijabli. Identifikatori broj1, broj2 i zbir su imena
varijabli, a int je tip varijable, što znači da sadržaj tih varijabli može biti samo neki (bilo koji) cijeli
broj. Pošto se više varijabli istog tipa mogu deklarisati sa jednom ili više deklaracija, ova 3 reda u
programu, mogao je zamijeniti jedan red:
9 int broj1, broj2, zbir;
U ovom slučaju, kao što se i vidi, imena varijabli se odvajaju zarezom, a preporučuje se (kao u MS
Word-u) da se poslije zareza ukuca znak ”space” (prazno). Preporučuje se takođe da Ime varijable
bude u skladu sa značenjem u programu, što čini program čitljivijim i razumljivijim, pa se na taj
način mogu izbjeći dodatni komentari. Bez obzira na to što se deklaracije varijabli mogu pisati
bilo gdje u programu pod usovom da se moraju pojaviti prije odgovarajućeg korištenja tih
varijabli u programu, preporučuje se da se deklaracije odvoje od proceduralnih (izvršivih) iskaza.
Objašnjavamo dalje liniju po liniju programa sabiranja dvaju cijelih brojeva.
Linija 12: cout<<endl; pozicionira kursor na 1. kolonu sljedećeg reda, odnosno preskače jedan
red.
Linija 13: cout << " Unesi prvi broj: ";, prikazuje string “ Unesi prvi broj: ” na ekranu. Ova poruka
se naziva još i prompt, jer obavještava korisnika da uradi određenu akciju, da unese broj putem
tastature (standardnog ulaza) i da pritisne taster <ENTER>.
Linija 14: cin >> broj1;, koristi input stream cin i stream operator >> (čita se” veće – veće) da bi
prihvatila vrijednost sa tastature. Čita prvi cijeli broj, koji se unosi sa tastature i smješta ga u
varijablu broj1.
Linija 15: cout << " Unesi drugi broj: ";, prikazuje string “ Unesi drugi broj: ” na ekranu i
obavještava korisnika da unese broj sa tastature.
Linija 14: cin >> broj2;, čita drugi cijeli broj, koji se unosi sa tastature i nakon pritiska na taster
<ENTER>, smješta ga u varijablu broj2.
Linija 17: zbir = broj1 + broj2; sabira brojeve broj1 i broj2, a rezultat se smješta u varijablu zbir,
korištenjem operatora dodjeljivanja =.
Linija 18: cout << " Zbir unesenih brojeva " << zbir << endl; prikazuje poruku " Zbir unesenih
brojeva ", a zatim sadržaj (vrijednost) varijable zbir, iza čega slijedi endl, odnosno tzv. stream
manipulator za novu liniju, koji prebacuje kursor u 1. kolonu sljedećeg reda. Treba obratiti pažnju
38
da se u ovom slučaju jednim cout iskazom prikazuje i string i vrijednost varijabli. Korištenjem
više operatora (<<) u jednom iskazu dobijamo tzv. kaskadni stream operator.
Računanje zbira dvaju cijelih brojeva možemo postići i spajanjem linija 17 i 18 u jedan iskaz. A to
bi izgledalo ovako: cout << " Zbir unesenih brojeva " << broj1 + broj2 << endl;. Na taj način
eliminšemo potrebu za varijablom zbir.
6. KONSTANTE
Konstante imaju gotovo sve iste karakteristike kao varijable (tip podataka, naziv, adresa
memorijske lokacije, veličina u bajtima) osim jedne, a ona se odnosi na fiksni sadržaj, odnosno
nepromjenljivost sadržaja. Dakle, konstante predstavljaju veličine koje ne mijenjaju inicijalnu
vrijednost tokom izvršavanja programa, pa se zbog ovih osobina često nazivaju varijablama
posebnog tipa. Koriste se kada je potrebno zaštititi vrijednost neke varijable od mijenjanja
(pridruživanja nove vrijednosti), odnosno kada je potrebno u cijelom programu zadržati njenu
inicijalnu vrijednost. Konstante mogu biti: a) cjelobrojne ili konstante tipa int, zatim b) konstante
tipa float sa sadržajem iz domena realnih brojeva c) konstante tipa char i d) znakovne konstante
sa sadržajem u formi literala ili poruka. Konstante se mogu deklarisati kao varijable, a mogu se
posebnom komandom i definisati. (slika 7).
Opšti format deklarisanja konstanti je jednostavan i svodi se na dodavanje ključne riječi „const“
ispred tipa podatka te kojem pripada ta konstanta. Npr. deklarisanje konstante tipa int sa
fiksnom vrijednošću 5, vrši se ovako: const int x = 5; ili deklarisanje konstante tipa char sa fiksnom
vrijednošću ‘\t’: const char tabulator = ‘\t’;.
Definisanjem konstanti preprocesorskom komadom #define mogu se definisati vlastita imena
za konstante, koje se vrlo često koriste bez nepotrebnog trošenja memorije. Opšti format
definisanja konstanti je:
#define identifier value, ili
#define identifikator vrijednost
Na primjer:
#define PI 3.14159
#define NEWLINE '\ n'
Ovo definiše dvije nove konstante: PI i NEWLINE. Nakon što su definisane, mogu se koristiti u
ostatku koda kao da su bilo koja druga normalna (deklarisana) konstanta.
39
Slika 9. Primjer za ilustraciju deklarisanja i definisanja konstanti
40
7. OSNOVNI TIPOVI PODATAKA
Neka je skup T skup kojeg čini n objekata: T := {v1, v2, .....vn}, n > 1.
Ako su svi objekti istih karakteristika, tako da se na njih, u okviru pravila programskog
jezika, može primjeniti određeni skup operacija, onda je skup T, predstavlja tip podatka. U smislu
kompjuterskog programiranja može se reći da tip podatka određuju:
41
3. Bool - skup B (true ili false) zajedno sa standardnim funkcijama (logički tip): NOT (!),
AND(∧) i OR(∨)
4. Char - skup C (skup ASCII znakova) zajedno sa standardnim funkcijama (karakter tip) sa
funkcijama: CHR, ASC, = C, ≥ C, > C, ≤ C, < C
Cjelobrojni tip podatka (Integer) prima vrijednosti iz određenog skupa, koji je podskup
skupa cijelih brojeva, pozitivnih i negativnih:
T := {minint, minint + 1, ... ,-1, 0, 1, ...maxint - 1, maxint} ili ....,-3, -2, -1, 0, 1, 2, 3,...
Tip podatka unsigned integer ili cardinal ima vrijednosti iz podskupa skupa cijelih pozitivnih
brojeva. Veličina tog podskupa zavisi od konkretnog programskog jezika i kompjuterskog
sistema, odnosno od dužine kompjuterske riječi i iznosi 2m – 1, gdje je m broj bita u
kompjuterskoj riječi. Npr. za 16-bitni sistem T := {0, 1, ............, 65535}
Short integer je u većini slučajeva isto što i integer, a long integer ima dvostruko veći prostor
za smještanje broja. Uz integer tip podataka vezuje se i neoznačeni (unsigned) tip podataka.
Ovaj tip podataka sadrži samo pozitivne brojeve. I na short i na long tip podataka, može se
primjeniti i unsigned oznaka.
Rezultat operacija na integer tipu podataka, nesmije biti izvan ranga vrijednosti jer u tom
slučaju dolazi do prekoračenja vrijednosti u odnosu na definisani tip, npr. kod unsigned integer
tipa podataka radi se o cikličnoj aritmetici. To znači da kada se izađe izvan ranga (prekorači
posljednja vrijednost u rangu), brojanje se vraća, odnosno ponovo počinje od 0.
42
7.1. Realni tip podataka
Realni tip podataka je podskup skupa realnih brojeva. Na tipu realnih brojeva, definisane
su operacije realne aritmetike: sabiranje, oduzimanje, množenje, dijeljenje. Za operacije
definisane na tipu integer u svim slučajevima osim prekoračenja važe poznati zakoni cjelobrojne
aritmetike. Nešto je drugačija situacija sa realnim tipom. Svi su tipovi podataka konačni skupovi,
pa to predstavlja problem u odnosu na realni tip podataka. Poznato je da svaki proizvoljno mali
interval na realnoj osi sadrži beskonačno mnogo vrijednosti, te da je realni tip podataka konačan
skup predstavnika intrervala na realnoj osi. Zbog toga se računarske operacije sa ovim tipom
podataka, ustvari vrše ne sa tačnim nego sa približno tačmim vrijednostima. Ocjena veličine
greške do koje dolazi kod ovakvih približnih računanja predstavlja veliki problem u situacijama
kada se traži izuzetna preciznost. Do sada je postojalo više tehnika za predstavljanje realnih
brojeva u cilju dobijanja što veće tačnosti, a trenutno se uglavnom koristi rad sa tehnikom
pomičnog zareza (floating point tehnika).
U C++ jeziku, realne varijable se deklarišu sa float tipom podataka. Ako varijablu
deklarišemo sa float, radi se o single precision floating point tipu podataka ili kratko float.
Primjeri tih deklaracija su:
float r1=1.323;
float r2=-9.1818;
float r3=-454.545E-3;//To je -454.545 * 10-3 ili -454.545 * (1/1000) = -454.545/1000=-0,454545
43
Float sa duplom preciznošću nazivaju se double u C++-u:.
double p1;
Iako su se računari u početku obrađivali prije svega numeričke podatke, brzo se javila
potreba za obradom i pretežno nenumeričkih podataka. Danas nenumeričke aplikacije kao što
su različite vrste tekst-procesora, edukativnih programa, različite baze podataka sa pretežno
alfabetskim podacima, prevladavaju u odnosu na matematičke aplikacije. Osim toga i finansijske
aplikacije, koje su pretežno numeričke, zahtjevaju korišćenje ovog tipa podataka, kao što su npr.
adresa dobavljača, naziv konta, naziv proizvoda, nazivi izvještaja itd.
Svakom računaru je na raspolaganju unaprijed definisan skup znakova kojima su
dodjeljene jednoznačne brojne vrijednosti. Varijabli karakternog tipa moguće je dodjeliti tačno
jedan znak iz datog skupa znakova. Prema tome dužina promjenjive karakternog tipa je 1 bajt i
ona je u memoriji smještena kao brojna vrijednost, koja odgovara internom predstavljanju
dodjeljenog znaka. Prilikom prvobitnog dodjeljivanja vrijednosti (inicijalizacije) ovom tipu
podataka, kao i prilikom svakog sljedećeg dodjeljivanja, koriste se jednostruki navodnici.
Varijabla karakter se definiše tipom podataka char. Ovaj tip podataka zauzima samo
jedan bajt koji predstavlja ustvari kod, odnosno način binarnog predstavljanja (zapisivanja) nekog
znaka u memoriji računara ili tačnije redni broj ASCII kombinacije, koja se koristi za predstavljanje
konkretnog znaka. Najčešći sistem, odnosno standard za kodiranje znakova je je ACSII (Amercan
Standard Code for Information Interchange). Na primjer, karakter Z ima ASCII kod 90 (to je
dekadna vrijednost binarne kombinacije, kojom je predstavljeno slovo Z u u ASCII kodu. Karakter
z je predstavljen ASCII kombinacijom 122.
Kao i interger tip podataka, tako i karakter tip može da bude signed i unsigned. Tako,
signed karakter može da sadrži numeričke vrijednosti između -128 i 127, a unsigned 0 do 255.
44
U C++ jeziku, deklaracija varijable tog tipa i rezervisana riječ za karakterni tip je:
char c1 ;
Dodjela vrijednosti varijabli karakternog tipa, svodi se na dodjeljivanje jednog znaka, koji
se smješta između jednostrukoih navoda (apostrofa). Primjer deklaracije i inicijalizacije karakter
varijable:
char slovo=’Z’;
U domen vrijednosti logičkog tipa spadaju samo dvije vrijednosti: tačno (true) i pogrešno
(false) ili istina i laž, 0 i 1, uključeno i isključeno, dan i noć itd.
Ovaj tip je važan zbog činjenice da operatori za poređenje dvaju vrijednosti (relacioni
operatori tipa =, <, > itd.), predstavljaju funkcije, koje kao rezultat poređenja vraćaju vrijednost
logičkog tipa. Npr. ako se porede dvije vrijednosti (zapisane u varijablama ili direktno) putem
operatora =, rezultat se smješta u varijablu logičkog tipa, u koju se zapisuje da je rezultat tog
poređenja tačan ili netačan. Isto tako, If iskaz, koristi logički tip podataka da bi zabilježio rezultat
ispunjavanja ili neispunjavanja nekog uslova u If naredbi.
U nekim jezicima tip boolen se definiše na sljedeći način: type boolean=(false,true), a u C++
jeziku, ovaj tip se ne definiše kao poseban tip, nego se za tu svrhu koristi tip integer sa sljedećim
tumačenjem: 1-tačno, 0-pogrešno.
U jeziku C++ nabrojivi tip podataka predstavlja ustvari način na koji korisnici mogu
definisati svoj tip podataka. Osnovna funkcija nabrojivih tipova je poboljšanje čitljivosti programa
i njegovo lakše razumijevanje.
Opšti oblik za definisanje nabrojivog tipa je: enum type_name {value_1,
value_2,...,value_n};, gdje type_name predstavlja ime nabrojivog tipa, a value_1,
value_2,...,value_n, predstavljaju uređeni skup nabrojanih imena, koja su ustvari konstante tipa
type_name.
Dakle, nabrojivi tipovi predstavljaju konačan skup vrijednosti, od kojih svaka ima svoj
naziv i svaka ima svoje specifično mjesto u određenom redoslijedu, odnosno poretku, koji je
određen njihovim nabrajanjem. Deklarišu se korišćenjem rezervisane riječi enum, te navođenjem
imena tipa koji se želi definisati i spiska mogućih vrijednosti tog tipa. Unutar vitičastih zagrada
45
(kao moguće vrijednosti sa spiska mogu se koristiti bilo koja imena, koja nisu prethodno
upotrijebljena u programu).
enum mjeseci {januar, februar, mart, april, maj, juni, juli, avgust, septembar, oktobar, novembar,
decembar};
enum godisnja_doba {proljeće, ljeto, jesen, zima};
46
Varijable nabrojivog tipa (npr. godisnja_doba), mogu se deklasirati i prilikom definicije
nabrojivog tipa:
Tip podataka void je dobio ime po engleskoj riječi, koja znači prazan ili ispražnjen. Pošto ne sadrži
nikakvu vrijednost, koju bi bilo potrebno memorisati, ovaj tip ne zauzima ni prostor u memoriji
računara. Koristi se kod funkcija koje ne vraćaju nikakvu vrijednost, pa će o njemu više biti riječi
u dijelu knjige koji se odnosi na funkcije.
47
8. OPERATORI
1. Operatore pridruživanja
2. Relacione operatore ili operatore poređenja
3. Aritmetičke operatore
4. Logičke operatore
5. Uslovni operator
6. Stream operatore
7. Comma (zarez) operatore
8. Dodatne operatore
9. Sizeof operator
Operator pridruživanja (engl. assignment) služi za dodjelu vrijednosti nekoj varijabli, koja
ima svoje ime i lokaciju u memoriji računara. To je znak =. Varijabli koja se nalazi sa njegove lijeve
strane pridružuje se (memoriše se u lokaciju varijable) određena vrijednost izraza koja se nalazi
sa njegove desne strane u iskazu pridruživanja. Tip vrijednosti izraza treba odgovarati tipu
varijable, odnosno to moraju biti isti tipovi.
Veoma često se pogrešno misli da znak = (jednako) znači da lijeva strana izraza treba da
bude jednaka desnoj. Ispravno značenje znaka = (jednako) jeste da ono što se nalazi na desnoj
strani znaka jednakosti (a to može biti, broj, znak, niz znakova ili izraz) dodijeli varijabli
(memoriše u lokaciju varijable) na lijevoj strani znaka jednakosti.
Uz ovaj operator, koji spada u unarne operatore (sastoji se od jednog znaka) mogu se
dodati i drugi unarni aritmetički operatori, pa se tako dobiju binarni operatori pridruživanja, čija
je osnovna funkcija da reduciraju veličinu kôda C++ programa. Najčešće korišćeni binarni
operatori pridruživanja, njihove oznake i objašnjenja, prikazani su u Tabeli 12.
48
Operator Opis Primjer Značenje
pridruživanja
= Pridruživanje vrijednosti x = 2; x = 2;
+= Pridruživanje vrijednosti nakon uvećavanja za x += 2; x = x + 2:
-= Pridruživanje vrijednosti nakon umanjenja za x -= 2; x = x - 2;
*= Pridruživanje vrijednosti nakon množenja sa x *= 2; x = x * 2;
/= Pridruživanje vrijednosti nakon dijeljenja sa x /= 2; x = x / 2;
%= Pridruživanje vrijednosti nakon izvršenja modulo x %= 2; x = x % 2;
operacije
Relacione operatore možemo definisati kao funkcije koje vraćaju vrijednost logičkog tipa.
Relacionim operatorima se definiše rezultat poređenja vrijednosti dviju varijabli, funkcija ili
izraza. Osnocni princip rada računara svodi se upotrebu jednostavne (binarne) logike, odnosno
logike, koja koristi samo dvije vrijednosti: a) ako je uslov istinit (true), vrijednost je 1; b) ako je
uslov lažan (false), vrijednost je 0. Relacioni operatori su prikazani u tabeli 13.
49
Ono što je na ovom mjestu još potrebno napomenuti i razjasniti jeste uočavanje bitne
razlike između operatora jednakosti C++ jezika (==) i znaka za pridruživanje vrijednosti nekoj
varijabli (=). Ukoliko greškom napišemo samo znak =, umjesto znaka ==, tada će program izvršiti
pridruživanje pa će logički izraz uvijek biti tačan i vraćati logičku vrijednost 1. Ovo je česta greška
prilikom pisanja programskog koda, koju ne prave samo početnici, a otkriva se tek prilikom
izvršavanja programa.
Operandi nekog relacionog operatora, odnosno varijable koje se porede moraju biti
brojevi. Ali, pošto i varijable tipa karakter takođe predstavljaju brojnu vrijednost, to znači da se i
one mogu porediti relacionim operatorima.
Većina simbola, koji se koriste za predstavljanje aritmetičkih operatora u C++ jeziku je ista kao i
odgovarajući standardni matematički simboli aritmetičkih operacija. Ovi operatori se primjenjuju
na cjelobrojni (integer) tip podataka, pa se zato često nazivaju integer operatori. Skup operacija,
koje se mogu obavljati na varijablama integer tipa, uključuju 4 osnovne operacije: sabiranje,
oduzimanje, množenje i dijeljenje, pa se svaka od tih operacija predstavlja odgovarajućim
aritmetičkim simbolom, koji je isti kao i standardni matematički simbol za konkretnu aritmetičku
operaciju.
50
int n = 35;
int m = 13;
cout << (n % m) << endl; // prikazuje 9
51
U primjeru 1 (prefiks), varijabla b se povećava za 1 prije nego što se njena vrijednost
dodijeli varijabli a (prvo se varijabla b povećava za 1 i dobije vrijednost 7, a nakon toga se 7
dodjeljuje varijabli a), dok se u primjeru 2 (sufiks) prvo inicijalna vrijednost varijable b (6)
dodjeljuje varijabli a i tek nakon toga se varijabla b povećava za 1.
Još jedno objašnjenje (slika 7) uz pomoć kojeg se može jednostavno uočiti razlika između
upotrebe unarnog operatora kao prefiksa i njegove upotrebe kao sufiksa, odnosi se na prikaz
vrijednosti varijable koristeći cout iskaz. Ako se varijabli x dodijeli vrijednost 3 putem iskaza int
x=3; i nakon toga iskazom cout<<" "<<x<<endl;, program će prikazati inicijalnu vrijednost
varijable x, odnosno tu istu vrijednost 3. Nakon iskaza cout<<" "<<(++x)<<endl;, program će prvo
povećati sadržaj varijable x za 1, a onda na konzoli prikazati njen novi sadržaj, odnosno broj 4.
Sljedeća naredba (red 9: cout<<" "<<x<<endl;) prikazuje ponovo sadržaj varijable x, odnosno broj
4. Zatim naredbom u redu 10 (cout<<" "<<(x++)<<endl;), ponovo prikazuje vrijednost varijable x,
odnosno broj 4, a tek nakon toga uvećava vrijednost varijable x za 1 i u narednom redu, redu 11,
iskazom (cout<<" "<<x<<endl;), prikazuje tu uvećanu vrijednost, odnosno broj 5.
52
definisanog tim matematičkim pravilima. U tabeli 17., prikazan je redosljed izvršavanja operatora
u složenim izrazima.
Slika 13. Kružna aritmetika, Izvor: Adapt. prema (Motik i Šribar, 1997)
53
8.4. Logički operatori
Kao što je već rečeno u dijelu knjige koji govori o relacionim operatorima, za ispitivanje,
odnosno provjeravanje tačnosti jednog uslova, koriste se naredbe za grananje toka programa (if,
if else, switch) i relacioni operatori ili tačnije rečeno za provjeravanje tačnosti jednog uslova,
koristi se samo jedan relacioni operator. Veoma često postoji potreba da se istovremeno testiraju
dva ili više izraza ili uslova (sa dva ili više relacionih operatora), pa se zavisno od rezultata
poređenja tačnosti dva ili više testova (složeni uslov), koji opet mogu biti tačni ili netačni, izvode
odgovarajuće komande, odnosno grane programa. To je moguće ostvariti uz pomoć logičkih
operatora, koji služe za povezivanje (kombinovanje) dvaju ili više jednostavnih uslova - izraza (sa
samo jednim relacionim operatorom).
Dakle, C++ obezbjeđuje logičke operatore koji se koriste da formiraju kompleksne
uslove, kombinujući jednostavne uslove.
C++ jezik koristi 3 logička operatora: a) ! – (logička negacija ili logičko ne ili engl. logical
NOT), b) && - (logičko i ili engl. logical AND) i c) ||- (logičko ili ili engl. logical OR). Ovi operatori
sa simbolima, značenjem i primjerima, prikazani su u tabeli 18. Slično relacionim operatorima za
jednostavne iskaze, rezultat pri korištenju logičkih operatora za složene iskaze je 0 (false) ili 1
(true).
Logički operator ! (ili engl. NOT) je unarni operator, koji se zapisuje ispred varijable i
mijenja njenu logičku vrijednost: vrijednost tačno (true ili 1) mijenja u netačno (false ili 0) ili
obrnuto.
Logički operator && (ili engl. AND) se koristi ukoliko je u programu potrebno testirati sve
rezultate složenog iskaza (sastavljenog od dva jednostavna iskaza) tako da se testiraju sve
kombinacije tačnosti kada je potrebno da oba iskaza budu tačna da bi složeni iskaz bio tačan i
zavisno od rezultata složenog iskaza, program se grana u odgovarajuće dijelove programa (tabela
19).
54
Uslov_1 (Izraz_1) Uslov_2 (Izraz_2) Uslov_1 && Uslov_2
False (netačno) 0 False (netačno) 0 False (netačno) 0
False (netačno) 0 True (tačno) 1 False (netačno) 0
True (tačno) 1 False (netačno) 0 False (netačno) 0
True (tačno) 1 True (tačno) 1 True (tačno) 1
Logički operator || (OR) se koristi ukoliko je u programu potrebno testirati sve rezultate složenog
iskaza (sastavljenog od dva jednostavna iskaza) tako da se testiraju sve kombinacije tačnosti kada
je dovoljno da bilo jedan ili drugi iskaz bude tačan da bi složeni iskaz bio tačan i zavisno od
rezultata složenog iskaza, program se grana u odgovarajuće dijelove programa (tabela 20).
U C++ jeziku se koristi i uslovni operator grananja, koji ima slično značenje kao if - else iskaz, o
kojem će kasnije biti detaljnije riječi. Operator grananja je jedini operator sa tri (ternarni)
operanda u programskom jeziku C++. Opšti format ovog operatora je:
rezultat=izraz_1?izraz_2:izraz_3;, gdje su, „?“ (upitnik) i „:“ (dvotačka) simboli operatora, a
izraz_1 , izraz_2 i izraz_3 su izrazi, pri čemu izraz_1 predstavlja izraz_uslov. Kako radi uslovni
operator grananja? Da bi obavio funkciju za koju je predviđen, uslovni operator grananja prvo
izračunava izraz_1. Ukoliko je vrijednost izraza_1 različita od 0 (odnosno, ukoliko je ovaj izraz
logički tačan) biće izračunat izraz_2 i njegova vrijednost će biti pridružena varijabli rezultat, što
će i predstavljati konačni rezultat ove operacije.
Ukoliko je vrijednost izraza_1 jednaka 0 (odnosno ukoliko je ovaj izraz logički netačan) biće
izračunat izraz_3 i njegova vrijednost će biti pridružena varijabli rezultat i predstavljati konačan
rezultat upotrebe uslovnog operatora grananja.
55
Slika 14. Primjer upotrebe uslovnog operatora grananja
U primjeru sa slike, program prvo izračunava tačnost izraza_1. Izraz_1 je (x>y). Pošto izraz_1
(3>9), nije tačan (vraća vrijednost false), vijednost varijable y (a to je broj 9) pridružuje se varijabli
z i prikazuje na monitoru. Kada nakon toga y varijabli pridružimo vrijednost manju od 3, npr. 1,
pa ponovo upotrijebimo isti uslovni operator grananja, tada će izraz_1 biti tačan i program će
prikazati vrijednost varijable x, a to je broj 3.
U C++ jeziku postoje 3 stream operatora: a) operator za izlazni stream (<<) ili insertion stream
operator, b) operator za ulazni (input) stream (>>) i c) operator za kaskadni stream operator.
56
Operator << (stream insertion operator) je operator koji se koristi za izlaz podataka na
standardni izlazni stream - ekran. To se vrši iskazom cout. Opšti format cout iskaza je:
cout<<”poruka”; Kada se program izvršava, vrijednost desno od operatora <<, koja se prikazuje
između navodnih znakova (poruka, literal ili string), insertuje se na izlazni stream (ekran) i to
uzrokuje prikazivanje poruke, odnosno stringa (niza) karaktera između navodnika u redosljedu
kako su zapisani u poruci.
Operator za ulazni (input) stream (>>) je operator koji se koristi za ulaz podataka sa
standardnog ulaznog streama – tastature. To se vrši iskazom cin. Opšti format cin iskaza je:
cin>>ime_varijable;. Da bi program prihvatio vrijjednost, koja se unosi sa tastature i pohranio ga
u varijablu ime_varijable, koristi se input stream cin i stream operator >>. Kada se unutar
programa izvršava prethodni iskaz, čeka se (prompt) da korisnik unese vrijednost za varijablu
ime_varijable. Korisnik odgovara ukucavajući vrijednost i pritiskom na taster <enter> potvrđuje
njen unos.
Kaskadni stream operator se dobiva korištenjem više operatora << u jednom iskazu C++
jezika. Primjer upotrebe ovog operatora je iskaz:
cout<<”Zbir broja “<<broj_1<<” i broja “<<broj_2<<”= “<<zbir<<endl;,
s tim što uz ostale neophodne iskaze, prethodno moraju biti deklarisane sve 3 varijable iskazom:
int broj_1, broj_2, zbir;.
Operator razdvajanja predstavljen znakom “zarez” (,) se koristi za odvajanje dva ili više izraza koji
su uključeni tamo gdje se očekuje samo jedan izraz. Izrazi razdvojeni zarezom se izvode
postepeno, s lijeva na desno. Na primjer, sljedeći kod:
a = (b = 3, b + 2);
Kao dodatne operatore, koji ne spadaju niti u jednu od prethodno opisanih kategorija
operatora, ovdje ćemo objasniti još dva operatora: a) operator dodjele tipa (type cast ili cast) i
b) operator sizeof.
Ponekad se u programu pojavi potreba da se isti podatak (ista vrijednost neke varijable
određenog tipa na određenoj memorijskoj lokaciji) tretira na drugačiji način, odnosno da joj se
57
dodijeli novi, drugačiji tip podataka. Pretvaranje izraza ili varijable određenog tipa podataka u
drugi tip poznato je kao type casting ili samo cast. Postoje dvije vrste te konverzije: implicitna i
eksplicitna.
Implicitna konverzija ne zahtijeva upotrebu bilo kakvog operatora za konverziju. Ona se
automatski izvodi, kada se vrijednost varijable (ili izraza) kopira u kompatibilni tip varijable. Npr:
short a = 2007;
int b;
b=a;
Ovdje treba napomenuti da je tip short, ustvari short int, a da se cijeli broj (tip integer)
može definisati pomoću tipova short, int i long. Jedina razlika je u tome da int koristi više ili
barem isto bajta kao short, a long koristi više ili barem isto bajta nego int, što zavisi od računara
na kojem se izvodi program. Dakle radi se o kompatibilnim tipovima podataka, pa nije potrebno
koristiti nikakav operator za casting. To je poznato kao standardna konverzija. Standardna
pretvaranja se odnose na osnovne tipove podataka i dopuštaju konverzije kao što su konverzije
između brojčanih tipova (short u int, int u float, double u int itd.),
Međutim, za eksplicitnu promjenu tipa varijable primijenjujemo operator dodjele tipa (engl.
type casting, ili samo cast):
int broj_1 = 1;
int broj_2 = 3;
float kolicnik = (float)broj_1 / (float)broj_2;
58
Slika 15. Primjer eksplicitne primjene operatora dodjele tipa (cast)
Operator sizeof je unarni operator, koji kao rezultat “vraća” broj bajtova, koje operand
zauzima u memoriji računara. Operand sizeof operatora može biti tip ili varijabla određenog tipa
npr. int, float, double, char ili neki konkretni objekat, koji je već deklarisan (slika 16.)
59
Slika 16. Primjer programa, koji ilustruje primjenu Sizeof operatora
60
8.10. Identifikatori (imena)
U arhitekturi C++ programa postoje elementi programa, koji imaju obavezna imena
(nazive ili identifikatore), kao i elementi kojima korisnici (programeri) moraju definisati imena.
Obavezna imena imaju naredbe, klauzule, neke funkcije, operatori kao alternativni naziv za
simbol, većina tipova podataka, odnosno tipova varijabli itd. Sva ova obavezna imena
predstavljaju rezervisane ili ključne riječi. Popis ključnih riječi i alternativnih naziva operatora,
nalaze se u tabeli 21. i tabeli 22. Elementi programa, kojima nazive (identifikatore) definišu
programeri su varijable, funkcije klase, korisnički tipovi podataka, nazivi labela (dijelova koda
izvornog programa) itd. Imena koja programeri dodeljuju tim elementima su u principu
proizvoljna uz uslov da se poštuju tri ograničavajuća pravila:
61
alignas alignof asm auto bool
break case catch char char8_t
char16_t char32_t class concept const
consteval constexpr constinit const_cast continue
co_await co_return co_yield decltype default
delete do double dynamic_cast else
enum explicit export extern false
float for friend goto if
inline int long mutable namespace
new noexcept nullptr operator private
protected public register reinterpret_cast requires
return short signed sizeof static
static_assert static_cast struct switch template
this thread_local throw true try
typedef typeid typename union unsigned
using virtual void volatile wchar_t
while
Tabela 22. Alternativne oznake operatora u C++ jeziku po ISO standardu za C++ 20
Izvor: (Smith, 2020)
62
kupci koji su uglavnom fizička lica, za izbor identifikatora varijable za fizičko lice, logičnije je dati
naziv Ime_kupca ili samo Kupac, nego npr. Naziv_kupca ili samo Naziv.
Ako kompjuterski program posmatramo kao niz naredbi (iskaza), koji se izvršavaju
naredba za naredbom tačno utvrđenim redoslijedom zapisanim u programu u kojem nema
preskakanja koda, onda govorimo o sekvencijalnom izvršavanju programa. Međutim u praksi se
rijetko dešava da se program izvodi pravolinijski, odnosno bez potrebe da se određene naredbe
programa izvode samo u slučaju kada je ispunjen neki uslov ili više njih ili bez potrebe da se
određeni dijelovi programa ponavljaju određeni broj puta. Iskazi koji omogućavaju programeru
da specificira naredbe programskog koda, koje je potrebno izvršiti a da to nisu sljedeće naredbe
u nizu (sekvenci), zovu se naredbe za transfer kontrole. Jedna od najčešće korišćenih naredbi,
koje omogućavaju grananje toka programa i ponavljanje dijelova kôda jeste naredba goto.
Međutim, prečesto mijenjanje toka kontrole programa sa destinacije na destinaciju u istom
programu, dovodilo je do nečitljivog koda, koji se zbog toga često nazivao „špageta“ kod.
Istraživanja Böhm and Jacopini (1966) (https://dl.acm.org/doi/10.1145/355592.365646)
pokazala su da se programi mogu pisati bez goto iskaza. To je dovelo do pojave metode
strukturiranog programiranja čija je jedna od paradigmi programiranje sa što manje upotrebe
goto naredbe ili potpuno bez nje. Primjenom ove metode, odjeljenja za razvoj softvera su
značajno reducirali vrijeme razvoja softverskih projekata, postalo je mnogo lakše isporučiti
softver u dogovorenom roku i u granicama propisanog budžeta, a pokazale su se značajne
prednosti i u fazi testiranja i održavanja softvera. Formula uspjeha se sastojala u primjeni principa
strukturiranog programiranja, koji su rezultirali jasnijim (čitljivijim) kodom, koji je zbog toga bio
brži i lakši za otklanjanje grešaka (debagiranje), testiranje i modificiranje.
Jedan od osnovnih principa strukturiranog programiranja je da se svi programi mogu pisati uz
pomoć 3 kontrolne strukture:
Dakle, naglasak je na korištenju što je više moguće upravljanja nad tokom programa pomoću
odvajanja dijelova kôda u blokove (sekvencijalne strukture), uslova (if-then-else ili struktura
selekcije ili izbora), for i while petlji (strukture ponavljanja) i posebnih funkcija, ili dijelova koji
rade odvojeno (subrutina), a pritom maksimalno izbjegavati naredbu goto, dakle bezuslovni skok
iz kôda u proizvoljnu drugu tačku u njemu.
63
9.1. Sekvencijalne strukture u C++ jeziku (sekvenca ili blok)
Na slici 17, u blok (sekvencu) su uključena dva iskaza: prvi dodaje vrijednost varijable
bodovi na ukupan iznos bodova (total varijablu), a drugi dodaje vrijednost 1 na varijablu brojač.
Sve je to grafički prikazano uz pomoć UML dijagrama aktivnosti.
UML dijagram aktivnosti je vrsta grafičkog alata, koji je veoma sličan dijagramima toka
koji su se dugo koristili kao jedini alat za prikazivanje algoritama ili dijela algoritma. UML dijagram
aktivnosti se sastoji od specijalnih simbola: pravouganika zaokruženih ivica za prikaz aktivnosti,
romba za odluku, kružića za označavanje početaka i kraja aktivnosti i strelica tranzicije koje
spajaju simbole u cilju prikaza toka aktivnosti. Slično kao pseudokod i dijagrami toka, UML
dijagrami aktivnosti pomažu programerima u bržem i lakšem razvoju i predstavljanju algoritama.
U skladu sa dokazanim pravilom da slika vrijedi više od 1000 riječi, UML dijagram aktivnosti
pokazuje jasnije od bilo kakvog tekstualnog objašnjenja logiku izvršavanja kontrolnih struktura.
Jednostavna (elementarna) naredba je svaka naredba koja završava znakom “tačka-zarez”.
64
Definicije varijabli i izrazi koji završavaju sa tačka-zarezom su neki primjeri elementarnih
akcija, koji se ne mogu podjeliti na manje (prostije) dijelove, koji bi i sami bili naredbe:
Posljednji primjer pokazuje beskorisnu naredbu, jer nema nikakvih popratnih efekata, a
najjednostavniji oblik naredbe, odnosno specijalan slučaj elementarne programske naredbe je
prazna naredba. To je linija koja sadrži samo znak “tačka-zarez” i zove se null-naredba. Prazna
naredba nema nikakav uticaj na izvršenje programa i ona se može pojaviti na svakom mjestu u
programu gdje i elementarna naredba. Ali, i ovakva naredba ponekad ima smisla. Ona se koristi
kada sa jedne strane sintaksa jezika zahtijeva naredbu, dok sa druge strane sam program na tom
mjestu ne vrši nikakvu akciju.
Ukoliko imamo niz iskaza koji čine neku cjelinu tada se radi o sekvenci iskaza. Mnogi
programski jezici uvode sintaksnu formu iskaza za sekvencu i nazivaju ga blok.
Blok strukture su naročito značajne kod struktura izbora, podprograma, funkcija.
U programskom jeziku C++, blok struktura se obilježava između {}, a u nekim jezicima (poput
PASCAL-a) sa begin i end:
{
broj_1=9;
broj_2=6;
proizvod=broj_1*broj_2;
cout<<proizvod<<endl;
}
65
3. Višestruki izbor (switch iskaz) izvršava jednu od više različitih akcija u zavisnosti od
vrijednosti uslova (izraza). Ova struktura se naziva još i varijanta.
Programi koriste strukturu selekcije za izbor izvršenja ili neizvršenja akcije. Blok dijagram
jednostrukog izbora u slučaju da je Uslov U tačan (slika 18a), pokazuje da se nakon toga izvodi
akcija A. Ukoliko Uslov U nije tačan, akcija A se preskače (ne izvršava), a izvođenje programa se
nastavlja izvođenjem prve naredbe, koja slijedi nakon akcije A.
U drugoj varijanti, kada je Uslov U netačan, izvodi se akcija A, a kada je tačan, preskače se
izvođenje akcije A (slika 18b).
Slika 18. a) If iskaz izbora, kada je uslov tačan b) If iskaz izbora, kada uslov nije tačan
If (izraz)
naredba_1;
Izraz može biti uslov ili logički izraz, a naredba_1 predstavlja neku akciju (iskaz) ili niz akcija
(skaza), koje tada predstavljaju blok naredbi, koje u tom slučaju moraju biti unutar (između)
vitičastih zagrada na 2 načina, kao u primjeru ispod.
66
if (izraz) { naredba_1; naredba_2; … naredba_n} if (izraz)
{
naredba_1;
naredba_2;
…
naredba_n;
}
If The_sex_of_the_person is equal 2,
add 1 to male_counter.
(Ako je pol_osobe jednak 2,
povećaj za 1 brojač_muških_osoba.)
To znači, da if naredba ispituje uslov (pol_osobe = 2), pa ukoliko je uslov tačan, povećava
za 1 brojač muških osoba, a ukoliko nije tačan neće ništa uraditi.
If (pol_osobe==2)
male_counter=male_counter + 1;
67
Slika 19. UML dijagram aktivnosti za primjer ilustracije if iskaza
Ukoliko program, poslije zadovoljenog uslova treba da izvrši više od jednog iskaza (dva ili
više iskaza ili složeni iskaz), svi oni moraju biti unutar vitičastih zagrada. To bi izgledalo ovako:
If (pol_osobe==2)
{
male_counter=male_counter + 1;
cout << “Broj osoba muškog pola je: “<< male_counter;
}
Slika 20a. Primjer upotrebe složenog iskaza nakon ispunjenog uslova u if naredbi
68
Slika 20b. Rezultat upotrebe složenog iskaza nakon ispunjenog uslova u if naredbi
Koristeći if jednostruki izbor (opciju) programer može izabrati da program ili izvrši neku
akciju ili da je ne izvrši. Za razliku od nje, if...else struktura izbora omogućava programeru da
specificira akciju ili akcije koje treba izvršiti ukoliko je uslov tačan, a u isto vrijeme da odredi koju
akciju ili akcije treba izvršiti ukoliko uslov nije tačan. Opšti format if … else strukture i njen
pesudokod, prikazani su u tabeli 24.
69
Na slici 21, prikazan je blok dijagram if … else naredbe.
If The_sex_of_the_person is equal 2,
add 1 to male_counter
else
add 1 to female_counter.
Ukoliko je uslov tačan, potrebno je povećati za 1 brojač osoba muškog pola, a ukoliko nije
tačan, treba povećati za 1 brojač osoba ženskog pola. Odgovarajući kod u C++ jeziku bi izgledao
ovako:
If (pol_osobe==2)
male_counter=male_counter + 1;
else
female_conter=female_counter + 1;
70
Slika 22. UML dijagram aktivnosti za primjer koji ilustruje if … else strukturu
Ako posmatramo opšti format if … else strukture, onda umjesto iskaza naredba_1 i/ili naredba_2,
može da stoji više iskaza (složeni iskaz) ili blok, koji se sastoji od niza jednostavnih iskaza, koji se
u tom slučaju moraju nalaziti unutar vitičastih zagrada {}. To se može ilustrovati sljedećim
primjerom:
If (pol_osobe==2)
{
male_counter=male_counter + 1;
cout<<” Broj osoba muskog pola: “<<male_counter;
}
else
{
female_conter=female_counter + 1;
cout<<” Broj osoba zenskog pola: “<<female_counter;
}
71
Slika 23. Primjer upotrebe blokla naredbi unutar vitičastih zagrada iza ključne riječi else
U slučaju kada se koriste zagrade iza else, program će raditi ispravno, odnosno izvršiti
oba iskaza u zagradama i prikazati izgled ekrana kao na slici 23. U slučaju kada je pol_osobe
jednak 1, a iza else se ne koriste vitičaste zagrade, izgled ekrana nakon izvršenja programa će biti
isti. Međutim, ukoliko u prethodnom primjeru, umjesto naredbe int pol_osobe=1;, napišemo
naredbu int pol_osobe=2; i pozovemo program u rad, dobićemo sljedeći izgled ekrana kao na
slici 23a.
72
Slika 23a. Rezultat rada programa sa promijenjenom opcijom (pol_osobe=2)
što na prvi pogled ne izgleda nelogično, ali kada se pogleda, koji je zadatak programa [prikazuje
na ekranu ukupan broj muških osoba, kada je pol osobe muški (vrijednost 2) i ukupan broj ženskih
osoba, kada je pol osobe ženski (vrijednost 1)], tada program greškom prikazuje jednu liniju viška.
Radi se o logičkoj grešci u programu.
Kao što je već rečeno, ova struktura selekcije izvršava jednu od više različitih akcija u
zavisnosti od vrijednosti uslova (izraza), odnosno bira jedna od više mogućnosti (varijanti) izbora.
Opšti format switch strukture izgleda ovako:
switch (izraz)
{
case vrijednost_1:
iskaz_1;
break;
case vrijednost_2:
iskaz_2;
break;
.
.
.
case vrijednost_n:
iskaz_n;
break;
default:
default iskaz;
break;
}
uz napomenu da se prvo izračunava izraz, koji može biti cjelobrojni izraz i davati cjelobrojni
rezultat ili karakter izraz i davati karakter rezultat, zatim iskaz_1, iskaz_2, … iskaz_n, mogu biti
73
jednostavni ili složeni iskazi (odnosno blokovi prostih iskaza, koji se moraju pisati unutar vitičastih
zagrada), a vrijednost_1, vrijednost_2, pa sve do vrijednost_n, predstavljaju ili neku konstantu ili
cijeli broj.
Vrijednost izraza iza ključne riječi switch se poredi sa vrijednostima navedenim iza
ključne riječi case. Ukoliko je bilo koje od tih poređenja tačno (na osnovu jednakih vrijednosti
izraza i specificirane vrijednosti iza case), tada se izvršava iskaz koji je pridružen toj vrijednosti
izraza i izvodi break iskaz, te time završava switch naredba i počinje se izvoditi prva naredba iza
switch naredbe. Ukoliko vrijednost izraza i specificirana vrijednost iza case nisu jednake,
provjeravanje, odnosno evaluacija se nastavlja sa sljedećom vrijednošću specificiranom iza
ključne riječi case. Ukoliko se testiranjem eksplicitno ustanovi da nijedna vrijednost izraza ne
odgovara vrijednostima navedenim u case varijantama, tada se izvršava default iskaz.
74
Na slici 24, dat je blok dijagram switch strukture izbora.
75
Ako je u switch strukturi selekcije za dvije ili više varijanti predviđeno izvođenje istog
iskaza ili bloka naredbi, tada je potrebno nabrajati case iskaze sa pripadajućim vrijednostima i
odvajati ih dvotačkom. Npr. za određeni dan u sedmici, koji će se ukucati sa tastature, program
treba da prikaže radno vrijeme za taj dan.
Slika 25. Primjer upotrebe switch strukture izbora sa izvođenjem istog iskaza za više varijanti
76
U prethodnom primjeru (slika 19) switch struktura izbora se koristi tako da za više varijanti ( 5
radnih dana u sedmici ), program izvrši isti iskaz ili blok iskaza (prikaz na ekranu poruke: “Radno
vrijeme je: od 8:00 do 16:00”), a za drugu varijantu (6. dan u sedmici) prikaže drugu poruku:
“Radno vrijeme je: od 8:00 do 16:00” i za treću varijantu (7. dan u sedmici) prikaže poruku:
“Neradni dan”.
Slika 26. Ilustracija ugnježdene if naredbe za računanje ocjene na osnovu ukupnog broja bodova
77
Ovaj program će biti modifikovan radi još jedne ilustracije switch-case strukture izbora.
umjesto redova 27 I 28, biće ubačen sljedeći kod:
Evaluacija uslova se vrši tako što se uslov definiše koristeći relacione operatore tako da
njegova provjera daje samo jedan od rezultata: tačno (true) ili netačno (false), a ponavljanje se
vrši dok god je uslov tačan.
Strukture ponavljanja (repeticije) često nazivamo petlje. Postoje 3 različite vrste petlji:
1. WHILE DO petlja
2. DO WHILE petlja
3. FOR petlja
79
Slika 28. Grafički prikaz toka izvršavanja while do petlje
Prvi korak kod izvođenja while do petlje jeste testiranje istinitosti uslova. Uslov se mora
provjeravati svaki put prije nego što se pristupi izvršenju akcije A. Ukoliko je uslov ispunjen
(istinit, tačan ili true) to se manifestuje vraćanjem broja 1 u varijablu logičkog tipa podataka
nadležnu za provjeru istinitosti uslova, pa se tek tada izršava akcija A, koja može biti jedan ili više
iskaza. Izvršavanje akcije A se ponavlja sve dok je uslov ispunjen. Kada uslov postane netačan,
program “iskače” iz petlje, a izvođenje se nastavlja prvom naredbom, koja slijedi iza petlje.
Redoslijed izvršavanja koraka u while do petlji, može se opisati i na sljedeći način:
80
While do struktura ne garantuje konačan broj ponavljanja akcije A, pa zbog toga treba
obratiti posebnu pažnju na uslov, koji u jednom trenutku mora postati netačan, da bi se završilo
izvođenje petlje. Ako je prije prvog izvršenja akcije A uslov tačan, a akcijom A se ne mijenja uslov,
odnosno akcija A nema uticaja na uslov, onda se ulazi u ponavljanje akcije A neograničen broja
puta, čime “ulazimo” u beskonačnu petlju, što nije prihvatljivo sa stanovišta definicije algoritma.
U suprotnom, ukoliko je uslov pri prvoj provjeri neistinit (vraća 0) akcija A se neće nijednom
izvršiti, što znači da se iz petlje “iskače” prije nego što je ona uspostavljena i nastavlja izvođenje
prve naredbe, koja slijedi iza koda za definisanje petlje.
Ovdje treba napomenuti, kao što je i vidljivo iz sintakse while-do petlje, gdje se koristi
samo ključna riječ while, ali ne i ključna riječ do, iako smo kao naziv za ovu strukturu ponavljanja
koristili dvije riječi while do. Za to postoje dva razloga:
1. Korišćenje ove iste strukture ponavljanja u nekim drugim programskim jezicima pod
nazivom while do.
2. Lakše razlikovanje ove strukture od strukture do while.
Sljedeći primjer, ilustruje primjenu while do strukture: Zadatak, koji je potrebno riješiti u ovom
primjeru odnosi se na izračunavanje i prikaz na ekranu zbira brojeva od 1 pa do nekog broja koji
je potrebno unijeti sa tastature. Kod programa je prikazan na slici 23.
81
Slika 29. C++ program, koji rješava zadatak uz pomoć while do strukture.
82
nikada ne izvrši ili da se izvrši određeni broj puta, koji nije jednak broju unesenom sa
tastature (u slučaju da nije incijalizirana, varijabla i ima neku nedefinisanu vrijednost,
koja se preuzima iz memorije računara na kojem se izvršava program)
2. Da je upisan znak ; (tačka-zarez) iza while (uslov) iskaza,
while ( i<broj+1);
{
zbir=zbir+i;
i++;
}
dobili bismo beskonačnu petlju jer će se stalno provjeravati da li je tačan uslov: (i < broj
+ 1), a on će stalno biti tačan jer je i = 1, a 1 < od unesenog broja).
3. Ukoliko se zaboravi uticati na uslov unutar tijela while do petlje, odnosno u
konkretnom slučaju kada se izostavi iskaz i++. I na ovaj način se dobije beskonačna
petlja, jer se ne mijenja vrijednost varijable i.
4. Ukoliko se zaboravi iskaze koji pripadaju while petlji (složeni iskaz) staviti u vitičaste
zagrade, tako da čine blok.
while ( i<broj+1);
zbir=zbir+i;
i++;
I na ovaj način se dobije beskonačna petlja, jer u tijelo petlje ne bi ulazila naredba i++, pa
se varijabla i ne bi mijenjala. Ukoliko se zamijene iskazi i++ i zbir=zbir+i, dobila bi se petlja koja
ne bi radila ono što se od nje očekuje, odnosno ne bi ispravno riješila problem.
Druga vrsta strukture ponavljanja, odnosno drugi način realizacije ponavljanja akcije A,
jeste provjera tačnosti uslova za ponavljanje nakon izvršenja akcije A. Petlja do while isto kao i
petlja while do, koristi se kada broj ponavljanja neke akcije ili akcija nije unaprijed poznat, ali
za razliku od for i while petlje ovdje se akcija ili blok akcija izvrši bar jednom. Osnovna razlika
između ove strukture u odnosu na while do i for petlje, jeste to što se kod ove petlje prvo izvrši
naredba ili više njih, pa se zatim provjerava uslov, a kod for i while petlje se prvo provjerava
uslov, pa se zatim izvršava naredbe ili više njih, koje se ponavljaju.
83
Ukoliko uslov nije ispunjen, ponavlja se izvršenje akcije A, a zatim ponovo provjerava
uslov. Ako je uslov zadovoljen ne vrši se novi ciklus ponavljanja, nego se “iskače” iz strukture kao
što je i prikazano na slici 30. Negacijom uslova može se postići suprotno. I ova struktura repeticije
nosi sa sobom opasnost neograničenog ponavljanja. Ukoliko akcija A nema uticaj na vrijednost
uslova U, onda će se desiti jedna od dvije mogućnosti:
a) Akcija A ili niz akcija će se izvršti samo jednom i to u slučaju da je uslov ispunjen prije
ulaska u ponavljajuću strukturu ili će doći do
b) Beskonačnog ponavljanja, odnosno ponavljanja neograničen broj puta i ulaska u
beskonačnu petlju, ukoliko uslov nije ispunjen.
Čak i kada se akcijom A mijenja istinitost uslova, neophodno je da ta promjena bude takva
da u željenom trenutku uslov dobije vrijednost istinito, da bi se izašlo iz petlje i izvođenje
programa nastavilo izvođenjem prve naredbe iza do while petlje.
84
Opšti formati do while strukture su:
Slika 31. C++ program, koji rješava prethodni zadatak uz pomoć do while strukture
85
10.3. Petlja for
Ciklusi ili iteracije naredbi, koje se ponavljaju predstavljaju kontrolne strukture, koje se
nazivaju petlje. Prema načinu određivanja broja iteracija, odnosno broja ponavljanja određenih
naredbi, koje čine tijelo petlje, petlje se mogu podijeliti na:
1. petlje koje ponavljaju određene naredbe sve dok je neki uslov tačan (while do)
2. petlje koje ponavljaju određene naredbe sve dok je neki uslov netačan (do while) i
3. petlje sa unaprijed poznatim brojem ponavljanja ili petlje brojanja (for petlje)
Kada je unaprijed poznat broj ponavljanja neke naredbe ili niza naredbi, a to je često
slučaj kod rješavanja velikog broja problema, koji se mogu rješavati uz pomoć kompjuterskog
programiranja, koriste se for petlje.
Pošto ima više načina univerzalnog objašnjenja funkcionisanja petlji, ovdje navodimo
jedan od tih načina, koji se čini najinformativnijim:
86
Opšti formati for petlje u C++ jeziku se mogu predstaviti na sljedeći način:
Sva tri izraza u for petlji ( inicijalni_izraz; izraz_uslov; izraz_korak ) su opcionalna, što
znači da nijedan nije obavezan. Tijelo for petlje se može izvršiti više puta, a ne mora nijednom,
odnosno tijelo petlje će se izvršavati sve dok izraz-uslov ne postane netačan. Inicijalni_izraz i
izraz_korak u kontrolnom dijelu for petlje su izrazi koji služe za inicijalizaciju i promjenu
vrijednosti za vrijeme izvršenja for petlje.
Često je varijabla koja kontroliše for petlju (sastavni dio izraza_uslov) potrebna i koristi
se samo unutar petlje. Zbog toga se ona najčešće i deklariše u dijelu for petlje, zaduženom za
inicijalizaciju (inicijalni_izraz). Veoma je važno znati da je u tom slučaju domen važenja kontrolne
varijable (scope) samo for petlja, te da ona izvan nje nije vidljiva.?
Prvi korak u izvršenju for petlje je izvođenje izraza inicijalni_izraz (ukoliko nije
izostavljen). Zatim se vrši testiranje istinitosti izraza_uslov sa tri moguća rezultata:
1. Ukoliko je izraz_uslov istinit (nije nula) izvodi se tijelo petlje, a zatim se izvršava
izraz_korak (ako je naveden). Proces se zatim ponavlja uz provjeru istinitosti
izraza_uslov.
87
2. Ukoliko je izraz_uslov preskočen, smatra se da je on istinit, pa se izvršavanja nastavlja
kako je opisano pod tačkom 1. Ako for petlja nema izraz_uslov, kraj izvršenja petlje se
može postići samo izvršenjem break, goto ili return iskaza u tijelu petlje.
3. Ukoliko je izraz_uslov netačan, izvršenje for petlje se završava i kontrola prelazi na prvu
slijedeću naredbu u programu.
Često je varijabla koja kontroliše for petlju (sastavni dio izraza_uslov) potrebna i koristi
se samo unutar petlje. Zbog toga se ona najčešće i deklariše u dijelu for petlje, zaduženom za
inicijalizaciju (inicijalni_izraz). Veoma je važno znati da je u tom slučaju domen važenja kontrolne
varijable (scope) samo for petlja, te da ona izvan nje nije vidljiva.
Prekid izvršenja for petlje se može postići iskazima break, goto ili return, čak i kada je naveden
izraz_ uslov u njenom kontrolnom dijelu.
Na primjeru zadatka, kojim je ilustrovana upotreba while do i do while petlje, a odnosi se na
izračunavanje i prikaz na ekranu zbira brojeva od 1 pa do nekog broja koji je potrebno unijeti sa
tastature, ilustrovaćemo i upotrebu for petlje (slika 32).
Slika 32. Primjer upotrebe for petlje za rješavanje zadatka računanja zbira brojeva od 1 do nekog
broja između 1 i 100, koji se unosi sa tastature
Rezultati rada programa će biti potpuno isti kao kada se koristi while do ili do while
struktura slika 29). Za ilustraciju sve 3 petlje, korišten je isti primjer, tako da se lakše mogu uočiti
sličnosti i razlike između njih.
88
Prilikom upotrebe for petlji, najčešće se prave sljedeće greške:
{
zbir=zbir+i;
cout <<“Zbir brojeva od 1 do 10 je: ” << zbir;
}
{
zbir=zbir+i;
cout <<“Zbir brojeva od 1 do 10 je: ” << zbir;
}
Tijelo ove petlje, koje se sastoji od samo jedne naredbe, neće se izvršiti nijednom, jer je
vrijednost njene kontrolne promjenljive counter veća od 6 kada se prvi put uđe u petlju.
Izraz_uslov (counter<6) vraća vrijednost false, jer je netačno da je 9 < 6, a kada je uslov ulaska u
petlju netačan, onda se ne izvršava tijelo petlje, a izvođenje programa nastavlja prvom
naredbom, koja slijedi poslije koda petlje.
89
Zbog velikog broja mogućih varijacija, for petlja je jedna od najčešće upotrebljavanih i
najkorisnijih naredbi u C++ jeziku. Npr. kontrolna linija for petlje omogućava upotrebu više
kontrolnih varijabli:
Int n, m;
for (n=0, m=9, n =< m; ++n, --m)
cout<<n<<” “<<m<<endl;
Slika 33. Primjer upotrebe dva inicijalna inkrementalna i dva izraza u jednoj for petlji
Kao što je već rečeno na početku priče o for petlji, za razliku od ostalih programskih jezika,
C++ jezik omogućava da se svaki od izraza u kontrolnoj liniji for petlje može a i ne mora
upotrijebiti. Slijedi primjer for petlje bez inkrementa (slika 34):
90
Slika 34. Primjer for petlje bez inkrementa
U ovom primjeru, izostavljen je inkrement, odnosno izraz_korak. Prije nego što se izvede
tijelo petlje, svaki put se provjerava da li kontrolna promjenljiva (iz izraza_uslov) ima vrijednost
999. Praktično se radi o beskonačnoj petlji iz koje se izlazi kada se sa tastature ukuca broj 999,
jer tada će rezultat poređenja u izrazu uslov biti odgovor na pitanje: da li je tačno da 999 nije
jednako 999? Taj odgovor će biti netačno ili false. Upravo to je uslov za izlazak iz petlje.
Još jedan primjer različitog načina upotrebe for petlje, odnosi se na mogućnost da se
inicijalni_izraz izmjesti izvan for petlje (slika 35).
U ovom primjeru je inicijalni_izraz izostavljen iz kontrolne linije petlje, odnosno izmješten
izvan tijela petlje. Najčešće se ovo izmještanje radi onda kada je inicijalna vrijednost rezultat nego
računanja u programu i nema veze sa tijelom petlje. Ovim primjerom se ilustruje i izostavljanje
izraza_korak (inkrementa) iz kontrolne linije u tijelo petlje (x++).
91
Slika 35. Varijacija upotrebe for petlje sa izmještanjem inicijalnog izraza izvan petlje
Kada govorimo o varijacijama for petlje, navešćemo još dva primjera. Prvi primjer se
odnosi na mogućnost da for petlja nema ni tijelo petlje, nego samo kontrolnu liniju. Ovom
varijacijom for petlje možemo riješiti i već često eksploatisani zadatak prikaaza zbira brojeva od
1 do 10. Osnovni dio koda bi izgledao ovako:
92
Slika 36b. Primjer upotrebe for petlje bez tijela petlje
Tabela 28. Prikaz vrijednosti kontrolne varijable i izraza for petlje po iteracijama
Bez obzira što su petlje takve programske strukture, koje putem vrijednosti kontrolne
varijable, odnosno izaza_uslov, mogu upravljati ulaskom u petlju (ponavljanje tijela petlje),
trajanjem petlje (brojem ponavljanja naredbi tijela petlje) te izlaskom iz petlje, u C++ jeziku
postoje i posebne naredbe, koje nisu sastavni dio strukture ponavljanja, uz pomoć kojih je to isto
omogućeno. To su naredbe continue, break, return i goto.
93
11.1. Naredba continue
Naredba continue prekida izvođenje naredbi u tijelu petlje i preusmjerava kontrolu programa na
slijedeći ciklus ponavljanja kod while do, do while ili for petlje, zaobilazeći na taj način ostale
naredbe u tijelu tih petlji. Unutar while do i do while petlje, sljedeća iteracija počinje sa novim
testiranjem na istinitost uslova petlje (u prvom slučaju prije, a u drugom nakon izvršenja tijela
petlje), a unutar for petlje, slijedeća iteracija počinje sa evaluacijom izraza_uslov u kontrolnoj
liniji te petlje. Jednostavnije rečeno, naredba continue dovodi do skoka programa na kraj
petlje, ali se nakon toga njeno ponavljanje nastavlja. Primjer upotrebe naredbe continue,
prikazan je na slici (37). Radi se o zadatku izračunavanja i prikaza kvadrata dvocifrenih brojeva.
94
Na ovom primjeru ćemo usput objasniti još dvije stvari: operator smanjenja vrijednosti
varijable za 1 kao sufiks i upotreba while do petlje bez naredbe za inkrement ili dekrement u
tijelu while do petlje. Kako radi program sa slike 31? Redovi 6 i 7 u programu deklarišu varijable
i, broj, te kvadrat_broja kao integer varijable. Pri tome je varijablu i potrebno inicijalizirati,
odnosno dati joj početnu vrijednost (u ovom slučaju to je vrijednost 1). Ovaj program ne bi radio
da je početna vrijednost varijable i 0. Zašto? Zato što izraz i— prvo uzima početnu vrijednost
varijable i, a to je 0 i poredi da li je 0>0, da bi se izračunao izraz uslov (i-- >0) iza while ključne
riječi. Pošto 0 nije veća 0, nego je jednaka, izraz uslov je netačan (false), a kada je ovaj uslov
netačan izlazi se iz petlje, odnosno završava se izvođenje petlje a da nije izvršena nijedna naredba
u tijelu petlje. Tek nakon izlaska iz petlje vrijednost varijable i (zbog sufiksa) se povećava za 1 i
iznosi 1.
Ako je inicijalna vrijednost varijable i jednaka 1 (kao što je u programu), kada se
izračunava (testira) izraz uslov (i-- >0), poredi se da li je 1>0 i dobiva rezultat tačno (true), te
izvodi prva naredba u tijelu petlje (linija 13), koja na ekranu prikazuje tekst “Unesite dvocifreni
broj: ”. Zatim se sa tastature unosi dvocifreni broj i nakon pritiska na taster “Enter”, taj unos
postaje sadržaj varijable broj. Linija 15 i 16 uz pomoć if naredbe (struktura pod nazivom opcija)
provjerava da li je uneseni broj veći od 99, što znači da ukoliko se sa tastature unese broj 100 ili
veći (trocifreni brojevi), prekida se izvođenje tijela petlje zbog upotrebe continue naredbe i ide
se u drugu iteraciju (ciklus ponavljanja), a pri tome se preskaču sve naredbe u tijelu petlje do prve
pojave znaka } ili zatvorene vitičaste zagrade, koja označava kraj tijela petlje. U ovom slučaju to
su linije 17, 18 i 19. Nakon toga izvođenje programa se nastavlja 2. iteracijom, odnosno novom
provjerom istinitosti izraza uslov. Sada je Izraz uslov netačan (false), jer je vrijednost varijable
sada = 0, a logička vrijednost izraza i-- >0 je netačno (false), pa se prekida izvođenje petlje i
nastavlja izvođenjem prve naredbe nakon tijela petlje, a to je naredba return 0, koja znači kraj
programa.
Ukoliko se sa tastature unese broj manji od 99 ili 99, rezultat poređenja u uslovu iza if
naredbe je netačno (false), jer uneseni broj npr. 45 nije veći 99. Tada se izvodi linija 17. U 17.
liniji programa izračunava se kvadrat_broja, kao proizvod dvije iste vrijednosti unesenog broja,
a u 19. liniji se prikazuje vrijednost (sadržaj) varijable kvadrat_broja.
Na kraju, treba primjetiti da se u ovom primjeru naredba continue koristi za prekid izvođenja
tijela petlje, preskaču neke naredbe u tijelu petlje i nastavlja izvođenje programa sa 2. iteracijom.
Ali pošto provjera uslova u drugoj iteraciji daje rezultat netačno (false), završava se izvođenje ne
samo petlje nego i cijelog programa, što najčešće nije slučaj kod upotrebe continue naredbe.
Najčešće se dešava da se program nastavlja sa drugom, trećom itd. iteracijom i završi tek kada
izraz uslov postane netačan. Sljedeći primjer (slika 38) to ilustruje.
95
Slika 38. Primjer upotrebe continue naredbe sa više iteracija
Na slici 38. je prikazan primjer programa, koji ponavlja prikaz poruke na ekranu za unos
dvocifrenog broja i nakon unosa tog broja, prikaz izračunatog kvadrata tog broja. Dvije prve
iteracije se odnose na brojeve 16 i 99, a treća iteracija je prekinuta continue naredbom, jer je
uslov u if naredbi tijela petlje bio tačan (broj>99, odnosno uneseni broj 100 je veći od 99), pa se
izvršila continue naredba, a to znači da je prekinuto izvođenje tijela petlje u trećoj iteraciji,
odnosno preskočen prikaz (nije prikazan) kvadrata broja 100, nego se izvođenje programa
nastavilo izvođenjem 4. iteracije, pa 5. itd. Treba primjetiti da se program nalazi u beskonačnoj
petlji iz koje nije moguće izaći continue naredbom, koja ima funkciju da prekida izvođenje tekuće
iteracije i izvođenje programa nastavlja narednom iteracijom.
96
11.2. Naredba break
Break naredba se koristi samo u switch strukturi izbora i u svim strukturama ponavljanja.
Svojim pojavljivanjem u tim strukturama, prekida izvođenje, odnosno dovodi do izlaska iz do
while, while do i for petlje, te switch strukture izbora. Nakon izvršenja break naredbe, kontrola
programa se prenosi na naredbu koja slijedi iza prekinute strukture (petlje ili switch strukture).
Break naredba se ne može koristiti izvan struktura ponavljanja (while do, do while i for) niti izvan
strukture višestrukog izbora (switch).
Ukoliko se naredba break koristi unutar ugniježdene (unutarnje) petlje, prekinuće
izvođenje samo te petlje i nastaviti izvođenje petlje vanjske petlje. Naredba break se najčešće
koristi za prekid izvođenja (izlazak iz) beskonačnih struktura ponavljanja. Uz naredbu goto i
return, predstavlja jedan od 3 moguća načina izlaska iz beskonačne petlje.
Na sljedećem primjeru, pokazaćemo jedan od najčešćih načina upotrebe break naredbe
(slika 39).
97
Ovaj isti primjer bez upotrebe break iskaza je prikazan na prethodnoj slici (slika 32). Kao
što se vidi iz koda programa na slici 33, prvo se na ekranu pojavljuje poruka “Unesite neki
dvocifreni broj: “, koja je praktično prva naredba u tijelu while do petlje. Nakon toga se unosi
broj sa tastature (15) i on se dodjeljuje varijabli broj. Zatim se vrši provjera istinitosti uslova
broj>99, pa pošto je uneseni broj 15<99, uslov je netačan (false) nastavlja se izvođenje druge
naredbe tijela petlje, odnosno provjera istinitosti uslova broj==99 (uslov nije tačan i ne izvodi se
naredba break) pa izračunavanje kvadrata unesenog broja i njegov prikaz na ekranu (prikaže se
poruka “Kvadrat broja 15 je broj: 225”). Izvođenje programa se nastAvlja ulaskom u drugu
iteraciju nakon provjere kontrolnog uslova petlje i>0 (koji je tačan, jer varijabla i sada ima
vrijednost 2, a 2 je veće od 0). Sada se u 2. iteraciji unosi novi broj sa tastature (a to je broj 100)
i ponovo provjerava istinitost uslova broj>99, pa pošto je uslov istinit (true, jer je broj 100 zaista
veći od 99) izvršava se naredba continue, koja preskače izvršenje naredbi do kraja tijela petlje i
preusmjerava izvođenje programa na 3. Iteraciju. U 3. Iteraciji, nakon provjere vrijednosti
kontrolne varijable, odnosno tačnosti uslova i>0 (uslov je tačan jer je vrijednost varijable i ista,
kao u prethodnoj iteraciji, to je 2), unosi se treći po redu broj sa tastature (99). Pošto 99 nije veće
od 99 (uslov nije tačan i ne izvodi se continue naredba iza if naredbe), kontrola programa je na
sljedećoj if naredbi, gdje se provvjrava uslov broj==99, pa pošto je 99 jedanko 99 (uslov je tačan)
izvodi se break naredba, koja prekida izvođenje 3. Iteracije, ali i cijele petlje. Nakon toga
program izvodi prvu naredbu iza petlje, a to je u primjeru naredba return 0;, kojom se završava
izvođenje programa.
Najčešće se definiše kao bezuslovni (apsolutni) skok iz jednog dijela (tačke) programa u
neki drugi dio programa, koji ima svoj naziv, odnosno identifikator iza koga slijedi dvotačka (:).
Ovu karakteristiku goto naredbe treba veoma oprezno koristiti, budući da njeno izvršenje
uzrokuje bezuslovni skok ignorišući bilo koju vrstu ograničenja (pravila) struktura ponavljanja.
Način osmišljavanja programskih struktura i njihovih karakteristika u C++ jeziku, koje smo dosad
spominjali i objašnjavali (strukture sekvencije, selekcije i ponavljanja) zajedno sa njihovim
sastavnim elementima, prilagođen je jednom jedinom cilju, a to je strukturirano programiranje.
Poštovanje pravila dizajniranja i upotrebe u programu tih struktura, nameću određenu disciplinu
u strukturiranju programa. Pored ovakvih pravila, koja su u skladu sa principima strukturiranog
programiranja, većina programskih jezika u širokoj paleti naredbi ima i naredbu, koja dozvoljava
kreiranje programa na gotovo proizvoljan način. Kada se to kaže onda se najčešće misli na
izbjegavanje struktura ponavljanja, koje imaju svoja stroga pravila za ulazak u njih, trajanje i
izlazak. Naredba, koja to omogućava je goto naredba.
98
Osnovni argumenti za izbjegavanje goto naredbe su onemogućavanje proizvoljnih
skokova sa jednog mjesta u programu na drugo, izbjegavanje ili onemogućavanje kreiranja
dijelova programskog koda koji nisu strukturirani, pa kao takvi postaju teški za razumijevanje,
ispravljanje programa i testiranje.
Naredbe goto, koje izazivaju skokove iz dijela koda programa izvan strukturiranog niza
naredbi (npr. dio koda izvan petlji) u dio koda unutar te strukture, ne samo da nisu prihvatljivi
sa konceptualne tačke gledišta, jer mogu dovesti do nepredvidljivog načina rada programa, nego
su zbog toga i zabranjeni.
Argumenti za korišćenje goto naredbe su česte potrebe za obavljanjem posebnih
zadataka, čije rješavanje na efikasan način nije moguće uz pomoć strukturiranih iskaza, nego
zahtijeva upotrebu specifičnih programskih struktura, pa to rezultira kompleksnim kodom koji
može biti i i nečitljiv i nerazumljiv. Bitnije od toga je da program rješava problem i da je
funkcionalan.
Dakle, pošto je u nekim situacijama nemoguće izbjeći korišćenje goto naredbe ili se
njenim korišćenjem problem efikasnije rješava, ne treba po svaku cijenu izbjegavati korišćenje
goto naredbe. Isto tako ne treba ni pretjerivati u količini njene upotrebe, odnosno treba je
izbjegavati gdje god se ona može zamijeniti nekim strukturiranim iskazom, a da to nije na uštrb
prije svega efikasnosti i funkcionalnosti programa.
U mnogim programskim jezicima naredbe exit, break, return se koriste da završe neki
strukturirani niz naredbi (i prenesu kontrolu na prvu naredbu iza tog niza) umjesto da se on
završava uz pomoć goto naredbe, koja kontrolu izvođenja programa prenosi na naki drugi dio
programa, što uzrokuje nečitljivost programa, teškoće oko praćenja toka izvođenja programa, a
ponekad i neprdvidivost rada programa.
goto naziv_naredbe;
...
...
naziv_naredbe:
naredba_1;
naredba_2;
...
naredba_n;
Bezuslovni iskaz goto prebacuje kontrolu izvođenja programa direktno na prvu naredbu
(naredba_1) specificiranu iza identifikatora naziv_naredbe. Naredba_1 se izvršava odmah nakon
izvršenja goto naredbe. Ukoliko se naredba_1 sa pripadajućim identifikatorom (naziv_naredbe)
ne nalazi u istoj funkciji, pojavljuje se greška.
99
Int kodgreske;
Int main ()
{
…
if (kodgreske > 0)
goto kraj;
...
...
…
kraj:cout<< “Kod greške ”<< kodgreske;
return 0;
}
U ovom slučaju smo mogli umjesto goto, koristi break naredbu. Slijedeći primjer ilustruje
jedan specijalni slučaj gdje se upotreba goto naredbe pokazuje kao svrhishodna.
...
for ( ...)
{ ...
for ( …)
{ ...
for ( …)
{
…
if (indikator_greske)
goto greska;
}
}
}
...
greska: cout<< “Greška ”;
Ovaj program bi se mogao realizovati i bez korišćenja naredbe goto, ali bi to bilo mnogo
teže i neefikasnije. Korišćenjem naredbe break u if naredbi (kada bi ona mijenjala goto naredbu)
došlo bi do prekida (iskakanja iz) samo one petlje unutar koje je if. Eventualno traženje greške bi
se tada moralo izvršiti za svaku iterativnu naredbu posebno. Nasuprot tome, rješenje sa
naredbom goto je jednostavno, jer se dijelu programa za otkrivanje greške može pristupiti iz
svakog dijela programa.
100
...
for ( ...)
{ ...
for ( …)
{ ...
for ( …)
{
…
if (indikator_greske)
goto break;
}
…
if (indikator_greske)
goto break;
}
…
if (indikator_greske)
goto break;
}
...
if (indikator_greske)
cout<< “Greška ”;
Na slici 40 prikazan je kod programa, koji uz pomoć if i goto naredbe kreira strukturu ponavljanja.
101
Još jedan primjer korišćenja goto iskaza, prikazan je na slici 41.
Ovaj primjer upotrebe goto iskaza, karakterističan je za starije programske jezike, koji
nisu podržavali strukturirano programiranje, odnosno programske jezike koji nisu imali
mogućnost korišćenja (unaprijed zadatih propisanim formatom) struktura ponavljanja, odnosno
petlji, nego su programeri u svakom pojedinačnom slučaju sami definisali uslove ulaska u petlju,
trajanje petlje (broj ponavljanja) i uslove izlaska iz petlje. U svakom slučaju, na ovaj način su
programeri imali veću slobodu i mogli da kreiraju labavije programske strukture, koje su s druge
strane bile teže za razumijevanje, ispravljanje i testiranje. Iako najnoviji programski jezici
dozvoljavaju mogućnost korišćenja goto naredbe, ipak se preporučuje njeno izbjegavanje kad
102
god je to moguće i što je god više to moguće i to ne samo zbog već spomenutih razloga, nego
izbog mogućnosti nepravilnog i nedisciplinovanog korišćenja goto naredbe, koja bi rezultirala
nepredvidivim ponašanjem programa.
Kada je određeni programski segment potrebno izvršiti više puta na različitim mjestima
unutar programa.
Dio koda, kojim se rješava neki specifični zadatak, bolje je napisati jednom kao funkciju i
poslije je pozivati kad zatreba, nego svaki put kad zatreba kopirati taj dio koda. Na ovaj
način se izbjegavaju moguće greške koje mogu nastati kopiranjem koda sa jednog mjesta
u programu na drugo.
Čak i onda kada se programski segment izvršava samo jednom, korisno ga je, ukoliko
izvršava određeni zadatak, izdvojiti u potprogram kao posebnu funkciju sa ciljem lakšeg
testiranja, dokumentovanja i čitljivosti.
103
12.1. Definicija, poziv i parametri funkcija u C++
104
Dakle, možemo zaključiti da se definicija funkcije sastoji od dva glavna dijela:
Neki zaglavlje funkcije nazivaju i prototip funkcije. Njime se definiše kako se funkcija
može koristiti. Tijelo funkcije sadrži računske postupke (naredbe) kojima se rješava neki zadataka
i koji su svrha upotrebe funkcije.
ime_varijable=ime_funkcije (lista_parametrara);
gdje je, ime_varijable ustvari identifikator ili naziv varijable u koju se smješta rezultat funkcije,
koji mora odgovarati po tipu podatka koji funkcija vraća. Lista_parametara su varijable (izrazi,
vrijednosti) koje se predaju funkciji kao ulazne vrijednosti.
Šta znači pozvati funkciju u rad? Nakon linije koda u kojoj se poziva funkcija, prekida se
izvođenje tekućeg sekvencijalnog niza instrukcija, odnosno izvođenje programa se ne nastavlja
sljedećom instrukcijom u sekvencijalnom nizu, nego nizom sekvencijalnih instrukcija unutar tijela
funkcije, nakon čega se izračunava povratna vrijednost i dodjeljuje varijabli ime_varijable.
Funkcije se kreiraju izvan glavne funkcije odnosno main funkcije, a pozivaju unutar
main funkcije, odnosno iz main funkcije. Na ovaj način se osigurava bolje razumijevanje i čitljivost
kôda. U C++ programu, kod funkcije je moguće napisati ispred main funkcije ili iza main funkcije.
Ukoliko kod deklaracije funkcije navodimo ispred main funkcije, ta funkcija će odmah biti
spremna za upotrebu. Ukoliko funkciju deklarišemo iza main funkcije tada ćemo morati koristiti
prototip funkcije. Prototip funkcije je prvi red definicije funkcije (tip podatka koji vraća funkcija,
ime funkcije, parametri) koji se u kodu navodi prije main funkcije. Razlog za to je potreba da
prilikom izvođenja programa, kada kompajler dođe do dijela programa koji poziva neku funkciju
napisanu iza main funkcije, “zna” namjeru programera. Budući da se programi izvode odozgo
105
prema dolje i u trenutku kada kompajler “naiđe” na funkciju sa kojom se još nije “susreo”, on “ne
zna” što mu programer pokušava saopštiti. Korištenjem prototipa funkcije, saopštava se
kompajleru da će se negdje u kôdu pojaviti funkcija određenog imena i da je ona deklarisana
negdje iza main funkcije. Kada kompajler u kôdu programa, “naiđe” na funkciju koja je
deklarisana iza main funkcije, a na početku joj je naveden prototip, kompajler će “znati” da je ta
funkcija negdje i zapisana u kodu programa, te će je potražiti i poređenjem prototipa i koda
funkcije provjeriti formalnu ispravnost njene upotrebe.
Primjer na slici 36 ilustruje definiciju funkcije koja izračunava vrijednost stepenovanja
cijelog broja na neki eksponent, koji je takođe cijeli broj. U sredini linije 8 [stepen (2, 9)],
predstavlja poziv funkcije stepen, kojoj se predaju dvije vrijednosti, odnosno dva argumenta.
Vrijednosti navedene između zagrada i odvojene zarezom, predstavljaju argumente koji se
prosljeđuju funkciji stepen, pri čemu se vrijednost svakog argumenta kopira redom u
odgovarajući parametar. To znači da se u pozivu funkcije stepen (2, 9), vrijednost 2 kopira u
varijablu baza, a 9 u varijablu eksponent. Kada se argumenti prosljeđuju funkciji, prvom
parametru se dodjeljuje vrijednost prvog argumenta, drugom parametru vrijednost drugog
argumenta itd. Redoslijed prosljeđivanja vrijednosti se određuje na bazi pozicije).
Linija 11 definiše zaglavlje (interfejs) funkcije. Ona počinje tipom funkcije koji se vraća (u
ovom slučaju int). Nakon toga je dato ime funkciji (stepen), a zatim njena lista parametara.
Funkcija stepen ima dva parametra (baza i eksponent) koji su tipa int. Sintaksa navođenja
parametara je slična sintaksi deklarisanja varijabli (nakon definisanja tipa, daje se ime
parametra). Međutim, nije ispravno nakon tipa navesti niz parametara odvojenih zarezom.
Zagrada { u liniji 12 predstavlja početak tijela funkcije. Linija 13 definiše lokalnu varijablu
rezultat.
Linije 14 i 15 računaju rezultat stepenovanja vrijednosti varijable baza na varijablu
eksponent (2 ^ 9) pomoću for petlje. Rezultat se pohranjuje u varijablu rezultat. U liniji 16 vraća
se vrijednost varijable rezultat kao rezultat funkcije. Zagrada } u liniji 17 predstavlja kraj tijela
funkcije.
106
Slika 42 Primjer koji ilustruje deklaraciju i poziv (upotrebu) funkcije
Da bi funkcija mogla da obavi svoj zadatak, zbog kojeg se i koristi u programiranju, moraju
joj se na neki način proslijediti podaci koje će ona računati. Funkcijama je moguće proslijediti
jednu ili više vrijednosti. Vrijednost koja se prosljeđuje funkciji, zove se argument. Kada se
definiše funkcija, koja prima jedan ili više argumenata, moraju se deklarisati i varijable koje
primaju te argumente. Te varijable se zovu parametri funkcije.
Ako se nakratko vratimo na definiciju funkcije (objašnjenje pojma funkcije), gdje je rečeno
da su funkcije programski segmenti (dijelovi koda) koji se mogu višestruko uključivati u program
(pozivati) sa svih potrebnih mjesta u programu, tome treba dodati da najčešće svaki poziv
funkcije zahtijeva da se kod u tijelu funkcije izvršava sa različitim podacima. Način kako uticati na
izvršavanje tijela funkcije je predaja podataka (parametara ili argumenata) da bi se obavilo
računanje unutar funkcije. Podaci se predaju funkciji u formi niza vrijednosti koji se naziva
parametri. Koncept je preuzet iz matematike gdje se matematičkim funkcijama predaju ulazni
argumenti, na osnovu kojih se računanjem unutar funkcije dobije rezultat.
107
Kada su argumenti funkcije u pitanju, treba jasno razlikovati dvije vrste parametara:
int i, j;
char a;
void funkcija_p ( int a, char b )// zaglavlje funkcije sa formalnim parametrima
{
i = a + ( int ) b;
}
formalni parametri funkcije_p su “a” i “b”, dok su aktuelni parametri prvog poziva “i” i “a”, a
drugog poziva ( i + j ) i ’x’. Ovdje je bitno je napomenuti da aktuelni parametri mogu biti
vrijednosti, konstante i izrazi a ne samo varijable, dok formalni parametri mogu imati ista imena
kao i stvarni, ali funkcija radi samo sa formalnim parametrima. Parametar “a” u glavnom
programu je potpuno nezavisan od parametra “a” u funkciji.
Predaja parametara funkciji se zasniva na tome da se vrijednost aktuelnog parametra
predaje u formalni parametar. Formalni parametar je samo varijabla definisana unutar
funkcije, tako da je predaja parametara mehanizam kopiranja vrijednosti aktuelnog parametra u
memorijsku lokaciju formalnog parametra. Ovaj mehanizam se naziva predaja parametara po
vrijednosti (copy-in semantics ili call-by-value). O načinima predaje parametara će detaljnije biti
riječi malo kasnije.
Još jedan primjer definicije funkcije i poziva funkcije, odnosi se na izračunavanje
kvadrata brojeva od 1 do 10 korišćenjem funkcije kvadrat, koju ćemo definisati u programu (slika
43).
U tabeli 29 su prikazane pripadnosti varijabli po funkcijama i vrijednsoti varijabli po
iteracijama. U liniji 5 se definiše prototip funkcije kvadrat kao int kvadrat (int); ili int kvadrat (int
x);. U liniji 10 koristi se for petlja (sa kontrolnom varijablom x) za ponavljanje izračunavanja
kvadrata brojeva od 1 do 10. Ukoliko je u liniji 5 korišćen 2. oblik protoptipa funkcije [int kvadrat
(int x);], onda će kontrolna linija for petlje izgledati ovako: for (x=1; x<11; x++). Tijelo for petlje
108
se sastoji iz dvije naredbe. Jednom se poziva funkcija kvadrat [rezultat=kvadrat(x);], a dobiveni
(vraćeni) rezultat se smješta u varijablu rezultat. Pošto je inicijalna vrijednost varijable “x” u 1.
iteraciji 1, vrijednost 1 se predaje (prenosi) u funkciju kvadrat, pa treba izračunati kvadrat(1).
Aktuelni parametar x, predajom vrijednosti funkciji kvadrat, postaje formalni parametar y.
Drugim riječima, sadržaj varijable iz for petlje (x), postaje sadržaj varijable u funkciji (y), odnosno
sada se x (aktuelni parametar) pretvara u y (formalni parametar). Parametar y egzistira samo
unutra funkcije. Unutar funkcije kvadrat deklariše se još jedna varijabla rez, u koju se smješta
rezultat rada funkcije kvadrat (povratna vrijednost), a to je y*y. I ova varijabla je lokalnog tipa,
odnosno vrijedi samo unutar funkcije kvadrat. Komandom return rez;, u kojoj je smješten
rezultat rada funkcije, formalni prametar rez, postaje aktuelni parametar rezultat, odnosno vraća
rezultat (povratnu vrijednost funkcije) varijabli rezultat. U ovoj varijabli se nalazi vrijednost 1 i
kontrola programa se opet vraća u for petlju. Izvodi se prikaz rezultata rada funkcije kvadrat na
ekranu (cout <<" "<<rezultat<<" ";) i ide na novu iteraciju for petlje sa novom vrijednošću
kontrolne varijable x, ato je 2. Isti postupak se ponavlja dok vrijednost varijable x ne bude 11.
Tada program iskače iz petlje i završava se njegovo izvođenje.
Slika 43. Primjer definisanja prototipa funkcije, definicije funkcije i poziva funkcije
109
Iteracije Funkcija Varijabla Vrijednost Poziv Nakon poziva funkcije kvadrat
funkcije (rezultat=povratna vrijednost
kvadrat funkcije kvadrat)
1. Main x 1 kvadrat(1)
2. Kvadrat y 1
rez 1=1*1
3. Main rezultat=1
4. Main x 2 kvadrat(2)
5. Kvadrat y 2
rez 4=2*2
6. Main rezultat=4
7. Main X 3 kvadrat(3)
8. Kvadrat y 3
rez 9=3*3
9. Main rezultat=9
...
Iako je o prototipu funkcije već podosta rečeno, ovdje treba opisati još neke njegove
karakteristike. Jedno od važnih unapređenja C++ programskog jezika u odnosu na C jezik jeste
prototip funkcije. On kompajleru, pored tipa povratne vrijednosti funkcije “saopštva” i broj
parametara, koji funkcija očekuje da primi, tipove parametara, i redosljed u kojem se očekuje
njihovo primanje. Kompajler koristi prototip funkcije da bi provjerio validnost poziva funkcije.
Ranije verzije C jezika nisu vršile ovu vrstu provjere, tako da je bilo moguće pozvati funkciju sa
pogrešnim brojem ili tipom parametara a da kompajler ne otkrije grešku.
110
Slika 44. Primjer upotrebe funkcije za određivanje maksimuma od 3 unesena broja
111
Imena parametara mogu biti uključena u prototip funkcije zbog kvalitetnijeg
dokumentovanja programa. Kompajler ne reaguje na ta imena. Ono što je još bitno znati u vezi
sa prototipom funkcije jeste pravilo da poziv funkcije, koji ne odgovara tipu funkcije uzrokuje
sintaksnu grešku, koju prijavljuje kompajler.
Slika 45. Program ilustruje povratak iz funkcije, koja ne vraća ništa uz pomoć return naredbe
112
Funkcija može imati nekoliko naredbi return. Ipak, povratak iz funkcije na više mjesta
može da naruši njenu strukturu i da oteža razumevanje koda, pa više naredbi return u istoj
funkćiji treba koristiti samo kada olakšavaju njeno razumevanje.
Kao što smo naveli u većini prethodnih primjera, funkcija najčešće vraća vrijednost
pozivaocu, odnosno glavnom programu, pa u tom slučaju naredba return služi za dobijanje
informacija od funkcije, što joj je i osnovni zadatak. Za vraćanje vriednosti koristi se drugi oblik
naredbe return:
return vrijednost;
Ovdje je se vrijednost odnosi na ono što funkcija vraća kao rezultat, a mora biti istog tipa
kao što je i tip funkcije. Ukoliko se tip funkcije i tip vrijednosti iza naredbe return ne podudaraju,
kompajler će prijaviti formalnu (sintaksnu) grešku. Dozvoljeno je da tip funkcije bude bilo koji
važeći C++ tip podataka osim niza.
C++ program završava izvođenje kada stigne do kraja funkcije main(), odnosno do zatvorene
vitičaste zagrade } ili do naredbe return 0; u funkciji main(). Kada se izvršavaju ostale funkcije
(potprogrami), program se ne završava, već se kontrola izvođenja programa vraća na naredbu
odmah iza poziva funkcije. Ponekad je potrebno ili čak neophodno da se program završi u nekoj
funkciji koja nije main() funkcija. Da bi se to postiglo, koristi se funkcija exit (), koja bezuslovno
prekida izvršavanje programa, bez obzira na to koja funkcija ili kontrolni mehanizam se izvode.
Da bi se koristila funkcija exit (), neophodno je koristiti biblioteku cstdlib.
113
Slika 46. Primjer C++ programa, koji ilustruje upotrebu exit(); naredbe
Funkcija exit () ima jedan cjelobrojni argument koji se koristi za prosljeđivanje izlaznog
koda operativnom sistemu; vrijednost 0 standardno (kao i return 0; u main funkciji) označava
uspješan završetak funkcije.
114
c) Vrijeme života varijable (lifetime) je vremenski interval izvođenja funkcije u kojem je
memorija dodijeljena varijabli. Vrijeme života varijable zavisi i od načina dodjeljivanja
memorije varijabli, koji zavisi od memorijskih klasa.
Lokalna oblast važenja se određuje u bloku naredbi, koje se nalaze između otvorene i
zatvorene vitičaste zagrade {...}. Kad god se otvori novi blok, kreira se i nova oblast važenja
varijabli (scope). Varijabla koja je definisana unutar bloka zove se lokalna varijabla. Sve varijable,
koje su definisane unutar bloka naredbi, imaju lokalnu oblast važenja, a to je samo taj blok. To
znači da nisu vidljive niti dostupne izvan njega. U principu, kada se deklariše lokalna varijabla,
ona se “lokalizuje”, što znači da se onemogućava njeno neovlašćeno korišćenje i mijenjanje.
Lokalne varijable “žive” (traju) samo dok se izvodi dio koda u zagradama (blok koda) u kome su
definisane. Može se reći da one nastaju unutar bloka (definišu se u bloku) i nestaju kada se završi
izvođenje bloka. Blokovi koda, koji se najčešće koristi za definisanje lokalnih varijabli su funkcije
Pošto se tijelo funkcije nalazi između zagrada, funkcija predstavlja blok, odnosno jedinstvenu
cjelinu čijim naredbama i podacima se ne može pristupiti izvan nje (slika 47). Npr. nije dozvoljeno
koristiti, odnosno pozvati goto naredbu izvan tijela funkcije adresiranu na naredbu unutar neke
funkcije.
Nepisano je pravilo da se sve varijable potrebne u funkciji deklarišu na početku tijela
funkcije, prije svega zbog toga što funkcija postaje razumljivija i čitljivija. Ali, to ne mora uvijek
biti tako. Lokalna varijabla se može deklarisati bilo gdje unutar bloka s tim što se ta deklaracija
mora navesti prije njene prve upotrebe.
Varijable parametara funkcije imaju oblasti važenja unutar funkcije, odnosno one su
lokalne za funkciju i osim što prihvataju vrijednosti argumenata, ponašaju se kao i sve druge
lokalne varijable.
Budući da se lokalna varijabla kreira i uništava pri svakom ulasku i izlasku iz bloka u kome
je deklarisana njena vrijednost neće biti zapamćena između dva izvršenja naredbi iz bloka. Isti
princip se odnosi i na korišćenje lokalnih varijabli unutar funkcije. Ove varijable se kreiraju pri
ulasku u funkciju, a uništavaju izlaskom iz nje, što znači da ne mogu da zadrže vrijednost između
dva poziva funkcije.
115
Slika 47. Program koji ilustruje lokalnu oblast važenja varijable
116
Slika 48. Primjer ponavljanja inicijalizacije varijable svakim izvršenjem tijela funkcije
117
13.2. Globalna oblast važenja varijabli (global scope)
Globalnu oblast važenja varijable imaju varijable, koje se deklarišu izvan svih funkcija,
pa time i main funkcije. Globalne varijable dostupne su u cijelom programu, odnosno njihova
oblast važnosti je cijeli kod programa, i zadržavaju svoju vrijednost tokom cijelog izvršavanja
programa. To znači da je njihova oblast važenja cijeli program (varijabla i sa slike 42). One se
nazivaju globalne varijable. Iz primjera sa slike 42 i teksta koji objašnjava globalni scope varijable
i, može se zaključiti da se globalne varijable deklarišu izvan svih funkcija, a to znači prije main
funkcije. Pošto se svaka varijabla mora deklarisati prije prvog korišćenja, najbolje je da se
globalne varijable deklarišu na samom početku programa, izvan svih funkcija i prije funkcije
main, kaako bi bile dostupne cijelom programu.
Globalne varijable se inicijaliziraju kada program počne da se izvršava. Ukoliko globalna varijabla
nije inicijalizirana nijednom vrijednošću (prilikom deklaracije nije navedena njena početna
vrijednost), onda se ona inicijalizira na 0. Globalne varijable se pohranjuju u posebnu oblast
memorije rezervisanu za tu namjenu. Koriste se kada je isti podatak (vrijednost varijable)
potrebno upotrijebiti u više funkcija, ili kada postoji potreba da neka varijabla zadrži vrijednost
sve vrijeme tokom izvođenja programa.
Korišćenje globalnih varijabli treba izbjegavati iz više razloga: (Irina Branović: Objektno
orjentisano programiranje: C++, Univerzitet Singidunum, Beograd, 2011)
zauzimaju memoriju sve vrijeme tokom izvršavanja programa, a ne samo onda kada su
potrebne
ako se globalna promjenljiva koristi u funkciji, ona postaje manje samostalna jer se
oslanja na promjenljivu koja je definisana izvan funkcije
globalne promjenljive prouzrokuju greške u programima koje se teško otkrivaju, zbog
promjena vrijednosti na raznim mjestima u programu
Memorijske klase su vrste memorije u C++ jeziku u koje se pohranjuju određene varijable,
odnosno podaci, koji predstavljaju sadržaj tih varijabli zavisno od načina njihovog deklarisanja. U
C++ jeziku postoje 4 vrste memorijskih klasa (Hancock & Krieger, 1986):
auto,
register,
extern i
static.
118
Pri deklaraciji varijabli, memorijska klasa se navodi ispred tipa varijabli:
Umjesto korišćenja globalnih varijabli u funkcijama kada je potrebna varijabla koja pamti
vrijednosti između različitih poziva iste funkcije bolje je koristiti statičke varijable. Deklaracija
statičke varijable, postiže se dodavanjem rezervisane riječi static ispred tipa varijable.
Lokalna varijabla, deklarisana uz pomoć rezervisane riječi static je poznata samo u funkciji u kojoj
je definisana, ali za razliku od lokalne varijable, koja nije deklarisana kao static, njena vrijednost
se zadržava i poznata je pri svakom narednom pozivu funkcije. Drugim riječima rečeno, ova
varijabla se ponaša kao globalna varijabla ali za razliku od nje ne odnosi se na nivo programa
nego na nivo funkcije.
119
Statičkoj varijabli se dodjeljuje početna vrijednost samo jednom, pri prvom izvršavanju
funkcije. Ona pamti svoje vrijednosti sve vrijeme dok se izvršava program, a dostupna je u onom
bloku u kojem je i deklarisana (slika 49).
Slika 49. Primjer programa kojim se ilustruje upotreba static lokalne varijable
Dakle, bez obzira na to što se lokalna varijabla counter, deklarisana modifikatorom klase
static, inicijalizira vrijednošću 0 na početku tijela funkcije brojanje_poziva, ona u 1. pozivu te
funkcije ima vrijednost 1 (++counter), a u njenom drugom pozivu ne inicijalizira se vrijednošću 0,
kao što bi bio slučaj da se ne koristi ključna riječ static prilikom njene deklaracije u funkciji
brojanje_poziva, nego se na vrijednost varijable counter iz prethodnog poziva (1), dodaje 1, pa
se prikazuje tekst “ Ovo je 2. poziv funkcije” itd.
120
Postoje 4 vrste vidokruga za identifikator:
Identifikator deklarisan ispred bilo koje funkcije ima vidokrug na nivou cjele datoteke
(file scope). Takav identifikator je vidljiv (poznat) u svim funkcijama od mjesta gdje je
identifikator deklarisan do kraja datoteke. Vidokrug datoteke (file scope) imaju globalne
varijable, definicije funkcija i funkcijski prototipi smješteni izvan funkcije
Oznake naredbi (labele ili identifikatori koji označavaju naredbu na koju se referencira sa
goto naredbom) su jedini identifikatori sa funkcijskim vidokrugom (function scope). Labele se
mogu koristiti bilo gdje u funkciji u kojoj se pojavljaju, ali se ne mogu referencirati izvan tijela
funkcije.
Identifikatori deklarisani unutar bloka imaju block scope. Lokalne varijable deklarisane
na početku funkcije imaju blok scope kao parametri funkcije. To su lokalne varijable za funkcije.
Svaki blok može imati deklaraciju varijabli. Kada se radi o ugnježdenim blokovima, tada i
identifikator u vanjskom bloku ima isto ime kao i identifikator u unutrašnjem bloku, a
identifikator u vanjskom bloku je “sakriven” dok se ne završi unutrašnji blok.
Identifikatori sa vidokrugom prototipa funkcije se koriste u listi parametara prototipa
funkcije. Osnovna namjena primjera sa slika 50 i 51 je objašnjnje i razlikovanje pojmova globalna
varijabla, lokalna varijabla, te vidljivost globalne i lokalne varijable iz različitih dijelova programa.
U programu se prvo prikazuje vrijednost varijable x deklarisane u main funkciji (to je njena
inicijalna vrijednost 5. Ova varijabla ima isto ime kao i globalna varijabla deklarisana prije main
funkcije, ali su to dvije različite varijable, jer ova druga je memorisana u različitoj memorijskoj
klasi. Uočava se da je globalna varijabla vidljiva u cijelom programu (primjer varijable x
deklarisane izvan svake funkcije, odnosno prije main funkcije, čija je inicijalna vrijednost 1).
Lokalna je vidljiva samo u funkciji ili bloku u kojem je deklarisana, a to je u primjeru varijabla x,
kojoj se u funkciji a dodjeljuje inicijalna vrijednost 25, povećava za 1 u istoj funkciji i prikazuje
vrijednost 26. Ako je varijabla static memorijske klase i deklarisana u funkciji ona je vidljiva samo
u toj funkciji, ali zadržava vrijednost sve vrijeme tokom izvršavanja programa (primjer static
varijable x u funkciji b). Ovo je u programu primjer 3. varijable koja ima isto ime, ali su to sve
različite varijable jer se njihov sadržaj memoriše u različitim memorijskim klasama. U ovom
slučaju je vidljivo da ukoliko globalna i lokalna varijabla imaju isto ime, u funkciji u kojoj je
deklarisana lokalna varijabla, onda lokalna varijabla ima veću važnost u odnosu na globalnu
istog imena. Kada se izvršava funkcija b (pozvana iz main funkcije, prvo se prikazuje inicijalna
vrijednost static lokalne varijable 50, a nakon povećanja za jedan, prikazuje vrijednost 51.
121
Funkcija c prikazuje inicijalnu vrijednost globalne varijable x, postavljene na samom
poćetku prije main funkcije, a to je vrijednost 1, te nakon povećanja za 1 u funkciji b, prikazuje
vrijednost 2. Kod drugog poziva funkcije a, prikazuju se iste vrijednosti kao i u prvom pozivu. Kod
drugog poziva funkcije b, karakteristično je da se statička lokalna varijabla ne inicijalizira, nego
zadržava posljednju vrijednost iz prethodnog poziva, a to je vrijednost 51, prikazuje je, te nakon
povećanja za jedan pokazuje vrijednost 52. Kada se radi o drugom pozivu funkcije c, pošto je riječ
o globalnoj varijabli, ona zadržava vrijednost iz prethodnog poziva, a to je vrijednost 2 i prikazuje
ga, te nakon povećanja za 1 prikazuje vrijednost 3. I na kraju, prikazuje se sadržaj varijable x u
main funkciji, deklarisane i inicijalizirane sa vrijdnošću 5 unutar funkcije main. Njena vrijednost
se nije mijenjala, pa i dalje ostaje 5. Ova x varijabla pripada vidokrugu bloka (block scope).
Slika 50. Primjer koji ilustruje upotrebu globalnih, te static i auto lokalnih i varijabli
122
Slika 51. Prikaz vrijednosti varijabli različitog vidokruga, a istog imena (x).
13.6. Rekurzija
Sasvim je uobičajeno da se iz neke funkcije može pozivati druga funkciju, iz ove druge
neka treća i tako unedogled. Međutim, malo je neobična i na prvi pogled nejasna mogućnost da
se iz neke funkcije može pozvati ta ista funkcija. Za rješavanje nekih problema ova mogućnost da
imamo funkcije koje pozivaju same sebe je veoma korisna. Rekurzivna funkcija je funkcija koja
poziva sama sebe direktno ili indirektno preko neke druge funkcije. Ideja, koja je u osnovi
upotrebe rekurzije slična je ideji korišćenja struktura ponavljanja, a cilj je da se naredbe iz tijela
funkcije ponavljaju, a jednom od tih naredbi pozovu izvođenje te iste funkcije određeni broj puta
dok se ne zadovolji neki uslov, nakon čega se prekida dalje pozivanje te iste funkcije. Postoji
određeni broj problema, koji je veoma pogodan za elegntno rješavanje uz pomoć rekurzije. Takav
primjer je rješavanje matematičke funkcije faktorijel i izračunavanje Fibonačijevog niza brojeva.
123
Slika 52. Primjer upotrebe rekurzivne funkcije za izračunavanje funkcije faktorijel za neki broj
Kako radi program? U liniji 4, int faktorijel (int broj) se definiše funkcija faktorijel tako što
će ulazni parametar u funkciju biti cjelobrojna varijabla broj, a i u rezultatu funkcije će biti
cjelobrojna vrijednsot, odnosno funkcija će vraćati cjelobrojnu vrijednost. Funkcija faktorijel je
definisana sa dvije premise:
1. Faktorijel od 0 je 1 i
2. Faktorijel pozitivnog broja n je n puta faktorijel od n-1, npr. faktorijel od 6 je
6*faktorijel(5)
Na osnovu toga, tijelo funkcije (linije 6 i 7) će se sastojati od jedne naredbe (if alternativna
struktura izbora), pa ćemo je detaljnije objasniti. Ukoliko je varijabla broj (koja se unosi sa
tastature i za koju treba izračunati funkciju faktorijel) jednaka 0, tada funkcija faktorijel vraća
124
vrijednost 1. To je realizacija prve gore navedene premise. Ukoliko se želi izračunati funkcija
faktorijel za neki drugi broj, npr. 3, tada se taj broj unosi putem tastature, smješta u varijablu
broj. Nakon toga u liniji 16, taj se broj prikazuje na ekranu zajedno sa uskličnikom, a zatim se
poziva funkcija faktorijel, kojoj se predaj broj 3 (unesen sa tastature i smješten u varijabli 3). Sada
se pozivom funkcije izvodi jedna jedina naredba iz tijela funkcije faktorijel, naredba iz 6. I 7. Linije,
naredba if...else. Prvo se provjerava istinitost uslova iza if naredbe (da li je 3 jednako 0), pa pošto
je uslov netačan (false), izvodi se naredba iza else iskaza, a to je naredba return. Kako se izvodi
naredba return? Prvo se izračunava vrijednost iskaza navedenog iza return naredbe. Taj iskaz je
ustvari ponovni poziv funkcije faktorijel (drugi po redu od početka izvođenja programa), ali sada
je ulazni parametar u funkciju faktorijel 2, odnosno rezultat izraza (broj-1). Dakle prvi poziv je bio
faktorijel(3) i ta funkcija nije vratila nijednu vrijednost, nego je pozvala funkciju faktorijel(2).
Funkcija faktorijel(2) ispituje da li je dva jednako 0, pa pošto nije, opet se ide na naredbu iza else,
a ona ponovo, sada 3. put poziva istu funkciju, ali sa ulaznim parametrom za jedan manjim od
varijable broj, a njena vrijednost je sada 1. Dalje, funkcija faktorijel(1) provjerava da li je 1
jednako 0, pa pošto nije ponovo se izvodi naredba return iza else naredbe, ali da bi se izvela do
kraja, ona ponovo poziva funkciju faktorijel, ali sada sa ulaznim parametrom 0, dakle faktorijel(0).
Ovo je bio 4. po redu poziv funkcije faktorijel, a još nijedna od tih funkcija nije završila svoje
izvođenje. Da se podsjetimo da tek kada iskaz return vrati neku vrijednost funkciji, tek tada se
završava njeno izvođenje. Do ovog trenutka nijedna funkcija od 4 pozvane funkcije [faktorijel(3),
faktorijel(2), faktorijel(1) i faktorijel(0)] nije vratila ni jednu vrijednost. Tek sada 4. pozivom
funkcije faktorijel(0), ispunjen je uslov iz if naredbe (true), jer je 0 jednako 0, izvodi se iskaz return
1, što znači da funkcija faktorijel (0) sada vraća vrijednost 1. Pošto je funkcija faktorijel (0)
pozvana iz funkcije faktorijel(1), sada se tek završava izvođenje funkcije faktorijel(1), koja vraća
vrijednost 1 [faktorijel (0)*1]. Sada kad je završeno izvođenje funkcije faktorijel (1) vraćanjem
vrijednosti 1, sada se tek završava i funkcija faktorijel 2) i izračunava izraz faktorijel (1)*2, a to je
1*2=2. Tek sada, kada je završeno izvođenje funkcije faktorijel(2) i ta funkcija vratila vrijednost 2
moguće je izračunati faktorijel (3), a to je faktorijel (2)*3, pa na kraju dobijemo rezultat 6.
Primjer rekurzivne funkcije je Fibonači serija brojeva. Primjer Fibonači serije je: 0, 1, 1, 2,
3, 5, 8, 13, 21, 34, 55, … Fibonači serija počinje bilo sa 0 i 1 i ima osobinu da svaki slijedeći Fibonači
broj predstavlja sumu prethodna dva Fibonači broja. Fibonači serija se može definisati rekurzivno
na sljedeći način:
fibonacci(0) = 0
fibonacci(1) = 1
fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
125
Slika 53. Primjer upotrebe rekurzivne funkcije za vraćanje vrijednosti broja u Fibonačijevom nizu
Poziv funkcije fibonacci iz main funkcije nije rekurzivan, ali su svi ostali (sljedeći) pozivi
rekurzivni zbog toga što funkcija fibonacci poziva samu sebe. Lako je zapaziti da Fibonacci broj
vrlo brzo postaje velik. Zbog toga se u primjeru koristi tip podataka unsigned long za deklarisanje
tipa parametra i tipa povratne vrijednosti.
Objašnjnje rada programa: Rekurzivna fibonacci funkcija je nagoviještena putem
prototipa funkcije prije main funkcije (linija 5). Varijable cijeli_broj i rezultat su deklarisane u
tijelu funkcije main, kao tipovi varijabli unsigned long (linija 8). Ukoliko se uz pomoć cin funkcije
putem tastature unese cijeli broj npr. 6, on postaje sadržaj varijable cijeli_broj (linija 12). Nakon
toga se rezultat izvršenja funkcije fibonacci(6), memoriše u varijablu rezultat (linija 14). Ovom
linijom se poziva izvršenje funkcije fibonacci sa parametrom 6 - fibonacci(6). Pozivom funkcije
počinje izvršavanje naredbi iz tijela funkcije (linije od 20 do 25). Predajom vrijednosti, sadržaj
varijable cijeli_broj se dodjeljuje varijabli n. Zatim se provjerava tačnost složenog uslova 6 = 0 ili
126
6 =1, pa pošto nijedan od dva prosta uslova, koja čine složeni uslov nije tačan, rezultat provjere
je false, izvršava se iskaz iza else, a to je naredba return fibonacci(n-1) + fibonacci(n-2);. Tom
naredbom, nakon return iskaza, koji se ne može završiti dok se ne izračuna vrijednost izraza koji
slijedi iza njega. Vrijednost izraza se ne može trenutno izračunati jer je pozvana rekurzivna
funkcija fibonacci(5), pa sve dok ova funkcija ne dobije povratnu vrijednost (dok joj se ne vrati
vrijednost), izvršavanje programa neće ići na sabiranje sa rezultatom funkcije fibonacci((n-2),
nego se vraća na početak funkcije fibonacci sa ulaznim parametrom 5. Budući da opet složeni
uslov iz if naredbe nije zadovoljen, izvršava se naredba iza else, a ona sada poziva ponovo
funkciju fibonacci, ali sada sa parametrom 4 - fibonacci(4). I sada se program praktično vrti u
petlji: poziva se 3. Funkcija fibonacci(3), pa fibonacci(2). U tom trenutku pozvane su 4 fibonacci
funkcije, a nijednoj od njih nije vraćena vrijednost. Tek kada se bude izvršavala sljedeća 5. po
redu fibonacci funkcija, koja će algoritmom biti pozvana - funkcija fibonacci(1), tada će bit
ispunjen složeni uslov (true)) iz if naredbe u tijelu funkcije (n=1), pa će ova posljednja funkcija
dobiti povratnu vrijednost 1, pa će fibonacci(1) biti jednako 1. Tada i pretposljednja (po redu)
pozvana funkcija fibonacci(2) treba da dobije povratnu vrijednost, tako što se sada izračunava
vrijednost izraza fibonacci(2-1) + fibonacci(2-2), odnosno fibonacci(1) + fibonacci(0). Pozivom
funkcije fibonacci (0), dobiva se povratna vrijednost 0, pa je vrijednost cijelog izraza 1. To je
povratna vrijednost funkcije fibonacci(2). Kada je ova funkcija dobila povratnu vrijednost,
izračunava se i povratna vrijednost funkcije fibonacci(3), a ona je fibonacci(2) + fibonacci(1), a to
je 2. Funkcija fibonacci(3) je bila pozvana iz funkcije fibonacci(4) i kada je funkcija fibonacci(3)
dobila povratnu vrijednost (a to je 2), tada se izračunava i izraz za povratnu vrijednost funkcije
fibonacci(4), a to je vrijednost 3, jer je fibonacci(3) + fibonacci(2) = 2 + 1 = 3. Kada je funkcija
fibonacci(4) dobila vrijednost (3), na redu je da se završi funkcija fibonacci(5), koja je pozvala
funkciju fibonacci(4). Funkcija fibonacci(5) se završava izračunavanjem (dobivanjem) povratne
vrijednosti, a to je fibbonacci(4) + fibonacci(3) = 3 + 2 = 5. I na kraju, iz main funkcije je pozvana
funcija fibonacci(6), koja je pozvala funkciju fibonacci(5), pa kada je fibonacci(5) dobila povratnu
vrijednost, a to je 5, računa se vrijednost funkciije fibonacci(6), a ona je fibonacci(5) + fibonacci(4)
= 5 + 3 = 8. Tek tada se vrši predaja vrijednosti (8) iz varijable n u varijablu rezultat i prikazuje na
ekranu poruku “Fibonacci(6)=8”.
Svaki problem koji se moze riješiti rekurzivno može i iterativno, odnosno uz pomoć
struktura ponavljanja. Ponekad je to mnogo jednostavniji način za rješenje problema. Rekurzivni
pristup se obično bira u odnosu na iterativni pristup jedino u onim slučajevima kada se problem
može riješiti jedino rekurzivnim pristupom. Medutim, rekurzivni pristup se izbjegava zbog
oduzimanja dodatnog vremena i trošenja dodatne memorije. Mnogi algoritmi pretraživanja (npr.
binarno pretraživanje) i algoritmi sortiranja (npr. algoritam quick sort) su rekurzivni.
Prethodni primjer (izračunavanje funkcije faktorijel), može se riješiti i uz pomoć petlje.
Primjer funkcije, koja to rješava prikazana je na slici 54.
127
Slika 54. Izračunavanje funkcije faktorijel uz pomoć while do petlje
U C++ jeziku prazna lista parametara se navodi na dva načina ili specificiranjem
rezervisane riječi void ili jednostavno praznim zagradama (), odnosno ne stavljajući ništa u
zagrade. Npr. deklaracija: void funkcija_f();, specificira da funkcija_F neće primati argumente i
neće vraćati nikakvu vrijednost.
128
Slika 55. Primjer deklarisanja funkcije sa praznom listom parametara
129
isto tako istina i da istovremeno povećavaju veličinu programa, pa zauzimaju puno više prostora
radne memorije prilikom izvršavanja.
Slika 56. Primjer deklarisanja i upotrebe Inline fukcije pri izračunavanju zapremine kocke
se mijenja sa :
130
izostavljeni prilikom poziva funkcije, oni automatski poprimaju podrazumijevane (unaprijed
specificirane) vrijednosti.
Podrazumijevani argumenti se navode kao prvi zdesna argumenti u listi parametara
funkcije. Kada se poziva funkcija sa dva ili više podrazumijevanih (default) argumenata, ako
izostavljeni argument nije prvi zdesna argument u listi argumenata, svi argumenti desno od
toga argumenta moraju takođe biti izostavljeni. Podrazumijevane argumente neophodno je
specificirati sa prvim pojavljivanjem imena funkcije, najčešće u prototipu.
Npr. ako je data sljedeća funkcija za računanje zapremine neke kutije:
Povratna vrijednost
pozivi: zapremina_kutije() 1
zapremina_kutije(10) 10
zapremina_kutije(10,5) 50
zapremina_kutije(10,5,2) 100
Sva tri argumenta imaju podrazumijevane vrijednosti 1. Prvi poziv inline funkcije
zapremina_kutije() je bez specificiranih argumenata i zbog toga koristi sva tri podrazumijevana
argumenta. Drugi poziv koristi vrijednost varijable dužina, a ostala dva parametra imaju default
vrijednosti. Treći poziv koristi default vrijednost za varijablu visina, a ostale dvije vrijednosti za
dužinu i širinu su default vrijednosti. Zadnji poziv predaje parametre i za sve tri varijable dužinu,
širinu i visinu, te ne koristi default vrijednosti.
C++ jezik omogućava definisanje više funkcija sa istim imenom i to može trajati toliko
dugo koliko ove funkcije imaju različit skup parametara. Ova mogućnost naziva se preklapanje
funkcija (function overloading). Kada se preklopljena funkcija, odnosno funkcija koja ima isto
ime kao neka prethodna funkcija ili neke prethodne funkcije, pozove u rad, C++ kompajer bira
jednu od njih ispitujući broj, tip i redosljed argumenata u pozivu. Function overloading se
najčešće koristi za kreiranje različtih funkcija istog imena koji rade sličan zadatak ali nad
različitim tipovima podataka.
131
Primjer preklapanja funkcija, dat je na slici 57.
Kada se vrši predaja argumenata po vrijednosti nekoj funkciji, tada se pravi kopija
vrijednosti argumenta i predaje se pozivom funkcije. Bitna karakteristika ove aktivnosti je da
kreiranje kopije i predaja kopije ne utiču na orginalnu vrjednost podataka u pozivu. Jedan od
osnovnih nedostataka ovog načina predaje parametara jeste problematična situacija u slučaju
132
kada se predaju velike količine podataka, pa predaja kopije podataka može značajno povećati
vrijeme izvršavanja i opteretiti dragocjeni memorijski prostor. To svakako bio jedan od razloga
zašto se pojavila potreba za drugim načinima predaje parametara.
Kada je riječ o predaji parametara po referenci (pass-by-reference), funkcije direktno
pristupaju podacima specificiranim u pozivu funkcije i na taj način ih mogu po potrebi i mjenjati.
Ovaj način predaje parametara je dobar zbog perfomansi, koje su rezultat eliminisanja potrebe
za kopiranjem velike količine podataka, ali je manje siguran jer se mogu oštetiti podaci.
Referencni parametar je ustvari drugi naziv za odgovarajući argument u pozivu funkcije.
Da bi se znalo da li je parametar funkcije predat po referenci, jednostavno je potrebno slijediti
tip parametra u prototipu funkcije sa & i koristiti istu konvenciju za tipove parametara u zaglavlju
funkcije. Npr. deklaracija int &count, u zaglavlju funkcije znači “count je referenca na int”.
Prilikom poziva funkcije, jednostavno se označi varijabla sa imenom i ona će biti predata sa
referencom. To znači da se varijabla označena sa imenom parametra u tijelu pozvane funkcije
ustvari refrencira na orginalnu varijablu, pa je funkcija može direktno mijenjati.
133
Slika 58b. Primjer rezultata poređenja predaje parametara po vrijednosti i predaje po referenci
14. NIZOVI
134
Npr. int c[9]; je deklaracija za jednodimenzionalni niz koji ima 18 elemenata. Element niza
je: ime_niza[indeks_elementa]. Indeks_elemenata_niza je u rangu od 0 do za jedan manje (n-
1) od ukupno n elemenata niza. Dakle, prvi element niza ima indeks 0, drugi indeks 1, treći indeks
2, itd. Za niz c[18] elementi su: c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8].
int radnici[27]; // deklaracija niza radnici, koji ima 27 elemenata tipa int
double prosjek[90]; // deklaracija niza od 90 elemenata koji su tipa float
Često se broj elemenata niza deklariše kao konstanta, pa u tom slučaju imamo sljedeće
deklaracije:
Inicijalizacija niza je dodjeljivanje početnih vrijednosti elementima niza ili cijelom nizu.
Može se izvršiti prilikom deklaracije niza, navođenjem unutar vitičastih zagrada vrijednosti za
pojedinačne elemente niza. Npr.:
135
Isto se može postići i na drugi način:
Ako je veličina niza izostavljena iz deklaracije niza koji ima inicijalizacijsku listu, tada
kompajler odreduje broj elemenata niza brojanjem elemenata.
Ako su veličina niza i inicijalna lista specificirani u deklaraciji niza, broj inicijalizatora mora
biti manji ili jednak veličini niza.
Deklaracija niza int y[ 6 ] = { 18, 27, 63, 36, 72, 54, 45 }; nije ispravno urađena, pa će
kompajler prijaviti sintaksnu grešku, jer je detektovao 7 inicijalnih vrijednosti za 6 elemenata
niza.
plata[0]=36 ;
plata[1]=36 ;
plata[2]=36 ;
plata[3]=36 ;
plata[4]=36 ;
.....
plata[11]=36 ;
136
Unos pojedinačnih elemenata niza sa standardnog ulaza pomoću for petlje:
U jeziku C++ jeziku, elementi niza se smještaju u susjedne memorijske lokacije. Prvi element niza
zauzima lokaciju na najnižoj adresi, a poslednji na najvišoj. Direktna dodjela jednog niza drugom
nije dozvoljena, već se vriednosti moraju dodjeljivati element po element. Dalje, jezik C++ ne
provjerava granice niza što znači da programera ništa ne ograničava da "prekorači” kraj niza.
Drugim riječima, ako je indeks posljednjeg elementa niza npr. 12, može da se indeksira element
sa indeksom većim od 12, a da to ne izazove nikakve greške tokom kompajliranja ili izvršavanja
programa. Zato se može reći da je prekoračenje ograničenja indeksa najčešća greška koja dovodi
do neispravnog rada programa što se vidi na sljedećem primjeru koda:
Tijelo petlje se izvršava i u slučaju kada je i = 10, ali budući da je posljednji element niza
a[9], tada dolazi i do promjene memorijske lokacije, koja nije rezervisana deklaracijom niza a[10],
pa program neće raditi ispravno.
Imamo i drastičniji primjer greške, koja može biti katastrofalna za ispravnost izvođenja
programa. Pretpostavimo da je u ovom istom primjeru u kontrolnoj liniji for petlje uslov izlaska
iz petlje i<100. Dakle bez obzira što je niz a[10] deklarisan da ima 10 elemenata, for petlja ga
puni sa dodatnih 90, odnosno ukupno 100. To će prouzrokovati mijenjanje memorijskih lokacija
koje nisu dodijeljene nizu. Prekoračenje granica niza može da prouzrokuje katastrofalne
posljedice. Ako se prekoračenje granice desi u operaciji dodjele inicijalne vrijednosti, mijenja se
memorija u kojoj se mogu naći neke druge promjenljive, a ako se desi tokom čitanja, program
će raditi sa neispravnim podacima. Medutim, kada bi provjera granica niza bila ugrađena u C++
jezik (kao što je to slučaj npr. u programskom jeziku Java), C++ kôd ne bi bio toliko brz i
efikasan.Zato je odgovornost prebačena na programera od koga se očekuje da bude oprezan,
137
odnosno da deklariše niz tako da sadrži potreban broj elemenata i da ne dozvoli prekoračenje
granice.
Kao što je već rečeno, pojedinačni elementi niza mogu biti i karakternog tipa, odnosno
tipa char. Ovi nizovi se mogu inicijalizirati korišćenjem stringova ili literala. Često se za niz čiji
su elementi znakovi (karakteri) koristi naziv string. Najčešće se jednodimenzionalni nizovi
koriste za pohranjivanje znakova. Jezik C++ podržava dvije vrste niza znakova (stringova). Prvi je
niz znakova koji se završava nulom ili tačnije null-terminated stringom ili null karakterom,
naslijeđen iz jezika C. On sadrži znakove koji sačinjavaju string, i na kraju null (odnosno znak '\0').
Ova vrsta stringova se koristi često zato što je veoma efikasna i programeru omogućuje detaljnu
kontrolu nad operacijama sa stringovima. Druga vrsta je klasa string koja se nalazi u biblioteci
klasa jezika C++. Treba se podsjetiti da u jeziku C++, string nije osnovni odnosno nije ugrađen tip.
Kada se deklariše niz znakova koji se završava nulom, on treba da se deklariše tako da bude za
jedan duži od broja znakova u stringu koji treba da sadrži. Na primjer, ako želimo da deklarišemo
niz imena string_1 u koji treba da stane string od deset znakova, deklarisaćemo ga kao char
string_1[11];
Npr.: char string_2[] = "first";, deklariše niz sa nazivom string_2 i elemente niza
inicijalizira na “first”. Treba uočiti da se string “first” sastoji od 5 znakova (karaktera) plus
specijalni znak za terminiranje (oznaka kraja) stringa, koji se naziva null karakter.
Tako, da niz string_2 stvarno sadrži 6 elemenata. Karakter konstanta koja predstavlja null
karakter je '\0'. Niz karaktera koji predstavljaju string moraju uvijek biti deklarisani tako da
mogu sadržavati zahtijevani broj znakova plus terminirajući null karakter.
Nizovi karaktera, takođe mogu biti inicijalizirani sa pojedinačnim karakterima u inicijalnoj listi kao
u primjeru:
138
učitava string sa ulaza dovoljne veličine da se uneseni string u njega smjesti. Iskaz cin učitava
znakove sa tastature dok se ne pojavi neki space karakter ili do kraja veličine niza.
Iskaz cout << string_2; prikazuje niz string_2 na standardni izlazu. Iskaz cout <<, kao i cin >>, ne
vodi računa kolike je dužine niz karaktera.
Niz karaktera se može procesirati i karakter po karakter, npr sa for petljom, što je i
prikazano donjim programskim iskazom.
139
Slika 60b. Rezultati rada programa prebrojavanja znakova, dodijeljenih nizu u programu
140
Slika 61. Primjer pretraživanja niza i prebrojavanja znakova u 2 niza
141
14.4. Predaja nizova funkcijama
Da bi predali niz kao argument funkciji, potrebno je specificirati ime niza kao parametar
i to bez zagrada. Npr.: ako je niz mjesečni_prihodi deklarisan kao
int mjesečni_prihodi[12];,
predaje niz mjesečni_prihodi i njegovu veličinu funkciji porezi. Kada se niz predaje funkciji,
normalno predaje se i veličina, tako da funkcije mogu procesirati specifične elemente u nizu.
C++ predaje niz funkciji preko reference tako da funkcije imaju mogućnost mijenjanja vrijednosti
elemenata originalnog niza. Pojedinačni elementi niza mogu se predati funkciji i po vrijednosti.
Za funkcije koje primaju niz preko poziva funkcija, listom parametara funkcije se mora
specificirati da funkcija očekuje da primi niz. Npr. zaglavlje funkcije za funkciju porezi može biti
napisano kao:
i znači da funkcija porezi, očekuje da primi niz cjelobrojnih vrijednosti u parametar x i broj
elemenata niza u parametar duzina_niza.
jer kako što je već poznato, kompajler ignoriše imena varijabli u prototipu funkcije pa se ona niti
ne moraju navodit. Prototip funkcije saopštava kompajleru broj i tip argumenata, te redoslijed
u kojem se argumenti očekuju. Primjer predaje nizova i pojedinačnih elemenata funkciji, prikazan
je na slikama 62a i 62b .
1. modifyArray koja prima dva parametra - niz i broj elemenata niza. Ovoj funkciji se
parametar predaje po referenci.
2. modifyElement koja prima jedan parametar - vrijednost elementa niza
142
Odgovarajući pozivi funkcija su:
modifyArray( a, arraySize );
modifyElement( a[3] );
Postoji mnogo situacija kada se funkciji ne bi trebalo dozvoliti da mijenja elemente niza.
Zbog toga C++ jezik obezbjeđuje kvalifikator const, koji se koristi da spriječi modifikaciju
elemenata niza. Kada je funkcijom specificiran niz kao parametar ispred kojeg je const
kvalifikator, elementi niza postaju konstantni u tijelu funkcije. Pokušaj da se modifikuje element
niza u tijelu funkcije rezultira kompilacijskom greškom.
143
Slika 62b. Rezultat rada programa (primjera) predaje nizova i pojedinačnih elemenata funkciji
144
Slika 63. Prikaz dvodimenzionalnog niza
int a[3][4];
int tab[3][4]={
{36,45,72,81},
{63,54,27,42},
{90,09,18,99}
};
145
U ovom slučaju elemnti niza su:
Tabela 30. Tabela Inicijalizacija višedimenzionalnog niza int pom[10] [10]; pomoću for petlje:
146
Slika 64. Primjer inicijalizacije, čitanja i prikaza elemenata dvodimenzionalnog niza
147
15. SLOGOVI PODATAKA (STRUKTURE)
Slog podataka ili struktura podataka je grupa različitih vrsta podataka, grupisanih pod
jednim imenom. U zavisnosti od programskog jezika, slogovi se nazivaju strukture, instance,
polja, komponente ili članovi. U C++ jeziku, slog se naziva struktura, a sastavni elementi sloga se
najčešće nazivaju članovi ili komponente. Najjednostavnije rečeno, struktura je složeni tip
podataka koji se sastoji od više članova, pri čemu svi članovi mogu biti različitog tipa.
Slog ili tačnije strukturu sloga (sastav sloga) definišemo u slučaju kada želimo da karakteristike
nekog objekta (entiteta) posmatramo kao cjelinu. Objekat posmatranja (entitet) može biti npr.
student, zaposleni radnik, pacijent ili odsjek na fakultetu. Ako je objekat posmatranja Student,
opisujemo ga sa imenom, prezimom, brojem indeksa, godinom studija, odsjekom studija,
smjerom studija itd. Ako je objekat posmatranja Radnik, opisujemo ga imenom, prezimenom,
matičnim brojem, radnim mjestom itd. Svi relevantni podaci o jednom studentu ili o jednom
radniku, bez obzira na činjenicu kojeg su tipa (znakovni, cjelobrojni ili neki dr.) predstavljaju skup
podataka (polja sa podacima o karakteristikama objekta posmatranja) koji se naziva slog ili u C++
jeziku struktura. Kao što se slog sastoji iz različitih polja u kojima su zapisani podaci o obilježjima
objekta prikupljanja, tako se i struktura u C++ jeziku sastoji iz članova te strukture, koji mogu biti
različitog tipa podataka i različite dužine.
Opšti format strukture u c++ jeziku je:
struct structure_name
{
member_type_1 member_name_1;// tip_1_člana ime_člana_1
member_type_2 member_name_2;// tip_2_člana ime_člana_2
member_type_3 member_name_3;// tip_3_člana ime_člana_3
.
.
.
} object_names;// imena_objekata
148
Sintaksa se može prikazati i na drugi opisniji način:
struct [opisno_ime_strukture]
{
lista_ članova_ strukture
} deklaracija_varijabli
struct {
char model [20];
float cijena;
int god_proiz;
int gorivo;
}
struct {
char model [20];
float cijena;
int god_proiz;
int gorivo;
} auto_1;
Ako želimo da deklarišemo više varijabli tog tipa npr. auto_1 i auto_2, koje su istog tipa
strukture, pisaćemo:
struct {
char model [20];
float cijena;
int god_proiz;
int gorivo;
} auto_1, auto_2;
149
Ukoliko koristimo opisno ime strukture, koje nije obavezno kod deklarisanja struktura,
tada uvođenje opisnog imena strukture (a) i deklaracija varijabli (b) zgledaju ovako:
a) struct automobil {
char model [20];
float cijena;
int god_proiz;
int gorivo;
}
Postoji i drugi način za uvođenje tipa podataka automobil. Taj drugi način se odnosi na
upotrebu komande typedef.
typedef struct {
char model [20];
float cijena;
int god_proiz;
int gorivo;
} automobil;
Tip “automobil” je korisnički definisan tip podataka i može se koristi na svim mjestima
gdje je dozvoljeno korišćenje i elementarnih tipova podataka.
Na ovom mjestu je važno zapaziti da je prvi korak u radu sa strukturama definisanje strukture i
eventualno uvođenje novog tipa podataka, a nakon toga se vrši deklarisanje objekata (varijabli
i konstanti) tog tipa podataka. Zato npr. iskaz automobil a_1, a_2;, predstavlja deklaraciju
varijabli a_1 i a_2, koji su tipa automobil (to je složeni tip podataka, odnosno struktura).
150
Npr. za auto_1 članovi (polja u strukturi sloga) su:
auto_1.model
auto_1.cijena
auto_1.god_proiz
auto_1.gorivo
Bitna karakeristika članova strukture je da se oni isto kao polja u strukturi sloga, koriste
kao i sve druge varijable elementarnog tipa u C++ jeziku. Na isti način će se npr. ponašati varijabla
auto_1.cijena u iskazu auto_1.cijena=auto_1.cijena*porez;, kao što se ponaša bilo koja druga
varijabla tipa float u sličnim iskazima. Selektirani član strukture je varijabla tipa selektiranog
polja. Prilikom unosa ili ispisa varijable tipa strukture, mora se navoditi član po član. Drugim
riječima nije moguće odmah unijeti niti prikazati sadržaj cijele strukture. Strukture se mogu
izjednačavati, odnosno kopirati sadržaj iz jedne u drugu strukturu ukoliko su istog tipa.
Npr.:
auto_1=auto_2;
Kao i kod elementarnih tipova podataka, tako se i prilikom deklaracije varijabli tipa
strukture mogu dodijeljivati inicijalne vrijednosti toj varijabli tako što se unutar vitičastih
zagrada navode vrijednosti za članove strukture i to onim redoslijedom kojim su deklarisani ti
članovi strukture. Vrijednosti koje se na taj način navode, moraju se odvajati zarezima.
Npr.:
struct {
char model [20];
float cijena;
int god_proiz;
int gorivo;
} auto_1= (“KIA”,12500.00,2012,80);
151
15.3. Predaja parametara struktura funkcijama
Kao i kod ostalih tipova podataka, tako i kod tipova struktura, sadržaj strukture se može
predati funkciji modelom predaje po vrijednosti tako da se predaje član po član te strukture
funkciji. Strukture i njeni članovi se također mogu predati funkciji po referenci, tako što se
predaje ili referenca ili pointer.
Da bi se struktura predala funkciji po referenci, potrebno je predati adresu strukture
objektu. Predaja struktura po referenci je mnogo efektivniji način nego predaja po vrijednosti,
osobito kod velikih struktura, jer predaja parametara po vrijednosti podrazumijeva kopiranje
kompletnog sadržaja strukture, što naravno usporava izvršenje programa. Primjer programa koji
ilustruje predaju parametra strukture funkciji po referenci, prikazan je na slici 58.
152
Slika 65b. Primjer punjenja strukture i njenog prikaza
153
Slika 66b. Rezultati rada programa predaje parametra tipa strukture funkciji po referenci
154
LITERATURA
Cockburn, A. i dr., Beck, K., Beedle, M., Bennekum, van A., Manifesto for Agile Software
Development, (2011), http://www.agilemanifesto.org/
Corrado, B., & Jacopini, G.,(1966), Flow Diagrams, Turing Machines And Languages With Only
Two Formation Rules, International Computation Centre and Istituto Nazionale per le
Applicazioni del Calcolo, Roma, Italy
Panian, Ž., (1999), Poslovna informatika - koncepti, metode i tehnologija, Informator, Zagreb,.
79 str i str 80
Parezanović, N., Petrić Z., Mitrinović D., (1979), Računske mašine i programiranje - programski
jezik COBOL, Beograd, str 7
Smith, R., (2020), Working Draft, Standard for Programming Language C++, 1.4.2020., str. 24
Stroustrup, B., (1996). A History Of C++: 1979-1991. Objavljeno u knjizi autora Bergin, T.,
Gibson, R.; History of Programming Languages II, str. 699-769.
Turban, E., Rainer K. Jr, (2009), Uvod u informacione sisteme, Data status, Beograd, 2009, str,
109
https://dl.acm.org/doi/10.1145/355592.365646
http://open-std.org/JTC1/SC22/WG21/docs/papers/2020/n4861.pdf
https://www.periodni.com/hr/pretvaranje_rimskih_brojeva.html
155
POPIS SLIKA
Slika 1: Hijerarhija memorijskih zapisa
Slika 2. Varijanta jednog dijagrama toka: Odlučivanje korištenjem informacija
Slika 3. Blok dijagram aktivnosti prilikom pravljenja programa
Slika 4. Prikaz jedne linije teksta sa više iskaza [(slučaj pod a)]
Slika 5. Prikaz više linija teksta sa jednim cout iskazom [(slučaj pod b)]
Slika 6. Kod programa, koji sabira dva cijela broja, unesena sa tastature
Slika 7. Primjer različitih načina definisanja i inicijaliziranja varijabli
Slika 8. Objašnjenje deklarisanja varijabli
Slika 9. Primjer za ilustraciju deklarisanja i definisanja konstanti
Slika 10. Ilustracija deklaracije i upotrebe realnog tipa podataka
Slika 11. Ilustracija upotrebe nabrojivog tipa varijabli
Slika 12. Prefix i Postfix operatori sabiranja
Slika 13. Kružna aritmetika, Izvor: Adapt. prema (Motik i Šribar, 1997)
Slika 14. Primjer upotrebe uslovnog operatora grananja
Slika 15. Primjer eksplicitne primjene operatora dodjele tipa (cast)
Slika 16. Primjer programa, koji ilustruje primjenu Sizeof operatora
Slika 17. Struktura sevence (blok) prikazana UML dijagramom
Slika 17. Strukture izbora (selekcija) u C++ jeziku
Slika 18a. If iskaz izbora, kada je uslov tačan
Slika 18b. If iskaz izbora, kada uslov nije tačan
Slika 19. UML dijagram aktivnosti za primjer ilustracije if iskaza
Slika 20a. Primjer upotrebe složenog iskaza nakon ispunjenog uslova u if naredbi
Slika 20b. Rezultat upotrebe složenog iskaza nakon ispunjenog uslova u if naredbi
Slika 21. Grafički prikaz if … else naredbe
Slika 22. UML dijagram aktivnosti za primjer koji ilustruje if … else strukturu
Slika 23. Primjer upotrebe blokla naredbi unutar vitičastih zagrada iza ključne riječi else
Slika 23a. Rezultat rada programa sa promijenjenom opcijom (pol_osobe=2)
Slika 24. Blok dijagram switch strukture izbora
Slika 25. Primjer upotrebe switch strukture izbora sa izvođenjem istog iskaza za više varijanti
Slika 26. Ilustracija ugnježdene if naredbe za računanje ocjene na osnovu ukupnog broja
bodova
Slika 27. Program za ilustraciju svitch-case strukture izbora
Slika 28. Grafički prikaz toka izvršavanja while do petlje
Slika 29. C++ program, koji rješava zadatak uz pomoć while do strukture.
Slika 30. Grafički prikaz toka izvršavanja do while petlje
Slika 31. C++ program, koji rješava prethodni zadatak uz pomoć do while strukture
Slika 32. Primjer upotrebe for petlje za rješavanje zadatka računanja zbira brojeva od 1 do
nekog
Slika 33. Primjer upotrebe dva inicijalna inkrementalna i dva izraza u jednoj for petlji
Slika 34. Primjer for petlje bez inkrementa
Slika 35. Varijacija upotrebe for petlje sa izmještanjem inicijalnog izraza izvan petlje
Slika 36a. Primjer upotrebe for petlje bez tijela petlje
156
Slika 36b. Primjer upotrebe for petlje bez tijela petlje
Slika 37. Primjer upotrebe continue naredbe
Slika 38. Primjer upotrebe continue naredbe sa više iteracija
Slika 39. Primjer upotrebe i poređenja continue i break naredbe
Slika 40. Primjer upotrebe goto naredbe
Slika 41 Primjer upotrebe goto iskaza, tipičan za nestrukturirane programske jezike
Slika 42 Primjer koji ilustruje deklaraciju i poziv (upotrebu) funkcije
Slika 43. Primjer definisanja prototipa funkcije, definicije funkcije i poziva funkcije
Slika 44. Primjer upotrebe funkcije za određivanje maksimuma od 3 unesena broja
Slika 45. Program ilustruje povratak iz funkcije, koja ne vraća ništa uz pomoć return naredbe
Slika 46. Primjer C++ programa, koji ilustruje upotrebu exit(); naredbe
Slika 47. Program koji ilustruje lokalnu oblast važenja varijable
Slika 48. Primjer ponavljanja inicijalizacije varijable svakim izvršenjem tijela funkcije
Slika 49. Primjer programa kojim se ilustruje upotreba static lokalne varijable
Slika 50. Primjer koji ilustruje upotrebu globalnih, te static i auto lokalnih i varijabli
Slika 51. Prikaz vrijednosti varijabli različitog vidokruga, a istog imena (x).
Slika 52. Primjer upotrebe rekurzivne funkcije za izračunavanje funkcije faktorijel za neki broj
Slika 53. Primjer upotrebe rekurzivne funkcije za vraćanje vrijednosti broja u Fibonačijevom
nizu
Slika 54. Izračunavanje funkcije faktorijel uz pomoć while do petlje
Slika 55. Primjer deklarisanja funkcije sa praznom listom parametara
Slika 56. Primjer deklarisanja i upotrebe Inline fukcije pri izračunavanju zapremine kocke
Slika 57. Primjer preklapanja funkcija
Slika 58a. Program poređenja predaje parametara po vrijednosti i predaje po referenci
Slika 58b. Primjer rezultata poređenja predaje parametara po vrijednosti i predaje po referenci
Slika 59. Karakteristike niza
Slika 60a. Program prebrojavanja znakova, dodijeljenih nizu u programu
Slika 60b. Rezultati rada programa prebrojavanja znakova, dodijeljenih nizu u programu
Slika 61. Primjer pretraživanja niza i prebrojavanja znakova u 2 niza
Slika 62a. Primjer predaje nizova i pojedinačnih elemenata funkciji
Slika 62b. Rezultat rada programa (primjera) predaje nizova i pojedinačnih elemenata funkciji
Slika 63. Prikaz dvodimenzionalnog niza
Slika 64. Primjer inicijalizacije, čitanja i prikaza elemenata dvodimenzionalnog niza
Slika 65a. Primjer punjenja strukture i njenog prikaza
Slika 65b. Primjer punjenja strukture i njenog prikaza
Slika 66a. Primjer predaje parametra tipa strukture funkciji po referenci
Slika 66b. Rezultati rada programa predaje parametra tipa strukture funkciji po referenci
157
POPIS TABELA
158