PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Osnove objektno orijentisanog programiranja
Microsoft Visual C++
C++ je jedan od objektno orijentisanih programa. Omogućava objektni pristup rješavanju
problema.
Nastao je kao naslednik jezika C, pa je zadržao i koncepte tradicionalnog programiranja.
Pojavio se osamdesetih godina 20.tog vijeka. Autor jezika je Bjarne Stroustrup.
Dragana T.
školska: 2009 / 2010
1
PROGRAMIRANJE I PROGRAMSKI JEZICI
2.Build
C++
IIIe2, IIIe3
3.Execute Program
1.Compile(Ctrl+F7)
Prvi program:
#include<iostream.h>
int main( )
{
// ovo je komentar, a sledi naredba izlaza
cout<<”Programiranje”<<endl;
return 0;
}
Znak # (eng. hash) je signal za predprocesor. Svaki put kad se pokrene kompajler, prije
kompajlera pokrene se i predprocesor.
#include je uputa (direktiva) kompajleru da u program uključi tzv. zaglavlje biblioteke sa
imenom "iostream.h".
iostream.h sadrži definicije naredbi: ulaza ( cin>>), izlaza (cout<<),prelaska u novi red
Dragana T.
školska: 2009 / 2010
2
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
( endl; ).
include je instrukcija predprocesora koja se može interpretirati kao "Ovo što slijedi je
ime biblioteke. Nađi tu biblioteku i pročitaj je tačno ovdje
int main ( )
Svaki program u C++ mora imati jednu main( ) funkciju. Tip int ispred funkcije određuje tip
vrijednosti koju će po završetku izvođenja vratiti funkcija main( ) sa naredbom return.
Na kraju bloka nalazi se naredba return 0;. Tom naredbom glavni program vraca
pozivnom programu broj 0, a to je poruka operativnom sistemu da je program uspješno
završen ( 0 znači OK ).
U programskim jezicima funkcija je obično potprogram koji vraća neku vrijednost ili rezultat,
mada imamo i funkcije koje ne vraćaju nikakvu vrijednost, odnosno funkcije koje vraćaju
void (void znači ništa).
Nakon zaglavlja funkcije slijedi tijelo funkcije.
Tijelo funkcije počinje znakom "{", a završava znakom "}".
Između vitičastih zagrada nalaze se nijedna ili više naredbi, odnosno blok naredbi i taj blok
naredbi čini tijelo funkcije.
Naredbe određuju ili definišu redoslijed izvršavanja programa, izračunavaju vrijednosti ili ne
rade ništa . Svaka naredba u C++ završava sa znakom
";"
Komentar:
// ovo je komentar, a sledi naredba
// izlaza

"cout"
Operatorom
je naredba za ispis i uvijek se piše:
"<<"
cout<<
upućuje se podatak koji slijedi na ekran
( output stream )
Tekst “Programiranje " koji se nalazi između navodnika, predstavlja niz znakova koji šaljemo
na izlaz (ekran).
cout<<"programiranje"<<endl;
Dakle, gornja naredba se može interpretirati kao: Pošalji niz znakova: “Programiranje " na
ekran.
Dragana T.
školska: 2009 / 2010
3
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Isti program možemo napisati i ovako:
#include<iostream>
using namespace std;
int main( )
{
cout<<"programiranje"<<endl;
return 0;
}
using namespace std;
omogućuje pristup standardnom prostoru sa imenima
( namespace) koji se naziva std.
Pitanja:
1 Šta znači: #include
2 Kakva je uloga main( ) funkcije
3 Kakvu poruku predstavlja naredba return 0 ?
4 Napiši deklaraciju funkcije main() koja ne vraca ništa i objasni
5 Kako počinje i završava blok naredbi u C++ ?
6 Kako se završava svaka naredba u C++?
Komentari
Komentar sadrži tekst koji se ne prevodi na mašinski jezik.
Sve što sledi posle znaka "//" ignoriše se od strane kompajlera.
Sve unutar znakova "/*" i "*/" se ignoriše.
Komentari dakle ne ulaze u izvršni kôd programa i služe programerima za opis značenja
pojedinih naredbi ili dijelova kôda.
Komentari se mogu pisati u zasebnom redu ili redovima, što se obično odnosi za duže opise, na
primjer šta određeni program ili funkcija radi.
Za krace komentare, na primjer za opise promjenljivih ili nekih operacija, komentar se piše u
nastavku naredbe.
Dragana T.
školska: 2009 / 2010
4
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
// ovo je komentar
/* i ovo je komentar
napisan u dva reda */
int main( )
return 0;
// int znači da funkcija main kao rezultat vrača cjelobrojnu vrednost
/*
void main( )
poslije rezervisane reči return pišemo šta vrača funkcija, u ovom slučaju nula
0 znači da je program uspješno završen */
/* void znači da funkcija main ne vrača ništa, i na kraju ove funkcije ne pišemo
naredbu return 0; */
cout<<"programiranje"<<endl;
/*
endl; znači ispiši tekst programiranje na izlazu a
zatim prebaci kursor u sledeći red
*/
Identifikatori
U mnogim dijelovima C++ programa (promjenjivim, funkcijama, klasama) potrebno je dati
određeno ime, tzv. identifikator.
Imena koja dodjeljujemo identifikatorima su proizvoljna, uz uslov da se poštuju sljedeća
pravila:
 Identifikator može biti sastavljen od kombinacije slova iz engleske abecede (A - Z, a - z),
brojeva (0-9) i znaka za podcrtavanje "_"
 Prvi znak mora biti slovo ili znak za podcrtavanje ( identifikator ne sme počinjati brojem)
 Identifikator ne smije biti jednak nekoj rezervisanoj riječi (asm, auto, delete, do...) ili
nekoj od alternativnih oznaka operatora (and, not, or, xor...).
 Programski jezik C++ razlikuje velika i mala slova u imenima
 Imena promenljivih koja su dobro odabrana asociraju korisniku za šta se koriste!
Rezervisane reči u C++
asm
continue
float
new
signed
try
auto
default
for
operator
sizeof
typedef
break
delete
friend
private
static
union
case
do
goto
protected
struct
unsigned
catch
double
if
public
switch
virtual
char
else
inline
register
template
void
class
enum
int
return
this
volatile
const
extern
long
short
throw
while
Dragana T.
školska: 2009 / 2010
5
PROGRAMIRANJE I PROGRAMSKI JEZICI
Pitanja:
1.
2.
3.
4.
C++
IIIe2, IIIe3
Komentari služe za...
Kako pišemo komentare, napiši primjer i objasni
Identifikatori su...
Navedi pravila pisanja identifikatora
Osnovni tipovi podataka
Svaki program koji nešto radi, sadrži podatke koje obrađuje. Ti podaci mogu biti u obliku
promjenjivih i konstanti.
Promjenjive mogu mijenjati svoju vrijednost, dok su konstante stalne u toku izvođenja
programa.
Svaku promjenjivu koju koristimo u programu moramo deklarisati.
Deklaracija promjenjive može se nalaziti ispred funkcije main – u tom slučaju se radi o tzv.
globalnoj promjenjivoj, odnosno, promjenjivoj dostupnoj u svim dijelovima programa.
#include<iostream>
using namespace std;
int x,y;
// x i y su globalne cjelobrojne promjenjive
void main( )
{
x=5;
y=3;
cout<<x+y<<endl;
}
Također promjenjivu možemo deklarisati i unutar bilo koje funkcije u programu:
#include<iostream>
using namespace std;
void main( )
{
int x,y;
// x i y su lokalne cjelobrojne promjenjive
x=5;
Dragana T.
školska: 2009 / 2010
6
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
y=3;
cout<<x+y<<endl;
}
Promjenjivu deklarišemo tako da navedemo prvo njen tip a zatim naziv:
int x;
int a=2;



Svaki podatak ima dodijeljenu oznaku tipa koja govori o tome kako se dotični podatak
smješta u memoriju računara, koji su njegovi dozvoljeni rasponi vrijednosti, kakve su
operacije moguće s tim podatkom i sl.
U C++ sve promenljive moraju imati tip.
U C++ sve promenljive moraju se prvo deklarisati da bi se mogle koristiti.
Tipovi promjenjivih

Integer – ( cjelobrojni tip ) cjelobrojni brojevi:
short
godina=18;
int
plata=22000;
long
cena=420000;
unsigned int vek=21;
(zauzima 2 bajta) (signed)
(zauzima 2 bajta) (signed)
(zauzima 4 bajta) (signed)
(može primiti samo poz. vrednosti)
 Realni brojevi ( realni tip ) :
float
kamata=0.01;(zauzima 4 bajta)
double
pi=3.141592654;(zauzima 8 bajtova)
long double rad=4.11E-3; (zauzima 10 bajtova)
 Char – ( znakovni tip ) slova:
char
unsigned
Dragana T.
ch_1=‘A’, ch_3= -42; (zauzima 1 bajt) (signed)
ch_2=2;
školska: 2009 / 2010
7
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Brojevi
U programski jezik C++ ugrađena su dva osnovna tipa brojeva: cijeli brojevi (eng. integers ) i
realni brojevi (eng. floating-point ).
 Cjelobrojna promjenjiva deklariše se sa int . Raspon promjenjive int je od -32768 do
32767.
int a=5;
int b(2);
Ako se ukaže potreba za većim cijelim brojevima promjenjivu možemo deklarirati sa long int
ili samo long .
long int c = 548234581;
int x = a + 4 ; // ovo je izraz
a =b = c + d
//Ovo je OK!
a =b + 3 = c
//GREŠKA!
Ako je potrebno računati sa decimalnim brojevima, najčešće se koriste promjenjive
tipa float i double :
float pi= 3.141593;
float nabojelektrona=-1.6e-19;
Praznine unutar broja, na primjer iza predznaka, ili između cifara i slova «e» nisu
dozvoljene.

Znakovi
Znakovne konstante tipa char pišu se uglavnom kao samo jedan znak unutar jednostrukih
znakova navoda:
char Slovo = 'a';
cout << 'b' << endl;
char konstante i promjenjive mogu se upoređivati poput brojeva:
cout << ('a' < 'b') << endl;
cout << (a < B) << endl;
cout << ('A' > 'a') << endl;
pri čemu se u biti upoređuju njihovi brojni ekvivalenti u nekom od standarda. Najrašireniji je
ASCII niz (skraćenica od American Standard Code for Information Interchange) u kojem su
svim ispisanim znakovima, brojevima i slovima engleskog alfabeta pridruženi brojevi od 32 do
127, dok specijalni znakovi imaju kôdove od 0 do 31 uključivo. U prethodnom primjeru, prva
naredba ispisuje 1, jer je ASCII kôd malog slova a (97) manji od kôda za malo slovo b (98).
Dragana T.
školska: 2009 / 2010
8
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Druga naredba ispisuje 0, jer je ASCII kôd slova B jednak 66 (nije važno što je B po abecedi iza
a!). Treća naredba ispisuje 0, jer za veliko slovo A kôd iznosi 65.
Logički tip podataka
Logički podaci su takvi podaci koji mogu poprimiti samo dvije vrijednosti, na primjer:
da/ne, istina/laž, dan/noć. Jezik C++ za prikaz podataka logičkog tipa ima ugrađen tip
bool, koji može poprimiti vrijednosti true (engl. true - tačno) ili false (engl. false pogrešno):
bool JeLiDanasNedjelja = true;
bool SunceSije = false;
Pri ispisu logičkih tipova, te pri njihovom korištenju u aritmetičkim izrazima, logički tipovi se
pretvaraju u int: true se pretvara u cjelobrojni
1,
a false u
0.
Konstante
U programima se često koriste simboličke veličine čija se vrijednost tokom izvođenja ne želi
mijenjati. To mogu biti fizičke ili matematičke konstante, ali i parametri poput maksimalnog
broja prozora ili maksimalne dužine znakovnog niza, koji se inicijalizuju prije prevođenja kôda
i ulaze u izvršni kôd kao konstante
Konstante definišemo navođenjem ključne riječi const, tipa podataka i naziva konstante, a
zatim joj odmah dodjeljujemo vrijednost. U main funkciji, konstanta više ne može promijeniti
vrijednost. Na svaki pokušaj promjene vrijednosti takve promjenljive, kompajler će javiti
grešku:
const double pi = 3.14159265359;
pi = 2 * pi;
// greška!
Drugi često korišteni pristup zasniva se na predprocesorskoj naredbi #define:
#define PI 3.14159265359
Dragana T.
( na kraju ovog reda ne piše se tačka-zarez)
školska: 2009 / 2010
9
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Miješanje tipova promjenljivih u brojnim izrazima
U brojnim izrazima možemo navoditi promjenljive deklarisane različito; možemo miješati
tipove. Uopšteno, C++ vrši konverziju “manjeg” tipa u “veći”. Npr. ako dodate double na
integer promjenljivu, C++ najprije pretvori integer u double, a zatim vrši sabiranje.
Rezultat je, naravno, tipa float. Automatska konverzija je samo privremena, te se nakon
izvršene operacije tip podataka zapravo ne mijenja.
Šta učiniti želimo li podijeliti dvije cjelobrojne promjenljive, a da pritom ne izgubimo
decimalna mjesta?
Za eksplicitnu promjenu tipa varijable primijenjujemo operator dodjele tipa (engl. type
cast, kraće samo cast):
int a = 1;
int b = 3;
float c = (float)a / (float)b;
Navođenjem rezervisanih riječi float u zagradama ispred operanada njihove vrijednosti se
pretvaraju u decimalne brojeve prije operacije dijeljenja, tako da je rezultat korektan.
Da ne bi bilo zabune, same varijable a i b i nadalje ostaju tipa int.
Pitanja:
1.
2.
3.
4.
5.
6.
7.
Zadatak
Napišite
Zadatak
Napišite
Koji su to osnovni tipovi podataka?
Kako se deklariše cjelobrojna varijabla?
Kako se deklariše realna varijabla?
Znakovni tip podataka
Konstante
Logički tip podataka
Objasniti miješanje tipova
1
program koji će ispisati na ekranu vaše ime i adresu.
2
program koji će na ekranu ispisati u jednom redu brojeve 2002 i 12.34.
Dragana T.
školska: 2009 / 2010
10
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Standarni ulaz/izlaz
Naredba izlaza cout<<
Za ispis vrijednosti koristi se naredba
cout<<, a za učitavanje podataka sa tastature naredba
cin>>. Da bismo koristili cout<< i cin>>, u program moramo uključiti biblioteku standarnih
ulazno/izlaznih funkcija iostream.h.
cout<< šalje podatke na standardni izlazni uređaj. Standardni izlazni uređaj je monitor, iako
se izlaz može preusmjeriti i na drugi uređaj. U opštem slučaju, cout<< koristimo na slijedeći
način:
cout << podaci << podaci;//svaki novi podatak koji šaljemo na izlaz pišemo poslije <<
pri čemu podaci mogu biti promjenljive, niz znakova, izrazi ili njihova kombinacija. Npr. da bismo
odštampali rečenicu: “Ja ucim programiranje.” zadajemo naredbu
Kursor ostaje
cout << “ Ja ucim programiranje “;
Izlaz:
Ja ucim programiranje _
da treperi posle
ispisanog teksta
cout<< ne obezbjeđuje automatski prelazak kursora u slijedeću liniju. To znači da će nakon
izvršavanje naredbe cout kursor ostati u istom redu, iza poslednjeg odštampanog karaktera
stringa navedenog u navodnicima.
Za prelazak u novi red koristimo objekat endl :
cout << “ Ja ucim programiranje “<<endl;
ili možemo upotrebiti “\n”;
cout << “ Ja ucim programiranje\n”;
Izlaz:
Ja ucim programiranje
_
Poslije
ispisanog teksta
kursor je
prebačen u
novi red
cout može kao parametre uzimati i promjenljive. Prilikom štampanja, cout će odštampati
vrijednosti promjenljive. Npr.
Izlaz:
int i;
5
i=5;
cout << i;
Umjesto nevedene naredbe cout, možemo navesti i
cout << “i=” << i;
Izlaz:
i=5
Kao parametar cout možemo zadati i izraz. Tako npr.
Dragana T.
školska: 2009 / 2010
11
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
cout << “zbir=” << (i+j);
prikazat će na ekranu zbir= “ zbir vrijednosti promjenljivh i i j”
Šta će biti odštampano nakon slijedećih naredbi?
cout << “Linija 1”; cout << “Linija 2”; cout << “Linija 3”;
Odgovor je
Linija 1Linija 2 Linija3
što vjerovatno ne želite. cout omogucava formatiranje izlaza korištenjem skupa specijalnih
karaktera. Tako npr., u cout možete uključiti specijalan karakter \n koji nazvačava prelazak na
novu liniju, kada god želite pomjeriti kursor nakon ispisa stringa navedenog u cout. To postižemo
naredbom:
cout << “Linija 1\n”;
cout << “Linija 2\n”;
cout << “Linija 3\n”;
što daje kao rezultat:
Linija 1
Linija 2
Linija 3
Ukoliko želimo preskočiti više od jedne linije, zadajemo onoliko \n koliko linija želimo preskočiti.
Ako želimo štampati tabelu možemo koristi specijalni karakter \t. Npr. da bismo odštampali
tabelu u kojoj prikazujemo broj učenika koji uče ruski i engleski po razredima, program bi
izgledao ovako:
#include <iostream.h>
int main( )
{
cout << "razred" << "\tRusi" << "\tEnglezi" << "\n";
cout <<"IIe1\t20\ t 8\n";
cout <<"IIe2\t15\ t 13\n";
cout <<"IIe3\t5\ t 23\n";
return 0 ; }
Dragana T.
školska: 2009 / 2010
12
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Pored spomenutih, za formatiranje izlaza možemo koristiti i druge specijalne znakove, kao što je
prikazano :
novi red
horizontalni tabulator
zvučni signal (alert)
\n
\t
\a
Naredba ulaza cin>>
cin >> promjenljiva;
cin učitava vrijednost koju korisnik unosi pomoću tastature i dodjeljuje je promjenljivoj čije ime
navedemo kao parametar.
Postoji velika razlika između dodjele vrijednosti promjenljvoj pomoću cin i pomoću operatora
dodjele( = ).
Iako obje naredbe u osnovi dodjeljuju vrijednost promjenljivoj, dodjela vrijednosti
promjenljivoj pomoću operatora dodjele vrši se unutar programa. Naredbom dodjele programer
tačno definiše egzaktnu vrijednost promjenljivoj. Svaki put kada startujete program, ta
promjenljiva dobit će istu vrijednost.
Kada koristite cin, promjenljiva će dobiti vrijednost koju korisnik učita. To može biti bilo koja
vrijednost i ovisi o korisniku.
Korištenje cin može biti uzrok problema – cin očekuje da korisnik upiše tačno određeni tip
podataka. Npr. ako je parametar cin promjenljiva tipa int, onda korisnik može upisati samo cio
broj. U principu, korisnik može postupiti i drugačije. Da bi se ovo izbjeglo može pomoći ako prije
svakog cin zadamo i cout u kome korisniku ispišemo kakvu vrijednost od njega očekujemo. Npr.
cout << “Unesite cio broj =”;
cin>> i;
Pomoću cin možemo učitati i više od jedne promjenljive. Npr.
cin >> i >> j >> k;
očekuje od korisnika tri brojne vrijednosti. Nakon unosa svake od tih vrijednosti korisnik mora
pritisnuti taster Enter da bi omogučio učitavanje slijedeće vrijednosti
Dragana T.
školska: 2009 / 2010
13
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
OPERATORI
Da bismo objekte u programu mogli mijenjati, na njih treba primjeniti odgovarajuće
operacije.
Operator pridruživanja:
Operatorom pridruživanja mjenja se vrijednost nekog objekta (variable), pri čemu tip objekta
ostaje nepromjenjen .Najčešći operator pridruživanja je (=), kojim se objektu na ljevoj strani
pridružuje neka vrijednost s desne strane.
primjer:
int i = 5;
i = 3;
cout << i ;
U prvom redu primjera deklariše se cjelobrojna promjenjiva te joj se pridružuje 5. U drugom
redu promjenjivoj je pridružen broj 3.U zadnjem redu ispisuje se nova vrijednost promjenjive
tj. 3.
Operator dodjele tipa:
Ponekad je potrebno podijeliti dvije cijelobrojne varijable te rezultat pridružiti nekoj realnoj
varijabli:
primjer:
int Brojnik = 1;
int Nazivnik = 4;
float Kolicnik = Brojnik / Nazivnik;
cout << Kolicnik << endl;
Izvođenjem ovog primjera na ekranu će se ispisati nula. Iako je rezultat djeljenja pridružen
realnoj promjenjivoj, to pridruživanje slijedi tek nakon što je operacija djeljenja dva cijela
broja završena, pa je prevodilac automatski odbacio decimalna mjesta rezultata.
Za dobivanje točnog rezultata potrebno je koristiti operator dodjele tipa, s njime bi naš
primjer izgledao ovako:
int Brojnik = 1;
int Nazivnik = 4;
float Kolicnik = (float)Brojnik / (float)Nazivnik;
cout << Kolicnik << endl;
Dragana T.
školska: 2009 / 2010
14
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Navođenjem ključnih riječi float u zagradama ispred operanada, njihove vrijednosti
pretvaraju se u decimalne prije operacije djeljenja, tako da je rezultat korektan.
Aritmetički operatori
Za ugrađene tipove podataka definirani su osnovni operatori
(sabiranje,oduzimanje,množenje,dijeljenje).
Ti operatori se mogu podijeliti na unarne, koji djeluju samo na jedan objekt, te na
binarne za koje su neophodna dva objekta.
Unarni operatori: +x, -x, x++, ++x, x--, --x.
predznaci
+X unarni plus
-X unarni minus
inkremencija
X++ uvećaj nakon
primjer:
int i=1;
cout<<(i++)<<endl; // ispisuje 1, pa tek onda povećava ’i’
++X
uvećaj prije
primjer:
int i=1;
cout<<(++i)<<endl; // ispisuje 2
dekremencija
X-- umanji nakon
--X
umanji prije
Operator ++ uvećava vrijednost varijable za 1, a operator -- umanjuje vrijednost varijable za 1.
Tako naredbe:
x=x+1
z=z-1
možemo zamijeniti naredbama:
x++
z—
Operator inkrement (dekrement) različito se ponaša kada je napisan ispred promjenljive i kada
Dragana T.
školska: 2009 / 2010
15
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
je napisan iza nje.
Binarni operatori:
x + y
sabiranje
x - y
oduzimanje
x * y
množenje
x / y
dijeljenje
x % y
modul
binarni operatori
(vraća ostatak dijeljenja dva cijela broja)
Operator
Primjer
ekvivalentan izraz
+=
-=
*=
/=
%=
x+=500;
x=x+500;
x-=50;
x=x-50;
x*=1.2;
x=x*1.2;
x/=.50;
x=x/.50;
x%=7;
x=x%7;
operator
ime
primer
rezultat
+
sabiranje
12 + 4.9
16.9
-
oduzimanje
3.98 - 4
-0.02
*
množenje
2*3.4
6.8
/
deljenje
9/2.0
4.5
%
ostatak
deljenja
13%3
1
Dragana T.
školska: 2009 / 2010
16
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Logički operatori
Logički operatori koriste se za formiranje složenih logičkih izraza. C++ koristi sledeće logičke
operatore:
operator
ime
primer
negacija
!(5==5)
&&
Logičko I (AND)
5<6 && 6<6 // daje 0
||
Logičko ILI (OR)
5<6 || 6<6 // daje 1
!
// daje 0
Rezultat logičke operacije je 0 ili 1
Naredni primer ilustruje upotrebu logičkih operatora:
#include<iostream.h>
main( )
{
int i=1;
int j=0;
cout<< (i&&j)<<'' ''<<(i || j)<< '' ''<< (!i)<<endl;
return 0;
}
i ima rezultat : 0 1 0
Operatori poređenja
Operatori poređenja koriste se za formiranje jednostavnih logičkih izraza. Kao rezultat
poređenja dobija se logička vrednost : 0 - logička laž ili 1 - logička istina.
<
>
<=
>=
Dragana T.
manje od
veće od
manje ili jednako
veće ili jednako
školska: 2009 / 2010
17
PROGRAMIRANJE I PROGRAMSKI JEZICI
= =
!=
C++
IIIe2, IIIe3
jednako
različito
Naredni primer ilustruje upotrebu operatora poređenja:
#include<iostream.h>
main()
{
cout<<(5= = 5)<<endl; //1
cout<<(5<=4)<<''\n''; //0
return 0;
}
Operator
Ime
Primer
Rezultat
==
jednakost
5==5
1
!=
nejednakost
5!=5
0
<
manje od
5<5.5
1
<=
manje ili jednako
5<=5.5
1
>
veće od
5>5
0
>=
veće ili jednako
6.3>=5
1
Bit operatori
Obzirom da se svaki podatak interno predstavlja u binarnom zapisu, kao niz bitova, u nekim
slučajevima su potrebne efikasne metode za manipulisanje pojedinačnim bitovima. U jezicima C i
C++ na raspolaganju je šest operatora:
Dragana T.
&
konjukcija na nivou bitova
|
disjunkcija na nivou bitova
^
ekskluzivna disjunkcija na nivou bitova ( isključivo ili)
~
komplement na nivou bitova
>>
pomeranje udesno sa postavljanjem levih bitova na 0
školska: 2009 / 2010
18
PROGRAMIRANJE I PROGRAMSKI JEZICI
<<
C++
IIIe2, IIIe3
pomeranje ulevo sa postavljanjem desnih bitova na 0
Naredni primer ilustruje upotrebu operatora za operacije na nivou bitova:
#include<iostream.h>
main( )
{
unsigned char a=85;
unsigned char b=~a;
//komplement od a
cout<<(int)a<<endl; //85
cout<<(int)b<<endl; //170
return 0;
}
Ovaj primer će ispisati broj 85 i njegov bitovni komplement, broj 170
Operator sizeof
Operator sizeof je unarni operator koji kao rezultat daje broj bajtova što ih operand zauzima u
memoriji računala:
primjer:
cout <<“Veličina memorije za čuvanje podatka tipa int je :”<< sizeof(int) <<” bajtova” << endl;
Ispisuje 2;
Operator sizeof primjenjuje se na izraze kod kojih se traži dužina rezultata.Ti izrazi mogu biti
pokazivači, reference, polja, korisnički definirane klase, strukture, unije i objekte.
Pitanja:
1.
2.
3.
4.
5.
6.
7.
8.
Dragana T.
Koja se naredba koristi za ispis vrijednosti na izlaz
Koju naredbu koristimo da bi dodjelili vrijednost nekoj promjenjivoj sa tastature
Čemu služe operatori
Objasniti unarne operatore
Binarni operatori
Bit operatori
Objasni sizeof operator
Logički operatori
školska: 2009 / 2010
19
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
NAREDBE ZA KONTROLU TOKA PROGRAMA
Izvođenje programa ponekad zavisi od ulaznih podataka ili od međurezultata obrade
Struktura kod koje se zavisno od stanja podataka izvršava jedan od mogućih dijelova
programa naziva se grananje.
Grananje toka naredbom if
Naredba if omogućava uslovno grananje toka programa ovisno o tome da li je ili nije zadovoljen
uslov naveden iza ključne riječi if:
if (a<0)
Jednostruki izbor:
if (a<0)
cout<<''Broj a je negativan!''<<endl;
}
// kraj
U slučaju da: ako je uslov tačan treba da se izvrše
dvije ili više naredbi (te naredbe pišemo u bloku
između velikih zagrada ):
DA
NE
a<0
Broj je negativan
if ( a<0 )
{
// početak bloka naredbi
cout<<”a=”<<a<<endl;
cout<<''Broj a je negativan!''<<endl;
}
// završetak bloka naredbi
} // kraj
kraj
Ako je vrijednost logičkog izraza tačna (ako je a<0 ->DA) izvršava se blok naredbi
koji se nalazi posle if naredbe (cout<<''Broj a je negativan!''<<endl; a zatim kraj )
Ako je vrijednost logičkog izraza netačna prva naredba ili blok naredbi posle if
naredbe se preskače i izvršavaju naredne naredbe ( u ovom slučaju kraj).
uslov koji se javlja u naredbi if (kao i u drugim kontrolnim strukturama) je Boolean tipa - ili je
tačan (true) ili netačan (false).
U C++: vrednost 0 je false (netačno)
sve ostale vrednosti su true (tačno)
Dragana T.
školska: 2009 / 2010
20
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Dvostruki izbor
Želimo li da se ovisno u rezultatu izraza u if uslovu izvode dva nezavisna programska odsječka,
primijenit ćemo sljedeći oblik uslovnog grananja:
if (neki_uslov)
{
DA
a>b
naredba_1;
naredba_2;
...;
NE
direktni blok
}
else
naredba_1;
naredba_2;
naredba_3;
naredba_4;
{
naredba_3;
naredba_4;
... ;
kraj
alternativni blok
}
Kod ovog oblika, ako izraz u if uslovu daje rezultat različit od nule, izvest će se prvi blok
naredbi (direktni blok). Po završetku bloka izvođenje programa nastavlja se od prve naredbe iza
drugog bloka. Ako izraz daje kao rezultat nulu, preskače se prvi blok, a izvodi samo drugi blok
(alternativni blok) naredbi, nakon čega se nastavlja izvođenje naredbi koje slijede.
Uslovni operator
?
Iako ne spada među naredbe za kontrolu toka programa, uslovni operator po strukturi je sličan
if-else bloku :
uslov ? izraz1 : izraz2 ;
Ako izraz uslov daje logičku istinu, izračunava se izraz1, a u protivnom izraz2. U primjeru:
x = (x < 0) ? -x : x;
// x = abs(x)
ako je x negativan, izračunava se prvi izraz, te se varijabli x na lijevoj strani znaka jednakosti
pridružuje njegova pozitivna vrijednost, tj. varijabla x mijenja svoj predznak. Naprotiv, ako je x
pozitivan, tada se izračunava drugi izraz i varijabli x na lijevoj strani pridružuje njegova
nepromijenjena vrijednost.
Izraz u uslovu mora kao rezultat vraćati aritmetički tip ili pokazivač. Alternativni izrazi desno
od znaka upitnika moraju davati rezultat istog tipa ili se moraju dati svesti na isti tip preko
Dragana T.
školska: 2009 / 2010
21
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
ugrađenih pravila konverzije. Uslovni operator koristite samo za jednostavna ispitivanja kada
naredba stane u jednu liniju. U protivnom kôd postaje nepregledan.
Primer upoterbe uslovnog operatora:
#include<iostream.h>
int main()
{
int a;
cout<<"a=";
cin>>a;
cout<< (a>0 ? ("pozitivan broj") : ("negativan broj"))<<endl;
return 0;
}
Zadatak:
1. Napisati program koji proverava da li je unesena celobrojna vrednost: paran ili neparan
broj.
2. Napisati program koji proverava da li je unesena celobrojna vrednost: paran ili neparan
broj i ako se radi o parnom broju ispisuje rezultat njegovog deljenja sa 2.
Složenija naredba izbora je naredba switch :
Operator switch
Kada izraz uslova daje više različitih rezultata, a za svaki od njih treba provesti različite
odsječke programa, tada je umjesto if grananja često preglednije koristiti switch grananje.
Kod tog grananja se prvo izračunava neki izraz koji daje cjelobrojni rezultat.
Ovisno o tom rezultatu, tok programa se preusmjerava na neku od grana unutar switch
bloka naredbi.
Opšta sintaksa switch grananja izgleda ovako:
switch (izraz) {
case konstanta_1:
naredba_11;
naredba_12;
...;
break;
Dragana T.
školska: 2009 / 2010
22
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
case konstanta_2:
naredba_21;
naredba_22;
...;
break;
case konstanta_3:
naredba_31;
naredba_32;
...;
break;
...
case konstanta_N:
naredba_N1;
naredba_N2;
...;
break;
default:
naredba_d1;
naredba_d2;
...; }
Naredba switch se izvršava na sljedeći način:
vrijednost izraza u zagradi (izraz) iza rezervisane riječi switch se upoređuje sa vrijednosti
neke od konstanti navedenih iza labele case. Ukoliko je vrijednost tog izraza jednaka vrijednosti
neke od konstanti iza labele case, izvršavanje programa se nastavlja od tog mjesta. Ako
vrijednost izraza nije jednaka niti jednoj od vrijednosti konstanti navedenih iza labele case,
izvršavanje programa se nastavlja od mjesta unutar bloka označenog labelom default, ako
postoji. U slučaju da vrijednost izraza nije jednaka vrijednosti neke konstante, a blok naredbi
sa labelom default ne postoji, tada se preskače cijeli switch blok i izvršava se dalji dio
programa.
Default labela je opcionalna (nije obavezna), međutim, korištenje default labele je dobra
programerska praksa. Blok naredbi iza default labele će biti izvršen samo u slučaju ako nije
izvršena niti jedna od case labela.
Dragana T.
školska: 2009 / 2010
23
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Primer:
Napisati program koji proverava da li je uneseno slovo samoglasnik ili ne i ako jeste
ispisuje ga kao veliko slovo:
#include<iostream.h>
main()
{
char a;
cout<<"Unesite jedno slovo:";
cin>>a;
cout<<"Slovo "<<a;
switch (a) {
case 'A':
case 'a':
cout<<" je samoglasnik A."<<endl;
break;
case 'E':
case 'e':
cout<<" je samoglasnik E."<<endl;
break;
case 'O':
case 'o':
cout<<" je samoglasnik O."<<endl;
break;
case 'I':
case 'i':
cout<<" je samoglasnik I."<<endl;
break;
case 'U':
case 'u':
cout<<" je samoglasnik U."<<endl;
break;
default:
cout<<" nije samoglasnik."<<endl;
}
return 0; }
Pitanja:
1. Objasniti if naredbu-jednostruki izbor
2. Objasniti if naredbu-dvostruki izbor
3. Kada koristimo switch naredbu grananja
Dragana T.
školska: 2009 / 2010
24
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Operator for
Često u programima treba ponavljati dijelove programa. Ako je broj ponavljanja poznat prije
ulaska u petlju, najprikladnije je koristiti for petlju.To je najopštija vrsta petlje i ima sljedeći
oblik:
for ( početni_izraz ; uslov_izvođenja ; izraz_prirasta)
blok naredbi
Postupak izvođenja for ciklusa je sljedeći:
n = 10
1. Izračunava se početni izraz. Najčešće je to
pridruživanje početne vrijednosti brojaču kojim se
kontroliše ponavljanje petlje
i=1
ne
i <= n
da
i
prekid
ponavljanja
i=i+1
2. Izračunava se uslov izvođenja, izraz čiji rezultat
mora biti tipa bool. Ako je rezultat jednak logičkoj
neistini, preskače se blok naredbi i program se
nastavlja prvom naredbom iza bloka
3. Ako je uslov izvođenja jednak logičkoj istini, izvodi se
blok naredbi
4. Na kraju se izračunava izraz prirasta. Program se
vraća na početak petlje,te se ona ponavlja od tačke 2.
Primjer: Napisati for naredbu za štampanje prvih n neparnih brojeva.
#include<iostream.h>
main()
{
int n;
cout<<"n=";
cin>>n;
int a=1;
for (int i=1; i<n; i++)
{
cout<<a<<endl;
Dragana T.
školska: 2009 / 2010
25
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
a=a+2;
}
return 0;
}
Zadatak
1. Napisati for petlju kojom se izračunavaju i štampaju svi brojevi djeljivi sa 5 do n.
2. Napisati program koji izračunava sumu parnih ( neparnih) brojeva od 1 do zadatog
broja n.
Pitanja:
1. Objasnite djelovanje for petlje.
2. Objesniti ulogu početnog izraza, uslova izvođenja i izraza prirasta
3. Šta je to “beskonačna petlja”. Kako može nastati?
4. Napisati program koji ispisuje prvih10 brojeva u jednoj koloni
5. Napisati program koji ispisuje prvih10 brojeva u jednom redu
6. Napisati program koji ispisuje prvih10 brojeva u jednoj koloni od broja 10 do 0
7. Napisati program koji ispisuje prvih10 brojeva u jednom redu od broja 10 do 0
8. Napisati program koji ispisuje u jednoj koloni
brojeve od 1 do 20 djeljive sa 2
Operator while
while petlja se koristi uglavnom za ponavljanje dijela programa kod kojeg broj ponavljanja nije
unapred poznat. Sintaksa while bloka je:
while (uslov_izvođenja)
blok_naredbi
uslov izvođenja je izraz čiji je rezultat tipa bool.
Redosled izvođenja while petljeje sljedeći:
a=1
1. izračunava se logički izraz uslov_izvođenja.
ne
a <10
2. ako je rezultat jednak logičkoj neistini, preskače se
blok_naredbi i program se nastavlja od prve
naredbe posle while petlje.
da
a
a ++
Dragana T.
Prekid ponavljanja
3. ako je uslov_izvođenja jednak logičkoj istini izvodi
se blok_naredbi. Zatim se program vraća na while
naredbu i izvodi od tačke 1.
školska: 2009 / 2010
26
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
//napisati program koji sabira 10 cijelih brojeva
//sa ulaza i ispisuje njihov zbir
#include<iostream.h>
void main()
{
int i,n,s;
s=i=0;
while (i<10)
{
cout<<"unesi broj:";
cin>>n;
s+=n;
i++;
}
cout<<"zbir je: "<<s<<endl;
}
do-while petlja
Za razliku od naredbe while, naredba do proverava ispunjenost uslova tek nakon izvršavanja
date naredbe, zbog čega se ona obavezno izvršava bar jedanput.
Sintaksa naredbe do je:
do
naredba;
while(neki_uslov);
Primer: Napisati program koji sabira brojeve sa ulaza sve dok se ne unese 0.
#include<iostream.h>
main()
{
int n,s;
s=0;
do {
cin>>n;
s+=n;
} while ( n!=0 ) ;
cout<<''Zbir je ''<< s<<endl;
return 0; }
Dragana T.
školska: 2009 / 2010
27
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
//kontrola unosa podataka:korisnik unosi podatak tako dugo dok ne unese ispravan
#include<iostream.h>
void main()
{
int ocjena;
do {
cout<<"Unesi ocjenu:";
cin>>ocjena;
}
while((ocjena<1)||(ocjena>5));
cout<<"ocjena:"<<ocjena<<endl;
}
Naredbe break , continue i goto
Naredba break može se koristiti samo u petljama i u switch grananjima. Ovom naredbom u
petljama se prekida izvođenje: for, while ili do while petlje.
//Pomoću while ciklusa unositi proizvoljne cijele brojeve, za svaki neparni broj //neka piše
komentar "neparan broj!", a ako unesemo paran broj upotrebiti break //naredbu koja će
prekinuti izvođenje ciklusa
#include<iostream.h>
int main ( )
{
int i,n;
i=1;
while(i<4)
//početak ciklusa, ispitivanje uslova
{
cout<<("unesite jedan broj:");
cin>>n;
if (n %2==0) //ako je ostatak celob.delenja jednak nuli
break;
//(broj je paran) prekida se izvđenje ciklusa
cout<<"neparan broj: "<<n<<endl;
i++;
}
return 0;
}
Dragana T.
školska: 2009 / 2010
28
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Naredba continue takođe uzrokuje skok programa na kraj petlje, ali se zatim njeno ponavljanje
nastavlja.
Treba izbjegavati često korištenje break i continue naredbi u petljama, jer one narušavaju
struktuiranost programa.Koriste se samo za posebna stanja, kada ne postoji drugi prikladan
način da se izvođenje naredbi prekine.Naredba continue može se izbjeći if blokom.
Naredba goto omogućava bezuslovni skok na neku drugu naredbu unutar iste funkcije.Opšti oblik
je:
goto ime_oznake;
ime_oznake (identifikator) je simboličko ime koje se mora nalaziti ispred naredbe na koju se
želi prenijeti kontrola, odvojen znakom
: (dvotačka).
Naredba na koju se želi skočiti može se nalaziti bilo gdje (ispred ili iza naredbe goto) unutar
iste funkcije.
Pitanja:
1. operator for
2. operator while
3. Naredbe break , continue i goto
4. do while petlja
Dragana T.
školska: 2009 / 2010
29
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
String
U C++ postoji tip string, koji predstavlja niz znakova kojima se obraćamo jednim imenom.
Nakon brojeva, stringovi su sledeći najčešće korišćeni tipovi podataka u mnogim programima.
° String tip nije osnovni tip podataka kao npr. char, int ili float.
° Definiše se u <string> biblioteci i dio je ANSI standarda za C++.
#include<iostream>
Ako će u programu biti primenjen tip podataka string
#include<string>
obavezno se mora uključiti biblioteka <string> u
zaglavlje programa
using namespace std;
int main( ) {
string ime,prezime;
cout<<"unesite ime:";
cin>>ime;
cout<<"unesite prezime:";
cin>>prezime;
cout<<"\n\n\tIme\tPrezime\n\n";
cout<<"\t"<<ime<<"\t"<<prezime<<endl;
return 0;
}
U mnogim slučejevima važno je odrediti dužinu stringa, npr.
#include<iostream>
#include<string>
using namespace std;
int main( ) {
string grad;
Funkcija koja vraća
cout<<"unesite naziv grada:";
dužinu stringa
cin>>grad;
cout<<"grad:"<<grad<<endl;
cout << "Duzina stringa " <<grad<< "je " << grad.length( );
return 0;
}
Ukoliko želimo dva stringa spojiti u treći, onda možemo
koristiti operator +. Operatori =, kao i obično za dodjelu vrijednosti.
npr.
string s1,s2,s3;
s3=s1+s2;
Pitanja:
1. Kada koristimo string promjenjive
2. Kako možemo provjeriti kolika je dužina stringa
3. Kako se spajaju string promjenjive
Dragana T.
školska: 2009 / 2010
30
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Pokazivački tip
Jedan od najmoćnijih alata koji su na raspolaganju C++ programeru je pokazivač, kojim se direktno
manipuliše memorijom kompjutera.
Pokazivač je promenjiva koja sadrži memorijsku adresu promenjive na koju pokazuje.
Svaka promjenjiva koja se deklariše u programu tokom svog života zauzima određeni prostor u
memoriji. Mjesto u memoriji koje je dodjeljeno nekoj promjenjivoj određeno je njenom adresom, koja
je fiksna sve dok posmatrana promjenjiva postoji
Npr imamo promjenjivu:
int x=5;
pri nailasku na ovu deklaraciju rezerviše se odgovarajući prostor u memoriji za smještanje sadržaja
( x=5) promjenjive x
adrese ....
1234
1235
1236
1237
1238
1239
1240
1241
5
x
promjenjiva x ima adresu 1237 i na toj adresi smještena je vrijednost 5
int *p;
// ovo je deklaracija pokazivača koji pokazuje na cjelobrojnu vrijednost
adrese ....
1234
1235
1236
1237
1238
1239
1240
1241
5
x
p
Kao i svaka druga promjenljiva, i pokazivačka promjenljiva zauzima određeni prostor u memoriji.
Pokazivaču je moguće dodjeliti adresu nekog objekta (npr. promjenljive) uz pomoć unarnog
prefiksnog operatora “&”,
p=&x;
adrese ....
1234
1235
1236
1237
1238
5
1239
1240
1241
1237
x
p
pokazivač p sada pokazuje na adresu promjenjive x (1237)
cout<<*p // 5
cout<<p // 1237, p je pokazivač koji pokazuje na adresu promjenjive x
cout<<&p // 1240, adresa pokazivačke promjenjive
cout<<&x // 1237, ovo je adresa promjenjive x
Dragana T.
školska: 2009 / 2010
31
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Adresa promenjive može se odrediti upotrebom operatora adresa: &
#include<iostream.h>
int main()
{
int a=5;
cout<<a<<"\t"<<&a<<endl;
//5
0x0012FF7C
return 0;
}
Svaka promenjiva ima adresu.Ta adresa može se čuvati u pokazivaču.
Pokazivač se može deklarisati tako da pokazuje na bilo koji tip podataka.
Kreiranje pokazivača:
1) int *pb=0; ovo je deklaracija pokazivača pb na tip int, to znači da se pb
deklariše za čuvanje adrese od int.
U ovom primjeru pb se inicijalizuje na 0.Pokazivač, čija je vrednost 0,naziva se null pokazivač.Svi
pokazivači, kada se kreiraju, trebalo bi da budu inicijalizovani na nešto.
2) int a,*pb;
a=5;
pb=&a;
// deklaracija pokazivača pb na tip int
// pokazivač pb pokazuje na adresu promjenjive a
3) int *pb=&a
//pokazivaču pb dodjeljuje se adresa promenjive a
Pokazivač pb čuva adresu promenjive a:
cout<<pb;
// 0x0012FF7C
Pomoću adrese koja se čuva u pokazivaču može se pristupiti vrednosti na toj adresi. (indirekcija):
cout<<*pb; // 5
Nekoj novoj promenjivoj c možemo dodjeliti vrednost promenjive a upotrebom pokazivača pb:
c=*pb; //uzmi vrednost koja se čuva na adresi u pb i dodjeli
je promenjivoj c
#include<iostream.h>
int main()
{
int a,*pb;
a=5;
pb=&a;
cout<<a<<"\t"<<&a<<endl;
cout<<*pb<<"\t"<<pb<<endl;
return 0;
}
Pitanja:
1. Šta je to pokazivač i kako se kreira
2. Kako se može provjeriti koja je adresa neke promjenjive
3. Šta se dobija na izlazu poslije naredbe cout<<p ; ako je *p pokazivač na cjelobrojnu vrijednost
4. Šta se dobija na izlazu poslije naredbe cout<<*p ; ako je *p pokazivač na cjelobrojnu
vrijednost
5. Šta se dobija na izlazu poslije naredbe cout<<&p ; ako je *p pokazivač na cjelobrojnu
vrijednost
Dragana T.
školska: 2009 / 2010
32
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
FUNKCIJE
Funkcija je zaseban blok naredbi koji se pišu prije ili poslije main( ).
Funkcija je potprogram (logicka cjelina) koja se poziva i izvodi po potrebi jednom ili veći broj puta na
mjestima gdje je to potrebno.
Korisnik mora znati šta funkcija radi, ali mu nije bitno kako ona to radi.( npr. Funkcija koja računa
površinu kvadrata, funkcija koja određuje maximum od tri unesena broja, ....)
Funkciju treba deklarisati prije prvog poziva,
Svaka funkcija prije svog poziva u programu trebala bi biti deklarisana. Deklaracija saopštava
kompajleru ime, povratni tip i parametre funkcije
primjer deklaracije funkcije koja računa površinu kvadrata:
int Povrsina_Kvadrata ( int a);
ime funkcije
Povratni tip
- Određuje kakav će biti tip podatka kojeg će funkcija
vratitit naredbom return poslije poziva te funkcije
- Vriednost koju funkcija vraća određuje se naredbom
return u definiciji funkcije
- Ako funkcija ne vraća ništa onda se piše da je tip
podatka void
Formalni argumenti ( parametri ) funkcije
- formalni podaci koji se predaju funkciji prilikom
njenog poziva
- njihov je broj proizvoljan, funkcija može biti i bez
argumenata ili sa neodređenim brojem argumenata
- u deklaraciji se imena argumenata mogu izostaviti
Deklaraciju funkcije koja računa površinu kvadrata možemo napisati i ovako:
int Povrsina_Kvadrata ( int);
Definicija funkcije mora oblikom u potpunosti odgovarati deklaraciji ( tip funkcije, broj,
redoslijed i tip argumenata) i sadržati sve naredbe te funkcije.
Definicija saopštava kompajleru kako funkcija radi.
Svi pozivi funkcije će se prilikom povezivanja programa usmjeriti na tu definiciju
Definicija funkcije:
int znači da
funkcija vraća
kao rezultat
cjelobrojnu
vrijednos
int Povrsina_Kvadrata ( int a)
{
int P;
P=a*a;
tijelo funkcije
return P;
}
Poslije return pišemo vrijednost
koju vraća funkcija
Kod funkcije koja ne vaća ništa ne
piše se return
Dragana T.
školska: 2009 / 2010
33
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Funkcije imaju parametre ili argumente (engl. parameters, arguments) koji se zadaju prilikom poziva.
Rezultat funkcije je povratna vrijednost (engl. return value).
Funkcija može pozvati drugu funkciju, ali i samu sebe (rekurzija).
Deklaracija daje prototip funkcije. Ona ne sadržava opis šta i kako funkcija radi.
Funkcija može imati n argumenata, a može biti i bez argumenata
Naredbe koje se izvode po pozivu funkcije čine tijelo funkcije (engl. function body).
I glavni program, main( ), je zapravo funkcija (potprogram), ali onaj koji se poziva od strane
operativnog sistema. Kada se program pokrene, izvršavanje uvijek započinje od funkcije main, bez
obzira gdje se ona nalazi unutar programa. Tijelo funkcije main, je glavni program, dok su sve ostale
funkcije potprogrami. Ostale funkcije se izvršavaju onog trenutka kada se eksplicitno pozovu.
Poziv funkcije se vrši navođenjem njenog imena iza kojeg slijede zagrade, unutar kojih se
navode parametri (argumenti) funkcije, ukoliko postoje.
Korišćenje funkcija u programu zahteva da prvo deklarišete funkciju, pa da je definišete.
Poziv funkcije
Nakon što je funkcija deklarisana, možemo je pozvati iz bilo kojeg dijela programa navođenjem
naziva funkcije sa odgovarajućom listom argumenata:
Povrsina_Kvadrata ( 5 );
Prilikom poziva funkcije formalni argumenti zamjene se sa stvarnim argumentima tj. sa konkretnom
vrijednošću ( npr 5 ):
 broj argumenata u pozivu funkcije mora biti jednak broju argumenata u definiciji funkcije
 tipovi stvarnih argumenata moraju se podudarati sa tipovima odgovarajućih formalnih
argumenata ( istog tipa ili se konverzijom mogu svesti na tipove formalnih parametara)
 imena formalnih argumenata ne moraju biti jednaka imenima stvarnih argumenata
Primer 1. Napisati funkciju koja računa površinu kvadrata. Iz glavnog programa pozvati
funkciju i prikazati površinu za unesenu stranicu kvadrata
#include<iostream.h>
int povrsina(int); //deklaracija funkcije koja računa površinu kvadrata
void main( )
poziv funkcije:povrsina
{
x je stvarni argument
int x;
cout<<"stranica kvadrata je x=:";
cin>>x;
cout<<"povrsina kvadrata je P= "<< povrsina(x) <<endl;
}
// sledi definicija funkcije koja računa površinu kvadrata
int povrsina(int a)
{
return a*a ;
definicija funkcije
}
Dragana T.
školska: 2009 / 2010
34
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Isti zadatak možemo da uradimi i ovako :
naredbe funkcije
Površina_Kvadrata
izvršavaju se pri svakom
pozivu te funkcije u
osnovnom programu
#include<iostream.h>
int povrsina(int x)
{
return x*x ;
}
prvo se izvršavaju naredbe main funkcije
sa tastature unesemo vrednost za
promjenjivu a i zatim sledi poziv funkcije
(i tek tada izvršavaju se naredbe funkcije
Površina_Kvadrata
void main( )
{
int a;
cout<<"stranica kvadrata je a=:";
cin>>x;
cout<<"povrsina kvadrata je P= "<< povrsina(a) <<endl;
}
poziv funkcije:povrsina
x je stvarni argument
Lokalne promenjive
Promenjive deklarisane unutar nekog bloka (uključujući i blok funkcije) su lokalne promenjive i one se
mogu koristiti samo unutar bloka u kojem su i deklarisane.
Globalne promenjive
Pored lokalnih promenjivih postoje i globalne promenjive. To su promenjive koje su deklarisane izvan
svih blokova. Njihov videokrug je cijeli program počevši od mjesta na kojem su definisane pa do kraja
programa.
#include<iostream.h>
int i;
// i je globalna promenjiva
void ispis( )
{
for(i=1; i<5; i++)
cout<<"ispis brojeva:\t"<<i<<endl;
}
void main( )
{
i=10;
cout<<"u funkciji main:\t"<<i<<endl;
ispis();
//poziv funkcije ispis
cout<<"u funkciji main:\t"<<i<<endl;
}
Dragana T.
školska: 2009 / 2010
35
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Zadaci:
1.
2.
3.
4.
5.
6.
7.
8.
Funkcija je…
Objasniti šta je definicija a šta deklaracija funkcije
Kad se izvršavaju naredbe funkcije
Kako pozivamo funkciju
Za koje promjenjive kažemo da su globalne a za koje da su lokalne promjenjive
Napisati funkciju koja računa faktorijel unjetog broja.
Napisati funkciju koja prikazuje parne brojeve
Neka se sa tastature unose brojevi a1,a2 i a3. Napiši funkciju koja prikazuje najveći broj i
program koji poziva tu funkciju.
#include<iostream.h>
void maxmin(int a, int b)
{
int z;
z=(a>b) ? a: b;
cout<<"max je:"<<z<<endl;
definicija funkcije koja traži max od unesena dva broja
return;
}
int main( )
{
int x,y;
cout<<"unesite dva broja:";
cin>>x>>y;
maxmin(x,y); // poziv funkcije
return 0;
}
#include<iostream.h>
#include<conio.h>
int main( )
{
int x,y;
void max(int x,int y); // deklaracija funkcije
cout<<"unesite dva broja:";
cin>>x>>y;
max(x,y); // poziv funkcije
return 0;
}
Dragana T.
školska: 2009 / 2010
36
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
void max(int x, int y)
{
int z;
if (x!=y)
{
z=(x>y) ? x: y;
cout<<"max je:"<<z<<endl;
}
else
cout<<"brojevi su isti!"<<endl;
getch( );
}
IIIe2, IIIe3
definicija funkcije
PRENOS ARGUMENATA FUNKCIJE
Vrste prenosa:



po vrednosti
prenos kao pokazivač
prenos kao referenca
Prenos argumenata po vrednosti podrazumeva da se pri pozivu funkcije u operativnoj memoriji
prave kopije za sve parametre funkcije. Funkcija radi sa tim kopijama i u trenutku završetka rada
funkcije te kopije se brišu iz operativne memorije. To automatski onemogućava da argument
funkcije bude promenjen u funkciji, a da to bude vidljivo u pozivajućem modulu.
#include<iostream>
#include<math.h>
using namespace std;
Izvršavanje programa
kreće od main( )
int a
Izvršavaju je naredbe funkcije
x=a
x=5
int a;
npr. a=5
//definicija funkcije
void Povrsina_Kvadrata(int x)
{
cout<<"P="<<pow(x,2)<<endl;
P=52
Poziv funkcije
Program Output
}
// osnovni program
int main( ) {
int a;
cout<<"a=";
cin>>a;
Povrsina_Kvadrata( a ); // poziv funkcije
return 0;
}
Dragana T.
školska: 2009 / 2010
a= 5
P=25
.....
37
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Primjer funkcije koja vrši zamjenu vrijednosti dvije promjenjive
#include<iostream>
using namespace std;
//definicija funkcije:
void Zamena_vrednosti(int x,int y) // x i y se prenose po vrijednosti
{
int pom;
pom=x;
x=y;
y=pom;
cout<<"Rezultat funkcije:\n";
cout<<"\t\tprvi broj="<<x<<"\t\t"<<"drugi broj="<<y<<"\n\n\n";
}
// osnovni program:
int main( ) {
int prvi_b,drugi_b;
cout<<"prvi_b=";
cin>>prvi_b;
cout<<"drugi_b=";
cin>>drugi_b;
Zamena_vrednosti(prvi_b,drugi_b); // poziv funkcije
cout<<"vrijednosti promjenjivih posle poziva funkcije:\n";
cout<<"\t\tprvi broj="<<prvi_b<<"\t\t"<<"drugi broj="<<drugi_b<<endl;
return 0;
}
Program Output
Dragana T.
školska: 2009 / 2010
38
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Osim prenosa argumenata po vrednosti, moguće je koristiti pokazivače i reference kao argumente.
U tom slučaju funkcija ne vrši obradu nad kopijama podataka nego nad originalnim podacima.
Svaka promena formalnog argumenta reflektovaće se na original, stvarni argument.
Pokazivači kao argumenti:
#include<iostream>
using namespace std;
//definicija funkcije
void Zamena_vrednosti(int *x,int *y) // argumenti funkcije su pokazivači na promjenjive
{
int pom;
pom=*x;
*x=*y;
*y=pom;
cout<<"Rezultat funkcije:\n";
cout<<"\t\tprvi broj="<<*x<<"\t\t"<<"drugi broj="<<*y<<"\n\n\n";
}
// osnovni program
int main( ) {
int prvi_b,drugi_b;
cout<<"prvi_b=";
cin>>prvi_b;
cout<<"drugi_b=";
cin>>drugi_b;
Zamena_vrednosti(&prvi_b,&drugi_b); //pri pozivu funkciji prosljeđujemo adrese argumenata
cout<<"vrijednosti promjenjivih posle poziva funkcije:\n";
cout<<"\t\tprvi broj="<<prvi_b<<"\t\t"<<"drugi broj="<<drugi_b<<endl;
return 0;
}
Program Output
Dragana T.
školska: 2009 / 2010
39
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Reference kao argumenti:
Referenca se označava znakom &
Referenca je drugo ime za promjenjivu
Upotreba referenci omogućuje promjenu vrijednosti stvarnih argumenata
 Referenca se prilikom svoje inicijalizacije “čvrsto vezuje” za objekat kojim se inicijalizuje.
 Ova veza se više nikako ne može raskinuti, što znači da referenca, do kraja svog životnog
veka, upućuje na jedan isti objekat.
 Svako navođenje neke reference u programu, posle trenutka njene inicijalizacije, predstavlja
posredan pristup do referenciranog objekta.
#include<iostream>
using namespace std;
//definicija funkcije
void Zamena_vrednosti(int &x,int &y) // x i y se prenose po referenci
{
int pom;
pom=x;
x=y;
y=pom;
cout<<"Rezultat funkcije:\n";
cout<<"\t\tprvi broj="<<x<<"\t\t"<<"drugi broj="<<y<<"\n\n\n";
}
// osnovni program
int main( ) {
int prvi_b,drugi_b; // stvarni argumenti
cout<<"prvi_b=";
cin>>prvi_b;
cout<<"drugi_b=";
cin>>drugi_b;
Zamena_vrednosti(prvi_b,drugi_b); // funkcija se poziva argumentima a ne njihovim adresama
cout<<"vrijednosti promjenjivih posle poziva funkcije:\n";
cout<<"\t\tprvi broj="<<prvi_b<<"\t\t"<<"drugi broj="<<drugi_b<<endl;
return 0;
}
Program Output
Dragana T.
školska: 2009 / 2010
40
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Preopterećenje funkcije
Preopterećenje omogućuje upotrebu istog imena za različite funkcije, pri čemu se te funkcije
međusobno razlikuju po tipu argumenata u svom zaglavlju.
Primer:
#include<iostream.h>
void funkcija(int n) {
cout<<"n="<<n<<endl;
}
void funkcija(float n){
cout<<"n="<<n<<endl;
}
void main( ) {
int a=5;
float b=3.125;
funkcija(a); //celobrojni argument
funkcija(b); //realni argumenat
}
Funkcije se mogu preopterećivati funkcijama koje imaju jednak povratni tip rezultata:
float povrsina( int );
float povrsina( float );
Funkcije se ne mogu preopterećivati po povratnom tipu:
float povrsina( int );
double povrsina( int );
Funkcije se ne mogu preopterećivati ako se razlikuju samo u podrazumjevanim argumentima:
int povrsina( int x=5 );
floatpovrsina( int );
Funkcije se ne mogu preopterećivati ako se razlikuju samo po vrijednosti ili referenci na nju:
int povrsina(int x );
long povrsina( int &rx);
Dragana T.
školska: 2009 / 2010
41
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Rekurzija
omogućuje da funkcija poziva samu sebe
Postupak pozivanje funkcije iz funkcije naziva se rekurzija.
Primjer: napisati funkciju koja računa faktorijel unesenog broja
( faktorijel npr broja 4 se računa: 4!=1*2*3*4 )
#include<iostream.h>
int factorial( int x )
{
if (x == 1)
return(1);
else
return(x * factorial (x-1 ) );
}
void main( ) {
int a;
cout<<"a=";
cin>>a;
cout<<"a!="<<factorial( a )<<endl;
}
1.
2.
3.
4.
5.
Pitanja:
Koje imamo vrste prenosa argumenata funkciji
Objasniti prenos argumenata po vrijednosti
Objasniti prenos argumenata po referenci
Objasni preopterećenje funkcije
Šta predstavlja rekurzija
Dragana T.
školska: 2009 / 2010
42
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
NIZOVI
Niz predstavlja skup objekata istog tipa koji nisu pojedinačno imenovani već se identifikuju svojom
pozicijom (indeksom) u nizu.
Objekti od kojih se niz sastoji nazivaju se elementi niza
Nizovi se koriste kada radimo sa više
podataka istog tipa koji čine neku cjelinu, a trebamo ih sačuvati radi daljе obrade
U memoriji niz zauzima kontinuirani prostor
° Jednodimenzionalni nizovi
° Višedimenzionalni nizovi
Jednodimenzionalni nizovi
•
Nizovi se koriste kada radimo sa više podataka istog tipa koji čine neku cjelinu, a trebamo ih
sačuvati radi daljnje obrade
Npr. Posmatramo niz od 10 izmjerenih temperatura.
Definišemo niz pod nazivom:
tem[10]
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
tem[0]
tem[1]
tem[2]
tem[3]
tem[4]
tem[5]
tem[6]
tem[7]
tem[8]
T10
tem[9]
•
•
•
•
Prvi element niza je nulti element!
•
•
Ti brojevi zovu se indeksi i preko njih se može direktno pristupiti bilo kojem elementu niza(polja)
•
Indeks ukazuje koliko je neki element udaljen od početnog elementa (koji ima indeks 0)
iIndeksi, redni broj elementa u nizu
Ako definišemo niz od n elemenata, poslednji element je n-1.
Ako pokušamo da pristupimo elementu na poziciji n dolazi do greške!
Pojedini elementi numerisani su redom
0, 1, 2, 3, …
Ako je a ime niza od n elemenata, tada su pojedini elementi označeni s:
a[0], a[1], a[2], …, a[n-1]
Definisanje niza:
int a[3];
Niz a[3] ima tri cjelobrojna elementa:
a[0], a[1] i a[2]
Elementima niza možemo dodjeliti vrednost pomoću naredbe cin:
Dragana T.
školska: 2009 / 2010
43
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
cin>>a[0]; // npr. a[0]=3
a[1]=9;
a[2]=a[0]+a[1]; // a[2]=3+9
cout<<a[2]; //12
Učitavanje i ispis elemenata niza
Primjer: Dodjeliti vrijednosti elementima niza a[5] i iste prikazati u jednom redu
#include<iostream.h>
#include<iomanip.h>
int main() {
int a[5];
//ucitavanje elemenata niza:
for(int i=0;i<5;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
// prikazivanje elemenata niza
for(i=0;i<5;i++)
cout<<setw(5)<<a[i];
cout<<endl;
return 0;
}
Pronalaženje najvećeg elementa niza
Pretpostavimo da je prvi element polja najveći( max= a[0] ). Zatim provjeravamo (pomoću ciklusa
naredbe if )da li među preostalim elementima ima neki koji je veći od trenutno najvećeg. Ako ima
izjednačimo ga sa promjenjivom koja predstavlja max ( max= a[i] ).
#include<iostream.h>
int main ( ) {
const int n=5;
int a[n];
cout<<"unesite 5 cijelih brojeva:\n";
for(int i=0;i<n;i++)
cin>>a[i];
// pronalazenje najveceg elementa
int max=a[0];
for(i=0;i<n;i++)
if(a[i]>max)
max=a[i];
cout<<"najveci element je:"<<max<<endl;
return 0;
}
Dragana T.
školska: 2009 / 2010
44
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Sortiranje
Napisati program kojim se uređuje niz cijelih brojeva u rastućem redosledu
#include<iostream.h>
#include<iomanip.h>
int main() {
const int n=5;
int a[n];
cout<<"unesite 5 cijelih brojeva:\n";
for(int i=0;i<n;i++)
cin>>a[i];
// sortiranje
for(i=0;i<n;i++)
for(int j=i+1; j<n; j++ )
if(a[i]>a[j])
{
int pom=a[i];
a[i]=a[j];
a[j]=pom;
}
// prikazivanje sortiranih elemenata
for(i=0;i<n;i++)
cout<<setw(7)<<a[i];
cout<<endl;
return 0;
}
•
Niz je moguće inicijalizirati prilikom njegove deklaracije.
Npr.
int a[4] = {22, 33, 66, 55};
char slova[3] = {'a', 'b', 'c'};
•
Ako je broj elemenata u listi manji od veličine niza, preostali elementi jednaki su 0.
npr.
float x[5] = {2.5, 1.2};
int y[100] = { };
Prva dva elementa niza x sadrže 2.5 i 1.2, a ostali nule.
Niz y ima 100 elemenata koji su jednaki nuli.
•
Veličinu niza moguće je izostaviti:
Npr. int b[ ] = {55, 33, 66};
Veličina niza b je u tom slučaju 3
•
Ako niz nije inicijaliziran, sadržaj elemenata (prije nego im dodijelimo vrijednost) je
posve slučajan!
Dragana T.
školska: 2009 / 2010
45
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
VIŠEDIMENZIONALNI
IIIe2, IIIe3
NIZOVI
Dvodimenzionalni niz - Matrica
Primjeri tabelarnog ( matričnog ) prikaza podataka:
Tablica množenja:
x 1 2 3 4 5
1 1 2 3 4 5
2
3
4
5
6
7
8
9
10
6
6
7
7
8
8
9
9
10
10
2
4
6
8
10 12 14 16 18 20
3
4
5
6
7
8
9
10
6
8
10
12
14
16
18
20
9
12
15
18
21
24
27
30
12
16
20
24
28
32
36
40
15
20
25
30
35
40
45
50
18
24
30
36
42
48
54
60
21
28
35
42
49
56
63
70
24
32
40
48
56
64
72
80
27
36
45
54
63
72
81
90
Tastatura:
30
40
50
60
70
80
90
100
Osnovni pojmovi o matrici:
Kolone (su vertikale u matrici, nizovi elemenata čiji je drugi
index jednak)
Redovi su horizontale, nizovi
elemenata čiji su prvi indexi jednaki
Svaki element matrice
ima dva indeksa broj
reda(i) i broj kolone(j)
a11
a21
ai1
...
am1
a12
a22
ai2
…
am2
a13
a23
ai3
…
am3
a1j
a2j
aij
….
amj
..
...
...
…
...
a1n
a2n
ain
…
amn
Veličina odnosno dimenzije matrice određene su brojem redova (m) i brojem kolona (n) i zapisuje se
kao m x n
Dragana T.
školska: 2009 / 2010
46
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Deklaracija višedimenzionalnog niza:
int x[50][20];
- deklaracija dvodimenzionalnog niza sa 50*20 integera
char y[10][30][100] -deklaracija trodimenzionalnog niza sa 10*30*100 karaktera
Višedimenzionalni niz se deklariše tako da se dodaju srednje zagrade, gde broj srednjih zagrada
određuje dimenziju tog niza, a unutar zagrada treba upisati broj elemenata u toj dimenziji.
x[7][9]=120; - element 7,9 poprima vrednost 120
Dvodimenzionalni niz može biti inicijaliziran na sledeći naćin:
float m[2][3]={2.5,1,8,6,0,4.8};
ili
float m[2][3]= {
{2.5,1,8},
{6,0,4.8}
}
Ukoliko neka od grupa ima manje elemenata od dimenzije retka, ostali elementi će biti inicijalizirani
nulama.
•
Pristup elementu niza znači korišćenje vrednosti datog elementa niza ili dodelu vrednosti
datom elementu u nizu
Pristup elementu je operacija koja se ponavlja onoliko puta koliko ima elemenata u nizu
•
Npr.
A[2][3]=5; // elementu matrice koji se nalazi na preseku drugog reda i treće kolone dodjeljena je vrijednost 5
Može i ovako: cin>> A[2][3];
cout<< A[2][3]; // prikazivanje vrijednosti elementa matrice A[2][3]
//Npisati naredbu for kojom se učitavaju elementi
//matrice n(3x4) vrsta po vrsta, a zatim matricu prikazati
#include<iostream.h>
int main()
{
int n[3][4];
for(int i=0; i<3; i++)
for(int j=0; j<4; j++)
cin>>n[i][j];
//deklaracija matrice m(3x4)
//učitavanje elemenata matrice
for(i=0;i<3;i++)
{
for(int j=0;j<4;j++)
cout<<" "<<n[i][j]<<" ";
cout<<endl;
}
return 0;
// prikazivanje matrice
// ispisuje jedan red elemenata
// prebacuje kursor u sledeći red
}
Dragana T.
školska: 2009 / 2010
47
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Znakovni niz
 definicija i ispis
Znakovni nizovi su jednodimenzionalni nizovi koji služe za prikazivanje tekstova:
Na kraju niza automatski se postavlja nul-znak (engl. null-character).
Nije ga potrebno eksplicitno navoditi, ali treba o njemu voditi računa.
char tekst [ ] = { 'm','a','r','i','j','a','n','a',’ \0’ } ;
cout << tekst << endl ;
// definicija
// ispis
char ime[ ] = ” Marijana ” ; // definicija
cout << ime;
// ispis
ili
char ime [10] ;
cout << ” unesite jedno ime : “;
cin >> ime;
cout << ime ;
// definicija
// ispis
Ispisuje samo do prve praznine i prekida izvođenje. Ovo se rješava upotrebom funkcijskih članova
get ( ) i getline ( ) :
char tekst[20];
char tekst [ 20 ];
cin.get(tekst,sizeof(tekst));
cin.getline( tekst, sizeof ( tekst )) ;
cout<<tekst<<endl;
cout<<tekst<<endl;
get ( ) sa argumentima:
 Učitava znak po znak.
 Prekida učitavanje kad naiđe na ‘\n’ koji ostaje u nizu, pa se može učitati najviše
(dužina-1) znakova.
 Zaključni nul-znak dodaje se automatski.
getline ( ) :
 Učitava znak po znak.
 Prekida učitavanje kad naiđe na ‘\n’.
 Automatski uklanja ‘\n’ i dodaje ‘\0’.
 Također vrlo pogodan način za učitavanje znakovnih nizova
1.
2.
3.
4.
5.
6.
Pitanja:
Kada koristimo nizove
Kako se deklariše jednodimenzionalni niz
Kako se pristupa elementima niza
Objasni deklaraciju višedimenzionalnog niza
Kako se pristupa elementima višedimenzionalnog niza
Objasniti kako koristimo funkcije get( ) i getline( )
Dragana T.
školska: 2009 / 2010
48
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
DATOTEKE
Svi programi koje smo do sada pisali posjedovali su suštinski nedostatak da se svi uneseni podaci
gube onog trenutka kada se program završi.Poznato je da se ovaj problem rješava uvođenjem
datoteka koje predstavljaju strukturu podataka koja omogućava trajno smještanje informacija na
nekom od uređaja vanjske memorije(obično na hard disku).
Svaki program u C++ programskom jeziku, koji se koristi datotekama po pravilu ima tri osnovna
dijela:
-
dio u kojem se datoteka otvara i priprema za U/I
dio u kojem se u datoteku upisuju podaci, ili se iz nje ispisuju
dio u kojem se datoteka zatvara
C++ biblioteka tokova podržava tri razreda za rad s ulazom/izlazom kod datoteka:
-
ifstream - čitanje datoteke s diska
ofstream - pisanje u datoteku na disku
fstream - podržava i čitanje i pisanje u datoteku
Pisanje u datoteku:
-
U datoteku brojevi.txt upisati prvih 20 brojeva
#include<fstream.h>
int main()
{
ofstream imedat("brojevi.txt");
for(int i=1; i<=20; i++)
imedat<<i<<" ";
imedat.close();
return 0; }
Čitanje iz datoteke sa diska:
-
Pročitati podatke iz datoteke brojevi.txt
#include<fstream.h>
void main()
{
ifstream broj("brojevi.txt");
for(int i=1;i<=20;i++)
{
broj>>i;
cout<<i<<" ";
}
broj.close( ); }
Dragana T.
školska: 2009 / 2010
49
PROGRAMIRANJE I PROGRAMSKI JEZICI
-
in
out
ate
app
trunc
nocreate
noreplace
binary
C++
IIIe2, IIIe3
// čitanje
// pisanje
// nakon otvaranja pozicionira se na kraj datoteke
// novi zapisi se dodaju na kraj datoteke
// prazni datoteku ako ona već postoji
// ako datoteka ne postoji otvaranje je neuspješno
// ako datoteka postoji otvaranje je neuspješno
// binarna datoteka
U datoteku brojevi.txt dopišite vaše ime:
#include<fstream.h>
int main()
{
char ime[20];
ofstream upis("brojevi.txt",ios::ate|ios::app);
cin>>ime;
upis<<ime;
upis.close();
return 0;
}
#include<fstream.h>
void main()
{
char b[10];
int a;
ifstream k("w.txt",ios::in);
for(int i=1;i<20;i++)
{
k>>a;
cout<<a<<" ";}
cout<<endl;
k>>b;
cout<<b;
k.close();
}
Dragana T.
školska: 2009 / 2010
50
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
STRUKTURE
Strukture predstavaljaju složene tipove podataka koji čuvaju skupine raznorodnih podataka, koji se
mogu razlikovati kako po prirodi tako i po tipu, i kojima se, za razliku od nizova, ne pristupa po
indeksu već po imenu.
Pri deklaraciji strukture se iza rezervisane reči struct u vitičastim zagradama navode deklaracije
individualnih elemenata od kojih se struktura sastoji.
Naziv
strukture
struct ucenikIIIe2 {
string ime;
int br_god;
float op_us;
} ;
članovi strukture
Deklaracija promjenjivih strukturnog tipa može se izvršiti na sledeći naćin:
ucenikIIIe2 u1, u2, u3; ili ovako:
struct ucenikIIIe2 {
string ime;
int br_god;
float op_us;
} u1, u2, u3 ; // ovo se smatra lošim stilom pisanja, koji treba izbjegavati
Pojedinačna polja (atributi,podaci članovi) unutar slogovnih promjenjivih ponašaju se poput
individualnih promjenjivih odgovarajućeg tipa, kojima se pristupa tako što prvo navedemo ime
slogovne promjenjive, zatim znak (operator) tačka ( . ) i, konačno, ime polja unutar slogovne
promjenjive :
cin >> u1.ime ;
cout << u1.ime << endl ;
bilo koja slogovna promjenjiva može se čitava dodjeliti drugoj slogovnoj promjenjivoj istog tipa :
u1 = u2 ;
Primjer:
Napisati strukturni tip “ucenikIIIe2” koji opisuje ucenika u školi, sa atributima: ime, broj godina i opšti
uspjeh
#include<iostream>
#include<string>
using namespace std;
struct ucenikIIIe2 {
Dragana T.
školska: 2009 / 2010
51
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
string ime ;
int br_god ;
float op_us ;
};
void main ( ) {
ucenikIIIe2 u1 ;
cout << " ime: " ;
cin >> u1.ime ;
cout << " br_god: ";
cin >> u1.br_god ;
cout << " op_us: " ;
cin >> u1.op_us ;
}
Zadatak: Za napisani program dodati u strukturni tip attribute: ukupan broj izostanaka i vladanje.
Izlaz treba da glasi:
Aco ima 17 god, opsti uspjeh 4.25, ukupno 5 izostanaka i primjerno vladanje
Ana ima 17 god, opsti uspjeh 4.54, ukupno 3 izostanaka i primjerno vladanje
Pitanja:
1. Kada se koriste datoteke
2. Objasniti pisanje u datoteku
3. Objasniti čitanje iz datoteke
4. Strukture su..
5. Kako deklarišemo strukturu
6. Kako se deklarišu promjenjive strukturnog tipa
7. Kako pristupamo članovima strukture
Dragana T.
školska: 2009 / 2010
52
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
II polugodiste
KLASE
Programski jezik C++ je karakterističan po tome što programeru dopušta da kreira svoj tip podatka.
U tu svrhu se koriste klase. Klasa je korisnički definisan tip podataka.
Klase su temelj objektno orijentisanog pristupa programiranju.
Klase omogućavaju programeru modeliranje objekata koji imaju atribute ( predstavljene kao podaci ) i
ponašanje ili operacije ( predstavljene kao funkcije ili metode )
Klasa predstavlja apstrakciju koja definiše zajednička svojstva i zajedničke postupke koji su svojstveni svim
objektima nekog tipa.
Npr.
Kreiramo klasu Mačak,
za opis mačke koristimo podatke koji su zajednički za zve mačke: ime, broj godina, prede,lovi miša...
ime, broj godina i slični podaci se predstavljaju kao atributi a ponašanje mačke kao što je prede, lovi miša i sl.
Predstavlja se u klasi kao metoda ( funkcija ).
class Macak
Mačak: string ime;
int br_god;
void spava( );
void lovi_misa( );
klasa je samo opis zajedničkih
osobina i postupaka
karakterističnih za sve mačke
OBJEKTI
//u osnovnoj funkciji ( main funkciji) kreiramo objekte
int main( ) {
Macak spavalica;
// spavalica je objekat tipa Macak
Klasa je samo opis, a objekat je stvarna, konkretna realizacija tog opisa.
Dragana T.
školska: 2009 / 2010
53
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Primjer:
#include<iostream>
#include<string>
using namespace std;
class Macak {
public:
string ime;
string prede ( )
{
return " ZZ Z zz...z.ZZZ";
}
};
// način pristupa članovima klase
//atribut
// ovo je metoda koja opisuje ponašanje mačke
// na kraju klase obavezno ide };
int main( ) {
Macak spavalica;
// kreiramo objekat
cout<<"unesi ime:";
cin>>spavalica.ime;
// pomoću kreiranog objekta obracamo se članovima klase
cout<<"Macak "<<spavalica.ime <<" voli da prede "<<spavalica.prede( )<<endl;
return 0;
}
Članovi klase su :
- atributi (podaci, osobine ) koji opisuju stanje objekta i
- metode (funkcije, ponašanje ) namjenjene definisanju operacija
nad podacima klase
Jedan primjerak ( instanca, pojava) klase naziva se objektom te klase
Klasa ima sekcije koje određuju pravo pristupa članovima
Način pristupa članovima klase može biti:
private
public
protected
(privatni)
(javni)
(zaštićeni)
Svaka sekcija započinje labelom sekcije (rezervisana reč)
1. Članovi (podaci ili funkcije) klase iza rezervisane reči private:
 nazivaju se privatnim (engl. private) članovima
 zaštićeni su od pristupa spolja (kapsulirani su)
 njima mogu pristupati samo metode klase (i prijatelji)
Dragana T.
školska: 2009 / 2010
54
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
2. Članovi iza rezervisane reči public:
 nazivaju se javnim (engl. public) članovima
 dostupni su spolja bez ograničenja
3. Članovi iza rezervisane reči protected:
 nazivaju se zaštićenim (engl. protected) članovima
 dostupni su metodama date klase, kao i klasa izvedenih iz te klase
 nisu dostupni ostalim funkcijama
Prava pristupa :
Redosled sekcija public, protected i private je proizvoljan (preporučuje se navedeni redosled)
Može biti više sekcija iste vrste
Podrazumevana sekcija (do prve labele) je privatna
Preporuka je da se klase projektuju tako da nemaju javne atribute
Ako nije ništa navedeno, podrazumijeva se privatni pristup
Obratiti pažnju na način pisanja metoda:
Prvo pišemo kog tipa je
rezultat metode
Ime
metode
Obavezno male
zagrade sa
argumentima
metode
string prede ( )
{ //otvorimo veliku zagradu i pišemo naredbe te metode
return " ZZ Z zz...z.ZZZ"; //ono što metoda vrača piše se posle return
}
//na kraju metode obavezno zatoriti veliku zagradu
Primjer metode koja ne vraća ništa:
Void znači da
metoda ne vraća
išta
void prede ( )
{
cout<< " ZZ Z zz...z.ZZZ";
}
Dragana T.
školska: 2009 / 2010
//ako metoda ne vraća ništa ne piše se return
55
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Deklaracija klase ''class'' definiše atribute i metode
Primjer deklaracije klase:
class pravougaonik
{
public:
int a, b ;
// a i b su atributi klase
void prikazi ( ) {
// prikazi( ) je metoda klase
cout<<"a = " << a << endl ;
cout<<"b = " << b << endl;
}
};
//deklaracija klase uvjek se završava sa ;
Primjer: Napisati klasu pravougaonik koja definiše sledeće članove:
a
- stranica (javni atribut,cjelobrojnog tipa),
b
- stranica (javni atribut,cjelobrojnog tipa),
prikazi ( ) - javna metoda, tipa void, koja prikazuje stranice pravougaonika.
A zatim napisati test program koji dodjeljuje vrednosti atributima klase i poziva metodu klase.
#include<iostream.h>
class
pravougaonik
{
public:
int a, b ;
void prikazi ( ) {
cout<<"a = " << a << endl ;
cout<<"b = " << b << endl;
}
};
void main ( ) {
pravougaonik p1;
// p1 je jedan konkretan pravougaonik
cout<<"prva stranica je :";
cin>>p1.a;
cout<<"druga stranica je :";
cin>>p1.b;
p1.prikazi( );
}
Dragana T.
školska: 2009 / 2010
56
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Deklaracija metode
Funkcije koje se deklarišu u klasi nazivaju se metode. Prostor njihove upotrebe je klasa.
One ne postoje izvan klase. Metode se mogu pozvati samo unutar klase ili ih može pozvati instanca (objekat)
klase.
Pomoću metoda klase se može pristupiti svim atributima klase bez obzira na njihova ograničenja pristupa.
Metoda u C++ mora biti prije upotrebe deklarisana, a zatim i definisana. Metode se kao i atributi mogu
deklarisati upotrebom rezervisanih riječi public, protected i private. Metode deklarisane kao public omogućuju
pristup svim dijelovima klase.
Metode private služe za interni rad s klasom. Korisnik ih ne može pozivati. Zato su privatne i skrivene od
vanjskog svijeta. Korisnik ne može pozivati i metode protected. Njima mogu pristupiti samo klase koje
nasljeđuju metode svojih nadklasa.
Slijedi primjer deklaracije metode.
class kvadrat {
private:
int a; // atribut
public:
void dodjela ( int x); // Deklaracija metode
};
U klasi kvadrat deklarisana je metoda:
void dodjela ( int x ) ;
Povratni tip podataka metode void dodjela ( int x ) je void, naziv metode je dodjela, a metoda ima samo jedan
argument tipa int.
U sljedećem se koraku deklarisana metoda mora definisati. To znači detaljno prikazati šta radi metoda. Svi
detalji moraju biti poznati, a oni se mogu definisati unutar ili izvan klase.
class kvadrat {
private:
int a ; // atribut
public:
void dodjela (int x) {
a=x;
}
//definicija metode u klasi
};
Primjer definicije metode izvan klase
Ako su metode složenije i sadrže veći broj programskih redaka onda je definicija unutar klase suviše
nepregledna. Zato je bolje metodu u klasi deklarisati a definisati izvan klase.
U definiciji metode izvan klase u upotrebi je tzv. operator klase ( class operator ), a njegov simbol je „::“.
Naziva se i operator područja vrijednosti.
Dragana T.
školska: 2009 / 2010
57
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
class kvadrat {
private:
int a ; // atribut
public:
void dodjela (int x); //deklaracija metode
};
void kvadrat :: dodjela(int x) { //definicija metode izvan klase
a = x ; // Tijelo metode
}
Definisanje metode izvan klase zahtjeva:
• tip podataka koji će metoda vratiti ( u gornjem primjeru taj tip je int)
• naziv klase kojoj pripada metoda
• operator “::”,
• naziv metode
• argumenti unutar zagrada
• i na kraju tijelo metode u kojem su naredbe. One definišu šta će metoda raditi.
Primjena metoda
Poziv ili upotreba metode zahtjeva navođenje naziva objekta, naziva metode i parametara metode.
Primjer
K1. dodjela ( 5 );
Primjer: Napisati klasu kvadrat sa sledećim članovima: stranica a – atribut i metode: dodjeli( ), povrsina( ),
obim( ),dijagonala( ) i rezultati( ).
#include<iostream.h>
#include<math.h>
class kvadrat{
private:
int a;
public:
void dodjela(int x);
int povrsina();
int obim();
double dijagonala();
void rezultat();
};
void kvadrat::dodjela(int x) {
a=x;
}
int kvadrat::povrsina( ) {
return a*a;
}
int kvadrat::obim( ) {
return 4*a;
}
Dragana T.
školska: 2009 / 2010
58
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
double kvadrat::dijagonala( ) {
return a*sqrt(2);}
void kvadrat::rezultat( ) {
cout<<a<<"\t"<<povrsina()<<"\t"<<obim()<<"\t"<<dijagonala()<<"\n";}
void main( ) {
kvadrat k1;
k1.dodjela(5);
k1.rezultat();
}
Konstantne funkcije članice
-
Funkcija članica može samo da čita stanje ili da menja stanje objekta.
Funkcije članice koje ne menjaju stanje objekta nazivaju se inspektori ili selektori.
Funkcija članica koja menja stanje objekta naziva se mutator ili modifikator.
Dobra praksa je da se korisnicima klase navede da li neka funkcija članica menja unutrašnje stanje
objekta.
Da je funkcija članica inspektor, korisniku klase govori reč const napisana iza zaglavlja funkcije.
Ovakve funkcije članice nazivaju se konstantnim funkcijama članicama
Primer: Napisati klasu ptrougao koja ima atribute a i b tipa int(katete pravouglog trougla) i metode:
dodeli( int at, int bt), H( ).
U osnovnoj main funkciji kreirati dva trougla ( objekta) T1 I T2, pozvati metode i za oba objekta
prikazati hipotenuze
#include<iostream.h>
#include<math.h>
class ptrougao {
int a,b;
public:
void dodeli(int at,int bt);
double H()const;
};
//modifikator, menja stanje objekta
//selektor, ne menja stanje objekta
void ptrougao::dodeli(int at,int bt) {
a=at;
b=bt; }
double ptrougao::H()const {
return sqrt(pow(a,2)+pow(b,2)); }
int main( ) {
ptrougao T1;
int x,y;
cout<<"unesite katete p.trougla:";
cin>>x>>y;
Dragana T.
školska: 2009 / 2010
59
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
T1.dodeli(x,y);
cout<<"hipo je c="<<T1.H( )<<endl;
return 0; }
Pokazivač this
Iz jedne klase moguće je definisati neograničen broj objekata
Klasa ne zna nazive svojih objekata
Pomoću pokazivača this moguće je unutar klase doznati adresu objekta, odnosno:
*this predstavlja sam taj objekt na način kako je dostupan iz koda klase
Primjer:
#include<iostream.h>
class ad {
public:
int a,b;
void m( ) {
cout<<"adresa objekta preko kojeg je metoda pozvana:";
cout<<(int)this<<endl;
cout<<"vrijednosti atributa su:"<<endl;
cout<<"a="<<this->a<<endl;
cout<<"b="<<this->b<<endl;
}
};
ad o1,o2;
int main ( ) {
o1.a=5;
o1.b=2;
cout<<"adresa objekta o1:"<<(int)&o1<<endl;
o1.m();
o2.a=7;
o2.b=9;
cout<<"adresa objekta o2:"<<(int)&o2<<endl;
o2.m();
return 0;
}
#include<iostream.h>
const double pi=3.1415;
class krug {
private:
int r;
public:
void dodela(int rr) {
r=rr;
};
double obim( ) {
Dragana T.
školska: 2009 / 2010
60
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
return 2*r*pi;
};
void adresa( ) {
cout<<"adresa objekta je:"<<(int)this<<endl;
cout<<"poluprecnik ima vrednost r="<<this->r<<endl;
};
};
krug k;
void main( ) {
int r1;
cout<<"unesite poluprecnik prvog objekta r1=";
cin>>r1;
k.dodela(r1);
cout<<"obim je O="<<k.obim( )<<endl;
cout<<endl;
k.adresa( );
}
Zajednički članovi klasa
Zajednički (statički) podaci članovi



Pri kreiranju objekata klase, za svaki objekat se kreira poseban komplet podataka članova.
Podatak član može biti deklarisan kao statički pomoću specifikatora static ispred tipa.
Postoji samo jedan primjerak statičkog podatka člana za cijelu klasu ( zajednički podatak za sve objekte
klase).
Class broj {
private:
static int a;
int b;
public:
//…
};





Statički član mora da se definiše izvan definicije klase i izvan definicije funkcija.
U definiciji može da se koristi samo konstantan izraz.
Dodjela inicijalne vrijednosti statičkom članu se vrši prije poziva main( ).
Obraćanje statičkom članu van klase vrši se preko operatora :: Za prethodni primjer: int broj::a=5;
Statički članovi se uglavnom koriste kada svi primjerci jedne klase treba da dijele neku zajedničku
informaciju.
Dragana T.
školska: 2009 / 2010
61
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Primjer: Napisati klasu krug koja u privatnom dijelu ima statički član pi i atribut r(poluprečnik), u javnom
dijelu deklarisati dvije metode: unos i obim
#include<iostream.h>
class krug {
private:
static double pi;
double r;
public:
void unos( );
double obim( );
};
double krug::pi=3.1415;
void krug::unos( )
{
cout<<"r=";
cin>>r;
}
double krug::obim()
{
double O=2*r*pi;
return O;
}
void main( )
{
krug k;
k.unos( );
cout<<"O="<<k.obim( )<<endl;
}
PRIJATELJI KLASA
Često je potrebno da se klasa projektuje tako da ima i “povlaštene“ korisnike, odnosno funkcije ili druge klase
koje imaju pravo pristupa njenim privatnim članovima.
Takve funkcije i klase nazivaju se prijateljima(friends).
Prijateljske funkcije:
-unutar deklaracije klase moguće je izvjesne obične funkcije (koje nisu funkcije članice klase) proglasiti
prijateljima klase tako što se unutar deklaracije klase navade rezervisana riječ friend, a zatim prototip funkcije
koju proglašavamo prijateljem. Ovim funkcija ne postaje funkcija članica (tj. i dalje se poziva kao obična
funkcija), samo dobija pravo pristupa privatnim atributima klase.
Dragana T.
školska: 2009 / 2010
62
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Primjer:
Napisati klasu kom koja predstavlja kompleksni broj i ima privatne atribute:a,b, i sledeće metode: dodela(),
prikaz() i prijateljsku funkciju sabiranje(kom k1,kom k2) koja sabira dva kompleksna broja.
#include<iostream.h>
class kom
{
private:
int a,b; //realni i imaginarni dio kompleksnog broja
public:
void dodela(int x,int y);
friend void sabiranje(kom k1,kom k2); //prijateljska funkcija
void prikaz( );
};
void kom::dodela(int x,int y)
{
a=x;
b=y;
}
//definicija prijateljske funkcije, u zagradi se piše ime klase i objekta te klase:
void sabiranje(kom k1,kom k2)
{
int x=k1.a+k2.a;
int y=k1.b+k2.b;
cout<<x<<"+j"<<y<<endl;
}
void kom::prikaz( )
{
cout<<this->a<<"+j"<<this->b<<endl;
}
void main( )
{
char u='j';
//imaginarna jedinica
kom A,B;
//A i B su objekti klase kom
A.dodela(4,3,u);
B.dodela(3,4,u);
cout<<"prvi kompleksni broj je: A=";
A.prikaz();
cout<<"drugi kompleksni broj je: B=";
B.prikaz();
cout<<"zbir kompleksnih brojeva je: Z=";
sabiranje(A,B); //poziv prijateljske funkcije, u zagradi se prikazuju objekti
}
Dragana T.
školska: 2009 / 2010
63
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Vježba:
-u klasu kom dodajte:
 još jednu prijateljsku funkciju koja računa modul kompleksnog broja: modul(kom k),
imaginarnu jedinicu predstavite kao statički član (static char c[ ] )
Prijateljske klase
Ako je potrebno da sve funkcije članice klase krug budu prijateljske funkcije klasi kvadrat, onda se klasa krug
deklariše kao prijateljska klasa (friend class krug) klasi kvadrat.Tada sve funkcije članice klase krug mogu da
pristupaju privatnim članovima klase kvadrat.
class kvadrat {
friend class krug;
//…
};



Prijateljske klase se obično koriste kada neke dvije klase imaju bliže međusobne veze.
Prijateljstvo nije simetrično, ako je klasa krug prijatelj klasi kvadrat to ne znači da je klasa kvadrat
prijatelj klasi krug.
Prijateljsvo nije tranzitivna relacija, ako je klasa krug prijatelj klasi kvadrat, a klasa trougao prijatelj
klasi krug, klasa trougao nije prijatelj klasi kvadrat, već to mora eksplicitno da se naglasi(ako je
potrebno).

Primjer: Napisati dvije međusobno prijateljske klase: krug i kvadrat koje računaju površine kruga i kvadrata
koji opisuje krug.
#include<iostream.h>
#include<math.h>
class kvadrat;
class krug
{
private:
double r;
static double pi;
public:
friend class kvadrat; //klasa kvadrat je prijatelj klasi krug
void dodela(double a){r=a;};
double pov(){return pow(r,2)*pi;};
void Ukvadratu(kvadrat kv); //metoda koja se obraća klasi kvadrat
};
double krug::pi=3.14159;
Dragana T.
//definicija statičkog člana
školska: 2009 / 2010
64
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
class kvadrat
{
private:
double a;
public:
friend class krug;
//klasa krug je prijatelj klase kvadrat
void dodela(double b){a=b;};
double pov(){return pow(a,2);};
void Okokruga(krug k); //metoda koja se obraća prijateljskoj klasi krug
};
void krug::Ukvadratu(kvadrat kv)
{
r = kv.a/2;
}
void kvadrat::Okokruga(krug k)
{
a = k.r*2;
}
// definicija metode koja pripada klasi krug
// definicija metode koja pripada klasi kvadrat
void main(){
krug kr;
kvadrat kva;
kr.dodela(2.5);
kva.Okokruga(kr); //metoda koja pripada klasi kvadrat a obrača se klasi krug
cout<<kr.pov()<<endl;
cout<<kva.pov()<<endl;
}
KONSTRUKTORI
U C++ se inicijalizacija i uništavanje objekata lako izvršavaju pomoću konstruktora i destruktora. Ove
specijalne funkcije članice kontrolišu kako se objekat pravi ili uništava.
Konstruktor je funkcija koja konstruiše objekat
U programu, instanciranje objekta uvjek podrazumjeva rezervisanje dovoljne količine memorije za smještanje
podataka o stanju objekta. Specijalni metod koji rezerviše memoriju za nove primjerke objekata se naziva
konstruktor. Pored rezervacije memorije, konstruktor može da bude proširen uključivanjem i drugih procesa
kao što je inicijalizacija stanja objekta.
Dragana T.
školska: 2009 / 2010
65
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Konstruktor objekta u C++ ima tri važna aspekta:
 Uzima isto ime kao i klasa
 Može da ima argumente
 Ne može da vrati vrednost
Postoje tri osnovna tipa konstruktora:
1. podrazumjevani (default) konstruktor
2. konstruktor sa parametrima (korisnički definisani konstruktor)
3. konstruktor kopije (copy konstruktor, za prepis vrjednosti)
 Podrazumjevani konstruktor
Ovaj konstruktor ne poseduje parametre, i ne vrši nikakvu drugu akciju sem zauzeća memorije. Svaka klasa
ima, ili bi bar trebalo da ima, podrazumjevani konstruktor (konstruktor bez argumenata).
 Ako u klasi nije definisan nijedan konstruktor, prevodilac će dodati podrazumjevani
konstruktor. To je skriveni konstruktor i nije neka složena fukcija; on inicijalizuje sve
podatke članove vrjednošću nula.
 Ako se vratite i deklaraciji klase dodate konstruktore, podrazumjevani konstruktor koji
je napravio prevodilac jednostavno će nestati- više ga neće biti.
Uvjek navedite podrazumjevani konstruktor, čak i kada on ništa ne radi. Tako ćete se osigurati da
podrazumjevani konstruktor ne nestane ako se vratite i dodate druge konstruktore u program
Primjer:
#include<iostream>
#include<math.h>
class kvadrat
{
private:
int stranica;
public:
kvadrat( ) {stranica=0; }
//podrazumjevani konstruktor
int povrsina( ){
return pow(stranica,2);
}
void izlaz( ) { cout<<"a="<<stranica<<endl;
cout<<"P="<<povrsina()<<endl;
}
};
int main( ) {
kvadrat k1;
//poziv podrazumjevanog konstruktora
k1.povrsina( );
k1.izlaz( );
return 0; }
Dragana T.
školska: 2009 / 2010
66
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Vježba: Klasi kvadrat dodati metodu preuzmi() koja stranici dodjeljuje vrednost, a u glavnom programu
kreirajte novi objekat k2 i pozovite metodu preuzmi(), povrsina() i izlaz().
#include<iostream>
#include<math.h>
using namespace std;
class kvadrat{
private:
int stranica;
public:
kvadrat( ) {stranica=0;}
void preuzmi(int a ) {stranica=a;}
int povrsina( ) {return pow(stranica,2);}
void izlaz( ) {
cout<<"a="<<stranica<<endl;
cout<<"P="<<povrsina()<<endl;}
};
int main( ) {
kvadrat k1;
k1.povrsina( );
k1.izlaz( );
kvadrat k2;
k2.preuzmi(5);
k2.povrsina( );
k2.izlaz( );
return 0;}

Konstruktor sa parametrima
(korisnički definisani konstruktor)
Preko podrazumjevanog konstruktora nije moguće prenjeti bilo kakav parametar, niti izvršiti poziv bilo
kojeg drugog procesa kao što je inicijalizcija vrjednosti atributa. Ovakav postupak se može izvesti pisanjem
korisnički definisanih konstruktor metoda, koje sadrže argumente.
Moguće da postoji više od jednog konstruktora u klasi. Time se obezbeđuje da se definišu različite verzije sa
razlikom u parametrima.
Konstruktori sa parametrima se izvršavaju ukoliko se prilikom deklaracije odgovarajućeg objekta u
zagradama navedu parametri koje treba proslijediti u konstruktore.
#include<iostream.h>
class pravougaonik {
private:
int a,b;
public:
pravougaonik(){a=0;b=0;} //podrazumjevani konstruktor
pravougaonik(int x,int y){a=x;b=y;} //konstruktor sa parametrima
pravougaonik(int c){a=c;b=0;};
//konstruktor sa parametrima
Dragana T.
školska: 2009 / 2010
67
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
void postavi(int x,int y) {a=x;b=y;}
long povrsina( ) {return a*b;}
void ispisi( ) {
cout<<"stranice su: "<<endl;
cout<<"\t\t"<<"a="<<a<<endl;
cout<<"\t\t"<<"b="<<b<<endl;
cout<<"povrsina je:"<<"P="<<povrsina( )<<endl; }
};
void main( )
{
pravougaonik p1; //pozivanje prvog konstruktora
p1.postavi(3,4);
p1.povrsina( );
p1.ispisi( );
pravougaonik p2(4,5); //pozivanje drugog konstruktora
long pov=p2.povrsina();
cout<<”P=”<<pov;
pravougaonik p3(7); //pozivanje trećeg konstruktora
p3.povrsina( );
p3.ispisi( );
}
 Vježba:
Klasi pravougaonik dodajte metodu: void obim() i
void dijagonala() i iste pozovite za kreirane objekte
 Konstruktor kopije
Kada se objekat k1 inicijalizuje drugim objektom k2 iste klase, C++ će podrazumjevano (ugrađeno) izvršiti
prostu inicijalizaciju redom članova objekta k1 članovima objekta k2.
To ponekad nije dobro (često ako objekti sadrže članove koji su pokazivači ili reference), pa programer treba
da ima potpunu kontrolu nad inicijalizacijom objekta drugim objektom iste klase.
Za ovu svrhu služi tzv. konstruktor kopije. To je konstruktor klase „broj” koji se može pozvati sa samo
jednim stvarnim argumentom tipa „broj”.
Taj konstruktor se poziva kada se objekat inicijalizuje objektom iste klase ( pomoću znaka = ili sa zagradama ).
Konstruktor kopije nikad ne smje imati formalni argument tipa „broj” , a može argument tipa broj & ili
najčešće const broj &.
#include<iostream.h>
class broj{
int re, im;
Dragana T.
školska: 2009 / 2010
68
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
public:
broj() {re=0;im=0;} //podrazumjevani konstruktor
void postavi(int r,int i ) {
re=r;
im=i; }
void prikazi( ) {
cout<<re<<"+j"<<im<<endl; }
broj(broj &z){
re=z.re+2;
im=z.im*3;
}
};
definicija
kopi konstruktora
void main( ) {
broj k1;
k1.postavi(3,4);
k1.prikazi( );
broj k2=k1;
// poziv kopi konstruktora
cout<<"drugi broj je:";
k2.prikazi( );
}
Parametar kopirnog konstruktora je referenca već postojećeg objekta.
U tijelu ovog kopirnog konstruktora kopira se vrijednost svih članskih promjenjivih postojećeg objekta u
promjenjve deklarisanog objekta.
Zadatak:
//Napisati klasu: “kbroj” koja predstavlja kompleksni broj.
U javnom dijelu deklarisati - podrazumjevani konstruktor,
- metodu postavi,
- metodu prikazi,
- prijateljsku funkciju sabiranje.
Uglavnom programu kreirati dva kompleksna broja (objekta)k1 i k2(k2=k1) pomoću kopi konstruktora a
zatim pozovi sve metode
#include<iostream.h>
class broj{
int re;
int im;
public:
broj(){re=0;im=0;}
void postavi(int r,int i){
Dragana T.
školska: 2009 / 2010
69
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
re=r;
im=i;}
void prikazi(){cout<<re<<"+j"<<im<<endl;}
int rea(int a){return re=a;}
broj(const broj &z);
};
broj::broj(const broj &z){
re=z.re+2;
im=z.im*3;
}
void main(){
broj k1;
k1.postavi(3,4);
k1.prikazi();
broj k2=k1;
cout<<"drugi broj je:";
k2.prikazi();
k2.rea(7);
k2.prikazi();
}
//Napisati klasu kbroj koja predstavlja kompleksni broj.U javnom dijelu deklarisati
//podrazumjevani konstruktor,metode postavi i prikazi,prijateljsku funkciju sabiranje.
//Uglavnom programu kreirati dva k.broja(objekta) k1 i k2(k2=k1) pomocu kopi konstruktora a
//zatim pozovi sve metode.
#include<iostream.h>
#include<math.h>
class broj{
double re;
double im;
public:
broj(){re=0;im=0;}
broj (double a,double b);
void prikazi();
void friend sab(broj d1,broj d2);
double modul();
double argument();
};
broj::broj(double a,double b){
re=a;
im=b;}
void broj::prikazi(){
cout<<re<<"+j"<<im<<endl;}
void sab(broj d1,broj d2){
double x=d1.re+d2.re;
double y=d1.im+d2.im;
Dragana T.
školska: 2009 / 2010
70
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
cout<<x<<"+j"<<y<<endl;}
double broj::modul( ) {
return sqrt(pow(re,2)+pow(im,2));};
double broj::argument( ) {
return atan2(im,re);}
void main(){
broj k1(1,sqrt(3));
cout<<"k1=";
k1.prikazi( );
broj k2=k1;
cout<<"k2=";
k2.prikazi( );
cout<<"k1+k2=";
sab(k1,k2);
cout<<"|k1|=";
cout<<k1.modul()<<endl;
cout<<"argument za k1:"<<k1.argument( )*57.3<<endl;
}
DESTRUKTOR
Ukoliko nam neki objekti više nisu potrebni, preporučljivo je njihovo brisanje kako bi oslobodili što više
memorijskog prostora.To se radi pomoću specijalne metode – destruktora. Destruktor je zadužen za “red i
mir” u programu.
•
Klasa može imati samo jedan destruktor.
•
Destruktor nema argumenata i nikad ne vraća vrednost.
•
Ime destruktora se sastoji od znaka ~ i imena klase: ~broj( )
•
Destruktor se automatski poziva kada objekt jedne klase gubi svoju važnost.
#include<iostream.h>
#include<math.h>
class trougao{
private:
double a,b;
public:
trougao(){a=0;b=0;}
// podrazumjevani konstruktor
trougao(double x,double y){a=x;b=y;} //konstruktor sa parametrima
double hipo(){return sqrt(pow(a,2)+pow(b,2));}
double obim(){return a+b+hipo();}
double pov(){return a*b/2;}
~trougao(){
definicija
cout<<"sada je objekat unisten!"<<endl;}
destruktora
};
Dragana T.
školska: 2009 / 2010
71
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
void main(){
trougao t1(3,4);
//poziv konstruktora sa parametrima
cout<<"c="<<t1.hipo()<<endl;
cout<<"O="<<t1.obim()<<endl;
cout<<"P="<<t1.pov()<<endl;
}
#include<iostream.h>
#include<math.h>
class kom
{
private:
int a,b; //realni i imaginarni dio kompleksnog broja
static char c[]; //imaginarni operator
public:
kom(int x=0,int y=0); //konstruktor
friend void sabiranje(kom k1,kom k2); //prijateljska funkcija
void prikaz();
friend double modul(kom k);
~kom(); //destruktor
};
char kom::c[]="j";
kom::kom(int x,int y)
{
a=x;
b=y;
}
double modul(kom k){
return sqrt(pow(k.a,2)+pow(k.b,2));}
void sabiranje(kom k1,kom k2)
{
int x=k1.a+k2.a;
int y=k1.b+k2.b;
cout<<x<<"+"<<k2.c<<y<<endl;
}
void kom::prikaz()
{
cout<<this->a<<"+"<<c<<this->b<<endl;
}
kom::~kom(){
cout<<"objekat se oprasta od programa!!"<<endl;}
void main(){
kom A(3,4),B(6,8); //poziv konstruktora
cout<<"prvi kompleksni broj je: A=";
A.prikaz();
Dragana T.
školska: 2009 / 2010
72
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
cout<<"drugi kompleksni broj je: B=";
B.prikaz();
cout<<"zbir kompleksnih brojeva je: Z=";
sabiranje(A,B);
cout<<endl;
cout<<"\n\nModul kompl.broja A je:"<<modul(A)<<endl;
cout<<"\n\nModul kompl.broja B je:"<<modul(B)<<endl;
}
Preklapanje operatora
C++ ne dozvoljava kreiranje novih operatora, ali dozvoljava postojećim operatorima preklapanje kada se
koriste sa novim tipom.
Preklapanje operatora nije automatsko, operator mora pisati operator funkcije za izvršavanje željenih
operacija.
Funkcije za preklapanje operatora mogu biti funkcije članice klase (member functions) i funkcije koje nisu
članice klase (nonmember) i koje su u tom slučaju friend funkcije.
U programskom jeziku C++ postoji nešto što se zove operatorska funkcija i ona je uvijek oblika “operator
@()”, gdje je @ operator koji ta operatorska funkcija obrađuje.
Operatorske funkcije se mogu preklapati na dva načina: kao prijateljske funkcije klase ili kao metode klase.
Pored toga povratna vrijednost i broj parametara operatorske funkcije zavisi od tipa operatora: unarni i
binarni.
Pretpostavimo da su nam u programu potrebni kompleksni brojevi i operacije nad njima. Treba nam struktura
podataka koja će, pomoću osnovnih (u jezik ugrađenih) tipova,predstaviti strukturu kompleksnog broja, a
takođe i funkcije koje će realizovati operacije nad kompleksnim brojevima.
#include<iostream.h>
#include<math.h>
class kom{
private:
double re,im;
char *g;
public:
kom(double a=0,double b=0) {re=a;im=b;}
//sledi operatorska funkcija:
friend kom operator+(kom a1,kom b1) {
kom k(0,0);
k.re=a1.re+b1.re;
k.im=a1.im+b1.im;
return k; }
Dragana T.
školska: 2009 / 2010
73
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
void prikaz( ){
if (im>0)
g="+j";
else
g="-j";
cout<<re<<g<<fabs(im)<<endl;}
~kom( ) { };
};
void main( ) {
kom A(3,-14), B(-6,8);
kom C=A+B;
C.prikaz( );
}
Napisati dvije operatorske funkcije (kao prijateljske) koje vrše sabiranje i oduzimanje dva kompleksna
broja u klasi “kom”.
#include<iostream.h>
#include<math.h>
class kom{
private:
double re,im;
char *g;
//imagin.jedinica
public:
kom(double a=0,double b=0) {re=a;im=b;}
//sledi operatorska funkcija:
friend kom operator+(kom a1,kom b1) {
kom k(0,0);
k.re=a1.re+b1.re;
k.im=a1.im+b1.im;
return k; }
void prikaz() {
if (im>0)
g="+j";
else
g="-j";
cout<<re<<g<<fabs(im)<<endl; }
~kom( ){ };
};
void main( ) {
kom A(3,-14), B(-6,8);
kom C=A+B; // -3-j6
C.prikaz();
}
Dragana T.
školska: 2009 / 2010
74
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Operatori new i delete
Operatorske fukcije new i delete su statičke funkcije članice ( čak i ako nisu tako deklarisane).
se pozivaju pre nego što je objekat stvarno kreiran, odnosno pošto je uništen.
Razlog: one
Unutar tjela ovih operatorskih funkcija ne treba pozivati konstruktor, odnosno destruktor.
Konstruktor se poziva posle operatorske funkcije new.
Destruktor se poziva pre operatorske funkcije delete.
Ove operatorske funkcije služe samo da obezbede prostor za smeštanje objekta i da ga posle oslobode.
U glavnom programu prvo se deklariše pokazivač na objekat klase krug:
krug *d;
a zatim kreiramo objekat pomoću operatora new:
d=new krug(5); //dinamičko kreiranje objekta
Operator new služi za dinamičko alociranje memorije.Tako kreirani objekti se nazivaju dinamički objekti.
Kada više nisu potrebni ovi objekti, treba izvršiti dealokaciju memorije.To se ostvaruje pomoću operatora
delete:
delete d;
Djelovanje operatora delete se odvija u dva koraka.Prvo se vrši poziv destruktora objekta, a zatim se prethodno
zauzeta memorija dealocira i označava kao slobodna za ponovno korištenje.Nakon izvršene dealokacije
vrijednost pokazivača d je neodređena.
Rezervisana memorija pomoću new operatora ( dinamičko dodjeljivanje memorije) zahtijeva da se ponovo
oslobodi ( pomoću operatora delete )
#include<iostream.h>
class pravougaonik {
private:
int a,b;
public:
//slede deklaracije metoda:
pravougaonik( );
pravougaonik(int x,int y);
void obim( );
void pov( );
~pravougaonik( );
};
//slede definicije metoda:
pravougaonik::pravougaonik( )
{ a=0;b=0; }
pravougaonik::pravougaonik(int x,int y)
{ a=x;b=y; }
Dragana T.
školska: 2009 / 2010
75
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
void pravougaonik::obim( )
{ cout<<"O=";
cout<<2*(a+b)<<endl; }
void pravougaonik::pov( )
{ cout<<"P=";
cout<< a*b<<endl; }
pravougaonik::~pravougaonik( )
{ cout<<“brisanje objekta"<<endl; }
void main( ) {
//deklaracija pokazivača p1:
pravougaonik *p1;
//kreiranje objekta:
p1=new pravougaonik(4,5);
p1->obim( );
p1->pov( );
delete p1;
}
Dragana T.
školska: 2009 / 2010
76
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
II polugodiste
NASLEĐIVANJE I IZVEDENE KLASE
Jedan od najvažnijih mehanizama u objektno orijentisanim programskim jezicima je nasleđivanje klasa.
Nasleđivanje podrazumeva mogućnost da se nova klasa opiše na osnovu neke postojeće uz zadržavanje svih
njenih svojstava i dodavanja novih atributa i metoda.
Pomoću mehanizma nasleđivanja definiše se izvedena klasa na osnovu jedne ili više baznih klasa.
Ako je klasa „B“ nasledila klasu „A“, kaže se da je klasa „A“ osnovna klasa, a klasa „B“ izvedena klasa.
Može se reći i da je klasa „A“ nadklasa, a klasa „B“ podklasa, ili da je klasa „A“ roditelj a klasa „B“ dete.
Da bi se klasa izvela iz postojeće klase, nije potrebno menjati postojeću klasu, niti je ponovo prevoditi.
Izvedena klasa se deklariše navođenjem reči public i naziva osnovne klase, iza znaka : ( dvotačka ).
Nasljeđivanje je korisno u slučaju kada se pomoću osnovne klase može izvesti više klasa.
Primjer klasa Poligon može biti osnovna klasa za definiciju klasa Pravougaonik i Trougao.
Poligon
Pravougaonik
Trougao
U klasi Poligon možemo deklarisati članove koji su zajednički za klasu Trougao i Pravougaonik. To su širina i
visina poligona.
U klasama Pravougaonik i Trougao, koje su izvedene klase, definisat ćemo funkciju kojom se računa površina
poligona – Povrsina( ).
#include<iostream.h>
class poligon {
protected:
int visina,sirina;
public:
void postavi(int a,int b);
void ispisi( );
};
void poligon::postavi(int a, int b)
{
visina=b;
sirina=a;
}
void poligon ::ispisi()
{
cout<<"a="<<sirina<<endl;
cout<<"b="<<visina<<endl;
Dragana T.
osnovna klasa
definisanje metoda
osnovne klase
školska: 2009 / 2010
77
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
}
class trougao:public poligon
{
public:
double povrsina( );
};
izvedena klasa
double trougao::povrsina( )
{
return (double)sirina*(double)visina/2;
}
definisanje metode
izvedene klase trokut
class pravougaonik:public poligon
{
public:
int povrsina()
{
return sirina*visina;}
};
void main( )
{
trougao t1;
t1.postavi(5,5);
t1.ispisi( );
cout<<"P="<<t1.povrsina( )<<endl;
pravougaonik p1;
p1.postavi(3,5);
p1.ispisi( );
cout<<"P="<<p1.povrsina( )<<endl;
}
Atribute sirina i visina deklarisali smo koristeći rezervisanu reč - specifikator protected. Taj specifikator ima
sličnu namjenu kao i specifikator private, u smislu da se protected članovi ne mogu koristiti kao javni članovi.
Razlika specifikatora private i protected je u tome što se protected članovi mogu koristiti u izvedenim klasama,
a private članovi se mogu koristiti samo u klasi u kojoj su deklarisani.
Rezervisane reči public, private i protected se koriste i kao specifikatori tipa naslijeđivanja.
U našem primjeru, klase Pravougaonik i Trougao su deklarisane s oznakom naslijeđivanja tipa public, tj.
class Pravougaonik: public Poligon;
class Trougao: public Poligon;
Riječ public označava da specifikatori pristupa varijablama iz osnovne klase vrijede i u izvedenim klasama.
Ponekad se za specifikator naslijeđivanja koriste riječi private ili protected. U tom slučaju se mijenja značaj
pristupa članovima temeljne klase na način da specifikator naslijeđivanja određuje minimalnu razinu pristupa
članovima koji su definirani u temeljnoj klasi.
Dragana T.
školska: 2009 / 2010
78
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
Pravo pristupa prema tipu naslijeđivanja prikazano je u slijedećoj tablici:
Tip
Pravo pristupa u osnovnoj klasi
nasljeđivanja
public
protected private
public
protected
private
public
protected
private
protected
protected
private
private
private
private
Ako se nasljeđivanje vrši s protected ili private, tada se ne može javno pristupiti članovima koji su u osnovnoj
klasi deklarirani kao public.
Ukoliko se ne označi način naslijeđivanja, podrazumjeva se da izvedena klasa ima private specifikator
naslijeđivanja.
Šta se sve nasljeđuje iz osnovne klase?
U pravilu, iz osnovne se klase nasljeđuju sve članske funkcije i promjenjive osim:
• konstruktora i destruktora
• operatora =
• prijateljskih funkcija i klasa
#include <iostream>
using namespace std;
class Poligon {
protected:
int sirina, visina;
public:
void postavi (int a, int b)
{ sirina=a; visina=b;}
int Sirina() {return sirina;}
int Visina() {return visina;}
};
class Pravokutnik: public Poligon {
public:
int Povrsina (void)
{ return (sirina * visina); }
};
class Trokut: public Poligon {
public:
int Povrsina (void)
{ return (sirina * visina / 2); }
};
int main () {
Pravokutnik pr;
Trokut tr;
pr.postavi (4,5);
tr.postavi (4,5);
cout << pr.Povrsina() << endl;
cout << tr.Povrsina() << endl;
return 0;
Dragana T.
školska: 2009 / 2010
79
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
}
Kada je nasleđivanje javno to znači da svi nasleđeni članovi zadržavaju isti nivo pristupa.
Ako je vrsta nasleđivanja zaštićena (protected), tada oni članovi koji su bili javni (public) ili zaštićeni
(protected) postaju zaštićeni.Privatni članovi bazne klase uopšte ne postoje u izvedenoj klasi, tj. iako se fizički
(na nivou implementacije) nasleđuju, logički možemo reći da se ne nasleđuju (ne možemo im pristupiti iz
izvedene klase).
Ako je vrsta nasleđivanja privatna (private) tada sve što je nasleđeno postaje privatno.
Konstruktori i destruktori izvedenih klasa
U izvdenoj klasi treba deklarisati samo atribute ili metode koje dodajemo. Svi ostali atributi i metode prosto se
nasleđuju iz osnovne klase.
Po pravilu, iz osnovne se klase nasljeđuju sve članske funkcije i atributi osim:
• konstruktora i destruktora
• operatora =
• prijateljskih funkcija i klasa
Ukoliko je osnovna klasa posjedovala konstruktore, izvedena klasa ih mora ponovo definisati. Razlog za ovo je
činjenica da su konstruktori namjenjeni da inicijaliziraju elemente objekta, a objekti nasljeđene klase gotovo
uvijek imaju dodatne atribute koje konstruktori osnovne klase ne mogu da inicijaliziraju ( s obzirom da ne
postoje u osnonoj klasi).
Konstruktor izvedene klase gotovo uvijek treba da odradi sve što je radio i konstruktor osnovne klase, a nakon
toga da odradi akcije specifične za izvedenu klasu.
Prilikom kreiranja objekta izvedene klase, poziva se konstruktor te klase, ali i konstruktor osnovne klase
Da bismo izbjegli potrebu za prepisivanjem koda, konstruktor izvedene klase gotovo po pravilu treba da
pozove konstruktor osnovne klase. To se radi navođenjem imena osnovne klase i argumenata poziva
konstruktora osnovne klase.
#include <iostream>
#include<string>
Dragana T.
školska: 2009 / 2010
80
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
using namespace std;
class Student {
protected:
string ime_i_prezime;
int broj_indexa;
public:
Student (string ip, int bi) { ime_i_prezime=ip; broj_indexa=bi;}
void ispisi( )
{ cout<<"\nStudent "<<ime_i_prezime ;
cout<<" ima index: "<<broj_indexa;}
~Student( ) { cout<<"pozvan destruktor osnovne klase"<<endl;}
};
class DiplomiraniStudent: public Student {
private:
int god_dipl;
public:
DiplomiraniStudent (string ip, int bi,int gd) : Student(ip,bi) {god_dipl=gd;}
void ispisi( ) {
Student::ispisi( );
cout<<" diplomirao je "<<god_dipl<<" godine"<<endl;}
~DiplomiraniStudent( ) { cout<<"pozvan destruktor izvedene klase"<<endl;}
};
int main ( ) {
Student s1("Marko Markovic",523);
DiplomiraniStudent ds1("Petar Petrovic",234,2003);
s1.ispisi( );
ds1.ispisi( );
return 0;
}
Pri kreiranju objekta izvedene klase redosled poziva konstruktora je sledeći:
. prvo se poziva konstruktor osnovne klase a zatim konstruktor izvedene klase
Pri uništavanju objekta, redosled poziva destruktora je uvek obratan.
POLIMORFIZAM
Polimorfizam u objektno orjentisanom programiranju označava manipulaciju različitim oblicima a dopušta se
atributima i funkcijama u programu da se ponašaju različito u različitim kontekstima.
Polimorfizam predstavlja mogućnost da se atributi i metode koji se koriste ponašaju dvosmisleno, tako da
njihovo značenje zavisi od konteksta.
C++ obezbeđuje tri različita tipa polimorfizma: virtualne (virtuelne) funkcije, preopterećivanje (engl.
Dragana T.
školska: 2009 / 2010
81
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
overloading) funkcija i operatora.
Virtuelne funkcije
∗ Funkcije članice osnovne klase koje se u izvedenim klasama mogu realizovati specifično za svaku izvedenu
klasu, nazivaju se virtuelne funkcije (engl. virtual functions).
∗ Virtuelna funkcija se u osnovnoj klasi deklariše pomoću ključne reči virtual na početku deklaracije. Prilikom
definisanja virtuelnih funkcija u izvedenim klasama ne mora se stavljati reč virtual, ali se to preporučuje radi
povećanja čitljivosti i razumljivosti programa.
∗ Prilikom poziva odaziva se ona funkcija koja pripada klasi kojoj i objekat koji prima poziv.
∗ U izvedenoj klasi u kojoj virtuelna funkcija nije definisana, važi značenje te virtuelne funkcije iz osnovne
klase.
∗ Deklaracija neke virtuelne funkcije u svakoj izvedenoj klasi mora da se u potpunosti slaže sa deklaracijom te
funkcije u osnovnoj klasi (broj i tipovi argumenata, kao i tip rezultata).
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
const double pi=3.1415;
class poligon{
protected:
string naziv;
float sirina,visina;
public:
poligon( ){ }
poligon(string n,float a,float b) {
naziv=n;sirina=a;visina=b;}
virtual float povrsina( ){return 0;}
virtual float obim( ){return 0;}
void ispisi(){
cout<<"ime poligona je: "<<naziv;
cout<<"\tpovrsina je P="<<povrsina();
cout<<"\tobim je O="<<obim()<<endl;}
~poligon (){cout<<"poligon"<<endl;}
};
class krug:public poligon {
private:
float r;
public:
krug( ){}
krug(string n,float R){
naziv=n;r=R;}
virtual float povrsina( ){
return (pow(r,2)*pi);}
virtual float obim( ){
return 2*r*pi;}
Dragana T.
školska: 2009 / 2010
82
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
~krug( ){cout<<"krug"<<endl;}
};
class trokut :public poligon{
public:
trokut( ){}
trokut(string n,float a,float b):poligon(n,a,b){ }
virtual float povrsina( ){
return sirina*visina/2;}
virtual float obim( ){return 2*(sirina+visina);}
~trokut(){cout<<"trokut"<<endl;}
};
void main(){
krug k1("krug",10);
trokut t1("trokut",4,5);
k1.ispisi( );
t1.ispisi( );
}
Apstraktne klase

Virtualna funkcija koja nije definisana za osnovnu klasu naziva se čistom virtualnom funkcijom.

Deklaracija čiste virtualne funkcije u osnovnoj klasi sadrži umjesto tjela =0

Klasa koja sadrži barem jednu čistu virtualnu funkciju naziva se apstraktnom klasom.

Apstraktna klasa ne može imati objekte ( instance ), već se iz nje samo mogu izvoditi druge klase.

Mogu da se formiraju pokazivači i reference na apstraktnu klasu.

Pokazivači i reference na apstraktnu klasu mogu da ukazuju samo na objekte izvedenih konkretnih
klasa.

Apstraktna klasa predstavlja samo generalizaciju izvedenih klasa.
Primjer: Napisati apstraktnu klasu lik koja sadrži čisto virtualne funkcije :
( )
#include<iostream.h>
class lik {
protected:
Dragana T.
školska: 2009 / 2010
void pov ( ) i double obim
83
PROGRAMIRANJE I PROGRAMSKI JEZICI
C++
IIIe2, IIIe3
float a,b;
public:
lik (float x,float y) { a=x; b=y; }
virtual void pov()
=0 ;
virtual double obim() =0;
~ lik() { cout << " lik \ n " ; }
};
class pravougaonik : public lik {
public:
pravougaonik ( float x, float y ) : lik ( x, y ) { }
void pov ( )
{ cout << " P = " << a*b << endl ; }
double obim ( ) { return 2*(a+b) ; }
~ pravougaonik ( ) {cout << " p " << endl ; }
};
void main ( ) {
lik *z1 = new pravougaonik ( 5,6 ) ;
z1 -> pov ( ) ;
cout << " O = " ;
cout << z1 -> obim ( ) << endl ;
delete z1 ;
}
Zadatak :
Napisanom programu dodati :


u osnovnu klasu funkciju ispisi
izvedene klase : kvadrat, pravougli_trougao i krug.
Višestruko nasleđivanje



Kada klasa nasleđuje više osnovnih klasa radi se o višestrukom nasleđivanju ( engl. multiple
inheritance ).
Primjer: konj je životinja, ali je i prevozno sredstvo. Pri tome ni životinja nije vrsta prevoznog
sredstva, ni obrnuto.
Izvedena klasa konj se deklariše kao naslednik više osnovnih klasa ( prev_sred i zivotinja ), tako što se
u zaglavlju deklaracije navode osnovne klase:
class konj : public prev_sred, public zivotinja {



Ispred svake osnovne klase treba da stoji reč public, da bi izvedena klasa nasleđivala prava pristupa
članovima.
Sva navedena pravila o nasleđenim članovima važe i ovde.
Konstruktori osnovnih klasa se pozivaju pre konstruktora članova izvedene klase i konstruktora
Dragana T.
školska: 2009 / 2010
84
PROGRAMIRANJE I PROGRAMSKI JEZICI


C++
IIIe2, IIIe3
izvedene klase.
Konstruktori osnovnih klasa se pozivaju po redosljedu deklarisanja.
Destruktori osnovnih klasa se izvršavaju na kraju, posle destruktora izvedene klase i destruktora
članova.
# include < iostream >
# include < string >
using namespace std;
class prev_sred {
protected:
string vrsta; //zivotinja,biciklo,automobil...
int v;
//brzina
public:
prev_sred ( string vr, int brz ) { vrsta=vr; v=brz; }
int sredb ( ) { return v; }
~ prev_sred ( ) { cout << " prevozno sredstvo " << endl; }
};
class zivotinja {
protected:
string vrsta_z; //konj,pas,..
public:
zivotinja ( string v_z ) { vrsta_z = v_z; }
void hrana ( ) { cout << " biljojed " << endl; }
~zivotinja ( ) { cout << " zivotinje " << endl; }
};
class konj:public prev_sred, public zivotinja {
private:
string vrsta_k;
public:
konj ( string vr_v, int br1, string v_z1, string v_k1) :prev_sred ( vr_v, br1 ), zivotinja ( v_z1 ) {
v_k1 = vrsta_k; }
~konj ( ) { cout << "konj" << endl; }
};
void main ( ) {
konj k1 ( " zivotinja ", 30, " konj ", " poni " );
cout << " srednja brzina: " << k1.sredb ( ) << endl;
k1.hrana ( ) ;
}
Zadatak:
Program preurediti tako da izlaz bude :
prevozno sredstvo moze biti zivotinja, npr konj kao sto je poni koji ima srednju brzinu: 30 i pripada grupi:
biljojeda
Dragana T.
školska: 2009 / 2010
85
Download

Osnove objektno orijentisanog programiranja Microsoft