You are on page 1of 9

1.

Osnovna struktura C++ programa


Uobiajeno je da svaka pria o programskom jeziku C++ poinje opisom kratkog programa koji
ispisuje pozdravnu poruku na ekranu. Stoga e na prvi program izgledati ovako:
// Ovaj program ispisuje pozdravnu poruku
#include <iostream>
using namespace std;
int main()
{
cout << "Zdravo narode!";
return 0;
}

ak i u ovako kratkom programu, mogue je uoiti nekoliko karakteristinih elemenata:


// Ovaj program ispisuje pozdravnu poruku

Komentar

#include <iostream>

Zaglavlje standardne biblioteke

using namespace std;

Deklaracija standardnog imenika

int main()
{
cout << "Zdravo narode!";
return 0;
}

Zaglavlje funkcije
Naredba 1
Naredba 2

Funkcija

Znak // oznaava komentar. Prilikom prevoenja programa, kompajler potpuno ignorira sve to je
napisano iza znaka za komentar do kraja tekueg reda. Svrha komentara je da pomogne ljudima koji
analiziraju program da lake shvate ta program ili njegovi pojedini dijelovi rade. Komentari su obino
kratki. Postoji jo jedan nain za pisanje komentara, naslijeen iz jezika C. Sve to se nalazi izmeu
oznaka /* i */ takoer se tretira kao komentar. Ovakav nain pisanja komentara moe biti pogodan
za pisanje komentara koji se proteu u vie redova teksta, kao na primjer u sljedeem programu:
/* Ovo je veoma jednostavan C++ program.
On ne radi nita posebno, osim to ispisuje pozdravnu poruku.
Meutim, od neeg se mora poeti. */
#include <iostream>
using namespace std;
int main()
{
cout << "Zdravo narode!";
return 0;
}

// Ispisuje tekst "Zdravo narode!"


// Vraa 0 operativnom sistemu

Glavninu programa sainjava cjelina nazvana funkcija. Funkcije predstavljaju funkcionalne cjeline
programa koje objedinjavaju skupine naredbi koje su posveene obavljanju nekog konkretnog zadatka.
Prikazani program ima samo jednu funkciju. Iole sloeniji programi gotovo uvijek imaju vie funkcija, jer
je vee programe mnogo lake pisati ukoliko se prethodno razbiju na manje funkcionalne cjeline koje se
kasnije izvode kao razliite funkcije. U svakom C++ programu mora postojati tano jedna funkcija koja se

zove main. Ova funkcija se naziva glavna funkcija, i to je ona funkcija koja e se prva poeti izvravati
kada program zapone sa radom. U naem primjeru, to je ujedno i jedina funkcija u programu. Drugim
rijeima, program uvijek zapoinje izvravanje od prve naredbe glavne funkcije.
Funkcije u programskom jeziku C++ uvijek zapoinju zaglavljem (engl. function heading) koje pored
imena funkcije sadri spisak parametara funkcije (engl. parameter list), i tip povratne vrijednosti (engl.
return type). Parametri su podaci koje pozivaoc funkcije treba da proslijedi pozvanoj funkciji, sa ciljem
preciziranja zadatka koji funkcija treba da obavi. Popis parametara se navodi u zagradama neposredno iza
imena funkcije. Poto se main funkcija poziva neposredno iz operativnog sistema, eventualne parametre
ovoj funkciji moe proslijediti jedino operativni sistem. Stoga je najei sluaj da funkcija main nema
nikakvih parametara, to se oznaava praznim zagradama (odsustvo parametara se ponekad oznaava i
navoenjem rijei void unutar zagrada, to je zastarjela praksa nasljeena iz jezika C). O parametrima
emo detaljnije govoriti u kasnijim poglavljima.
Ispred imena funkcije navodi se tip povratne vrijednosti funkcije. Povratna vrijednost je vrijednost
koju funkcija vraa pozivaocu funkcije. Vraanje vrijednosti obavlja se pomou naredbe return, koja
tipino predstavlja posljednju naredbu unutar funkcije, i iza koje se navodi povratna vrijednost. U sluaju
funkcije main, povratna vrijednost se vraa operativnom sistemu. Po dogovoru, vrijednost 0 vraena
operativnom sistemu oznaava uspjean zavretak programa, dok se vrijednosti razliite od nule vraaju
operativnom sistemu iskljuivo kao signalizacija da iz nekog razloga program nije uspjeno obavio
planirani zadatak (znaenje ovih vrijednosti zavisi od konkretnog operativnog sistema). Stoga je
posljednja naredba funkcije main u gotovo svim sluajevima naredba
return 0;

Sve naredbe jezika C++ obavezno zavravaju znakom ;, koji oznaava kraj naredbe (jedna od
najeih sintaksnih greaka u C++ programima je upravo zaboravljanje zavrnog taka-zareza na kraju
naredbe). Rije int ispred imena funkcije oznaava da je vrijednost koju ova funkcija vraa cijeli broj,
kao to e biti jasnije iz sljedeeg poglavlja.
Kako je povratna vrijednost iz main funkcije gotovo uvijek nula, mnogi kompajleri doputaju da se
naredba return potpuno izbaci iz main funkcije. Tako neto ne smatra se dobrom programerskom
praksom. Takoer, ranije verzije kompajlera za C++ dozvoljavale su da se naredba return izbaci i da
se tip povratne vrijednosti int zamijeni sa void, to oznaava da se nikakva povratna vrijednost ne
vraa. Standard ISO C++98 zabranio je ovakvu praksu, i strogo naredio da funkcija main kao povratni
tip moe imati samo int, i nita drugo.
Nakon zaglavlja funkcije, slijedi tijelo funkcije (engl. function body). Tijelo funkcije poinje znakom
{ a zavrava znakom }, odnosno tijelo funkcije uvijek je omeeno vitiastim zagradama. Kasnije
emo vidjeti da se vitiaste zagrade koristimo kada god treba objediniti neku skupinu naredbi u jednu
kompaktnu cjelinu. U ovom sluaju ta cjelina e biti upravo tijelo funkcije. Pod naredbama
podrazumijevamo upute koje govore raunaru kakvu akciju treba da preduzme, odnosno naredbe opisuju
algoritam. Kao to vidimo, program se ne sastoji samo od naredbi. Na primjer, komentar ili zaglavlje
funkcije nisu naredbe, jer ne dovode do nikakve konkretne akcije. Program u naem primjeru je toliko
jednostavan da ima samo dvije naredbe, od kojih je druga naredba praktino trivijalna. Analizirajmo stoga
jedinu netrivijalnu naredbu u programu, koja glasi:
cout << "Zdravo narode!";

cout (skraenica od engl. console out) predstavlja objekat tzv. izlaznog toka podataka (engl. output
stream), koji je povezan sa standardnim ureajem za ispis. Standardni ureaj za ispis je tipino ekran,
mada ne mora biti (C++ uope ne podrazumijeva da raunar na kojem se program izvrava mora

posjedovati ekran). Znak << predstavlja operator umetanja (engl. insertion) u izlazni tok, koji
pojednostavljeno moemo itati kao alji na. Tekst "Zdravo narode!" koji se nalazi izmeu
navodnika, predstavlja niz znakova koji aljemo na (odnosno umeemo u) izlazni tok. Takav niz znakova
nazivamo stringovni literal (ili neimenovana stringovna konstanta). O stringovnim literalima i
stringovima openito e kasnije biti vie govora, a za sada e nam stringovni literali sluiti samo za ispis
fiksnog teksta na izlazni ureaj. Dakle, gornja naredba moe se interpretirati kao:
Poalji niz znakova Zdravo narode! na izlazni ureaj (tipino ekran).
Uz pretpostavku da smo uspjeno kompajlirali i pokrenuli program (taan postupak kako se to radi
ovisi od upotrijebljenog kompajlera), na ekranu bi se trebao pojaviti ispis poput sljedeeg:
Zdravo narode!

U sluaju da radite pod nekim grafikim operativnim sistemom (poput Windows-a), ovaj tekst e se
tipino pojaviti u posebnom prozoru nazvanom konzolni prozor. Mogue je da u sluaju kompajlera sa
kojim radite neete biti u stanju da vidite nikakav tekst, jer se konzolni prozor obino automatski zatvara
nakon zavretka programa, ime i ispisani tekst odlazi u nepovrat. O nainima za prevazilaenje ovog
problema govoriemo u narednom poglavlju, a u meuvremenu, djelimino rjeenje moe biti ubacivanje
sljedee naredbe neposredno ispred naredbe return:
cin.get();

Ubacivanjem ove naredbe postii emo da se program nee zavriti prije nego to korisnik pritisne tipku
ENTER, ime smo odloili zatvaranje konzolnog prozora. Ovo nije zapravo pravi smisao ove naredbe. ve
smo se ovdje oslonili na jednu njenu propratnu pojavu. O njenom tanom smislu govoriemo u kasnijim
poglavljima.
Objekat cout ne mora nuno prihvaati samo stringovne literali, nego i mnoge druge tipove
podataka o kojima e biti vie rijei kasnije. Na primjer, pored stringovnih literala, bie prihvaeni i
brojevi (brojani literali), tako da moemo pisati:
cout << "Proba";
cout << 1234;
cout << 12.34;

U gornjem primjeru 12.34 je decimalni broj. Primijetimo da se za odvajanje decimala od cijelog dijela
ne koristi zarez nego taka. O pravilima za pisanje brojeva govoriemo detaljnije u poglavljima koja
slijede.
Operator umetanja u tok moe se primijeniti vie puta zaredom na cout objekat, tj. moemo pisati
cout << "Broj je " << 10;

Ovo e proizvesti sljedei ispis na izlazni ureaj:

Broj je 10

Veoma je bitno da se na samom poetku shvati razlika izmeu objekata kao to su 10 i "10". Objekat
10 je broj i nad njim se mogu vriti raunske operacije poput sabiranja itd. S druge strane, objekat "10" je
niz znakova (stringovni literal) koji se sluajno sastoji od dvije cifre (1 i 0), i nad njim se ne mogu vriti
nikakve raunske operacije (npr. telefonski broj je sigurno sastavljen od cifara, ali teko kome e pasti na
pamet da sabira dva telefonska broja zajedno). Ova razlika e biti mnogo jasnija neto kasnije. Ipak, sa
aspekta ispisa ova dva objekta se ponaaju identino, tako da bi isti efekat proizvela i sljedea naredba:
cout << "Broj je " << "10";

ili prosto
cout << "Broj je 10";

Stringovni literali mogu sadravati potpuno proizvoljan niz znakova, tako da je npr. "! ?@ #"
sasvim legalan stringovni literal, iako je njegov smisao upitan. Grubo reeno, moe se shvatiti da
navodnici oznaavaju bukvalno to, ba to itd. Kada god nisu upotrijebljeni navodnici, kompajler za
C++ e pokuati da interpretira smisao onog to je napisano prije nego to se izvri ispis (o emu e
kasnije biti vie rijei), dok kada se upotrijebe navodnici, na izlazni ureaj se bukvalno prenosi ono to je
napisano izmeu njih. Tako npr. ako napiemo
cout << "2+3";

na ekranu emo dobiti ispis


2+3

dok ako napiemo


cout << 2+3;

prikaz na ekranu e biti


5

Naravno, naredba poput


cout << @#!&&/3++;

dovee do prijave greke od strane kompajlera, jer je kompajler pokuao (bezuspjeno) da interpretira
smisao napisanih znakova, dok je s druge strane,
cout << "@#!&&/3++";

posve legalna naredba. Da bismo ovo jo jednom istakli, uzmimo da elimo da ispiemo telefonski broj sa
crticom. Moramo pisati
cout << "453-728";

a ne nipoto
cout << 453-728;

jer e u posljednjem sluaju - biti shvaen kao znak za oduzimanje, tako da emo umjesto telefonskog
broja imati ispisan rezultat oduzimanja (tj. -275).
Ovim jo nismo objasnili sve elemente naeg prvog programa. Prvi red programa ne raunajui
komentar je glasio:
#include <iostream>

Naredba #include predstavlja uputu (tzv. direktivu) kompajleru da u program ukljui tzv.
zaglavlje biblioteke (engl. library header) sa imenom iostream. Naime, sve funkcije i objekti u jeziku
C++ grupirani su u biblioteke, i na poetku svakog programa obavezno se ukljuuju sve biblioteke koje
sadre funkcije i objekte koje koristimo u programu. Biblioteka iostream (skraeno od engl. inputoutput stream), izmeu ostalog, definira objekat cout koji koristimo za pristup izlaznom toku podataka.
Tako, npr. ako piemo matematiki program, na poetku programa e takoer stajati i
#include <cmath>

a ako piemo program koji radi sa grafikom, vjerovatno emo imati i neto poput:
#include <graphics.h>

Ideja svega ovoga je da se program ne optereuje bespotrebno objektima i funkcijama koji se nee
koristiti unutar programa. Npr. bespotrebno je program optereivati grafikim objektima ako program
nee koristiti grafiku. Standard ISO C++98 jezika C++ predvia da se kao sastavni dio jezika C++
obavezno moraju nalaziti sljedee biblioteke:
algorithm
ciso64
csignal
ctime
functional
iterator

bitset
climits
cstdarg
cwchar
iomanip
limits

cassert
clocale
cstddef
cwtype
ios
list

cctype
cmath
cstdio
deque
iosfwd
locale

cerrno
complex
cstdlib
exception
iostream
map

cfloat
csetjmp
cstring
fstream
istream
memory

new
stack
valarray

numeric
stdexcept
vector

ostream
streambuf

queue
string

set
typeinfo

sstream
utility

U starijim verzijama kompajlera za C++ sva zaglavlja biblioteka imala su nastavak .h na imenu,
tako da se umjesto zaglavlja iostream koristilo zaglavlje iostream.h. Novi kompajleri jo uvijek
podravaju stara imena zaglavlja, ali njihovo koritenje se ne preporuuje, jer e podrka za stara imena
biti izbaena u doglednoj budunosti. Kompajler ima pravo da upozori programera na to da se upotreba
starih zaglavlja ne preporuuje emitiranjem poruke upozorenja. Sve biblioteke ija imena poinju slovom
c osim complex naslijeena su iz jezika C, u kojima su imali imena zaglavlja bez poetnog slova c
i sa nastavkom .h (npr. math.h umjesto cmath). I u ovom sluaju, stara imena zaglavlja se jo
uvijek mogu koristiti, ali tu praksu treba izbjegavati.
Pored navedenih 50 standardnih biblioteka, mnogi kompajleri za C++ dolaze sa itavim skupom
nestandardnih biblioteka, koje ne predstavljaju propisani standard jezika C++. Tako, na primjer,
biblioteka za rad sa grafikom sigurno ne moe biti unutar standarda jezika C++, s obzirom da C++ uope
ne podrazumijeva da raunar na kojem se program izvrava mora imati ak i ekran, a kamoli da mora biti
u stanju da vri grafiki prikaz. Takoer, biblioteka sa zaglavljem windows.h koja slui za pisanje
Windows aplikacija ne moe biti dio standarda C++ jezika, jer C++ ne predvia da se programi moraju
nuno izvravati na Windows operativnom sistemu. Zaglavlja nestandardnih biblioteka gotovo uvijek
imaju i dalje nastavak .h na imenu, da bi se razlikovala od standardnih biblioteka. Treba napomenuti i
to da se nestandardne biblioteke za razne namjene esto mogu nabaviti i kod neovisnih proizvoaa
softvera, ili besplatno skinuti sa Interneta. Oigledno su nestandardne biblioteke esto itekako potrebne,
ali ne mogu da uu u dio standarda jezika C++, s obzirom da standard jezika ne smije da sadri nikakve
pretpostavke o hardverskim osobinama raunara na kojem se program izvrava, niti o operativnom
sistemu koji se izvrava na raunaru.
Strogo uzevi, direktiva #include ne ini sastavni dio jezika C++, nego ini tzv. naredbu
pretprocesora. Pretprocesor je program koji vri poetnu obradu C++ programa jo prije nego to C++
program uope bude prihvaen od strane kompajlera. Kako je pretprocesor obino tijesno vezan za
kompajler, korisnik najee nije svjestan ove injenice (i ne mora da bude svjestan, osim u veoma
naprednim primjenama). Sve naredbe pretprocesora poinju znakom # koji se, inae, ita kao he
(engl. hash).
Preostaje jo da objasnimo red programa koji je glasio:
using namespace std;

Ovaj programski red govori programu da koristi imenik (engl. namespace) nazvan std. Imenici su
osobina jezika C++ koja je uvedena tek nedavno. Naime, pojavom velikog broja nestandardnih biblioteka
razliitih proizvoaa bilo je nemogue sprijeiti konflikte u imenima koje mogu nastati kada dvije
razliite biblioteke upotrijebe isto ime za dva razliita objekta ili dvije razliite funkcije. Zbog toga je
odlueno da se imena svih objekata i funkcija razvrstavaju u imenike. Dva razliita objekta mogu imati
isto ime, pod uvjetom da se nalaze u razliitim imenicima. Standard propisuje da se svi objekti i sve
funkcije iz standardnih biblioteka moraju nalaziti u imeniku std. Pomou navedenog programskog reda
govorimo kompajleru da elimo da sve funkcije i objekti iz ovog imenika budu vidljivi u naem programu.
Bez ovog reda, objektu cout bismo morali pristupati pomou konstrukcije std::cout, koja znai
objekat cout iz imenika std. Alternativno bismo umjesto prethodnog programskog reda mogli pisati
i sljedei red:
using std::cout;

Ovim bismo naglasili da elimo pristupati objektu cout iz imenika std (bez kasnijeg stalnog
navoenja imena imenika pri svakom pristupu cout objektu), bez potrebe da uvozimo itav imenik
std.
Da uoimo jo neke osobine objekta cout, napisaemo ponovo program koji radi istu stvar kao i
program iz prvog primjera, ali na neto drugaiji nain:
#include <iostream>
using namespace std;
int main()
{
cout << "Zdravo ";
cout << "narode!";
return 0;
}

Ovaj program proizvodi potpuno isti ispis kao i prethodni program, jer svaka sljedea naredba za ispis
nastavlja sa ispisom tano od onog mjesta gdje se prethodna naredba za ispis zavrila. Razmak iza o u
prvoj naredbi je bitan. Naime, i razmak je dio stringovnog literala, i kao takav bie ispisan na izlazni
ureaj. Da smo izostavili taj razmak, tj. da smo glavnu funkciju napisali ovako:
int main()
{
cout << "Zdravo";
cout << "narode!";
return 0;
}

tada bi ispis na ekran izgledao otprilike ovako:


Zdravonarode!

Vano je napomenuti da su svuda osim unutar stringova i iljatih zagrada (<>), dodatni razmaci
potpuno nebitni, i kompajler ih ignorira, to omoguava programeru stiliziranje izgleda programa u svrhu
poboljanja njegove itljivosti. Zapravo, isto vrijedi ne samo za razmake nego i za sve tzv. bjeline (engl.
whitespaces), u koje osim razmaka spadaju tabulatori i oznake za kraj reda. Tako se naredbe koje ine
tijelo funkcije obino piu neznatno uvueno, da se vizuelno istakne poetak i kraj tijela. Razmaci unutar
iljastih zagrada nisu dozvoljeni, tj. sljedea direktiva je neispravna:
#include < iostream >

Unutar stringovnih literala mogu se nai i neki specijalni, tzv. kontrolni znakovi. Jedan od
najkorisnijih je znak \n koji predstavlja znak za novi red (kasnije emo upoznati i neke druge
kontrolne znakove). Tako, ako napiemo

cout << "Zdravo\nnarode!";

ispis na ekranu e biti:


Zdravo
narode!

Naravno, mogli smo istu stvar pisati i kao 2 naredbe:


cout << "Zdravo\n";
cout << "narode!";

Ovakav nain pisanja poetnicima obino bude jasniji.


Biblioteka iostream definira objekat nazvan endl, koji je u logikom smislu sinonim za string
"\n" (mada u izvedbenom smislu postoje znaajne razlike) tako da smo istu naredbu mogli pisati i kao:
cout << "Zdravo" << endl << "narode!";

ili je ralaniti na dvije naredbe kao:


cout << "Zdravo" << endl;
cout << "narode!";

Vano je napomenuti da stil pisanja programa (razmaci, novi redovi, uvlaenje redova, itd.) ni na koji
nain ne utiu na njegovo izvravanje. Novi red ne oznaava kraj naredbe, nego je kraj naredbe iskljuivo
tamo gdje se nalazi znak taka-zarez. Tako bi sljedei program proizveo isti efekat kao i program iz prvog
primjera:
#include <iostream>
using namespace std;
int main(){cout<<"Zdravo narode!";return 0;}

Jo gore, isti rezultat bi proizveo i ovakav program:


#include <iostream>
using
namespace
std;int
main(
){ cout
<<
"Zdravo narode!"
;return
0
;}

Naravno, radi itljivosti programa treba paziti na stil pisanja. Treba napomenuti da se stringovi ne

smiju prelamati u vie redova. Na primjer, nije dozvoljeno pisati:


cout << "Zdravo
narode!";

ta e se dogoditi ukoliko napiemo neto slino, zavisi od konkretnog kompajlera. Neki kompajleri e
prijaviti greku, dok e neki prihvatiti ovakvu naredbu, i smatrati da string sadri znak za novi red \n na
mjestu preloma. ak i uz pretpostavku da je ovo dozvoljeno u Vaoj verziji kompajlera, ne trebate koristiti
tu mogunost, jer ona nije podrana standardom.
Pretprocesorske naredbe se takoer moraju pisati u jednom redu, tako da nije dozvoljeno pisati:
#include
<iostream>

Pored toga, pretprocesorske naredbe se, kao to ste ve vjerovatno primijetili, ne zavravaju
taka-zarezom.

You might also like