-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
1
Osnove objektno orijentisanog programiranja
Microsoft Visual C++
C++ je jedan od objektno orijentisanih programa. Omoguava
objektni pristup rjeavanju problema. Nastao je kao naslednik jezika
C, pa je zadrao i koncepte tradicionalnog programiranja. Pojavio se
osamdesetih godina 20.tog vijeka. Autor jezika je Bjarne
Stroustrup.
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
2
Prvi program:
#include int main( ) { // ovo je komentar, a sledi naredba
izlaza cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
3
( endl; ). include je instrukcija predprocesora koja se moe
interpretirati kao "Ovo to slijedi je ime biblioteke. Nai tu
biblioteku i proitaj je tano ovdje
int main ( ) Svaki program u C++ mora imati jednu main( )
funkciju. Tip int ispred funkcije odreuje tip vrijednosti koju e po
zavretku izvoenja 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 uspjeno zavren ( 0 znai OK ). U programskim
jezicima funkcija je obino potprogram koji vraa neku vrijednost ili
rezultat, mada imamo i funkcije koje ne vraaju nikakvu vrijednost,
odnosno funkcije koje vraaju
void (void znai nita). Nakon zaglavlja funkcije slijedi tijelo
funkcije.
Tijelo funkcije poinje znakom "{", a zavrava znakom "}". Izmeu
vitiastih zagrada nalaze se nijedna ili vie naredbi, odnosno blok
naredbi i taj blok naredbi ini tijelo funkcije.
Naredbe odreuju ili definiu redoslijed izvravanja programa,
izraunavaju vrijednosti ili ne
rade nita . Svaka naredba u C++ zavrava sa znakom ";"
Komentar:
// ovo je komentar, a sledi naredba // izlaza
"cout" je naredba za ispis i uvijek se pie: cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
4
Isti program moemo napisati i ovako:
#include using namespace std; int main( ) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
5
// ovo je komentar /* i ovo je komentar napisan u dva reda
*/
int main( ) // int znai da funkcija main kao rezultat vraa
cjelobrojnu vrednost return 0; /* poslije rezervisane rei return
piemo ta vraa funkcija, u ovom sluaju nula 0 znai da je program
uspjeno zavren */
void main( ) /* void znai da funkcija main ne vraa nita, i na
kraju ove funkcije ne piemo naredbu return 0; */
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
6
Pitanja: 1. Komentari slue za... 2. Kako piemo komentare, napii
primjer i objasni 3. Identifikatori su... 4. Navedi pravila pisanja
identifikatora
Osnovni tipovi podataka
Svaki program koji neto radi, sadri podatke koje obrauje. Ti
podaci mogu biti u obliku promjenjivih i konstanti. Promjenjive
mogu mijenjati svoju vrijednost, dok su konstante stalne u toku
izvoenja programa. Svaku promjenjivu koju koristimo u programu
moramo deklarisati. Deklaracija promjenjive moe se nalaziti ispred
funkcije main u tom sluaju se radi o tzv. globalnoj promjenjivoj,
odnosno, promjenjivoj dostupnoj u svim dijelovima programa.
#include using namespace std; int x,y; // x i y su globalne
cjelobrojne promjenjive void main( ) {
x=5; y=3; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
7
y=3; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
8
Brojevi U programski jezik C++ ugraena su dva osnovna tipa
brojeva: cijeli brojevi (eng. integers ) i realni brojevi (eng.
floating-point ).
Cjelobrojna promjenjiva deklarie se sa int . Raspon promjenjive
int je od -32768 do 32767.
int a=5; int b(2); Ako se ukae potreba za veim cijelim brojevima
promjenjivu moemo 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 //GREKA!
Ako je potrebno raunati sa decimalnim brojevima, najee se
koriste promjenjive tipa float i double :
float pi= 3.141593; float nabojelektrona=-1.6e-19; Praznine
unutar broja, na primjer iza predznaka, ili izmeu cifara i slova e
nisu dozvoljene.
Znakovi Znakovne konstante tipa char piu se uglavnom kao samo
jedan znak unutar jednostrukih znakova navoda: char Slovo = 'a';
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
9
Druga naredba ispisuje 0, jer je ASCII kd slova B jednak 66
(nije vano to je B po abecedi iza a!). Trea naredba ispisuje 0, jer
za veliko slovo A kd iznosi 65.
Logiki tip podataka
Logiki podaci su takvi podaci koji mogu poprimiti samo dvije
vrijednosti, na primjer: da/ne, istina/la, dan/no. Jezik C++ za
prikaz podataka logikog tipa ima ugraen tip
bool, koji moe poprimiti vrijednosti true (engl. true - tano)
ili false (engl. false - pogreno):
bool JeLiDanasNedjelja = true; bool SunceSije = false;
Pri ispisu logikih tipova, te pri njihovom koritenju u
aritmetikim izrazima, logiki tipovi se
pretvaraju u int: true se pretvara u cjelobrojni 1, a false u
0.
Konstante U programima se esto koriste simbolike veliine ija se
vrijednost tokom izvoenja ne eli mijenjati. To mogu biti fizike ili
matematike konstante, ali i parametri poput maksimalnog broja
prozora ili maksimalne duine znakovnog niza, koji se inicijalizuju
prije prevoenja kda i ulaze u izvrni kd kao konstante Konstante
definiemo navoenjem kljune rijei const, tipa podataka i naziva
konstante, a zatim joj odmah dodjeljujemo vrijednost. U main
funkciji, konstanta vie ne moe promijeniti vrijednost. Na svaki
pokuaj promjene vrijednosti takve promjenljive, kompajler e javiti
greku:
const double pi = 3.14159265359; pi = 2 * pi; // greka! Drugi
esto koriteni pristup zasniva se na predprocesorskoj naredbi
#define: #define PI 3.14159265359 ( na kraju ovog reda ne pie se
taka-zarez)
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
10
Mijeanje tipova promjenljivih u brojnim izrazima
U brojnim izrazima moemo navoditi promjenljive deklarisane
razliito; moemo mijeati tipove. Uopteno, C++ vri konverziju manjeg
tipa u vei. Npr. ako dodate double na integer promjenljivu, C++
najprije pretvori integer u double, a zatim vri sabiranje. Rezultat
je, naravno, tipa float. Automatska konverzija je samo privremena,
te se nakon izvrene operacije tip podataka zapravo ne mijenja.
ta uiniti 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, krae samo cast):
int a = 1; int b = 3; float c = (float)a / (float)b;
Navoenjem rezervisanih rijei 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. Koji su to osnovni tipovi podataka? 2. Kako se deklarie
cjelobrojna varijabla? 3. Kako se deklarie realna varijabla? 4.
Znakovni tip podataka 5. Konstante 6. Logiki tip podataka 7.
Objasniti mijeanje tipova
Zadatak 1 Napiite program koji e ispisati na ekranu vae ime i
adresu. Zadatak 2 Napiite program koji e na ekranu ispisati u
jednom redu brojeve 2002 i 12.34.
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
11
Standarni ulaz/izlaz Naredba izlaza cout, u program moramo
ukljuiti biblioteku standarnih ulazno/izlaznih funkcija iostream.h.
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
12
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
13
Pored spomenutih, za formatiranje izlaza moemo koristiti i druge
specijalne znakove, kao to je prikazano :
\n novi red \t horizontalni tabulator \a zvuni signal
(alert)
Naredba ulaza cin>>
cin >> promjenljiva; cin uitava vrijednost koju korisnik
unosi pomou tastature i dodjeljuje je promjenljivoj ije ime
navedemo kao parametar. Postoji velika razlika izmeu dodjele
vrijednosti promjenljvoj pomou cin i pomou operatora dodjele( = ).
Iako obje naredbe u osnovi dodjeljuju vrijednost promjenljivoj,
dodjela vrijednosti promjenljivoj pomou operatora dodjele vri se
unutar programa. Naredbom dodjele programer tano definie egzaktnu
vrijednost promjenljivoj. Svaki put kada startujete program, ta
promjenljiva dobit e istu vrijednost. Kada koristite cin,
promjenljiva e dobiti vrijednost koju korisnik uita. To moe biti
bilo koja vrijednost i ovisi o korisniku. Koritenje cin moe biti
uzrok problema cin oekuje da korisnik upie tano odreeni tip
podataka. Npr. ako je parametar cin promjenljiva tipa int, onda
korisnik moe upisati samo cio broj. U principu, korisnik moe
postupiti i drugaije. Da bi se ovo izbjeglo moe pomoi ako prije
svakog cin zadamo i cout u kome korisniku ispiemo kakvu vrijednost
od njega oekujemo. Npr.
cout > i; Pomou cin moemo uitati i vie od jedne promjenljive.
Npr.
cin >> i >> j >> k; oekuje od korisnika tri
brojne vrijednosti. Nakon unosa svake od tih vrijednosti korisnik
mora pritisnuti taster Enter da bi omoguio uitavanje slijedee
vrijednosti
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
14
OPERATORI
Da bismo objekte u programu mogli mijenjati, na njih treba
primjeniti odgovarajue operacije.
Operator pridruivanja: Operatorom pridruivanja mjenja se
vrijednost nekog objekta (variable), pri emu tip objekta ostaje
nepromjenjen .Najei operator pridruivanja je (=), kojim se objektu
na ljevoj strani pridruuje neka vrijednost s desne strane.
primjer:
int i = 5; i = 3; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
15
Navoenjem kljunih rijei float u zagradama ispred operanada,
njihove vrijednosti pretvaraju se u decimalne prije operacije
djeljenja, tako da je rezultat korektan.
Aritmetiki operatori
Za ugraene tipove podataka definirani su osnovni operatori
(sabiranje,oduzimanje,mnoenje,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++ uveaj nakon
primjer: int i=1; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
16
je napisan iza nje. Binarni operatori: x + y sabiranje x - y
oduzimanje x * y mnoenje binarni operatori x / y dijeljenje x % y
modul (vraa 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 * mnoenje
2*3.4 6.8 / deljenje 9/2.0 4.5
% ostatak deljenja
13%3 1
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
17
Logiki operatori
Logiki operatori koriste se za formiranje sloenih logikih
izraza. C++ koristi sledee logike operatore: operator ime
primer
! negacija !(5==5) // daje 0
&& Logiko I (AND) 5
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
18
= = jednako != razliito
Naredni primer ilustruje upotrebu operatora poreenja: #include
main() { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
19
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
20
a
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
21
Dvostruki izbor elimo li da se ovisno u rezultatu izraza u if
uslovu izvode dva nezavisna programska odsjeka, primijenit emo
sljedei oblik uslovnog grananja:
if (neki_uslov)
{ naredba_1; naredba_2; direktni blok ...; } else { naredba_3;
naredba_4; alternativni blok ... ; }
Kod ovog oblika, ako izraz u if uslovu daje rezultat razliit od
nule, izvest e se prvi blok naredbi (direktni blok). Po zavretku
bloka izvoenje programa nastavlja se od prve naredbe iza drugog
bloka. Ako izraz daje kao rezultat nulu, preskae se prvi blok, a
izvodi samo drugi blok (alternativni blok) naredbi, nakon ega se
nastavlja izvoenje naredbi koje slijede.
Uslovni operator ? Iako ne spada meu naredbe za kontrolu toka
programa, uslovni operator po strukturi je slian if-else bloku :
uslov ? izraz1 : izraz2 ; Ako izraz uslov daje logiku istinu,
izraunava se izraz1, a u protivnom izraz2. U primjeru:
x = (x < 0) ? -x : x; // x = abs(x) ako je x negativan,
izraunava se prvi izraz, te se varijabli x na lijevoj strani znaka
jednakosti pridruuje njegova pozitivna vrijednost, tj. varijabla x
mijenja svoj predznak. Naprotiv, ako je x pozitivan, tada se
izraunava drugi izraz i varijabli x na lijevoj strani pridruuje
njegova nepromijenjena vrijednost. Izraz u uslovu mora kao rezultat
vraati aritmetiki tip ili pokaziva. Alternativni izrazi desno od
znaka upitnika moraju davati rezultat istog tipa ili se moraju dati
svesti na isti tip preko
a>b
kraj
DA NE
naredba_1;naredba_2;
naredba_3;naredba_4;
a>b
kraj
DA NE
naredba_1;naredba_2;
naredba_3;naredba_4;
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
22
ugraenih pravila konverzije. Uslovni operator koristite samo za
jednostavna ispitivanja kada naredba stane u jednu liniju. U
protivnom kd postaje nepregledan. Primer upoterbe uslovnog
operatora: #include int main() { int a; couta; cout0 ? ("pozitivan
broj") : ("negativan broj"))
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
23
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 izvrava na sljedei
nain: vrijednost izraza u zagradi (izraz) iza rezervisane rijei
switch se uporeuje sa vrijednosti neke od konstanti navedenih iza
labele case. Ukoliko je vrijednost tog izraza jednaka vrijednosti
neke od konstanti iza labele case, izvravanje programa se nastavlja
od tog mjesta. Ako vrijednost izraza nije jednaka niti jednoj od
vrijednosti konstanti navedenih iza labele case, izvravanje
programa se nastavlja od mjesta unutar bloka oznaenog labelom
default, ako postoji. U sluaju da vrijednost izraza nije jednaka
vrijednosti neke konstante, a blok naredbi sa labelom default ne
postoji, tada se preskae cijeli switch blok i izvrava se dalji dio
programa. Default labela je opcionalna (nije obavezna), meutim,
koritenje default labele je dobra programerska praksa. Blok naredbi
iza default labele e biti izvren samo u sluaju ako nije izvrena
niti jedna od case labela.
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
24
Primer: Napisati program koji proverava da li je uneseno slovo
samoglasnik ili ne i ako jeste ispisuje ga kao veliko slovo:
#include main() { char a; couta; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
25
prekidprekidponavljanjaponavljanja
n = 10
i = 1
i = i + 1
i
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
26
a=a+2; } return 0; } Zadatak
1. Napisati for petlju kojom se izraunavaju i tampaju svi
brojevi djeljivi sa 5 do n. 2. Napisati program koji izraunava sumu
parnih ( neparnih) brojeva od 1 do zadatog
broja n. Pitanja:
1. Objasnite djelovanje for petlje. 2. Objesniti ulogu poetnog
izraza, uslova izvoenja i izraza prirasta 3. ta je to beskonana
petlja. Kako moe 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_izvoenja) blok_naredbi uslov izvoenja je izraz iji
je rezultat tipa bool.
Redosled izvoenja while petljeje sljedei:
1. izraunava se logiki izraz uslov_izvoenja.
2. ako je rezultat jednak logikoj neistini, preskae se
blok_naredbi i program se nastavlja od prve naredbe posle while
petlje.
3. ako je uslov_izvoenja jednak logikoj istini izvodi se
blok_naredbi. Zatim se program vraa na while naredbu i izvodi od
take 1.
a
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
27
//napisati program koji sabira 10 cijelih brojeva //sa ulaza i
ispisuje njihov zbir #include void main() { int i,n,s; s=i=0; while
(i
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
28
//kontrola unosa podataka:korisnik unosi podatak tako dugo dok
ne unese ispravan
#include void main() { int ocjena; do { coutocjena; }
while((ocjena5)); cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
29
Naredba continue takoe uzrokuje skok programa na kraj petlje,
ali se zatim njeno ponavljanje nastavlja. Treba izbjegavati esto
koritenje break i continue naredbi u petljama, jer one naruavaju
struktuiranost programa.Koriste se samo za posebna stanja, kada ne
postoji drugi prikladan nain da se izvoenje naredbi prekine.Naredba
continue moe se izbjei if blokom. Naredba goto omoguava bezuslovni
skok na neku drugu naredbu unutar iste funkcije.Opti oblik je:
goto ime_oznake;
ime_oznake (identifikator) je simboliko ime koje se mora
nalaziti ispred naredbe na koju se eli prenijeti kontrola, odvojen
znakom : (dvotaka). Naredba na koju se eli skoiti moe 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
30
String
U C++ postoji tip string, koji predstavlja niz znakova kojima se
obraamo jednim imenom. Nakon brojeva, stringovi su sledei najee
korieni tipovi podataka u mnogim programima.
String tip nije osnovni tip podataka kao npr. char, int ili
float. Definie se u biblioteci i dio je ANSI standarda za C++.
#include #include using namespace std; int main( ) { string
ime,prezime; coutime; coutprezime; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
31
Pokazivaki tip
Jedan od najmonijih alata koji su na raspolaganju C++ programeru
je pokaziva, kojim se direktno manipulie memorijom kompjutera.
Pokaziva je promenjiva koja sadri memorijsku adresu promenjive na
koju pokazuje. Svaka promjenjiva koja se deklarie u programu tokom
svog ivota zauzima odreeni prostor u memoriji. Mjesto u memoriji
koje je dodjeljeno nekoj promjenjivoj odreeno je njenom adresom,
koja je fiksna sve dok posmatrana promjenjiva postoji Npr imamo
promjenjivu: int x=5; pri nailasku na ovu deklaraciju rezervie se
odgovarajui prostor u memoriji za smjetanje sadraja ( x=5)
promjenjive x adrese .... 1234 1235 1236 1237 1238 1239 1240 1241 x
promjenjiva x ima adresu 1237 i na toj adresi smjetena je
vrijednost 5 int *p; // ovo je deklaracija pokazivaa koji pokazuje
na cjelobrojnu vrijednost adrese .... 1234 1235 1236 1237 1238 1239
1240 1241 x p Kao i svaka druga promjenljiva, i pokazivaka
promjenljiva zauzima odreeni prostor u memoriji. Pokazivau je mogue
dodjeliti adresu nekog objekta (npr. promjenljive) uz pomo unarnog
prefiksnog operatora &, p=&x; adrese .... 1234 1235 1236
1237 1238 1239 1240 1241 x p pokaziva p sada pokazuje na adresu
promjenjive x (1237) cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
32
Adresa promenjive moe se odrediti upotrebom operatora adresa:
& #include int main() { int a=5; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
33
FUNKCIJE
Funkcija je zaseban blok naredbi koji se piu prije ili poslije
main( ). Funkcija je potprogram (logicka cjelina) koja se poziva i
izvodi po potrebi jednom ili vei 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 rauna povrinu kvadrata,
funkcija koja odreuje maximum od tri unesena broja, ....) Funkciju
treba deklarisati prije prvog poziva, Svaka funkcija prije svog
poziva u programu trebala bi biti deklarisana. Deklaracija saoptava
kompajleru ime, povratni tip i parametre funkcije primjer
deklaracije funkcije koja rauna povrinu kvadrata: int
Povrsina_Kvadrata ( int a); ime funkcije Deklaraciju funkcije koja
rauna povrinu kvadrata moemo napisati i ovako: int
Povrsina_Kvadrata ( int); Definicija funkcije mora oblikom u
potpunosti odgovarati deklaraciji ( tip funkcije, broj, redoslijed
i tip argumenata) i sadrati sve naredbe te funkcije. Definicija
saoptava kompajleru kako funkcija radi. Svi pozivi funkcije e se
prilikom povezivanja programa usmjeriti na tu definiciju Definicija
funkcije:
int Povrsina_Kvadrata ( int a) {
int P; P=a*a; tijelo funkcije return P;
}
Povratni tip - Odreuje kakav e biti tip podatka kojeg e funkcija
vratitit naredbom return poslije poziva te funkcije - Vriednost
koju funkcija vraa odreuje se naredbom return u definiciji funkcije
- Ako funkcija ne vraa nita onda se pie da je tip podatka void
Formalni argumenti ( parametri ) funkcije - formalni podaci koji
se predaju funkciji prilikom njenog poziva - njihov je broj
proizvoljan, funkcija moe biti i bez argumenata ili sa neodreenim
brojem argumenata - u deklaraciji se imena argumenata mogu
izostaviti
int znai da funkcija vraa kao rezultat cjelobrojnu vrijednos
Poslije return piemo vrijednost koju vraa funkcija Kod funkcije
koja ne vaa nita ne pie se return
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
34
Funkcije imaju parametre ili argumente (engl. parameters,
arguments) koji se zadaju prilikom poziva. Rezultat funkcije je
povratna vrijednost (engl. return value). Funkcija moe pozvati
drugu funkciju, ali i samu sebe (rekurzija). Deklaracija daje
prototip funkcije. Ona ne sadrava opis ta i kako funkcija radi.
Funkcija moe imati n argumenata, a moe 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, izvravanje uvijek
zapoinje 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 izvravaju onog
trenutka kada se eksplicitno pozovu. Poziv funkcije se vri
navoenjem njenog imena iza kojeg slijede zagrade, unutar kojih se
navode parametri (argumenti) funkcije, ukoliko postoje. Korienje
funkcija u programu zahteva da prvo deklariete funkciju, pa da je
definiete. Poziv funkcije Nakon to je funkcija deklarisana, moemo
je pozvati iz bilo kojeg dijela programa navoenjem naziva funkcije
sa odgovarajuom listom argumenata: Povrsina_Kvadrata ( 5 );
Prilikom poziva funkcije formalni argumenti zamjene se sa stvarnim
argumentima tj. sa konkretnom vrijednou ( npr 5 ):
broj argumenata u pozivu funkcije mora biti jednak broju
argumenata u definiciji funkcije tipovi stvarnih argumenata moraju
se podudarati sa tipovima odgovarajuih 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 rauna povrinu kvadrata. Iz
glavnog programa pozvati funkciju i prikazati povrinu za unesenu
stranicu kvadrata #include
int povrsina(int); //deklaracija funkcije koja rauna povrinu
kvadrata void main( ) { int x; coutx; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
35
Isti zadatak moemo da uradimi i ovako : #include int
povrsina(int x) { return x*x ; } void main( ) { int a; coutx;
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
36
Zadaci:
1. Funkcija je 2. Objasniti ta je definicija a ta deklaracija
funkcije 3. Kad se izvravaju naredbe funkcije 4. Kako pozivamo
funkciju 5. Za koje promjenjive kaemo da su globalne a za koje da
su lokalne promjenjive 6. Napisati funkciju koja rauna faktorijel
unjetog broja. 7. Napisati funkciju koja prikazuje parne brojeve 8.
Neka se sa tastature unose brojevi a1,a2 i a3. Napii funkciju koja
prikazuje najvei broj i
program koji poziva tu funkciju. #include void maxmin(int a, int
b) { int z; z=(a>b) ? a: b; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
37
void max(int x, int y) { int z; if (x!=y) { z=(x>y) ? x: y;
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
38
Primjer funkcije koja vri zamjenu vrijednosti dvije promjenjive
#include 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
39
Osim prenosa argumenata po vrednosti, mogue je koristiti
pokazivae i reference kao argumente. U tom sluaju funkcija ne vri
obradu nad kopijama podataka nego nad originalnim podacima. Svaka
promena formalnog argumenta reflektovae se na original, stvarni
argument. Pokazivai kao argumenti:
#include using namespace std; //definicija funkcije void
Zamena_vrednosti(int *x,int *y) // argumenti funkcije su pokazivai
na promjenjive { int pom; pom=*x; *x=*y; *y=pom; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
40
Reference kao argumenti: Referenca se oznaava znakom &
Referenca je drugo ime za promjenjivu Upotreba referenci omoguuje
promjenu vrijednosti stvarnih argumenata
Referenca se prilikom svoje inicijalizacije vrsto vezuje za
objekat kojim se inicijalizuje. Ova veza se vie nikako ne moe
raskinuti, to znai da referenca, do kraja svog ivotnog
veka, upuuje na jedan isti objekat. Svako navoenje neke
reference u programu, posle trenutka njene inicijalizacije,
predstavlja
posredan pristup do referenciranog objekta. #include 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
41
Preoptereenje funkcije Preoptereenje omoguuje upotrebu istog
imena za razliite funkcije, pri emu se te funkcije meusobno
razlikuju po tipu argumenata u svom zaglavlju. Primer:
#include void funkcija(int n) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
42
Rekurzija omoguuje da funkcija poziva samu sebe Postupak
pozivanje funkcije iz funkcije naziva se rekurzija. Primjer:
napisati funkciju koja rauna faktorijel unesenog broja ( faktorijel
npr broja 4 se rauna: 4!=1*2*3*4 )
#include int factorial( int x ) { if (x == 1) return(1); else
return(x * factorial (x-1 ) ); } void main( ) { int a; couta;
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
43
NIZOVI
Niz predstavlja skup objekata istog tipa koji nisu pojedinano
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 vie podataka istog tipa koji ine neku
cjelinu, a trebamo ih sauvati radi dalj obrade U memoriji niz
zauzima kontinuirani prostor
Jednodimenzionalni nizovi Viedimenzionalni nizovi
Jednodimenzionalni nizovi
Nizovi se koriste kada radimo sa vie podataka istog tipa koji
ine neku cjelinu, a trebamo ih sauvati radi daljnje obrade
Npr. Posmatramo niz od 10 izmjerenih temperatura.
Definiemo niz pod nazivom: tem[10] T1, T2, T3, T4, T5, T6, T7,
T8, T9, T10 tem[0] tem[1] tem[2] tem[3] tem[4] tem[5] tem[6] tem[7]
tem[8] tem[9]
Prvi element niza je nulti element! iIndeksi, redni broj
elementa u nizu Ako definiemo niz od n elemenata, poslednji element
je n-1. Ako pokuamo da pristupimo elementu na poziciji n dolazi do
greke! Pojedini elementi numerisani su redom
0, 1, 2, 3,
Ti brojevi zovu se indeksi i preko njih se moe direktno
pristupiti bilo kojem elementu niza(polja) Ako je a ime niza od n
elemenata, tada su pojedini elementi oznaeni s:
a[0], a[1], a[2], , a[n-1]
Indeks ukazuje koliko je neki element udaljen od poetnog
elementa (koji ima indeks 0)
Definisanje niza: int a[3]; Niz a[3] ima tri cjelobrojna
elementa: a[0], a[1] i a[2] Elementima niza moemo dodjeliti
vrednost pomou naredbe cin:
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
44
cin>>a[0]; // npr. a[0]=3 a[1]=9; a[2]=a[0]+a[1]; //
a[2]=3+9 cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
45
Sortiranje Napisati program kojim se ureuje niz cijelih brojeva
u rastuem redosledu
#include #include int main() { const int n=5; int a[n]; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
46
VIEDIMENZIONALNI NIZOVI Dvodimenzionalni niz - Matrica Primjeri
tabelarnog ( matrinog ) prikaza podataka: Tablica mnoenja:
Tastatura:
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
Veliina odnosno dimenzije matrice odreene su brojem redova (m) i
brojem kolona (n) i zapisuje se kao m x n
x 1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 2 2 4 6 8 10 12 14
16 18 20
3 3 6 9 12 15 18 21 24 27 30 4 4 8 12 16 20 24 28 32 36 40 5 5
10 15 20 25 30 35 40 45 50 6 6 12 18 24 30 36 42 48 54 60 7 7 14 21
28 35 42 49 56 63 70 8 8 16 24 32 40 48 56 64 72 80 9 9 18 27 36 45
54 63 72 81 90 10 10 20 30 40 50 60 70 80 90 100
a11 a12 a13 a1j .. a1n a21 a22 a23 a2j ... a2n ai1 ai2 ai3 aij
... ain ... .
am1 am2 am3 amj ... amn Svaki element matrice ima dva indeksa
broj reda(i) i broj kolone(j)
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
47
Deklaracija viedimenzionalnog 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
Viedimenzionalni niz se deklarie tako da se dodaju srednje zagrade,
gde broj srednjih zagrada odreuje 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 moe biti
inicijaliziran na sledei nain: 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 znai korienje 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 tree kolone dodjeljena je
vrijednost 5 Moe i ovako: cin>> A[2][3]; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
48
Znakovni niz
definicija i ispis
Znakovni nizovi su jednodimenzionalni nizovi koji slue za
prikazivanje tekstova: Na kraju niza automatski se postavlja
nul-znak (engl. null-character). Nije ga potrebno eksplicitno
navoditi, ali treba o njemu voditi rauna. char tekst [ ] = {
'm','a','r','i','j','a','n','a', \0 } ; // definicija cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
49
DATOTEKE Svi programi koje smo do sada pisali posjedovali su
sutinski nedostatak da se svi uneseni podaci gube onog trenutka
kada se program zavri.Poznato je da se ovaj problem rjeava uvoenjem
datoteka koje predstavljaju strukturu podataka koja omoguava trajno
smjetanje informacija na nekom od ureaja vanjske memorije(obino 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 podrava tri razreda za rad s
ulazom/izlazom kod datoteka:
- ifstream - itanje datoteke s diska - ofstream - pisanje u
datoteku na disku - fstream - podrava i itanje i pisanje u
datoteku
Pisanje u datoteku:
- U datoteku brojevi.txt upisati prvih 20 brojeva
#include int main() { ofstream imedat("brojevi.txt"); for(int
i=1; i
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
50
- in // itanje - out // pisanje - ate // nakon otvaranja
pozicionira se na kraj datoteke - app // novi zapisi se dodaju na
kraj datoteke - trunc // prazni datoteku ako ona ve postoji -
nocreate // ako datoteka ne postoji otvaranje je neuspjeno -
noreplace // ako datoteka postoji otvaranje je neuspjeno - binary
// binarna datoteka
U datoteku brojevi.txt dopiite vae ime:
#include int main() { char ime[20]; ofstream
upis("brojevi.txt",ios::ate|ios::app); cin>>ime; upis
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
51
STRUKTURE
Strukture predstavaljaju sloene 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 rei struct u vitiastim zagradama navode deklaracije
individualnih elemenata od kojih se struktura sastoji. struct
ucenikIIIe2 { string ime; int br_god; lanovi strukture float op_us;
} ; Deklaracija promjenjivih strukturnog tipa moe se izvriti na
sledei nain: ucenikIIIe2 u1, u2, u3; ili ovako: struct ucenikIIIe2
{ string ime; int br_god; float op_us; } u1, u2, u3 ; // ovo se
smatra loim stilom pisanja, koji treba izbjegavati Pojedinana polja
(atributi,podaci lanovi) unutar slogovnih promjenjivih ponaaju se
poput individualnih promjenjivih odgovarajueg tipa, kojima se
pristupa tako to prvo navedemo ime slogovne promjenjive, zatim znak
(operator) taka ( . ) i, konano, ime polja unutar slogovne
promjenjive : cin >> u1.ime ; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
52
string ime ; int br_god ; float op_us ; } ; void main ( ) {
ucenikIIIe2 u1 ; cout > u1.ime ; cout > u1.br_god ; cout >
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 deklariemo
strukturu 6. Kako se deklariu promjenjive strukturnog tipa 7. Kako
pristupamo lanovima strukture
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
53
II polugodiste
KLASE
Programski jezik C++ je karakteristian po tome to programeru
doputa da kreira svoj tip podatka. U tu svrhu se koriste klase.
Klasa je korisniki definisan tip podataka. Klase su temelj objektno
orijentisanog pristupa programiranju. Klase omoguavaju programeru
modeliranje objekata koji imaju atribute ( predstavljene kao podaci
) i ponaanje ili operacije ( predstavljene kao funkcije ili metode
) Klasa predstavlja apstrakciju koja definie zajednika svojstva i
zajednike postupke koji su svojstveni svim objektima nekog tipa.
Npr. Kreiramo klasu Maak, za opis make koristimo podatke koji su
zajedniki za zve make: ime, broj godina, prede,lovi mia... ime,
broj godina i slini podaci se predstavljaju kao atributi a ponaanje
make kao to je prede, lovi mia i sl. Predstavlja se u klasi kao
metoda ( funkcija ). class Macak klasa je samo opis zajednikih
osobina i postupaka karakteristinih za sve make O B J E K T I //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.
Maak: string ime; int br_god; void spava( ); void lovi_misa(
);
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
54
Primjer: #include #include using namespace std; class Macak {
public: // nain pristupa lanovima klase string ime; //atribut
string prede ( ) // ovo je metoda koja opisuje ponaanje make {
return " ZZ Z zz...z.ZZZ"; }
}; // na kraju klase obavezno ide }; int main( ) { Macak
spavalica; // kreiramo objekat coutspavalica.ime; // pomou
kreiranog objekta obracamo se lanovima klase cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
55
2. lanovi iza rezervisane rei public: nazivaju se javnim (engl.
public) lanovima dostupni su spolja bez ogranienja
3. lanovi iza rezervisane rei protected:
nazivaju se zatienim (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 (preporuuje se navedeni redosled) Moe biti vie sekcija
iste vrste Podrazumevana sekcija (do prve labele) je privatna
Preporuka je da se klase projektuju tako da nemaju javne
atribute
Ako nije nita navedeno, podrazumijeva se privatni pristup
Obratiti panju na nain pisanja metoda:
string prede ( ) { //otvorimo veliku zagradu i piemo naredbe te
metode return " ZZ Z zz...z.ZZZ"; //ono to metoda vraa pie se posle
return } //na kraju metode obavezno zatoriti veliku zagradu
Primjer metode koja ne vraa nita:
void prede ( ) {
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
56
Deklaracija klase ''class'' definie 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
57
Deklaracija metode Funkcije koje se deklariu u klasi nazivaju se
metode. Prostor njihove upotrebe je klasa. One ne postoje izvan
klase. Metode se mogu pozvati samo unutar klase ili ih moe pozvati
instanca (objekat) klase. Pomou metoda klase se moe pristupiti svim
atributima klase bez obzira na njihova ogranienja pristupa. Metoda
u C++ mora biti prije upotrebe deklarisana, a zatim i definisana.
Metode se kao i atributi mogu deklarisati upotrebom rezervisanih
rijei public, protected i private. Metode deklarisane kao public
omoguuju pristup svim dijelovima klase. Metode private slue za
interni rad s klasom. Korisnik ih ne moe pozivati. Zato su privatne
i skrivene od vanjskog svijeta. Korisnik ne moe pozivati i metode
protected. Njima mogu pristupiti samo klase koje nasljeuju 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
sljedeem se koraku deklarisana metoda mora definisati. To znai
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) {
//definicija metode u klasi a = x ; } }; Primjer definicije metode
izvan klase Ako su metode sloenije i sadre vei broj programskih
redaka onda je definicija unutar klase suvie 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
podruja vrijednosti.
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
58
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 definiu ta e metoda
raditi. Primjena metoda Poziv ili upotreba metode zahtjeva navoenje
naziva objekta, naziva metode i parametara metode. Primjer K1.
dodjela ( 5 ); Primjer: Napisati klasu kvadrat sa sledeim lanovima:
stranica a atribut i metode: dodjeli( ), povrsina( ), obim(
),dijagonala( ) i rezultati( ). #include #include 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; }
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
59
double kvadrat::dijagonala( ) { return a*sqrt(2);} void
kvadrat::rezultat( ) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
60
T1.dodeli(x,y); cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
61
return 2*r*pi; }; void adresa( ) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
62
Primjer: Napisati klasu krug koja u privatnom dijelu ima statiki
lan pi i atribut r(poluprenik), u javnom dijelu deklarisati dvije
metode: unos i obim #include class krug { private: static double
pi; double r; public: void unos( ); double obim( ); }; double
krug::pi=3.1415; void krug::unos( ) { coutr; } double krug::obim()
{ double O=2*r*pi; return O; } void main( ) { krug k; k.unos( );
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
63
Primjer: Napisati klasu kom koja predstavlja kompleksni broj i
ima privatne atribute:a,b, i sledee metode: dodela(), prikaz() i
prijateljsku funkciju sabiranje(kom k1,kom k2) koja sabira dva
kompleksna broja. #include 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 pie 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
64
Vjeba: -u klasu kom dodajte:
jo jednu prijateljsku funkciju koja rauna modul kompleksnog
broja: modul(kom k), imaginarnu jedinicu predstavite kao statiki
lan (static char c[ ] )
Prijateljske klase
Ako je potrebno da sve funkcije lanice klase krug budu
prijateljske funkcije klasi kvadrat, onda se klasa krug deklarie
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 obino koriste kada neke dvije klase imaju
blie meusobne veze. Prijateljstvo nije simetrino, ako je klasa krug
prijatelj klasi kvadrat to ne znai 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 meusobno prijateljske klase: krug i
kvadrat koje raunaju povrine kruga i kvadrata koji opisuje krug.
#include #include 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 obraa klasi kvadrat
}; double krug::pi=3.14159; //definicija statikog lana
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
65
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
obraa prijateljskoj klasi krug
}; void krug::Ukvadratu(kvadrat kv) { r = kv.a/2; // definicija
metode koja pripada klasi krug } void kvadrat::Okokruga(krug k) { a
= k.r*2; // 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 obraa se klasi krug cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
66
Konstruktor objekta u C++ ima tri vana aspekta: Uzima isto ime
kao i klasa Moe da ima argumente Ne moe da vrati vrednost
Postoje tri osnovna tipa konstruktora:
1. podrazumjevani (default) konstruktor 2. konstruktor sa
parametrima (korisniki definisani konstruktor) 3. konstruktor
kopije (copy konstruktor, za prepis vrjednosti)
Podrazumjevani konstruktor Ovaj konstruktor ne poseduje
parametre, i ne vri nikakvu drugu akciju sem zauzea 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 sloena fukcija; on inicijalizuje sve podatke lanove
vrjednou nula.
Ako se vratite i deklaraciji klase dodate konstruktore,
podrazumjevani konstruktor koji je napravio prevodilac jednostavno
e nestati- vie ga nee biti.
Uvjek navedite podrazumjevani konstruktor, ak i kada on nita ne
radi. Tako ete se osigurati da podrazumjevani konstruktor ne
nestane ako se vratite i dodate druge konstruktore u program
Primjer:
#include #include
class kvadrat { private: int stranica; public: kvadrat( )
{stranica=0; } //podrazumjevani konstruktor int povrsina( ){ return
pow(stranica,2); } void izlaz( ) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
67
Vjeba: 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
#include 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
68
void postavi(int x,int y) {a=x;b=y;} long povrsina( ) {return
a*b;} void ispisi( ) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
69
public: broj() {re=0;im=0;} //podrazumjevani konstruktor void
postavi(int r,int i ) { re=r; im=i; } void prikazi( ) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
70
re=r; im=i;} void prikazi(){cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
71
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
72
void main(){ trougao t1(3,4); //poziv konstruktora sa
parametrima cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
73
cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
74
void prikaz( ){ if (im>0) g="+j"; else g="-j"; cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
75
Operatori new i delete Operatorske fukcije new i delete su
statike funkcije lanice ( ak i ako nisu tako deklarisane). Razlog:
one se pozivaju pre nego to je objekat stvarno kreiran, odnosno
poto je uniten. 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 slue samo da
obezbede prostor za smetanje objekta i da ga posle oslobode. U
glavnom programu prvo se deklarie pokaziva na objekat klase
krug:
krug *d; a zatim kreiramo objekat pomou operatora new:
d=new krug(5); //dinamiko kreiranje objekta Operator new slui za
dinamiko alociranje memorije.Tako kreirani objekti se nazivaju
dinamiki objekti. Kada vie nisu potrebni ovi objekti, treba izvriti
dealokaciju memorije.To se ostvaruje pomou operatora delete:
delete d; Djelovanje operatora delete se odvija u dva
koraka.Prvo se vri poziv destruktora objekta, a zatim se prethodno
zauzeta memorija dealocira i oznaava kao slobodna za ponovno
koritenje.Nakon izvrene dealokacije vrijednost pokazivaa d je
neodreena. Rezervisana memorija pomou new operatora ( dinamiko
dodjeljivanje memorije) zahtijeva da se ponovo oslobodi ( pomou
operatora delete )
#include 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; }
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
76
void pravougaonik::obim( ) { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
77
II polugodiste
NASLEIVANJE I IZVEDENE KLASE
Jedan od najvanijih mehanizama u objektno orijentisanim
programskim jezicima je nasleivanje klasa. Nasleivanje podrazumeva
mogunost da se nova klasa opie na osnovu neke postojee uz
zadravanje svih njenih svojstava i dodavanja novih atributa i
metoda. Pomou mehanizma nasleivanja definie se izvedena klasa na
osnovu jedne ili vie baznih klasa. Ako je klasa B nasledila klasu
A, kae se da je klasa A osnovna klasa, a klasa B izvedena klasa.
Moe se rei 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 postojee
klase, nije potrebno menjati postojeu klasu, niti je ponovo
prevoditi. Izvedena klasa se deklarie navoenjem rei public i naziva
osnovne klase, iza znaka : ( dvotaka ). Nasljeivanje je korisno u
sluaju kada se pomou osnovne klase moe izvesti vie klasa. Primjer
klasa Poligon moe biti osnovna klasa za definiciju klasa
Pravougaonik i Trougao. U klasi Poligon moemo deklarisati lanove
koji su zajedniki 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 rauna povrina poligona
Povrsina( ). #include class poligon { protected: int visina,sirina;
public: osnovna klasa void postavi(int a,int b); void ispisi( ); };
void poligon::postavi(int a, int b) { visina=b; sirina=a; } void
poligon ::ispisi() definisanje metoda { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
78
} class trougao:public poligon { public: izvedena klasa double
povrsina( ); }; 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
79
Pravo pristupa prema tipu naslijeivanja prikazano je u slijedeoj
tablici:
Pravo pristupa u osnovnoj klasi Tip nasljeivanja
public protected private
public protected private
public protected private
protected protected private
private private private
Ako se nasljeivanje vri s protected ili private, tada se ne moe
javno pristupiti lanovima koji su u osnovnoj klasi deklarirani kao
public. Ukoliko se ne oznai nain naslijeivanja, podrazumjeva se da
izvedena klasa ima private specifikator naslijeivanja. ta se sve
nasljeuje iz osnovne klase? U pravilu, iz osnovne se klase
nasljeuju sve lanske funkcije i promjenjive osim: konstruktora i
destruktora operatora = prijateljskih funkcija i klasa #include
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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
80
} Kada je nasleivanje javno to znai da svi nasleeni lanovi
zadravaju isti nivo pristupa. Ako je vrsta nasleivanja zatiena
(protected), tada oni lanovi koji su bili javni (public) ili
zatieni (protected) postaju zatieni.Privatni lanovi bazne klase
uopte ne postoje u izvedenoj klasi, tj. iako se fiziki (na nivou
implementacije) nasleuju, logiki moemo rei da se ne nasleuju (ne
moemo im pristupiti iz izvedene klase). Ako je vrsta nasleivanja
privatna (private) tada sve to je nasleeno 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 nasleuju iz osnovne klase. Po
pravilu, iz osnovne se klase nasljeuju 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 nasljeene 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 specifine 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 navoenjem
imena osnovne klase i argumenata poziva konstruktora osnovne klase.
#include #include
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
81
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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
82
overloading) funkcija i operatora.
Virtuelne funkcije
Funkcije lanice osnovne klase koje se u izvedenim klasama mogu
realizovati specifino za svaku izvedenu klasu, nazivaju se
virtuelne funkcije (engl. virtual functions).
Virtuelna funkcija se u osnovnoj klasi deklarie pomou kljune rei
virtual na poetku deklaracije. Prilikom definisanja virtuelnih
funkcija u izvedenim klasama ne mora se stavljati re virtual, ali
se to preporuuje radi poveanja 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, vai znaenje te virtuelne funkcije iz
osnovne klase.
Deklaracija neke virtuelne funkcije u svakoj izvedenoj klasi
mora da se u potpunosti slae sa deklaracijom te funkcije u osnovnoj
klasi (broj i tipovi argumenata, kao i tip rezultata). #include
#include #include 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
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
83
~krug( ){cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
84
float a,b; public:
lik (float x,float y) { a=x; b=y; } virtual void pov() =0 ;
virtual double obim() =0; ~ lik() { cout
-
PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3
Dragana T. kolska: 2009 / 2010
85
izvedene klase. Konstruktori osnovnih klasa se pozivaju po
redosljedu deklarisanja. Destruktori osnovnih klasa se izvravaju 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