You are on page 1of 60

UVOD

Za razliku od C-a, programski jezik C++ je objektno orijentirani programski jezik.


Zamisao objektnog programiranja je da se sloeni zadatak razdijeli na manje dijelove koji se onda mogu
meusobno neovisno rjeavati.
Jezik je nastao osamdesetih godina 20.tog stoljea kao naprednija verzija C-a. Postoji vie verzija
prevoditelja (kompajlera) za C++, a najpoznatiji su: Dev C++; Microsoft Visual C++ i Borland C++
Builder.

Osnovna struktura programa


Svaki program napisan u C-u ili C++ ima svoj izgled (strukturu).
U nastavku emo pokazati koji su elementi jedno programa napisanog u C++ programskom jeziku:
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
deklaracija varijabli;
naredbe programa;
system ("PAUSE");
return 0;
}
Linije programa koje poinju s znakom # nisu programske naredbe, ve su to pretprocesorske naredbe
C programa prevodiocu (kompajleru) koje se izvravaju prije kompajliranja. Prevodilac ili kompajler je
zaseban program koji je "zaduen" za prevoenje naredbi programskog jezika u mainski jezik.
Naredba #include <iostream> poziva datoteku iostream.h koja sadri skup naredbi zaduenih za
komunikaciju s programom, a <cstdlib> cstdlib.h koja sadri opis funkcija ulaza-izlaza za C++.
Unutar vitiastih zagrada nalaze se deklaracije varijabli (koje e kasnije biti opisane) te slijede naredbe
programa koje ine naredbe za ulaz, raunanje i ispis rezultata.
Naredbom using namespace std; obavjetavamo prevoditelja da emo koristiti standardne nazive
naredbi. Ta se naredba moe zamijeniti i naredbom #include <stdio> na poetku programa.
Prva linija programa, main, definira funkciju ili grupu zavisnih programskih naredbi. Funkcije su sastavni
dijelovi programa u C++u te se ta glavna ili osnovna zove main. Veina programa sadri jo nekoliko
dodatnih funkcija koje imaju svoje ime.
Svaka naredba u programu zavrava sa tokom-zarezom ( ; ), osim uvjetne naredbe (ifelse).
Naredbom system ("PAUSE"); zaustavljamo program dok ne pritisnemo neku tipku. To nam je vano
prilikom izvoenja programa.
Naredba return 0; najee stoji na kraju programa, a ustvari govor da funkcija main() ne vraa
vrijednost. Kada budete uili o potprogramima tada ete vie saznati to radi ova naredba.
Uz program poeljno je pisati i komentar tako da onaj tko ita program moe shvatiti o emu se radi.
Komentari se piu unutar slijedeih znakova /* */ ili se bilo gdje u retku upiu znakovi za dvije kose crte
//
Naredbe programa nalaze se unutar vitiastih zagrada i neke osnovne bit e opisane u slijedeim
lekcijama .

Programiranje C++

Tipovi podataka
Raunaru je vano s kakvim podacima radi. Ovisno o vrsti razlikujemo:

Cjelobrojne tipovi podataka (int)

Realne tipovi podataka (obine (float) i dvostruke preciznosti(double))

Znakovne tipovi podataka (char i string)

Korisnike definirane tipove (strukture)

Svaki tip podatak zauzima odreenu veliinu (memoriju) u raunaru i ima odreeni veliinu ili obim. U
sljedeoj tablici dan je prikaz vrsta podataka, veliine u bitovima koju taj podatak zauzima u memoriji
raunara i obim u kojem se moe nalaziti u programskom jeziku C.

Tip podatka

Veliina u bitovima

Opseg

char

-128 do 127

signed char

-128 do127

unsigned char

0 do 255

short int

16

-32768 do 32767

unsigned int

16

0 do 65535

int

16

-32768 do 32767

long

32

-2147483648 do 2147483647

unsigned long

32

0 do 4294967295

float

32

3,4x10-38 do 3,4x1038

double

64

1,7x10-308 do 1,7x10308

long double

80

3,4x10-4932 do 1,1 x104932

Osnovni tip cijelog broja je int. On moe imati negativnu ili pozitivnu vrijednost unutar prikazanih granica.
Tip podatka long koristi se kada nam je za varijablu potrebno vee podruje. Tipovi podataka mogu biti
predznani signed i to znai da je u jednom bitu smjetena informacija o tome da li je broj pozitivan ili
negativan. Neke varijable ne mogu nikada poprimiti negativnu vrijednost pa ih deklariramo kao
nepredznane ili unsigned.
Realni brojevi imaju decimalni dio. Zovemo ih jo i floating-point (plivajui zarez) brojevima. Ime su
dobili po nainu predstavljanja takvih brojeva u memoriji raunala. Taj tip podatka naziva se float. Tipovi

Programiranje C++

podataka doble i lon double su poput tipa float, jedino omoguavaju da se smjeti vei broj znamenaka sa
veom preciznou..
Za znakovni tip podataka koristimo se sa char (to je isto kao i signed char). Ukoliko elimo koristiti
kompletan set znakova treba upotrijebiti unsigned char. Kada baratamo s rijeima i reenicama
moemo koristiti i tip - string (niz znakova).
esto se javlja potreba da kod izvoenja programa elimo zadrati sadraj ekrana da proitamo
rezultate izvoenje programa. Za to e nam posluiti naredba getch() koja uita jedan znak i nastavlja
program, bez pritiska na tipku Enter. esto se koristi kao posljednja naredba u programu,a nalazi se u
datoteci funkcija conio.h

Aritmetiki operatori
Operacija

Operator

Zbrajanje

Oduzimanje

Mnoenje

Dijeljenje

Ostatak cjelobrojnog dijeljenja


Na primjer 7%2=1 jer je 7 podijeljeno s 2
jednako 3, a ostatak je jedan.

Matematike funkcije
Osnovne koje na poetku treba znati:
Opis funkcije

Zapisivanje

Drugi korijen pozitivnog


broja

sqrt(x)

Potenciranje (xy)

pow(x,y)

Funkcije se nalaze u biblioteci funkcija math.h pa je na poetku programa potrebno napisati naredbu
#include <math.h>

Varijable
Varijable u programu su promjenjive veliine. Mogu biti:
- brojane (cijeli ili decimalni broj)
- znakovne
Najbolje je da se svaka varijabla koja se koristi u programu deklaira na poetku programa, ali u C++ se
moe deklarirati bilo gdje u programu. . Deklaracija se sastoji od tipa podatka i jednog ili vie imena
varijabli.Osim deklaracije ponekad je varijable potrebno i inicijalizirani tj. postaviti na poetnu vrijednost,
najee je to 0, ali moe biti i 1 (na primjer kod mnoenja brojeva). Ako se varijabla u ne postavi na

Programiranje C++

poetnu vrijednost ona e biti nepredvidiva tj. poetna vrijednost moe biti bilo koji broj pa e program
krivo raditi (raunati).

Imena varijabli
Sva imena varijabli trebaju zapoinjati slovom engleskog alfabeta ili podvlakom _. za ostatak imena
koriste se slova ili brojevi. Znakovi interpunkcije, odnosno kontrolni znakovi se ne smiju koristiti. Za
prepoznavanje imena varijabli bitna su prva 32 znaka. Broj znakova iznad 32 se zanemaruje. Postoje
razlike izmeu malih i velikih slova tj. program ih prepoznaje kao razliite znakove u imenima varijabli.
Primjeri deklaracija varijabli:
int

broj;

/*cjelobrojna varijabla*/

char znak;

/*znakovna varijabla*/

float temp;

/*decimalna varijabla*/

Varijabla broj deklarirana je kao cijeli broj. Varijabla znak deklarirana je kao znak tj. ona moe biti bilo
koje slovo ili broj, ali brojevi koji su deklarirani kao znak ne mogu se oduzimati, zbrajati, mnoiti i dijeliti
niti nad njima mogu vriti bilo koje matematike operacije.
Varijabla temp deklarirana je kao decimalni broj.

Konstante
Konstante imaju tokom programa odreenu vrijednost koja se ne moe promijeniti. Kljuna rije u
deklariranje i inicijalizaciju konstante je const iza koje slijedi tip konstante i njezina vrijednost.
Primjeri konstanti:

const float pi=3.14159;


const int a=8;
Pravila koja vrijede za odreivanje imena varijabli vrijede i za imena konstanti.

Naredba cin

Programiranje C++

Naredbom cin unosimo podatke s tastature i pridruujemo ih varijablama u programu. Varijable kojima
elimo pridruiti vrijednosti zapisujemo iza naredbe cin.
Na primjer, naredbom cin>>a uz pomo tastature, pridruujemo varijabli a broj ili slovo, a naredbomcin
>>a>>bpridruujemo vrijednosti varijablama a i b.
Vana napomena: Varijable prethodno trebamo deklarirati.

Naredba cout
Naredbom cout ispisujemo tekst, vrijednosti matematikih izraza i vrijednosti varijabli u
programu. Tekst koji elimo ispisati navodimo unutar navodnika,a varijable ije vrijednosti
elimo ispisati piemo iza naredbe. Na primjer, naredbom
cout<<"Pozdrav";
ispisuje se pozdravna poruka Pozdrav na zaslonu raunala, a naredbom
cout <<2+2;
ispisuje se broj 4 jer je to vrijednost matematikog izraza 2+2.
Vrijednosti varijabli ispisujemo tako da ih navodimo iza naredbe cout. Na primjer
cout<< a;
ispisuje na ekranu raunara vrijednost varijable a.

Formatirani upis i ispis


Upoznali smo naredbe za upis i ispis cin i cout. One ne zahtijevaju nikakvu posebnu naznaku po kojem
e se formatu vriti unos i ispis podataka i koriste se u sluajevima kada nam format zapisa nije vaan.
Meutim postoje situacije kada moramo navoditi format zapisa , na primjer u radu s datoteka pa emo u
nastavku pokazati koje se naredbe koriste za formatirani upis i ispis podatak u C++.

Funkcija ulaza - scanf


Funkcija koja je zaduena za spremanje podataka u odreene varijable zove se scanf. Ona se moe
koristiti za razliite tipove podataka koji se na razliite naine spremaju u memoriju. Zbog toga je
potrebno funkciji scanf opisati koji tip podataka elimo itati. Opi oblik funkcije scanf je:
scanf ("opis_formata",[adresa, adresa..]);
U programu to piemo ovako: scanf ("%d", &a);
opis_formata sainjava niz znakova koji sadre jedan ili vie opisanih formata. Opis formata se sastoji
od oznake postotka (%) iza kojeg slijedi slovo, koje opisuje tip podatka koji se upotrebljava. Jedan ili vie

Programiranje C++

opisa formata je smjeteno izmeu dvostrukih navodnika, a najee koriteni opisi formata nalaze se u
priloenoj tablici.
Funkcija

scanf

printf

char

%c

%c

int

%d

%d

float (decimalni)

%f

%f

float (eksponencijalni)

%e

%e

string (niz znakova)

%s

%s

unsigned

%u

%u

long int

%ld

%ld

double

%lf

%lf

long double

%Lf

%Lf

Slijedei neophodni dio funkcije scanf je adresa na koju e podaci biti spremljeni. Potrebno je
napomenuti da je potrebno navesti adresu varijable pomou znaka &. Svaka varijabla u C++u ima
specifinu adresu u memoriji.Potrebno je voditi rauna da se ova funkcija koristi za definirani oblik i tip
podatka koji je potrebno unijeti. Meutim, ako ulazni podatak ne odgovara ulaznom formatu, ponaanje
funkcije je nepredvidivo to rezultira pogrenim izvoenjem programa.
Stoga je vano da vodite rauna o pravilnom zapisivanju opisa formata kojeg koristite.

Funkcija izlaza - printf


Suprotnost funkciji scanf, koja daje vrijednost varijabli, je funkcija printf, koja pokazuje vrijednost
varijabli na ekranu. Poziv funkcije printf izgleda:
printf ("opis_formata",varijabla,varijabla,...);
U programu to piemo: printf("Rezultat je %d", a);
opis_formata moe opcionalno sadravat tekst koji e se ispisati. Ukoliko prikazujete vrijednost jedne ili
vie varijabli, potrebno je na odgovarajue mjesto upisati opis formata pretvorbe za svaku varijablu.
Opisi formata za funkciju scanf su isti kao za funkciju printf.
Postoji nekoliko znakova koji kontroliraju kako se tekst prikazuje na ekranu, a funkcija printf omoguava
da se bilo koji od tih znakova ispie na ekranu.

Sekvenca

Ime

Znaenje

\a

Alert

Aktiviranje zujala

Programiranje C++
\b

Backspace

Vraanje unatrag jedan znak

\f

Formated

Start nove strane ili ekrana

\n

Newline

Pomicanje u novu liniju

\r

Carriage ret

Povratak na poetak linije

\t

Horizontal tab

Pomicanje na narednu tab poziciju

\v

Vertical tab

Pomicanje prema dolje

\\

Backslash

Prikazivanje kose crte

\'

Single quote

Prikazivanje jednostrukog navodnika

\''

Double quote

Prikazivanje dvostrukih navodnika

\?

Question mark

Prikazivanje znaka pitanja

\OOO

Prikazivanje znakova sa oktalno zadanim ASCII kodom

\xHHH

Prikazivanje znakova sa heksadecimalno zadanim ASCII


kodom

Opirnije o naredbama scanf i printf


U naredbi scanf i printf se moe pisati vie formata zapisa zajedno to znai da unosimo i ispisujemo
vie vrijednosti varijabli istovremeno.
Formati zapisa, u naredbi scanf se mogu odvojiti razmakom ili zarezom to uvjetuje i nain upisa (na
primjer s razmakom unosimo 2 3 , a zarezom 2,3)
Primjer 1: Unesi dva cijela broja i ispisi njihov zbir.
(Napomena: za unos i ispis koristi funkciju scanf i printf tako da se brojevi unose s razmakom, npr: 2 3)
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
printf("\nUnesi dva broja= ");
scanf("%d %d",&a,&b);
c=a+b;
printf ("\n Zbroj brojeva %d %d je zbir %d ",a,b,c);
system ("PAUSE");
return 0;
}
Izlaz:
Unesi dva broja= 10
5
Zbroj brojeva 10 5 je zbir 15 Press any key to continue . . .

Primjer 2: Unesi dva cijela broja i ispisi njihovu razliku.


(Napomena: za unos i ispis koristi funkciju scanf i printf tako da se brojevi unose s zarezom npr: 2,3)
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
printf("\nUnesi dva broja= ");
scanf("%d,%d",&a,&b);

Programiranje C++

c=a-b;
printf ("\n Zbroj brojeva %d %d Razlika je %d ",a,b,c);
system ("PAUSE");
return 0;
}
Izlaz:
Unesi dva broja= 10 5
Zbroj brojeva 10 5 Razlika je 5
Press any key to continue . . .
Objanjenje:
Broj mjesta rezerviran za ispis detaljnije se regulira brojem ispred formata.
Na primjer za ispis cijelih brojeva moemo napisati:
printf ("\n Zbroj brojeva %3d %2d je %4d ",a,b,c); gdje stoji da e za prvi broj u ispisu biti rezervirana 3
mjesta za drugi 2 za rezultat zbrajanja 4 mjesta.
Za ispis decimalnih brojeva moemo napisati:
printf ("\n Zbroj brojeva %.4f %.2f je %.3f ",a,b,c);
gdje %f znai da se radi o decimalnim brojevima, .4 oznaava da e za ispis decimalnog dijela prvog
broja biti rezervirana 4 mjesta, za decimalni dio drugog 2, a za decimalni dio treeg broja 3 mjesta.

Operatori inkrement i dekrement


Operator inkrement oznaava UVEAVANJE varijable za 1, a dekrement UMANJENJE za 1.
Tako na primjer x=x+1 moemo zapisati kao x++ ili ++x.
Ako je x=1 onda e nakon izvravanja svake od sljedeih naredbi
x++
++x
x poprimiti vrijednost 2.
Meutim u matematikom izrazu vrlo je vano na kojem mjestu piemo inkrement jer on utjee na
konaan rezultat. Pogledajmo primjer
Neka je x=5
Napiemo li u programu: y=++x to znai da e se prvo x uveati za jedan a zatim pridruiti varijabli y.
Rezultat je: x=6 i y=6
Ako napiemo y=x++, tada se prvo x pridrui varijabli y pa se x -u doda jedan. Rezultat je: y=5, x=6.
Isto vrijedi i za operaciju dekrement.

Relacijski operatori
Raunala u svom radu upotrebljavaju jednostavnu logiku sa dvije vrijednosti; ukoliko je uvjet istinit (true),
vrijednost je 1; ukoliko je laan (false), vrijednost je 0. Relacijski operatori prikazani su u slijedeoj tablici:
Operator

Znaenje

Primjer

>

vei od

5>4

>=

vei od ili jednak

5>=x

Programiranje C++
<

manji od

4<5

<=

manji od ili jednak

x<=5

==

jednak

5==5

!=

nije jednak

5!=4

Logiki operatori
Mogue je u testu kombinirati vie od jednog uvjeta. To postiemo upotrebom jednog od tri logika
operatora prikazana u slijedeoj tablici:
Operator

Znaenje

&&

I (AND), svi uvjeti moraju biti istiniti da


rezultat uvjeta bio istinit

||

ILI (OR), najmanje jedan od uvjeta


mora biti istinit da bi rezultat uveta bio
istinit

NE (NOT), negacija uvjeta

Primjer 1:
(a==c)&&(a>d)
rezultat je istinit samo ukoliko je a jednak c i a vei od d. Programski jezik C radi tako da ukoliko je prvi
uvjet (sa lijeve strane) laan, drugi uvjet se nee testirati, jer je I izraz laan, ukoliko je jedan od uvjeta
laan.
Primjer 2:
(a==c)||(a>d)
rezultat je istinit ukoliko je bilo koji od uvjeta istinit. Ukoliko je prvi uvjet istinit, nije potrebno daljnje
testiranje, rezultat je svakako istini

If i if..else naredbe
Jednostavna if naredba ima oblik:
if (uslov){
naredba ili blok naredbi;
}
Uslov moe biti jednostavan relacijski izraz ili kombinacija izraza spojenih s logikim operatorima. Izraz
mora biti unutar okruglih zagrada. Naredba if radi tako da se ispita uvjet i u skladu sa istinitom ili lanom
vrijednou uvjetnog izraza izvravaju naredbe. Ukoliko je izraz istinit, naredba ili blok naredbi , koje
slijede, se izvravaju. Ukoliko elimo koristiti blok naredbi, one moraju biti zatvorene unutar vitiastih
zagrada.

Programiranje C++

10

Viestruki izbor pomou if ....else


Ovaj oblik izbora ima slijedei oblik:
if (uslov){
naredba ili blok naredbi;
}
else{
alternativna naredba ili blok naredbi;
}
Izjave if...else je mogue ugraivati jednu u drugu. U sljedeem opem primjeru zelena petlja je
ugraena u plavu.
if (uslov 1){
naredba ili blok naredbi;
}
else{
if (uslov 2){
naredba ili blok naredbi;
}
else{
alternativna naredba ili blok naredbi;
}
}
ili
if (uslov 1){
if (uslov 2){
naredba ili blok naredbi;
}
else{
alternativna naredba ili blok naredbi;
}
}
else{

Programiranje C++

11

naredba ili blok naredbi;


}

Testiranje viestrukih izbora: switch


Dugaka serija if i else naredbi se moe zamijeniti naredbom za izbor-switch. U slijedeem
primjeru prikazan je izbor jedne opcije iz menija. Kod praktinog pisanja, esto je potrebno na taj nain
odrediti akciju programa.
-Iskaz continue skae(vraa) na vrh petlje.
Opta forma naredbe switch je:
switch (vrijednost)
{
case vrijednost: naredba ili blok naredbi
.......
default: naredba ili blok naredbi
}
Varijabla vrijednost se na poetku usporeuje sa vrijednou prve case izjave. Ukoliko su iste, izvrava
se program iza dvotoke do kraja switch naredbe ili dok se ne doe do specijalne izjave break. Ukoliko
vrijednost nije ista sa prvom case izjavom, testira se vrijednost slijedee case naredbe tako do
posljednje case naredbe. Ukoliko niti jedna vrijednost nije ista kao vrijednost switch izjave, izvrava se
program iza default naredbe. Naredba default je opcionalna, te ukoliko se ne napie, u sluaju da niti
jedna vrijednost nije zadovoljena, ne izvrava se ni jedna izjava unutar switch naredbe.
Unutar naredbe switch, na kraju case moe se nalaziti naredba break. Ona uvjetuje skok na kraj
switch naredbe. Ukoliko postoji, program se nastavlja izvravati do kraja switch naredbe ili do izjave
break.

Programiranje C++

12

-Iskaz break trenutno izlazi iz petlje

Ponavljanje izvravanja naredbi pomou petlji


Naredbe if, if-else i swich izvravaju uslov i naredbe samo jednom.
est je sluaj u praksi da naredbe moramo izvriti vie od jednog puta, kao na primjer u sluaju
uitavanja ili ispisa vee koliine podataka. Za sluaj kada istu naredbu ponavljamo vie puta koristimo
petlje.
Petlje oznaavaju naredbu ili niz naredbi koje e se izvravati vie puta za redom, dok se ne ispuni neki,
unaprijed zadan uvjet.
U C-u i C++u koriste se tri petlje: for, while i do-while.

Petlja -For
Programsku petlju for u C++-u zapisujemo na sljedei nain:
for (inicijalizacija kontrolne varijable; USLOV; promjena vrijednosti kontrolne varijable)
{
blok naredbi;
}
Objanjenje:
Inicijalizacija kontrolne varijable podrazumijeva postavljanje poetne vrijednosti.
Poetna vrijednost je UVIJEK broj koji se pridruuje varijabli petlje. Najee poetna vrijednost iznosi 1,
ali moe imati i drugu vrijednost 100, 200, ili bilo koji drugi broj.

Programiranje C++

13

Uvjet podrazumijeva postavljanje uvjeta izvravanja petlje. Ako je uvjet zadovoljen, naredbe unutar petlje
e se izvriti. Ako uvjet nije zadovoljen (ispunjen) petlja e se zavriti i program e nastaviti sa svojim
izvoenjem s prvom prvom naredbom izvan petlje.
Kontrolna varijabla , kontrolira izvoenje petlje i svaki put kad se naredbe unutar petlje izvedu, ona
promijeni svoju vrijednost. Njezina uloga, najee je da "broji" koliko se puta petlja izvela pa korak
promjene kontrolne varijable najee iznosi 1. Meutim, postoje programske situacije u kojima korak,
odnosno promjena kontrolne varijable moe iznositi 2 ili 3. Openito promjena kontrolne varijable moe
biti bilo koji cijeli broj.

Petlja While
Petlja while izvrava jednu ili vie naredbi, sve dok je zadani uvjet istinit.
While naredbu piemo:
while (uslov)
{
blok naredbi;
}
Kod petlje while se moe dogoditi da se naredbe unutar petlje ne izvre niti jednom; ako uvjet nije
zadovoljen.
Kod petlje do-while, ne postoji takav sluaj, odnosno naredbe se uvijek bar jednom izvedu.

Petlja Do-While
Za razliku od while petlje ova petlja se izvede bar jednom jer se uslov ispituje na njezinom kraju.
Naredbe unutar petlje se izvravaju dok je uvjet istinit (dok ne postane laan). Kada uvjet postane laan
zavrava se petlja i program se nastavlja izvoenjem prve naredbe iza zagrade petlje.
Naredba se zapisuje na sljedei nain:
do{
blok naredbi;
} while (uvjet);

Programiranje C++

14

Obratite panju da se toka-zarez koja oznaava kraj naredbe zapisuje iza while uvjeta.

Funkcije
Funkcije su cjelovite skupine naredbi koje izvravanjem ispunjavaju odreene zahtjeve.
Omoguavaju ralanjivanje problema na jednostavnije - manje cjeline, ime doprinose boljoj
preglednost izvornog koda i jednostavnijem rjeenjem.
Funkcija se definie na slijedei nain:
tip_funkcije ime_funkcije(najava liste_argumenata)
{
najava lokalnih varijabli;
naredbe;
return izlazna_vrijednost;
}
gdje je:
- tip_funkcije odreuje tip vrijednosti koju pozvana funkcija vraa u nadreenu funkciju,
a moe biti bilo koji od osnovnih tipova podataka (int, char, float, double, void),
- ime_funkcije je identifikator preko kojeg se funkcija poziva, dok je
- lista_argumenata lista formalnih parametara sa pripadajuim tipovima preko kojih se niz podataka iz
nadreene funkcije prenose u pozvanu funkciju.
Funkcija u glavni program vraa jednu ili niti jednu vrijednost ovisno o tipu funkcije.
Za prijenos vrijednosti u nadreeni program koristi se naredba return;.
Funkcija se poziva na slijedei nain: ime_funkcije(stvarna lista_argumenata);
Funkcije se mogu pozivati u izrazima, petljama, ili kao argumenti u pozivima drugih funkcija. Svaka
koritena funkcija se mora najaviti prije poziva.

-Prototipovi funkcije
Prototip funkcije je iskaz, to znai da zavrava znakom taka-zarez. On se sastoji od povratnog tipa
funkcije, imena i liste parametara.
Primjer:
usigned short int FindArea (int length , int width) ;
povratni tip

ime

parametri (int tip parametra , a length i width imena parametara).

Prototip funkcije i definicija funkcije se moraju potpuno slagati po povratnom tipu , imenu i listi
parametara.
#include<iostream.h>
using namespace std;
int Povrsina(int duzina,int sirina);
int main()
{
int duzina;
int sirina;
int p;
cout<<"duzina=";
cin>>duzina;
cout<<"sirina=";
cin>>sirina;
p=Povrsina(duzina,sirina);

Programiranje C++

15

cout<<"Povrsina p=";
cout<<p;
cout<<" kvadratnih metara\n\n";
system("pause");
return 0;
}
int Povrsina(int d,int s)
{
return d*s;
cout<<endl;
}
Izlaz:
duzina=10
sirina=5
Povrsina p=50 kvadratnih metara
Press any key to continue . . .

-Lokalne promjenjive
Moete ne samo predati promjenjive funkciji , nego i deklarisati promjenjive unutar funkcije .Za to se
koriste lokalne promjenjive, koje su tako nazvane jer postoje samo lokalno unutar same funkcije.Po
pvratku iz funkcije one nisu vie raspoloive. U C++promjenjive moete definisati bilo gde unutar funkcije
, ne samo na njenom vrhu.Opseg promjenjive je blok u kojem je ona definisana.
Promenljive sa lokalnim opsegom vaznosti( krace receno lokalne promenljive) su vidljive samo unutar
jednog bloka naredbi( telo funkcije, telo petlje) u kojem su definisane.

-Globalne promjenjive
Promjenjive koje su definisane izvan svake funkcije imaju globalni opseg , pa su zbog toga raspoloive u
svakoj funkciji u programu, ukljuujui main().

-Argumenti funkcije
Za svaki argument treba posebno navesti njegov tip, a broj argumenata nije ogranicen i ne moraju svi
argumeti funkcije biti istog tipa. Argumenti koji se predaju funkciji su za nju lokalni .Promjene izvrene na
argumentima ne utiu na vrednosti u pozivajuoj funkciji . Ovo je poznato kao predavanje po vrednosti ,
to znai da se u funkciji pravi lokalna kopija svakog argumenta.
Vidimo da vrijednost originalne varijable ostaje nepromjenjena iako ju funkcija mjenja u 0. To je zato to
funkcija zapravo mjenja vrijednost njene kopije, a ne i same varijable.

Programiranje C++

16

-Povratne vrednosti
Funkcije vraaju vrednost , ili void. Void je signal kompajleru da nikakva vrednost nee biti vraena. Da
biste vratili vrednost iz funkcije , napiete kljunu re return- za njom sledi vrednost koju elite da vratite.
Sama vrednost e ,moda , biti izraz koji vraa vrednost.

-Podrazumevani parametri
Za svaki parametar koji deklariete u prototipu i definiciji funkcije pozivajua funkcija mora predati
vrednost.Predata vrednost mora biti deklarisanog tipa . Ako imate funkciju deklarisanu kao funkciju

long myFunction(int);-ona mora prihvatiti celobrojnu promenjivu.

Preklapajue funkcije
C++ omoguava da kreirate vie od jedne funkcije sa istim imenom.Ovo se naziva preklapanje funkcije.
Funkcije se moraju razlikovati po svojim listama parametara , razliitim tipom parametara , razliitim
brojem parametara, ili jednim i drugim.
Primjer:
int myFunction (int,int);
int myFunction (long,long);
int myFunction (long);
Preklapanje funkcije se naziva i funkcijski polimorfizam. Poly znai vie , a morph znai
forma.Funkcijski polimorfizam se odnosi na sposobnost da se funkcija optereti vie od jednog znaenja.

-Inline funkcija
Kada definiete funkciju , kompajler, normalno, kreira samo jedan skup instrukcija u memoriji.Kada
pozovete funkciju, izvrenje programa skae na te instrukcije , a po povratku iz funkcije, ono se vraa
na sledeu liniju u pozivajuu funkciju .Ako pozovete 10 puta, program skae na isti skup instrukcija
svaki put. Ovo znai da postoji samo jedna kopija funkcije, a ne 10.
Ako je funkcija deklarisana kljunom reju inline , kompajler ne kreira pravu funkciju: on kopira kod iz
inline funkcije , direktno u pozivajuu funkciju . Ne obavlja se nikakav skok, a to je kao da ste napisali
iskaze u pozivajuoj funkciji.

-Rekurzija
Funkcija moe pozvati samu sebe i to se naziva rekurzija. Rekurzija moe biti direktna ili indirektna.
Direktna je kada funkcija poziva samu sebe . Indirektna je kada funkcija poziva drugu funkciju, koja ,
onda, poziva prvu funkciju. Vano je uoiti da se, kada funkcija poziva samu sebe , izvrava njena nova
kopija. Da bismo ilustrovali reavanje problema korienjem rekurzije razmotrite Fibonaccievu seriju:
1,1,2,3,5,8,13,21,34....
Prva dva broja su 1.Svaki broj ,posle drugog, predstavlja zbir dva broja pre njega. Uopteno govorei , nti broj je zbir n-2 i n-1, sve dok je n:2.Rekurzivne funkcije treba da zaustave uslov. U Fibonaccievvoj seriji
n<3 je uslov za zaustavljanje.

Polja ili nizovi


Nizovi su skupine podataka koji predstavljaju jednu cjelinu. Niz ima svoje ime, tip i veliinu tj. Zauzima
odreeni prostor u memoriji raunala. Niz se sastoji od lanova niza koji imaju svoju vrijednost i mjesto.
Nizove u procesu programiranju koristimo kada elimo raditi s vie podataka koji su organizirani u retke i

Programiranje C++

17

stupce, istog su tima i imena. Meusobno se razlikuju po svom mjestu i svojoj vrijednosti. Stoga ih je
lake premjetati, sortirati i s njima vriti razliite raunske operacije.
Nizovi mogu sadravati:
- brojeve (cijele ili decimalne)
- znakove (slova i posebne znakove)
Ovisno o tome razlikujemo numerike i znakovne nizove. U definiranom nizu, svi podaci moraju biti istog
tipa. Nije mogue u istom nizu mijeati brojeve i znakove. Svaki lan u nizu ima svoje mjesto. To mjesto
zovemo INDEKS. Osim mjesta, lan niza ima i svoju vrijednost.
Na primjer: Ako kaemo da elimo definirati niz imena A koji e imati 7 lanova i iji e lanovi biti cijeli
brojevi, onda emo u programskom to napisati ovako: int A[7].
Grafiki prikazano to izgleda ovako :
A[0]

A[1]

A[2]

A[3]

A[4]

A[5]

A[6]

34

56

Vidimo da svaki lan niza ima svoje mjesto (indeks) i vrijednost. Indeksi idu od 0-6 i zapisani su unutar
uglatih zagrada.
Tako na primjer vrijednost prvog lana niza A[0] iznosi 2, drugog ,A[1], iznosi 3 itd. Uoimo da lanovi
niza idu od 0-N-1 gdje je N broj koji govori koliko ima lanova niza.
Postoje jednodimenzionalni, dvodimenzionalni i viedimenzionalni nizovi.

Jednodimenzionalni nizovi
Niz je kolekcija lokacija za smjetanje podataka , od kojih svaka sadri isti tip podataka.Sve te lokacije
nazivaju se elementi niza.
Jednodimenzionalni nizovi imaju samo jedan niz podataka. Na primjer niz A prikazan u tablici ima 7
lanova. Svi lanovi su cijeli brojevi i nalaze se poredani su jedan iza drugoga (u nizu).
A[0]
A[1]
A[2]
A[3]
A[4]
A[5]
A[6]
34

21

76

Kako bi program mogao raditi s nizom, na poetku programa potrebno je rezervirati memoriju u
raunalu. To se radi naredbom za deklaraciju koja se openito zapisuje:
tip_niza naziv_niza [dimenzije] ;
Na primjer sljedee deklaracije oznaavaju:
int a[10] da je deklariran niz cijelih brojeva koji se zove a i ima ukupno 10 lanova, a indeksi idu od 0
do 9
float X[8] da je deklariran niz decimalnih brojeva koji se zove X i ima ukupno 8 lanova , a indeksi idu
od 0 do 7
char b[30] - da je deklariran niz od 30 znakova

Programiranje C++

18

Vano je uvijek rezervirati vie prostora nego to e se u programu koristiti jer e inae program nee
raditi ispravno. Na primjer ako deklariramo da emo koristiti niz od 10 lanova, a unesemo 20 program
nee moi prihvatiti preostalih 10 lanova niza te nee moi ispravno raditi.
Niz se moe zadati unutar programa ili unosom s tipkovnice (naredbom cin ili scanf). Ako se vrijednosti
lanova niza zadaju unutar programa navode se unutar vitiastih zagrada npr: naredbom
A[6]={2,34,1,67,99,7}; je zadan niz A kojeg ini 6 cijelih brojeva.
Kada se vrijednosti lanova niza unose preko tipkovnice (naredbom cin) koristi se petlja for. Petljom for
unose se jedna po jedan lan niza, poveavanjem kontrolne varijable za jedan. U nastavku je dio
programskog koda koji pokazuje unos lanova niza pomou petlje for.
for (i=0;i<N;i++) {
cin>>X[i];
}
Za ispis lanova niza takoer se koristi petlja for:
for (i=0;i<N;i++) {
cout>>X[i];
}

Dvodimenzionalni nizovi
Karakteristika dvodimenzionalnih nizova je da imaju vie redaka i stupaca.Tablicom u nastavku
predstavljen je cjelobrojni niz naziva A.
1. stupac

2. stupac

3. stupac

4.stupac

1. redak

2. redak

itajui tablicu, lanovi niza su sljedei:


A[0,0] = 2
A[0,1] = 4
A[0,2] = 5
A[0,3] = 6
A[1,0] = 0
A[1,1] = 3
A[1,2] = 9
A[1,3] = 7
Prvi broj unutar uglatih zagrada je redak, a drugi stupac.
Ako lanove niza zadajemo u programu onda to za, prethodno tablicom prikazani niz, zapisujemo ovako:
int A[2][4]={{2,4,5,6},{0,3,9,7}};

Programiranje C++

19

gdje prvi broj oznaava broj redaka, a drugi broj stupaca.Kao i kod jednodimenzionalnih nizova prvi
redak i stupac imaju redni broj (index) 0.
Dvodimenzionalni niz, se primjerice u praksi koristi za rjeavanje problema sortiranja niza (od najveeg
do najmanjeg ili od najmanjeg do najveeg). U nastavku je primjer sortiranja niza koritenjem
jednodimenzionalnog niza.
Pokuajte rijeiti isti zadatak koritenjem dvodimenzionalnog niza.

OBJANJENJE:
47

78

17

53

61

A[0]

A[1]

A[2]

A[3]

A[4]

Za i=0, j e poprimiti vrijednosti 1,2,3 i 4, to znai da e se element niza A[0] usporeivati s ostalim
elementima. Svaki put kad neki drugi element bude manji id elementa A[0], doi e do zamjene
vrijednosti.

A[0]>A[1]
47>78

A[0]>A[2]
47>17

Nejednakost ne
vrijedi pa ne treba
nita raditi

Nejednakost vrijedi
pa se zamijene
vrijednosti sada je

Programiranje C++

20

A[0]=17, A[2]=47

A[0]>A[3]

Nejednakost ne
vrijedi pa ne treba
nita raditi

17>53

A[0]>A[4]

Nejednakost ne
vrijedi pa ne treba
nita raditi

17>61

Nakon prvog prolaza na prvom mjestu u nizu nalazi se najmanji element. Niz sada izgleda:

17

78

47

53

61

A[0]

A[1]

A[2]

A[3]

A[4]

Sad od preostalih elementa (od mjesta 1 do 4) traimo najmanji:

A[1]>A[2]
78>47

A[1]>A[3]
47>53

A[1]>A[4]
47>61

Nejednakost vrijedi
pa se zamijene
vrijednosti sada je
A[1]=47, A[2]=78

Nejednakost ne
vrijedi pa ne treba
nita raditi

Nejednakost ne
vrijedi pa ne treba
nita raditi

Programiranje C++

21

Nakon drugog prolaza niz izgleda:

17

47

78

53

61

A[0]

A[1]

A[2]

A[3]

A[4]

A[2]>A[3]

Nejednakost vrijedi
pa se zamijene
vrijednosti sada je
A[2]=53, A[3]=78

78>53

A[2]>A[4]

Nejednakost ne
vrijedi pa ne treba
nita raditi

53>61

Sada niz izgleda ovako:

17

47

53

78

61

A[0]

A[1]

A[2]

A[3]

A[4]

A[3]>A[4]
78>61

Nejednakost vrijedi
pa se zamijene
vrijednosti sada je
A[3]=61, A[4]=78

Petlje su zavrene, a samim tim i postupak sortiranja, niz koji e biti ispisan izgleda:

Programiranje C++

17

47

53

61

78

A[0]

A[1]

A[2]

A[3]

A[4]

22

Sortiranje je zavreno!

Nizovi znakova
Za rad s nizom znakova moemo koristiti tip string ili char. Tip string se koristi u sluaju ako radimo s
rijeima ili reenicama, dok tip char radi samo s jednim znakom. DEfiniramo li polje ili niz znakova tipa
char, takoer emo moi raditi s rijeima ili reenicama.
Pri rad s tipom string na poetku programa potrebno je izvriti deklaraciju varijabli naredbom;
string ime_varijable;
Budui da varijabla string prilikom unosa unese znakove jedne rijei, postoji posebna naredba za unos
cijele reenice:
getline(cin, ime_varijable);

Primjer 1: Unesi i ispii svoje ime.


#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main()
{

Programiranje C++

23

string ime;
/*deklaracija stringa (niza znakova)*/
cout <<"Unesi svoje ime =";
cin >> ime;
cout <<"Tvoje ime je "<<ime;
cout<<"\n";
/*prelazak u novi red*/
system ("PAUSE");
return 0;
}
Izlaz:
Unesi svoje ime =MARKO
Tvoje ime je MARKO
Press any key to continue . . .

Primjer 2: Unesi reenicu " Danas uim programiranje u C++." te ju nakon unosa ispii na monitoru
raunala.
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string recenica;
/*deklaracija stringa (niza znakova) za varijablu recenica*/
cout <<"Unesi recenicu = ";
getline(cin,recenica);
/*unos reenice pomou naredbe getline*/
cout <<recenica;
cout<<"\n";
system ("PAUSE");
return 0;
}
Izlaz:
Unesi recenicu = Danas ucim programiranje u C++
Danas ucim programiranje u C++
Press any key to continue . . .

Programiranje C++

24

Niz znakova moemo i definiramo kao jednodimenzionalni nizi iji su elementi znakovi (char).
Znakovni niz se deklarira kao i svaki jednodimenzionalni niz, navoenjem tipa char, imena niza i njegove
duljine.
Kod odreivanja duljine niza znakova treba voditi rauna o tome da niz znakova zavrava nul znakom
(\0) koji zauzima jedno mjesto niza.
Niz se inicijalizira tako da se njegov sadraj navodi unutar dvostrukih navodnika ( " " ).
Za uitavanje i ispis znakovnih nizova mogu se koristiti standardni naini uitavanja i ispisivanja
elemenata jednodimenzionalnog niza
(cout , cin , printf(), scanf() u kombinaciji s petljom for).
Osim ovog naina mogu se koristiti i funkcije:
- gets() - koja omoguuje unoenje niza znakova sa standardnog ulaza.
- puts() - koja omoguava ispis niza znakova na standardni izlaz.
(Obje funkcije nalaze u biblioteci stdio.h)

Primjer 1: Napii program kojim se unosi niz znakova i ispisuje duljina uitanog niza.
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main()
{
char a[80];
int i=0;
printf("upisite niz znakova: ");
gets(a);
while (a[i+1]!='\0')
i++;
printf("upisali ste niz: ");
puts(a);
printf("Duljina mu je %d znakova",i+1);
system ("PAUSE");
return 0;
}
Izlaz:
upisite niz znakova: Maja je student

Programiranje C++

25

upisali ste niz: Maja je student


Duljina mu je 15 znakova
Press any key to continue . . .

Strukture
Struktura je kombinacija skupa istih ili razliitih tipova podataka koje formira sam korisnik, prema
vlastitim potrebama.
U C++u se struktura openito zapisuje:
struct ime_strukture
{
najava lanova strukture;
};
gdje je struct kljuna rije koja oznaava poetak najave strukture, ime_strukture koju najavljujemo, a
unutar vitiastih zagrada navodimo sve alnove(varijable) koje elimo kreirati strukturom.
Varijable strukture mogu se navesti :
a) odmah iza strukture
struct ime_strukture
{

Programiranje C++

26

najava lanova strukture;


} lista strukturnih varijabli;
- ili u posebnoj naredbi iji je oblik
struct ime_strukture lista_strukturnih_varijabli;
lanovima strukturne varijable pristupa se preko imena strukturne varijable i strukturne toke (.)
operatora.
U nastavku je primjer programa u kojem se unose podaci za: ime, prezime, matini broj, prosjek i datum
roenja za sve uenike jednog razreda (najvie 40). Nakon unosa svih podataka trai se uenik s
najboljim prosjekom te se na kraju programa na zaslonu raunala ispisuju svi podaci za uenika koji ima
najbolji prosjek.
Objanjenje: U programu su definirane dvije strukture: datum i ucenik. Struktura datum slui za unos
datuma roenja uenika i sastoji se od dana, mjeseca i godine roenja. Druga struktura se zove ucenik i
sadri 2 niza znakova (za ime i prezime), matini broj i prosjek ocjena. Niz (polje) razred se sastoji od
struktura tipa uenik.

Na primjer poziv za ispis varijable razred[0].rodjendan.godina e dati za ispis godine roenja za 1. uenika, a
razred[1].prosjek e dati ispis prosjeka za 2. uenika.
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
struct datum
{
int dan;
int mjesec;
int godina;
};
struct ucenik
{
char ime[15];
char prezime[15];
int maticni;
float prosjek;
struct datum rodjendan;
}razred[40];
/*polje razred iji su lanovi strukture tipa ucenik*/
int main()
{
int n,i,k;
float max;
cout<<"\nKoliko ima ucenika? ";
cin>>n;
if (n>40)
cout<<"Broj ucenika ne moze biti >40";
else
{
for(i=0;i<n;i++)
/*unos podataka za pojedinog uenika u polje razred*/
{
cout<<"\nIme: ";

Programiranje C++

27

cin>>razred[i].ime;
cout<<"\nPrezime: ";
cin>>razred[i].prezime;
cout<<"\nMaticni u imeniku: ";
cin>>razred[i].maticni;
cout<<"\nProsjek: ";
cin>>razred[i].prosjek;
cout<<"\nRodjen dan: ";
cin>>razred[i].rodjendan.dan;
cout<<"\nRodjen mjesec: ";
cin>>razred[i].rodjendan.mjesec;
cout<<"\nRodjen godina: ";
cin>>razred[i].rodjendan.godina;
}
max=razred[0].prosjek; /*odreivanje najboljeg prosjeka*/
k=0;
for(i=0;i<n;i++)
if (max<razred[i].prosjek)
{
max=razred[i].prosjek;
k=i;
}
/*ispis najboljeg*/
cout<<"\nNajbolji je "<<razred[k].ime<<" " <<razred[k].prezime;
cout<<"\nMaticni broj "<<razred[k].maticni;
cout<<"\nRodjen "<<razred[k].rodjendan.dan<<razred[k].rodjendan.mjesec<< razred[k].rodjendan.godina;
cout<<"\nS prosjekom "<<razred[k].prosjek;
}
system ("PAUSE");
return 0;
}

Izlaz:
Koliko ima ucenika? 2
Ime: mladen
Prezime: milkovi
Maticni u imeniku: 1011
Prosjek: 6
Rodjen dan: 10
Rodjen mjesec: 12
Rodjen godina: 1989
Ime: maja
Prezime: milkovi
Maticni u imeniku: 1010
Prosjek: 8.5

Programiranje C++

28

Rodjen dan: 10
Rodjen mjesec: 12
Rodjen godina: 1989
Najbolji je maja milkovi
Maticni broj 1010
Rodjen 10121989
S prosjekom 8.5
Press any key to continue . . .

U nastavku je isti primjer, ali uz koritenje naredbi za formatirani ulaz i izlaz (printf i scanf).
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
struct datum
{
int dan;
int mjesec;
int godina;
};
struct ucenik
{
char ime[15];
char prezime[15];
int maticni;
float prosjek;
struct datum rodjendan;
}razred[40]; /*polje razred koje se sastoji od struktura ucenik*/
int main()
{
int n,i,k;
float max;

Programiranje C++

29

printf("\nKoliko ima ucenika? ");


scanf("%d",&n);
if (n>40)
printf("Broj ucenika ne moze biti >40");
else
{
for(i=0;i<n;i++)
/*unos podataka za svakog uenika u polje razred*/
{
printf("\nIme: ");
scanf("%s",razred[i].ime);
printf("\nPrezime: ");
scanf("%s",razred[i].prezime);
printf("\nMaticni u imeniku:");
scanf("%d",&razred[i].maticni);
printf("\nProsjek: ");
scanf("%f",&razred[i].prosjek);
printf("\nRodjen dan: ");
scanf("%d",&razred[i].rodjendan.dan);
printf("\nRodjen mjesec: ");
scanf("%d",&razred[i].rodjendan.mjesec);
printf("\nRodjen godina: ");
scanf("%d",&razred[i].rodjendan.godina);
}
max=razred[0].prosjek; /*odreivanje najboljeg prosjeka*/
k=0;
for(i=0;i<n;i++)
if (max<razred[i].prosjek)
{
max=razred[i].prosjek;
k=i;
}
/*ispis najboljeg*/
printf("\nNajbolji je %s %s",razred[k].ime,razred[k].prezime);
printf("\nMaticni broj %d",razred[k].maticni);
printf("\nRodjen %d.%d.
%d",razred[k].rodjendan.dan,razred[k].rodjendan.mjesec,razred[k].rodjendan.godina);
printf("\nS prosjekom %.2f",razred[k].prosjek);
}
system ("PAUSE");
return 0;
}
Izlaz:
Koliko ima ucenika? 2
Ime: maja
Prezime: milkovic
Maticni u imeniku:1010
Prosjek: 8.5
Rodjen dan: 10

Programiranje C++

30

Rodjen mjesec: 12
Rodjen godina: 1989
Ime: milan
Prezime: milkovic
Maticni u imeniku:1011
Prosjek: 9
Rodjen dan: 27
Rodjen mjesec: 5
Rodjen godina: 1987
Najbolji je milan milkovic
Maticni broj 1011
Rodjen 27.5.1987
S prosjekom 9.00
Press any key to continue . . .

Datoteke
Datoteke omoguuju pohranjivanje velike koliine podataka koji se mogu koristiti neovisno o programu.
Datoteke mogu biti tekstualne ili binarne. U nastavku e biti opisane tekstualne datoteke.
2 su osnovna naina upisa/ispisa podataka u datoteku:
- formatirani
- neformatirani
Neformatirani nain upisa i ispisa podataka iz datoteke koristi naredbe:
ofstream: za upisivanje podataka u datoteku
ifstream: za itanje podataka iz datoteke
fstream: za itanje i pisanje podataka u datoteku
a obavlja se kombinacijama kljunih rijei open i close.
Primjer1: Otvaranje datoteke primjer.txt i upis teksta "Ovo je primjer pisanja teksta u datoteku".
Datoteka e se nalaziti u radnoj mapi tvrdog diska te se moe proitati izlaskom iz C++ a i pokretanjem
programa Blok za pisanje (NotePad).

Programiranje C++

31

#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream test;
/*deklaracija datoteke test - opcija:upisivanje podataka*/
test.open ("primjer.txt");
/*otvaranje datoteke primjer.txt u radnoj mapi na tvrdom disku*/
test << "Ovo je primjer pisanja teksta u datoteku \n";
/*upis teksta u datoteku*/
test.close();
/*zatvaranje datoteke*/
system ("PAUSE");
return 0;
}
Izlaz:

Primjer 2: Ispis (itanje) sadraja prethodnim zadatkom kreirane datoteke primjer.txt.


#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string redak;
ifstream test ("primjer.txt");
datoteke*/
if (test.is_open())
{
while (! test.eof() )
{
getline (test,redak);
varijablu redak*/
cout << redak << endl;
}
test.close();
}

/*deklaracija tekstualne varijable redak*/


/*deklaracija datoteke test - opcija:itanje podataka iz
/*ispitivanje da li je datoteka ispravno otvorena*/
/*itaj dok nije kraj datoteke (End Of File)*/
/*uzmi iz datoteke test jedan red teksta i stavi ga u
/*ispis teksta retka na zaslon raunala*/

else cout << "Ne mogu otvoriti datoteku";


system ("PAUSE");

/*ispis ako uvjet test.is_open() nije ispunjen*/

Programiranje C++

32

return 0;
}
Izlaz:
Ovo je primjer pisanja teksta u datoteku
Press any key to continue . . .
elimo li koristiti formatirani upis/spis podataka u datoteku koristiti emo naredbe fscanf() i fprintf().
Prije otvaranja datoteke programu emo naredbom FILE *identifikator; najaviti da emo raditi s
datotekom. Identifikator je naziv datoteke koji emo koristiti u programu, a zvjezdica govori da se radi o
pokazivau.
Datoteku emo otvoriti funkcijom fopen(), a nakon uporabe zatvoriti funkcijom fclose();.
Openito se te funkcije zapisuju:
fopen("ime_datoteke","nain_otvaranja");
fclose(identifikator);
Ime datoteke zadaje se po istom pravilu kao i naziv varijable, a nain otvaranja datoteke (tekstualne)
odreuje njezine mogunosti. Tako na primjer moe postojati datoteka koja se moe samo itati ili u koju
se mogu samo zapisivati podaci samo. Naini otvaranja se biljee slovom (r, w, r+) i detaljnije su opisani
u tablici.

Nain
otvaranja

Objanjenje

"r"

Otvara tekstualnu datoteku za itanje. Ako datoteka ne postoji javlja pogreku.

"w"

Otvara tekstualnu datoteku za pisanje u nju.

"a"

Otvara tekstualnu datoteku za dodavanje novih podataka na njen kraj.

"r+"

Otvara tekstualnu datoteku za itanje i pisanje. Ako ne postoji javlja pogreku.

"w+"

Otvara tekstualnu datoteku za itanje i pisanje. Ako datoteka ne postoji kreirat e ju. Ako

Programiranje C++

33

datoteka postoji, svi podaci iz nje bit e izbrisani prije upisivanja novih.

"a+"

Otvara tekstualnu datoteku za dodavanje novih podataka na njen kraj. Ako datoteka ne
postoji bit e kreirana

Za pisanje u datoteku koristi se nekoliko funkcija. Najee koritene funkcije su fprintf() i funkcija
fwrite() koja je pogodna za upisivanje blokova podataka.
Za itanje podataka iz datoteke najee se koriste funkcije fscanf() i fread() - koja se esto koristi u
kombinaciji sa strukturama.
U programima za rad s datotekama esto emo naii na dio programskog koda kojim se ispituje da li je
datoteka ispravno otvorena. Ako je datoteka deklarirana sa FILE *f; onda taj dio koda izgleda ovako:
if(f==NULL)
{
printf("Greska pri otvaranju");
exit(1);
}
Ako je uvjet (f==NULL) ispunjen na zaslonu raunala e se ispisat poruka "Greka pri otvaranju".

Primjer 1: Napiite program koji u radnoj mapi kreira datoteku test1.txt i u nju smjeta prvih 100 cijelih
brojeva. (Napomena: nakon izvoenja programa izaite i u radnoj mapi provjerite da li imate datoteku
test1.txt. Njezin sadraj moete proitati s programom Blok za pisanje (NotePad))
#include <cstdlib>
#include <iostream>
using namespace std;

Programiranje C++

34

int main()
{
FILE *f;
int i;
f=fopen("test1.txt","w");
/*otvaranje datoteke za itanje i pisanje*/
if(f==NULL)
/*ispitivanje valjanosti otvaranja datoteke*/
{
printf("Greska pri otvaranju");
exit(1);
}
for(i=1;i<=100;i++)
/*upis podataka u datoteku; for petljom; brojeva od 1-100*/
fprintf(f,"%d\n",i);
fclose(f);
/*zatvaranje datoteke*/
system ("PAUSE");
return 0;
}
Izlaz:

Primjer 2: Napiite program koji e proitati sadraj iz datoteke iz prolog zadatka i ispisati njezin
sadraj na zaslonu raunala.

Programiranje C++

35

#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
FILE *f;
int a;
f=fopen("test1.txt","r");
/*ponovno otvaranje datoteke*/
if(f==NULL)
{
printf("Greska pri otvaranju");
exit(1);
}
while (!feof(f))
{
fscanf(f,"%d\n",&a);
printf("\n%d",a);
}

/*citanje iz datoteke - dok nije kraj !feof*/

fclose(f);

/*zatvaranje datoteke*/

/*ispis na zaslon raunala*/

system ("PAUSE");
return 0;
}

Izlaz:

Objekti i klase
Klase u jeziku C++ su sloeni tipovi podataka koji se satoje od ureenih nizova elemenata koji mogu da
budu meusobno razliitih tipova. Ti elementi nazivaju se lanovi klase. Podaci klasnih tipova
predstavljaju primjerke date klase i nazivaju se objekti . Pojam podatak obuhvata kako vrednost

Programiranje C++

36

standardnih tipova , tako i objekte klasnih tipova. Kvalitativno se razlikuju pojedinani podaci i nizovi.
Prosti(skalarni) podaci , pokazivai strukture i objekti smatraju se pojedinanim podacima.
lanovi klasa mogu da budu podaci ili funkcije.Vrednosti podataka lanova ine stanje (vrednost) objekta
i nazivaju se polja ili atributi klase , odnosno objekta.
Funkcije lanovi slue za izvoenje raznih operacija nad podacima lanovima (poljima) ime mjenjaju
stanje objekta na koji se primjenjuju. Nazivaju se metode klase.
Osnovni pojmovi objektnog programiranja su:
- klase
- objekti
- svojstva
- metode i
- dogaaji
U C++u definiranje klasa slino je definiranju struktura u programskom jeziku C, s tim da je kljuna rije
class, a ne struct. U klasama je takoer potrebno zadati varijable koje e biti dostupne cijelom
programu. Takve varijable zovemo javne i privatne u C++ se zapisuju s public i private.
-Privatnim(private) lanovima se moe pristupiti samo unutar metode same klase.
-Javnim (public) lanovima se moe pristupiti kroz svaki objekt klase
-protected privilegovani pristup
Klasa se definie naredbom class i deklarie se:
class Ime_klase {
<podaci_clanovi>
<objekti_clanovi>
<funkcije_clanice>
};

1. Pristup javnim lanovima klase.


#include<iostream.h>
using namespace std;
class Cat
{

Programiranje C++

37

public:
int itsAge;
};
int main()
{
Cat Milan;
Milan.itsAge=5;
cout<<"Milan ima";
cout<<Milan.itsAge<< "godina"<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Milan ima 5godina
Press any key to continue . . .
2.Pristup javnim lanovima
#include<iostream.h>
using namespace std;
class Cat
{
public:
int itsAge;
int itsWeight;
};
int main()
{
Cat Milan;
Milan.itsAge=5;
cout<<"Milan ima";
cout<<Milan.itsAge<< "godina"<<endl;
Cat Marko;
Marko.itsWeight=10;
cout<<"Marko ima";
cout<<Marko.itsWeight<< "godina"<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Milan ima 5godina
Marko ima 10godina
Press any key to continue . . .

Primjer 3: U ovom primjeru kreirana je klasa koja se zove Primjer i koja sadri funkciju Ispis().
Funkcija Ispis() ispsuje tekst "Ispis teksta na ekranu racunala koristenjem klase Ispis" na ekranu
raunala.

Programiranje C++

38

#include <iostream>
using namespace std;
class Primjer
/*deklaracija klase koja se zove Primjer i koja u sebi sadri funkciju Ispis()*/
{
public:
void Ispis()
{
cout << "Ispis teksta na ekranu racunala koristenjem klase Ispis\n" << endl;
}
};
int main()
{
Primjer tekst;
/*deklaracija objekta imena test prema "nacrtu"u klasi Primjer*/
tekst.Ispis();
/*poziv funkcije Ispis() nad objektom test*/
system ("PAUSE");
return 0;
}
Izlaz.
Ispis teksta na ekranu racunala koristenjem klase Ispis
Press any key to continue . . .
4.U ovom primjeru kreirana je klasa tekst i koja sadri funkciju pisi() koja ispisuje tekst Ovo je
nas tekst
#include<cstdlib>
#include<iostream.h>
using namespace std;
class tekst
{
public:
void pisi()
{
cout<<"Ovo je nas tekst"<<endl;
}
};
int main()
{
tekst t;
t.pisi();
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Ovo je nas tekst
Press any key to continue . . .

5.U ovom programu kreirana je klasa tekst koja sadri funkciju pisi()

#include<cstdlib>
#include<iostream.h>
using namespace std;

Programiranje C++
class tekst
{
public:
void pisi()
{
cout<<"Ovo je nas tekst"<<endl;
}
};
int main()
{
tekst prvi;
tekst drugi;
tekst treci;
prvi.pisi();
drugi.pisi();
treci.pisi();
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Ovo je nas tekst
Ovo je nas tekst
Ovo je nas tekst
Press any key to continue . . .

6.Program sadri dvije klase tekst1 i tekst2

#include<cstdlib>
#include<iostream>

i funkciju pisi()

39

Programiranje C++

40

using namespace std;


class tekst1
{
public:
void pisi()
{
cout<<"Ovo je klasa tekst1"<<endl;
}
};
class tekst2
{
public:
void pisi()
{
cout<<"Ovo je klasa tekst2"<<endl;
}
};
int main()
{
cout<<"Zovemo metodu klase tekst1"<<endl;
tekst1 t1;
t1.pisi();
cout<<"Zovemo metodu klase tekst2"<<endl;
tekst2 t2;
t2.pisi();
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Zovemo metodu klase tekst1
Ovo je klasa tekst1
Zovemo metodu klase tekst2
Ovo je klasa tekst2
Press any key to continue . . .

7.Napisati program koji rauna povrinu pravougaonika a pristup lanovima private (varijabla c
int tipa) i public (( metoda naslov() i metoda povrsina (int a i int b))
#include<cstdlib>

Programiranje C++
#include<iostream>
using namespace std;
class pravougaonik
{
private:
int c;
public:
void naslov()
{
cout<<"Povrsina pravougaonika"<<endl;
cout<<endl;
}
int povrsina(int a,int b)
{
c=a*b;
return (c);
}
};
int main()
{
pravougaonik p;
p.naslov();
cout<<"Povrsina je ";
cout<<p.povrsina(2,3);
cout<<endl<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Povrsina pravougaonika
Povrsina je 6
Press any key to continue . . .

8.Program rauna povrinu pravougaonika pomou dvije void metode


a)Metoda unesi gde se unose brojevi u varijablu a i varijablu b
b) Metodom povrsina izraunava se povrsina i ispisuje rezultat

41

Programiranje C++

#include<cstdlib>
#include<iostream>
using namespace std;
class pravougaonik
{
private:
int a;
int b;
int c;
public:
void unesi(void)
{
cout<<"Unesi stranicu a="<<endl;
cin >>a;
cout<<"Unesi stranicu b="<<endl;
cin >>b;
}
void povrsina(void)
{
c=a*b;
cout<<"Povrsina je "<<c<<endl;
}
};
int main()
{
pravougaonik p;
p.unesi();
p.povrsina();
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Unesi stranicu a=
10
Unesi stranicu b=
5
Povrsina je 50
Press any key to continue . . .

9.Program rauna povrinu i obim pravougaonika pomou dvije void metode


a)Metoda unesi gde se unose brojevi u varijablu a i varijablu b
b) Metodom povrsina izraunava se povrsina i obim ispisuje rezultat

42

Programiranje C++

43

#include<cstdlib>
#include<iostream>
using namespace std;
class pravougaonik
{
private:
int a;
int b;
int p;
int o;
public:
void unesi(void)
{
cout<<"Unesi stranicu a="<<endl;
cin >>a;
cout<<"Unesi stranicu b="<<endl;
cin >>b;
}
void povrsina(void)
{
p=a*b;
cout<<"Povrsina je "<<p<<endl;
o=2*a+2*b;
cout<<"Obim je "<<o<<endl;
}
};
int main()
{
pravougaonik p;
p.unesi();
p.povrsina();
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Unesi stranicu a=
8
Unesi stranicu b=
4
Povrsina je 32
Obim je 24
Press any key to continue . . .

10. U primjeru 2 zadana je klasa pravokutnik koja ima dvije varijable: stranicu a i stranicu b. To su
"stanja" pravokutnika, odnosno pravokutnik je odreen veliinama tih stranica.U klasi se nalaze i
dvije funkcije: povrsina() i opseg() koje mu odreuju "ponaanje", odnosno odreeno je

Programiranje C++

44

pravokutniku moemo raunati opseg i povrinu.U glavnom programu naredbom pravokutnik


prvi; je deklariran objekt prvi prema predloku koji je opisan u klasi pravokutnik. Zna se da objekt
ima dva stanja prvi.str1 i prvi.str2. Budui da su to javne varijable u klasi pravokutnik, naredbom
prvi.opseg(); se moe dobiti izraun opsega za objekt prvi, a naredbom prvi.povrsina(); povrina
za objekt prvi.
#include <iostream>
#include <math.h>
using namespace std;
class pravokutnik
{
public:
float str1,str2;

/*klasa pravokutnik koja sadri dvije funkcije: povrsina() i opseg()*/

float povrsina()
{
float pov;
pov=str1*str2;
return pov;
}
float opseg ()
{
float opseg;
opseg=2*(str1+str2);
return opseg;
}
};
int main()
{
pravokutnik prvi;
prvi.str1=5;
prvi.str2=6;
cout<<"Za a= "<<prvi.str1<<" i b= "<<prvi.str2<<"\nPovrsina je: "<<prvi.povrsina()<<"\n";
cout<< "a opseg je: "<<prvi.opseg()<<"\n";
system ("PAUSE");
return 0;
}
Izlaz:
Za a= 5 i b= 6
Povrsina je: 30
a opseg je: 22
Press any key to continue . . .

11.Program rauna povrinu i obim pravougaonika-klase

Programiranje C++

45

#include <iostream>
#include <math.h>
using namespace std;
class Pravougaonik
{
public:
float str1,str2;

/*klasa pravougaonik koja sadri dvije funkcije: povrsina() i opseg()*/

float povrsina()
{
float pov;
pov=str1*str2;
return pov;
}
float opseg ()
{
float opseg;
opseg=2*(str1+str2);
return opseg;
}
};
int main()
{
Pravougaonik prvi;
cout<<"Unesite prvu stranicu"<<endl;
cin>> prvi.str1;
cout<<"Unesite drugu stranicu"<<endl;
cin>>prvi.str2;
cout<<"Za a= "<<prvi.str1<<" i b= "<<prvi.str2<<"\nPovrsina je: "<<prvi.povrsina()<<"\n";
cout<< "Opseg je: "<<prvi.opseg()<<"\n";
system ("PAUSE");
return 0;
}
Izlaz:
Unesite prvu stranicu
10
unesite drugu stranicu
5
Za a= 10 i b= 5
Povrsina je: 50
Opseg je: 30
Press any key to continue . . .

-Konstruktor i destruktor
Uloga konstuktora je da direktno dodeljuje vrednost nekih promenljivih u klasi prije izvravanja main()
funkcije Konstruktor bi trebalo da inicijalizuje lanove objekta na neke poetne vrednosti za koje

Programiranje C++

46

smatramo da bi trebalo da ih imaju pre nego to se krene sa upotrebom objekta. To moe da bude
rezervisanje memorije, postavljanje pokazivaa na NULL, otvaranje fajla, uitavanje podataka iz
konfiguracionog fajla i tome slino.
Destruktor oslobaa zauzetu memoriju. . Destruktor treba da "poisti" za sobom koliko je to mogue, jer
se poziva kada se objekat unitava: znai da oslobodi memoriju, zatvori otvorene fajlove, upie podatke
u konfiguracioni fajl itd.
Definisanje konstruktora
class PovrsinaValjka
{
public:
PovrsinaValjka(); //To jest definicja konstruktora
};
PovrsinaValjka::PovrsinaValjka()
{
//Tu inicijalizujemo
}
Konstruktor specijalna funkcija lanica koja omoguava inicijalizaciju objekta prilikom njegovog
kreiranja.
Konstruktor ima isto ime kao i klasa kojoj pripada.
Konstruktor nema tip ak ni void!
Konstruktor se automatski poziva svaki put kad se kreira neki objekat.

Klasa ne mora da ima konstruktor.


Objekti mogu da se inicijalizuju drugim funkcijama lanicama.
Praksa pokazuje da je najbolje da se objekat inicijalizuje konstruktorom

Primjer:
class Time
{
private:
int hh, mm, ss;
public:
...
Time() { hh = mm = ss = 0; }
...
};
...
Time t;

Destruktori slino konstruktoru jo jedna specijalna funkcija lanica klase


Destruktor se poziva svaki put kad se unitava neki objekat.
Destruktor sutinski ne unitava objekat (objekat e biti uniten i u sluaju da klasa nema
definisan destruktor) - destruktor slui za ienje memorije (bitno kod objekata koji dinamiki
alociraju memoriju).
Klasa moe da ima samo jedan destruktor. Nije dozvoljeno preklapanje imena.
Destruktor nema argumenata! Destruktor nema tip!
Destruktor ima isto ime kao konstruktor, ali se ispred stavlja tilda (~). Intuitivno se moe napraviti
analogija sa bitskim operatorom negacije, jer se destruktor ponaa kao komplement
konstruktora.
class Time
{
public:
...
~Time();
...
};

Programiranje C++
1.Program rauna povrinu pravougaonika uz primjenu konstruktora
#include<cstdlib>
#include<iostream>
using namespace std;
class pravougaonik
{
private:
int a;
int b;
public:
pravougaonik(void) // konstruktor//
{
cout<<"Unesi stranicu a="<<endl;
cin >>a;
cout<<"Unesi stranicu b="<<endl;
cin >>b;
}
int povrsina(void)
{
return(a*b);
}
};
int main()
{
pravougaonik p;
cout<<"Povrsina je "<<p.povrsina()<<"."<<endl;
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Unesi stranicu a=
5
Unesi stranicu b=
4
Povrsina je 20.
Press any key to continue . . .

47

Programiranje C++

2.Program rauna obim pravougaonika uz primjenu konstruktora


#include<cstdlib>
#include<iostream>
using namespace std;
class pravougaonik
{
private:
int a;
int b;
public:
pravougaonik::pravougaonik(void) // konstruktor//
{
cout<<"Unesi stranicu a="<<endl;
cin >>a;
cout<<"Unesi stranicu b="<<endl;
cin >>b;
}
int obim(void)
{
return(2*a+2*b);
}
};
int main()
{
pravougaonik o;
cout<<"Obim je "<<o.obim()<<"."<<endl;
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Unesi stranicu a=
10
Unesi stranicu b=
5
Obim je 30.
Press any key to continue . . .

48

Programiranje C++

3.Program rauna povrinu pravougaonika koristei dva konstruktora


#include<cstdlib>
#include<iostream>
using namespace std;
class pravougaonik
{
private:
int a;
int b;
public:
pravougaonik(void) // konstruktor 1//
{
cout<<"Unesi stranicu a="<<endl;
cin >>a;
cout<<"Unesi stranicu b="<<endl;
cin >>b;
}
pravougaonik(int a1, int b1) // konstruktor 2//
{
a=a1;
b=b1;
}
int povrsina(void)
{
return(a*b);
}
};
int main()
{
pravougaonik p1;
cout<<"Povrsina je "<<p1.povrsina()<<"."<<endl;
cout<<endl;
pravougaonik p2(3,4);
cout<<"Za p2(3,4) povrsina je "<<p2.povrsina()<<"."<<endl;
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Unesi stranicu a=
4
Unesi stranicu b=
2
Povrsina je 8.
Za p2(3,4) povrsina je 12.
Press any key to continue . . .

49

Programiranje C++

3 a.Program rauna povrinu pravougaonika koristei dva konstruktora


#include<cstdlib>
#include<iostream>
using namespace std;
class pravougaonik
{
private:
int a;
int b;
public:
pravougaonik::pravougaonik(void)// konstruktor 1//
{
cout<<"Unesi stranicu a="<<endl;
cin >>a;
cout<<"Unesi stranicu b="<<endl;
cin >>b;
}
pravougaonik::pravougaonik(int a1, int b1)// konstruktor 2//
{
a=a1;
b=b1;
}
int povrsina(void)
{
return(a*b);
}
};
int main()
{
pravougaonik p1;
cout<<"Povrsina je "<<p1.povrsina()<<"."<<endl;
cout<<endl;
pravougaonik p2(3,4);
cout<<"Za p2(3,4) povrsina je "<<p2.povrsina()<<"."<<endl;
cout<<endl;
system("PAUSE");
return 0;
}
Izlaz:
Unesi stranicu a=
5
Unesi stranicu b=
4
Povrsina je 20.
Za p2(3,4) povrsina je 12.
Press any key to continue . . .
4.Primjena konstruktora na brojaku petlju

50

Programiranje C++

#include <iostream.h>
class Inkrement
{
public:
Inkrement( int b=0, int i=1 );
void dodaj() { stanje += korak; }
void print();
private:
int stanje;
const int korak;
};
Inkrement::Inkrement(int b,int i) : korak (i) { stanje = b; }
void Inkrement::print()
{
cout << "stanje=" << stanje << ", korak=" << korak << endl;
}
main()
{
Inkrement data(10,5);
cout << "Prije petlje : ";
data.print();
for ( int j=1; j<4; j++ ) { data.dodaj(); data.print(); }
system("PAUSE");
return 0;
}
Izlaz:
Prije petlje : stanje=10, korak=5
stanje=15, korak=5
stanje=20, korak=5
stanje=25, korak=5
Press any key to continue . . .

51

Programiranje C++
5.Program rauna udaljenost izmeu taaka
#include <iostream.h>
#include <math.h>
#define K(a,b) pow(((a)-(b)),2)
class Tacka
{
public:
Tacka (double=0, double=0);
double getX() const;
double getY() const;
double daljina(Tacka) const;
void pisiTacka() const;
private:
double x, y;
};
Tacka::Tacka(double xx, double yy)
{ x = xx; y = yy; }
double Tacka::getX() const
{ return x; }
double Tacka::getY() const
{ return y; }
double Tacka::daljina(Tacka t) const
{ return sqrt(K(x,t.x)+K(y,t.y)); }
void Tacka::pisiTacka() const
{ cout << "("<<x<<","<<y<<")"; }
main()
{
Tacka tA(3,4);
const Tacka tO; // konstantan objekat
cout<<"A: "<<tA.getX()<<","<<tA.getY()<<endl;
cout<<"O: "<<tO.getX()<<","<<tO.getY()<<endl;
cout<<"A: "; tA.pisiTacka(); cout<<endl;
cout<<"O: "; tO.pisiTacka(); cout<<endl;
cout << "Udaljenost od A"; tA.pisiTacka();
cout << " do O"; tO.pisiTacka();
cout << " iznosi: " << tA.daljina(tO) << endl;
cout << "Udaljenost od O"; tO.pisiTacka();
cout << " do A"; tA.pisiTacka();
cout << " iznosi: " << tO.daljina(tA) << endl;
system("PAUSE");
return 0;
}
Izlaz:
A: 3,4
O: 0,0
A: (3,4)
O: (0,0)
Udaljenost od A(3,4) do O(0,0) iznosi: 5
Udaljenost od O(0,0) do A(3,4) iznosi: 5
Press any key to continue . . .

-Nasljeivanje

52

Programiranje C++

1.Program rauna kvadrat i kub broja metodom nasljeivanja

53

Programiranje C++

54

#include<cstdlib>
#include<iostream>
using namespace std;
class kvadrat
{
protected:
int br;
public:
void unos(void)
{
cout<<"Unesite broj: "<<endl;
cin>>br;
}
int izracun(void)
{
return(br*br);
}
};
class kub:public kvadrat // formirana klasa kub koja naslje]uje varijable i metode klase kvadrat//
{
public:
int izracun(void)
{
return(br*br*br);
}
};
int main()
{
kvadrat objekt1;
objekt1.unos();
cout<<"Kvadrat je"<<objekt1.izracun()<<endl;
cout<<endl;
kub objekt2;
objekt2.unos();
cout<<"Kub je "<<objekt2.izracun()<<endl;
cout<<endl,
system("PAUSE");
return 0;
}
Izlaz:
Unesite broj:
3
Kvadrat je9
Unesite broj:
3
Kub je 27
Press any key to continue . . .

Programiranje C++

55

2.Program rauna povrinu i dijagonalu kvadrata metodom nasleivanja


#include<cstdlib>
#include<iostream>
using namespace std;
class kvadrat
{
protected:
float a;
public:
void unos(void)
{
cout<<"Unesite stranicu kvadrata: "<<endl;
cin>>a;
}
float izracun(void)
{
return(a*a);
}
};
class dijagonala:public kvadrat// formirana klasa dijagonala koja naslje]uje varijable i metode klase
kvadrat/
{
public:
float izracun(void)
{
return(a*1.41);
}
};
int main()
{
kvadrat objekt1;
objekt1.unos();
cout<<"Povrsina kvadrata je "<<objekt1.izracun()<<endl;
cout<<endl;
dijagonala objekt2;
objekt2.unos();
cout<<"Dijagonala kvadrata je "<<objekt2.izracun()<<endl;
cout<<endl,
system("PAUSE");
return 0;
}
Izlaz:
Unesite stranicu kvadrata:
10
Povrsina kvadrata je 100
Unesite stranicu kvadrata:
10
Dijagonala kvadrata je 14.1
Press any key to continue . . .

Programiranje C++

56

Pokazivai i reference
Kao to im ime kae, pokazivai (eng. pointers) su objekti koji pokazuju na neki drugi objekt.
Jednostavnije reeno, jedina funkcija im je pokazivati na neki drugi objekt ili varijablu da bismo preko njih
mogli pristupiti onome na to pokazuju. Oni, sami od sebe nemaju nikakvu vrijednost, odnosno vrijednost
im je NULL (mora se to eksplicitno navesti). Poetnici obino ne vide smisla postojanju pokazivaa pa je
za sada najbolje da ih promatrate, u terminologiji operativnih sistema, kao izvjesne preace (shortcuts)
do nekog objekta ili varijable.
Na koji nain pokaziva pokazuje na neto? Naime, da bi pokaziva mogao obavljati svoju funkciju mi
mu moramo proslijediti adresu onoga na to e on pokazivati. Ne vrijednost tog objekta, ne neku
proizvoljnu vrijednost, nego samo adresu. Na taj nain emo preko njega moi pristupiti tom objektu radi
itanja njegove vrijednosti ili pak promijeniti vrijednost objekta preko pokazivaa. Sintaksa deklaracije
pokazivaa je
tip_na_koji_pokazuje * ime_pokazivaa
Napomena: sasvim je nebitno da li piete pokaziva kao tip* pok, tip *pok ili tip * pok jer C++
kompajler ionako ne vidi ove razmake. Do vas i vaeg stila je da izaberete jedan od naina.
Kada pokaziva deklariramo, onda ga inicijaliziramo adresom nekog drugog objekta koristei znak
ampersand (&) ili adresni operator. Sada pokaziva sadri adresu tog objekta odnosno pokazuje na
njega. Sintaksa inicijalizacije je
pokaziva = &neki_objekt;
Pretpostavimo da imamo varijablu imena broj
float broj = 3.14;
Idemo napraviti pokaziva koji e pokazivati na tu varijablu:
float broj = 3.14;
float *pok_broj; // ovo je
pok_broj = &broj; // pokaziva
Ali jednostavnije ga je napisati u jednom redu:
float *pok_broj = &broj;
to smo time uinili? Kako biste lake razumjelo, proitajte taj nepoznati dio s desna na lijevo:
nai varijablu broj, uzmi njenu adresu (adresu dohvaamo pomou znaka &) i smjesti ju u varijablu
pok_broj koja je pokaziva (pokazivai se od obinih varijabli razlikuju po znaku * ispred imena) na
varijablu tipa float.

1.Pokaziva koji pokazuje na varijablu

Programiranje C++

57

#include <iostream>
using namespace std;
int main()
{
float broj = 3.14;
float *pok_broj = &broj;
cout << broj;
system("PAUSE");
return 0;
}
Izlaz:
3.14
Press any key to continue . . .
Pokaziva smo mogli napisati i ovako:
float* pok_broj = &broj; // premjestili smo zvjezdicu
No takav pristup ima jednu manu. Ako elimo stvoriti vie pokazivaa moramo napisati ovako:
float* pok1;
float* pok2;
A prvim pristupom je to mogue i ovako:
float *pok1, *pok2;
U ovom primjeru emo promjeniti vrijednost varijable broj, ali pomou pokazivaa (pok_broj):
float broj = 3.14;
float *pok_broj = &broj;
*pok_broj = 1337;
Kada bismo ispisali vrijednost varijable broj vidjeli bismo da sadri brojanu vrijednost 1337:
2.Program za promjenu vrijednosti varijable pomou pokazivaa
#include <iostream>
using namespace std;
int main(){
float broj = 3.14;
float *pok_broj = &broj;
*pok_broj = 1337;
cout << broj;
char cekaj;
cin >> cekaj;
system(PAUSE);
return 0;
}
Izlaz:
1337
Time smo zakljuili da se izmeu pokazivaa i varijable na koju pokazuje stvara nekakva veza.
Recimo da smo se predomislili i elimo da pokaziva pokazuje na drugu adresu. Tu nipoto ne bismo

Programiranje C++

58

smjeli obrisati varijablu broj jer bi se stvorio pokaziva koji ne pokazuje na nita. Takve pokazivae
nazivamo nul-pokazivaima. Njima su se u C-u uglavnom ispitivale greke prilikom izvoenja.
3.Pokaziva pokazuje na drugu varijablu:
#include <iostream>
using namespace std;
int main()
{
float broj = 3.14;
float drugiBroj = 192.12;
float *pok_broj = &broj;
*pok_broj = 13.37;
pok_broj = &drugiBroj;
*pok_broj = 73.31;
cout << "Prvi broj = " << broj << endl << "Drugi broj = " << drugiBroj << endl;
char cekaj;
cin >> cekaj;
system(PAUSE);
return 0;
}
Izlaz:
Prvi broj = 13.37
Drugi broj = 73.31
Ovim smo se izvukli od nepotrebnog kreiranja novog pokazivaa ve smo mu samo promjenili sadraj tj.
adresu na koju pokazuje. Kao to moete vidjeti prilikom mjenjanja adrese nismo stavljali znak * jer
nismo mijenjali varijablu na koju pokaziva pokazuje, ve smo mijenjali sadraj pokazivaa.
/* <KORISNO> */
Znak * predstavlja vrijednost varijable na koju pokaziva pokazuje, a bez znaka * pristupamo adresi na
koju pokaziva pokazuje.
4. Pokaziva moemo interpretirati kao varijablu koja sadri heksadecimalnu adresu neke druge
varijable.
#include <iostream>
using namespace std;
int main()
{
float broj = 3.14;
float *pok_broj = &broj;
*pok_broj = 13.37;
cout << "Vrijednost varijable na koju pokazujem = " << *pok_broj << endl << "Adresa varijable na
koju pokazujem = " << pok_broj << endl;
char cekaj;
cin >> cekaj;
return 0;
system(PAUSE);
}
Izlaz:
Vrijednost varijable na koju pokazujem = 13.37
Adresa varijable na koju pokazujem = 0x22ff44

Programiranje C++

59

Vrijednost varijable na koju pokazujem = 13.37


Adresa varijable na koju pokazujem = 0x7fff81fc2d14
Adresa varijable moe biti bilo koja heksadecimalna vrijednost.
/* </KORISNO> */
Na pokazivae moemo koristiti sve operatere kao i za obine varijable (samo moramo paziti da
koristimo znak * tj. da pristupamo sadraju varijable, a ne njenoj adresi).
5. Primjer pokazivaa na pokaziva:
#include <iostream>
using namespace std;
int main(){
float broj = 3.14;
float *pok_broj = &broj;
float **pok_na_pok = &pok_broj;
cout << "Adresa na koju pokazuje prvi pokazivac = " << pok_broj << endl
<< "Adresa prvog pokazivaca = " << pok_na_pok << endl
<< "Adresa varijable na koju pokazuje drugi pokazivac = " << pok_na_pok << endl;
char cekaj;
cin >> cekaj;
system(PAUSE);
return 0;
}
Izlaz:
Adresa na koju pokazuje prvi pokazivac = 0x22ff44
Adresa prvog pokazivaca = 0x22ff40
Adresa varijable na koju pokazuje drugi pokazivac = 0x22ff40
Kao to se vidi pokaziva na pokaziva ima dva znaka *. Opet emo olakati i proitati s desna na
lijevo:
Uzmi adresu pokazivaca pok_broj i smjesti ju u varijablu pok_na_pok koja je pokaziva na pokaziva na
tip float.
Program e nam ispisati tri adrese, a iz druge dvije moemo zakljuiti da pok_na_pok zaista pokazuje na
pok_broj.

Reference su u biti varijable vrlo sline pokazivaima, ali daleko jednostavnije. U C-u nisu postojale pa
su nove i za C programere.

Programiranje C++

60

Sada neemo koristiti brojanu varijablu (isto da vidite da se pokazivai i reference mogu primjeniti na
sve tipove podataka).
Evo primjera:
string ime = "Pero";
string &ref_ime = ime;
Stvorili smo referencu na varijablu ime. Reference su vrlo jednostavne za shvatiti, a pedstavljaju drugo
ime varijable. Sada moemo jednostavno mjenjati vrijednost varijable ime ovako:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string ime = "Pero";
string &ref_ime = ime;
ref_ime = "Marko";
cout << ime;
char cekaj;
cin >> cekaj;
return 0;
system (PAUSE);
}
Izlaz:
Marko
Kao to vidite program e ispisati "Marko". Ve moete primjetiti da ne morate misliti na nikakve
zvjezdice, ve samo prilikom deklariranja varijable stavite znak & uz ime reference.

You might also like