Professional Documents
Culture Documents
CPP Predavanja
CPP Predavanja
Literatura
Laslo Kraus: Programski jezik C++ sa reenim zadacima, Akademska misao
Programski jezik C
Jezik opte namene Ima karakteristike
viih programskih jezika
strukturirani tipovi podataka upravljake strukture
Standardizovan 1989
standard izdao American National Standards Institute ANSI C
Autor C++ je Bjarne Stroustrup, njegova knjiga The C++ Programming Language koriena je kao definicija jezika pre nego to je standardizovan
5
1991 objavljena knjiga The Annotated C++ Reference Manual, autori su Margaret A. Elis i Bjarne Stroustrup, ANSI standard je izdat 1997, jezik je proiren:
provera tipa objekta u toku izvrenja programa razraene generike funkcije i klase definisana biblioteka gotovih klasa i funkcija koje se esto koriste
6
Povezivanje prevedenog oblika programa sa potrebnim korisnikim i sistemskim potprogramima u izvrni oblik
ekstenzija datoteke je .exe
Izvravanje programa
Prikazivanje algoritma
Algoritam je opis koraka koji se izvravaju u toku neke obrade Opis algoritma
govornim jezikom grafiki pomou dijagrama toka pomou pseudojezika pomou programskog jezika
10
Tipovi podataka
11
Elementi jezika C
Skup znakova Leksiki simboli Beli znaci Naredbe Direktive pretprocesora
12
Skup znakova
Mala i velika slova engleskog alfabeta
razlikuju se mala i velika slova
13
Leksiki simboli
Leksiki simboli su nedeljivi nizovi znakova
identifikatori konstante slubene rei operatori separatori
14
Beli znaci
Beli znaci su
razmak tabulacija vertikalna tabulacija prelazak u novi red prelazak na novu stranicu
15
Komentari
Komentar u jednom redu
// Proizvoljan tekst do kraja reda
16
Naredbe
Naredbe su nizovi leksikih simbola Vrste naredbi
deklarativne naredbe slue za definisanje podataka, potprograma (funkcija), ... izvrne naredbe izvode elementarne obrade
17
Direktive pretprocesora
Pretprocesor je deo prevodioca koji koji priprema izvorni tekst programa pre samog prevoenja Direktive pretprocesora su uputstva kojima se utie na tok prevoenja programa
Nisu deo programa tj. nisu naredbe Piu se u posebnim redovima, prvi ne-beli znak je # Naredbe se ne piu u istom redu sa direktivom
18
Identifikatori
Identifikatori slue za oznaavanje
podataka simbolikih konstanti tipova podataka potprograma (funkcija) oznake koje su odredita za naredbe skoka
Identifikatori se sastoje od velikih i malih slova, cifara i znaka donja crta "_" (u Javi moe i "$!)
prvi znak ne moe biti cifra mogu da budu proizvoljno dugaki
po standardu najmanje 31 znak je znaajan
19
Primeri identifikatora
Ispravni identifikatori alfa a b356 c5a ime_i_prezime imeIprezime Neispravni identifikatori 3a // poinje cifrom int // rezervisana re x-z // operator nije dozvoljen
20
Tipovi podataka
Tipovi podataka odreuju osobine podatka:
skup moguih vrednosti podatka operacije koje mogu da se urade sa podatkom
Podaci se predstavljaju
vrednostima (konstantama) identifikatorima
21
22
23
24
25
char je mali celobrojni podatak dovoljan da primi jedan znak iz skupa znakova koji se koriste na raunaru
standardom nije precizirano da li je oznaen
27
Neoznaene varijante
unsigned short int unsigned int unsigned long int
28
29
long double je realni podatak u viestrukoj tanosti Raunari obino podravaju IEEE standard za brojeve IEEE 754
30
Sa denormalizovanom mantisom (eksponent = 0) min float 2149 max (1223)2126 priblini opseg 1,401045 1,751038
32
Celobrojne konstante
Piu se u numerikim sistemima
decimalnom oktalnom heksadecimalnom
33
34
35
heksadecimalna konstanta poinje sa 0x ili 0X Znak broja je odreen prvim bitom broja u binarnom numerikom sistemu Primeri 0x1a 0XCF05 0x2F3B 0xFFFFFFFF
36
Realne konstante
Piu se u decimalnom numerikom sistemu Za vrlo velike i vrlo male brojeve koristi se zapis sa mantisom i eksponentom <mantisa>E<eksponent> Mantisa je decimalni broj sa decimalnom takom
mora da ima bar jednu cifru
Moe da se koristi malo ili veliko slovo e ili E Pojedini delovi mogu da nedostaju Da bi se razlikovale od ceolbronih konstanti mora da postoji ili decimalna taka ili E ili e
38
Realne konstante
Podrazumeva se tip double Za tip float dodaje se F ili f na kraju Za tip long double dodaje se L ili l na kraju Primeri: 1.23 1.2E5 1e5 .2e3 0.1F 3.1e3f Primeri neispravnih realnih konstanti: 1,23 1.a2 .1
39
Znakovne konstante
Piu se izmeu jednostrukih navodnika Primeri: 'A' 'a' '3' U jeziku C++ su tipa char, a u jeziku C su tipa int
40
naziv_tipa je identifikator koji se dodeljuje tipu iji je opis naveden Primeri: typedef unsigned int pozitivan; typedef pozitivan neoznacen;
Tipovi pozitivan i neoznacen su nova imena Podaci ovih tipova su u stvari istog tipa unsigned int
41
Definisanje podataka
Promenljivi podaci se definiu deklarativnom naredbom opteg oblika tip podatak = vrednost, podatak, ... ; tip je opis tipa podatak je identifikator podatka Podatku moe da se dodeli poetna vrednost navoenjem = vrednost
ako se ne dodeli poetna vrednost podatak e imati neku sluajnu vrednost zateenu u memoriji! neki podaci dobijaju poetnu vrednost 0
Dodeljivanje poetne vrednosti naziva se inicijalizacija Vrednost koja se dodeljuje naziva se inicijalizator
42
43
44
const
U jeziku C sa const se definiu nepromenljivi podaci
nepromenljivi podatak mora da se inicijalizuje ne moe da mu se promeni vrednost u toku izvravanja programa nije konstanta, tj. ne moe da se koristi na mestu gde se zahtevaju konstante
Primeri const int DIMENZIJA=100; const double e=2.71828182845905; const long dan=24L * 60 * 60;
45
Nabrojane konstante
Nabrojane konstante su simbolike konstante Dodeljuju im se vrednosti eksplicitno ili implicitno po redosledu Opti oblik naredbe je enum ime_nabrajanja { IME_KONSTANTE=vrednost, ... IME_KONSTANTE=vrednost } Nabrojane simbolike konstante su formalno tipa int
47
Nabrojane konstante
ime_nabrajanja je identifikator nabrajanja koji moe da se izostavi IME_KONSTANTE je identifikator konstante
svi identifikatori moraju biti razliiti
48
Nabrojane konstante
Nabrojane konstante mogu da se koriste kao novi tip
u jeziku C mora se pisati i re enum u C++ moe se koristiti ime_nabrajanja bez enum ako ne postoji podatak sa tim imenom, inae se mora pisati i enum
49
Nabrojane konstante
Da ne bi morala da se pie re enum u jeziku C moe se koristiti naredba typedef oblika typedef enum { IME_KONSTANTE = vrednost, IME_KONSTANTE = vrednost, ... } Ime_tipa; ime_nabrajanja koje se pie iza rei enum se u ovom sluaju najee izostavlja, ali moe da se napie
50
52
53
54
Ulazna konverzija
Opti oblik funkcije scanf je: scanf(format, &arg1, &arg2, ... , &argN); format je tekstualni podatak oblika "tekst" koji odreuje ulazne konverzije koje se koriste
pojedinane konverzije su oblika %nq
% je oznaka za poetak konverzije n su dopunski parametri konverzije q je oznaka za vrstu konverzije
Ulazna konverzija
Ulazni podaci su razdvojeni belim znakom, tj. podatak je niz znakova izmeu dva bela znaka itanje podatka se zaustavlja na prvom znaku iza proitanog podatka Broj znakova u jednom podatku
moe da bude proizvoljan moe da se nevede parametrom n (unutar %nq)
u ovom sluaju ne mora da beli znak izmeu dva podatka
Za tipove short dodaje se znak h ispred oznake konverzije: hi, hd, hu, ho, hx Za tipove long dodaje se znak l ispred oznake konverzije: li, ld, lu, lo, lx
57
Za tip double dodaje se znak l ispred oznake konverzije: lf, le, lg Za tip long double dodaje se znak L ispred oznake konverzije: Lf, Le, Lg
58
Tok konverzije
scanf(format, &arg1, &arg2, ... , &argN); Analizira se format sleva udesno, znakovi razmaka i tabulacije se Kad se naie na opis konverzije vri se konverzija i rezultat se dodeljuje sledeem podatku iz liste itanje se zavrava kad se naie na kraj formata ili ako se desi greka Programer obezbeuje da broj opisa konverzije i broj podataka budu isti
ako je broj podataka vei od broja opisa, prekobrojni podaci nee dobiti vrednost ako je broj opisa vei od broja podataka posledice su nepredvidive
59
Ako je dodatni znak %, piu se dva znaka %% umesto jednog, jer jedan znak oznaava poetak opisa konverzije
60
Primer uitavanja
int i; float f; double d; scanf("%i%f%lf", &i, &f, &d);
61
Izlazna konverzija
Opti oblik fukncije scanf je: printf(format, izraz1, ... , izrazN); format je tekstualni podatak oblika "tekst" koji odreuje izlazne konverzije koje se koriste
pojedinane konverzije su oblika % -+0#n.kq
prvi znak % je oznaka za poetak konverzije znaci -+0#n.k su dopunski parametri konverzije i ne moraju da postoje poslednji znak q je oznaka za vrstu konverzije
62
znak k razdvojen takom oznaava tanost prikazivanja podataka koja zavisi od vrste konverzije znak - oznaava poravnanje uz levu stranu znak + oznaava da treba da se ispie znak + ispred pozitivnog broja znak razmaka oznaava da treba da se ostavi jedno prazno mesto umesto znaka + znak 0 oznaava da se u sluaju ravnanja na desnu ivicu sa leve strane umesto praznih znakova ispisuju nule znak # oznaava alternativni nain ispisivanja koji zavisi od vrste konverzije 63
Parametar konverzije *
Umesto dopunskih parametara n i k moe da se stavi znak *
kao irina polja za ispisivanje uzima se vrednost sledeeg celobrojnog izraza meu argumentima funkcije printf
64
x, X oznaavaju heksadecimalnu konverziju, pri emu se cifre oznaene slovima se ispisuju malim ili velikim slovima
vodei 0x se ispisuje ako postoji znak # u opisu konverzije
Za tipove short dodaje se znak h, a za long znak l ispred oznake konverzije: hi, hd, hu, ho, hx, hX, odnosno li, ld, lu, lo, lx, lX Tanost k oznaava najmanj broj cifara
dodaju se vodee nule ako je potrebno
65
konverzije g, G su iste kao e, E ako je eksponent vei od 4 ili vei ili jednak od tanosti, inae su iste kao f
Za tip long double dodaje se znak L ispred oznake konverzije: Lf, Le, LE, Lg, LG Konverzije za tip float su iste kao za double 66
tanost k treba da je primerena tipu float
Tok konverzije
printf(format, izraz1, ... , izrazN); Analizira se format sleva udesno, znakovi koji nisu deo opisa konverzije ispisuju se kako su navedeni Kad se naie na opis konverzije vri se konverzija sledeeg izraza i rezultat se ispisuje Ispisivanje se zavrava kad se doe do kraja formata Programer obezbeuje da broj opisa konverzije i broj podataka budu isti
ako je broj podataka vei od broja opisa, prekobrojni podaci se nee ispisati ako je broj opisa vei od broja podataka posledice su nepredvidive
67
Znaci u formatu
Znak \n oznaava prelazak u novi red Ako je potrebno ispisati dodatni znak %, piu se dva znaka %% umesto jednog, jer jedan znak oznaava poetak opisa konverzije
68
Primeri ispisivanja
printf("Dobar dan!\n"); printf("Zapremina lopte poluprecnika %7.3f je %g\n", r, v); printf("Zbir brojeva %d i %d je %d\n", m, n, m+n); printf("Srednja vrednost je %*.*f\n", m, n, s);
69
Primer programa
Program ispisuje: Pozdrav svima! #include <stdio.h> main() { printf("Pozdrav svima!"); }
70
Primer programa
Primer programa koji uitava dva cela broja, sabira ih i ispisuje rezultat #include <stdio.h> main() { int a, b; printf("unesite dva cela broja: "); scanf("%d%d", &a, &b); int c = a + b; printf("Zbir unetih brojeva: %d\n", c); }
71
Operatori
72
Operatori i izrazi
Operator je radnja koja se izvrava nad operandima i daje rezultat Izraz je proizvoljno sloeni sastav operanada i operatora Izrazi su:
konstanta podatak operator izraz izraz operator izraz operator izraz izraz ? izraz : izraz ( izraz )
73
74
Vrste operatora
Adresni operatori Aritmetiki operatori Relacijski operatori Operatori nad bitima Logiki operatori Operatori za dodelu vrednosti Operator zarez izraunava prvi operand i odbacuje rezultat, a zatim izraunava drugi operandi vraa tu vrednost. Poeljno kada su potrebni boni efekti. Primer:
int a = 1, b=2; i = a += 2, a + b; // increases a by 2, then stores a = 5 into i
75
Operatori
Prioritet 19 18 17 Broj Smer operanada grupisanja 1, 2 2 1 :: [] () . -> Operatori
a++ a-static_cast const_cast dynamic_cast reinterpret_cast typeid ! ~ ++a --a + - * & (tip) sizeof new delete .* * + << ->* / >>
76
16 15 14 13 12
1 2 2 2 2
Operatori
Prioritet 11 10 9 8 7 6 5 4 3 2 1 Broj operanada 2 2 2 2 2 2 2 3 2 1 2 Smer grupisanja < == & ^ | && || ?: = &= , += ^= -= |= *= /= %= <<= >>= <= != Operatori > >=
throw
77
Unarni aritmetiki operatori + i + vrednost operanda bez promenene znaka vrednost operanda sa promenjenim znakom
78
Za prefiksne operatore
prioritet je 16 smer grupisanja je zdesna ulevo
++k k++ j = --k j = k-// // // // k=k+1 k=k+1 k=k1, j=k j=k, k=k-1
79
80
1 + a * b / = b c -d;
Boni efekat
Boni efekat je promena vrednosti nekog operanda operatora u toku izvravanja operatora Primer j = --k; --k;
// k = k - 1, j = k // k = k - 1
82
84
Lvrednost
Lvrednost je vrednost koja oznaava podatak u memoriji, odnosno moe da se nalazi na levoj strani operatora za dodelu vrednosti Neki operatori se primenjuju samo na lvrednosti
operandi operatora ++, --, & operandi na levoj strani operatora za dodelu vrednosti
Primeri za lvrednosti
++ ++k; // ++(++k) ili k=k+2 --k*=5; // (--k)*=5 ili k=(k-1)*5 k++ ++; // greka d*=e+=f; // e=e+f, d=d*e (d*=e)+=f; // d=d*e, d=d+f ili d=d*e+f x=y=5; // x=(y=5) ili y=5, x=y ++(p/=q); // p=p/q, p=p+1 ili p=p/q+1 ++p/=q; // p=p+1, p=p/q ili p=(p+1)/q long x=5; int a,b; x ? a : b = 1; // x ? a=1 : b=1 x ? x : b = 1; // greka x ? 2 : b = 1; // greka
86
Konverzija tipa
Binarni operatori se izvravaju nad operandima istih tipova Za operande razliitih tipova radi se automatska konverzija
Oprez: kompajler ne upozorava tako striktno kao kod Jave mogue nenamerne greke.
Pravilo za automatska konverziju tipa: tip operanda jednostavnijeg tipa se pretvori u tip operanda sloenijeg tipa i posle toga se izraunava rezultat operatora Neoznaena varijanta istog tipa je sloenija od oznaene varijante
87
88
89
90
Na mestima gde se oekuju logike vrednosti mogu da se piu numeriki podaci Primer: int i; if( i ) ...
91
92
Operandi su numerikog tipa, rezultat je logikog tipa Operatori >, <, >=, <= imaju prioritet 11 Operatori == i != imaju prioritet 10 Grupisanje je sleva udesno
93
// 0xFFFFFFFFL < 0x00000001UL // 0xFFFFFFFFUL < 0x00000001UL // rezultat je false, unsigned long je sloeniji tip od long (tj //dolazi do konverzije prvog operanda)
94
Logiki operatori
! Logika negacija Prefiksni unarni operator Prioritet je 16 Grupisanje zdesna ulevo && || Logiko i Logiko ili
false true
true false
|| false true
96
Uslovni izraz ?:
Opti oblik je uslov ? izraz1 : izraz2 Primeri (a > b) ? a : b // max(a, b) (x<=y && y<=z) ? y : (x+z)/2 a<b ? -1 : a>b ? 1 : 0 a<b ? -1 : (a>b ? 1 : 0)
97
Operatori po bitima
Operacije se izvode nad bitima unutar podataka celobrojnih tipova i rezultat je celobrojnog tipa Vrste operatora po bitima
logike operacije nad bitima odgovarajuih pozicija pomeranje bita
98
99
0 1
1 0
| 0 1
0 0 1
1 1 1
& 0 1
0 0 0
1 0 1
^ 0 1
0 0 1
1 1 0
100
101
103
104
Pomeranje ulevo za N bita odgovara mnoenju sa 2N, pod uslovom da ne doe do promene znaka broja
105
Pri pomeranju se uva znak, tj. sa leve strane se dodaje bit jednak bitu koji je prethodno bio na poziciji 31 Biti sa desne strane se gube Primer:
int a a = a a >>= int b b = b b >>= b >>= = 35; >> 2; 4; = -8; >> 2; 1; // 1; // // a = 0...0 00100011 // a = 0...0 00001000 (tj. a=8) // a = 0...0 00000000 (tj. a=0) // b = 1...1 11111000 // b = 1...1 11111110 (tj. b=-2) b = 1...1 11111111 (tj. b=-1) b = 1...1 11111111 (b ostaje -1)
106
107
108
Niz izraza
Izrazi mogu da se sastave u niz izraza pomou binarnog operatora zarez (,), pri emu se niz izraza ponaa kao jedan izraz Binarni operator zarez (,) je prioriteta 1 i grupie se sleva udesno Primer a=5, b+=13, c++ x=3, y*=x+3, x--, z-=x*3- --y Zbog smera grupisanja i izrazi se izraunavaju sleva udesno u sluaju da ima vie uzastopnih operatora zarez Rezultat koji vraa niza izraza je vrednost poslednjeg izraza (krajnji desni koji se poslednji izraunava)
109
Korienje zagrada
Zagrade slue za definisanje redosleda izraunavanja (prioriteta) i za pisanje jasnijih izraza
a >> b + 3; // prvo se b uveava za 3, // zatim se sadraj a pomera udesno // ("+" ima vei prioritet od ">>") a >> (b + 3); // ekvivalentno gornjem (a >> b) + 3; // prvo se sadraj a pomera udesno, // zatim se uveava za 3
110
Veliina podataka
Operator sizeof je prefiksni unarni operator koji izraunava veliinu memorije, izraenu u bajtovima, koja je potrebna za smetanje podatka nekog tipa Operand je izraz ili identifikator tipa Ako je operand identifikator tipa stavlja se u zagradama Primeri sizeof(char) sizeof(long double) Tip rezultata je size_t koji je celobrojni tip definisan naredbom typedef u fajlu <stddef.h> Standardom nije precizirano kojeg celobrojnog tipa je size_t
111
Biblioteke funkcije
Funkcije na osnovu svojih argumenata daju rezultate Funkcije mogu da imaju neogranien broj argumenata Opti oblik pozivanja funkcije je
identifikator_funkcije(argument, ... , argument)
Ako su argumenti izrazi, izraunavaju se pre pozivanja funkcije po proizvoljnom redosledu U sastavu jezika je standardna biblioteka sa velikim brojem standardnih funkcija Funkcije su deklarisane u datotekama zaglavlja (header), i imaju ekstenziju *.h
112
113
114
Naredbe
115
Naredbe
Naredba je osnovna jedinica obrade u programu Proste naredbe ne mogu da se podele na manje delove koji su takoe naredbe Sloene naredbe su strukture narebi (upravljake strukture) koje odreuju redosled izvravanja naredbi u strukturi. Dele se na:
sekvence selekcije cikluse (petlje)
Upravljake naredbe ne vre obradu, ve prenose tok upravljanja na neko drugo mesto (skokovi)
116
Naredbe
Deklarativne naredbe deklarisanje tipova podataka Izvrne naredbe
117
Prosta naredba
Opti oblik je izraz; Prazna naredba se koristi kada sintaksa jezika zahteva naredbu, a nije potrebna nikakva obrada ;
118
Sekvenca (blok)
Niz naredbi koje se izvravaju jedna za drugom Opti oblik sekvence je { naredba1 naredba2 ... naredbaN } Moe da se pie i u jednom redu { naredba1 naredba2 ... naredbaN } Moe da bude prazna { }
119
Primer sekvence
int a, b; ... { int t; t = a; a = b; b = t; } ili u jednom redu { t=a; a=b; b=t; }
120
121
Uklapanje dosega
Unutar jednog bloka (spoljanji) moe da se nalazi drugi blok (unutranji) U unutranjem bloku mogu da se koriste identifikatori definisani u spoljanjem bloku, oni su globalni za unutranji blok Identifikatori definisani u unutranjem bloku su lokalni za taj blok, i ne mogu da se koriste izvan njega U unutranjem bloku se moe definisati identifikator koji ima isto ime kao i identifikator iz spoljanjeg bloka, i na taj nain identifikator iz spoljanjeg bloka postaje nevidljiv u unutranjem bloku
122
123
Selekcije
if-else switch
124
Primeri za if
if(a < b) a = 0; else b = 0; if(a > b) { t=c; c=a; a=t; } else { t=c; c=b; b=t; } if(a > b) { t=a; a=b; b=t; }
126
127
128
if else if
if(uslov1) naredba1; else if(uslov2) naredba2; else if(uslov3) naredba3; else if(uslov4) naredba4; else naredba5; if(uslov1) naredba1; else if(uslov2) naredba2; else if(uslov3) naredba3; else if(uslov4) naredba4; else naredba5;
129
Naredba switch
Grananje u vie putanja zavisno od vrednosti izraza Opti oblik
switch(izraz) { case vrednost1: niz_naredbi1 case vrednost2: niz_naredbi2 ... default: niz_naredbiD ... case vrednostN: niz_naredbiN }
130
Naredba switch
izraz je celobrojni izraz Svaka od vrednosti je celobrojna konstanta Ne sme se ponoviti ista vrednost u istom switch Sa break se zavrava switch Ako ne postoji break nastavlja se izvravanje sledeeg case Deo default je opcioni i oznaava mesto na koje se skae ako vrednost izraza nije jednaka nijednoj od vrednosti u oznakama case
131
default:
case vrednostN: }
Primer za switch
switch(i + j * k) { case 0: printf("Unseite 3 cela broja:"); scanf("%d%d%d", &i, &j, &k); case 7: case 3: case 5: a = i + j * k; b = i j / k; default: c = a * b; case 12: printf("Rezultati su: %d %d %d", a, b, c ); }
133
134
Poreenje if i switch
switch proverava samo jednakost, a if proizvoljan logiki izraz switch je efikasniji od ugnjedenih if else if
135
Ciklusi (petlje)
Izvravanje (ponavljanje) jedne naredbe ili bloka naredbi potreban broj puta, zavisno od uslova Naredbe ciklusa (petlje)
while do while for
136
Petlja while
Opti oblik while petlje while(uslov) telo_petlje uslov je proizvoljan logiki izraz telo_petlje je jedna naredba (moe biti i prazna naredba) ili blok naredbi telo_petlje se ponavlja sve dok uslov ima vrednost true while petlja je sa izlazom na vrhu, ako uslov ima vrednost false pri prvoj proveri, ne ulazi se u petlju, tj. telo_petlje se ne izvrava nijednom
137
139
Petlja do while
Opti oblik do while petlje do telo_petlje while(uslov); uslov je proizvoljan logiki izraz telo_petlje je jedna naredba ili blok naredbi do while petlja je sa izlazom na dnu:
telo_petlje se izvrava jednom a posle toga se proverava uslov ako uslov ima vrednost true, telo_petlje se izvrava ponovo, a ako je vrednost false izlazi se iz petlje
140
Primer za do while
int n = 5; // Za n=0 petlja bi se izvrila jednom do { printf("Vrednost n je %d\n", n); n--; } while(n > 0); Vrednost n je 5 Vrednost n je 4 Vrednost n je 3 Vrednost n je 2 Vrednost n je 1 Za n=0 rezultat bi bio Vrednost n je 0
141
142
143
144
Petlja for
inicijalizacija je izraz
izvrava se samo jednom na poetku pre ulaska u petlju obino inicijalizuje jednu ili vie promenljivih petlje
Petlja se nastavlja proverom uslova i izvravanjem tela petlje i iteracije sve dok je uslov taan 145
Nain pisanja
Smatra se loim programerskim stilom ako se u jedan ili vie delova petlje: inicijalizacija, uslov, iteracija, stavljaju radnje koje se ne odnose na opsluivanje petlje
147
Primeri za for
for(i=pocetak; i<kraj; i+=korak) {...} for(i=pocetak; i<kraj; i++) {...} for(i=pocetak; i>=kraj; i--) {...} for(s=0, i=1; i<=n; i++) s+=i*i; for(s=0, i=1; i<=n; s+=i*i, i++) ; // Loe for(s=0, i=1; i<=n; i++) s+=i; for(s=0, i=1; i<=n; s+=i++) ;
// Moe
148
Primer za for
int n; for(n=5; n>0; n--) printf("Vrednost n je %d\n", n); Vrednost n je 5 Vrednost n je 4 Vrednost n je 3 Vrednost n je 2 Vrednost n je 1
149
150
154
Trajnost podataka
Prema intervalu vremena u kojem podaci postoje u toku izvravanja programa podaci mogu biti:
prolazni trajni privremeni
156
Prolazni podaci
Stvaraju se naredbom za definisanje
dodeljuje im se prostor u memoriji inicijalizator se svaki put izvrava imaju sluajnu vrednost ako nisu inicijalizovani unitavaju se pri naputanju dosega njihovog identifikatora
register
sugerie prevodiocu da se podaci smeste u brze procesorske registre koriste se npr. za promeljive koje se koriste u najdubljoj petlji kad postoji nekoliko uklopljenih petlji nije sigurno da e prevodilac to i uraditi
158
159
160
161
Privremeni podaci
Slue za odlaganje meurezultata sloenih izraza Stvara ih prevodilac tako da programer ne zna za njihovo postojanje Unitavaju se automatski kad vie nisu potrebni
162
163
Tipovi podataka, npr. definisani sa typedef, obino se koriste u veem delu programa
definiu se u *.h fajlu ili na poetku fajla
164
Naredbe skoka
Slue za prekidanje izvravanja redosleda naredbi i nastavljanje na definisanom mestu, tj. slue za preskakanje naredbi
break continue return
Naredbe skoka nemaju strukturu, pa nisu upravljake strukture Naredbe skoka ne vre nikakvu obradu pa nisu proste naredbe
165
Naredba break
Slui za iskakanje iz upravljake strukture
preskakanje preostalih naredbi unutar naredbe switch i skakanje na prvu naredbu iza naredbe switch prevremeni zavretak petlje (for, while, do) i skakanje na prvu naredbu iza naredbe
uobiajeno je da se iz petlje izlazi na osnovu uslova
166
170
171
Naredba continue
Opti oblik petlja { ... continue; ... } Slui za preskakanje naredbi do kraja tela petlje i na prelazak na naredbe za opsluivanje tela petlje
u while i do while petljama posle continue se prelazi na proveru uslova u for petlji posle continue se prelazi na iteraciju
172
Naredba continue
Naredba continue se obino nalazi unutar naredbe if ili switch, inae se naredbe iza continue nikad ne bi izvravale
Primer petlja { ... if(uslov) continue; ... }
173
Primer za continue
for(int i=0; i<10; i++) { printf("%d ", i); if(i%2 == 0) continue; printf("\n"); }
01 23 45 67 89
174
Naredba na koji se skae obeleava se oznakom koja se pie ispred naredbe oznaka: naredba Odredite skoka moe biti na bilo kojem mestu
uskakanje u blok nije zabranjeno, ali treba smatrati kao da jeste naredba goto se moe koristiti npr. da se prekine vie uklopljenih struktura 175
Primer za goto
for(...){ for(...){ for(...){ ... if(propast) goto greska; ... } } } greska: // obrada greke
176
Naredba return
Opti oblik tip ime_metode(lista_parametara) { ... if(uslov) return [vrednost]; ... } Slui za izlazak iz metode Posle naredbe return kontrola se vraa pozivaocu metode Naredba if je se najee pie ako naredba return nije poslednja naredba u metodi, inae se naredbe iza naredbe return nikad ne bi izvravale vrednost ne postoji ako je tip metode void, inae postoji
177
Nizovi
178
Nizovi
Sloeni (strukturirani) tipovi podataka Slue za predstavljanje vektora, matrica, viedimenzionalnih nizova Predstavljaju niz podataka istog tipa koji se nazivaju elementi niza Elementi niza se identifikuju pomou rednog broja unutar niza koji se naziva indeks Indeksiranje uvek poinje od nule, tj. prvi element niza uvek ima indeks 0
179
Nizovi
Imaju jednu ili vie dimenzija Jednodimenzionalni niz (vektor) ima skalarne elemente Dvodimenzionalni niz (matrica) je niz iji su elementi jednodimenzionalni nizovi
180
Definisanje nizova
Opti oblik je:
tip identifikator_niza [duina1][duina2]...[duinaN]
Duina mora da bude konstantan izraz Primer float vektor[50], matrica[10][20], x; Elemenit niza vektor imaju indekse od 0 do 49 Dvodimenzionalni niz matrica ima 10 vrsta i 20 kolona, indeksi vrsta su od 0 do 9, a kolona od 0 do 19
181
Inicijalizacija niza
Pri definisanju niza mogu da se navedu poetne vrednosti tj. inicijalizatori Nizovi sa inicijalizatorima su uvek trajni Inicijalizator niza je oblika: { vrednost1, vrednost2, ... vrednostN } Primeri:
int dani[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int dani[] = {31,28,31,30,31,30,31,31,30,31,30,31}; long a1[5] = { 1, 2, 3 }; long a2[5] = { 1, 2, 3, 0, 0 }; // iste vrednosti ima i niz a1 long a3[5] = { 1, 2, 3, 4, 5, 6 }; // greka const int tablica[] = { 1, 5, 3, 4, 2 };
182
183
184
185
186
187
188
Veliina niza
Veliina memorije koju zauzima neki niz dobija se unarnim operatorom sizeof Primeri: typedef double Niz p, q[3]; p[7] = q[0][9]; sizeof(double) sizeof(Niz) sizeof(q) sizeof(q[1]) sizeof(q[2][7]) Niz[10];
// // // // //
8 10 x 8 = 80 3 x 10 x 8 = 240 10 x 8 = 80 8
189
190
Pokazivai
Operativna memorija je niz adresnih lokacija koje su numerisane celim brojevima 0, 1, 2, ... , m-1, gde je m kapacitet memorije Brojevi pridrueni memorijskim lokacijama nazivaju se adrese Najmanja memorijska lokacija koja moe da se adresira je obino jedan bajt Pokaziva je prost podatak u koji moe da se smesti adresa neke lokacije u memoriji Pokaziva obino zauzima 2 ili 4 bajta
191
192
193
Definisanje pokazivaa
Opti oblik je: tip * identifikator_pokazivaa Tip je standardni tip ili tip definisan sa typedef Primer: int *p; int* p; Jedno tumaenje: poto je *p tipa int, p je pokaziva na int Definisanje vie pokazivaa istom naredbom short *p1, *p2;
194
Generiki pokaziva
Generiki pokaziva je pokaziva kod kojeg nije odreen tip pokazivanog podatka Definie se stavljanjem slubene rei void umesto tipa Primer: void* p;
195
Primeri
double a, *pa=&a; double b, *pb; pb = &b; Nije bitno to a i b nisu dobili vrednosti
196
Primeri
int x=1, y=2, z[7]; int *pi; // pi je pokaziva na int void *pj; // pj je generiki pokaziva pi = &x; // pi pokazuje na x y = *pi; // y je sada 1 pj = pi; // pj pokazuje na x *pi = 0; // x je sada 0 *pj = 3; // greka, pj je generiki pok. *(int*)pj = 3; // x je sada 3 pi = &z[0]; // pi sada pokazuje na z[0] pj = &z[5]; // pj sada pokazuje na z[5]
197
Primeri
int x=1; int *pi; void *pj; pi = &x; pj = pi; *pj = 3; *(int*)pj = 3; *(double*)pj = *(double*)pi = // pi je pokaziva na int // pj je generiki pokaziva // pi pokazuje na x // pj pokazuje na x // greka u prevodjenju // x je sada 3 1.5; // prevodi se 2.5; // prevodi se
U zadnja dva primera pokaziva pokazuje na tip podatka koji zauzima 4 bajta u memoriji, a upisuje se podatak koji zauzima 8 bajtova
198
199
200
201
202
203
Primeri
int a=2,*pa=&a, *const kpa=&a;//pok.je const const int b=5, *pkb=&b, *const kpkb=&b; pkb = pa; *pkb = 4; // greka kpa = pa; // greka // greka pravilo 1 sa pa = kpkb; // prethodne strane pa = (int*)kpkb; // Ne preporuuje se *pa = 4; // Menja se nepromenljivi // podatak b int c=1, *const kpc=&c; pa = kpc;
204
205
Adresna aritmetika
Dozvoljene su operacije
dodela vrednosti jednog pokazivaa drugom dodavanje celobrojnog podatka na vrednost pokazivaa i oduzimanje celobrojnog podatka od vrednosti pokazivaa oduzimanje i uporeivanje dva pokazivaa uporeivanje pokazivaa i nule
207
Dodela vrednosti
Ako su razliiti tipovi pokazivaa obavezno je kastovanje Kastovanje nije obavezno ako se dodeljuje vrednost pokazivau generikog tipa (void*) Primer: int a; void* gp = &a; int* pi = gp; // greka int* pj = (int*)gp;
208
209
Dozvoljeno je uporeivanje dva pokazivaa istog tipa (ukljuujui i void*) relacijskim operatorima ==, !=
rezultat je da li pokazivai pokazuju na isti podatak
Pokazivai i nizovi
Identifikator niza predstavlja poetnu adresu niza Identifikator niza je nepromenljivi pokaziva na podatke iji je tip jednak tipu elementa niza Primer: int a[10]; Moe se smatrati da je identifikator a tipa int* const, i da je inicijalizovan poetnom adresom bloka memorije veliine 10 podataka tipa int
211
Pokazivai i nizovi
Ako su: a identifikator niza, i indeks, prema adresnoj aritmetici, tj. na osnovu sabiranja pokazivaa i celih brojeva, sledee je ekvivalentno: &a[i] a + i i + a a[i] *(a + i) *(i + a) i[a] Izraz i[a] treba izbegavati
212
213
214
215
Tip identifikatora b je pokaziva na niz od etiri integer-a b &b[0] je adresa poetka prve vrste matrice b+1 &b[1] je adresa poetka druge vrste matrice Pristupanje elementu dvodimenzionalnog niza b[i][j] *((int*)b + n*i + j) b[i][j] *((int*)(b+i) + j) U izraunavanju indeksa ne uestvuje prva dimenzija niza m 216
217
Tip identifikatora c je pokaziva na matricu od dve vrste i tri kolone iji su elementi integer-i c &c[0] je adresa poetka prve matrice c+1 &c[1] je adresa poetka druge matrice Pristupanje elementu trodimenzionalnog niza c[i][j][k] *((int*)c + q*r*i + r*j + k) U izraunavanju indeksa ne uestvuje prva dimenzija niza p
218
219
220
221
223
Primeri
double* pd = new double(5.2); delete pd; int n = 10; float* a = new float[n]; for(int i=0; i<n; i++) a[i] = ...; delete[] a; float* b = a; delete[] b;
224
225
Reference (upuivai)
Referenca je alternativno ime za podatak Ne zauzimaju prostor u memoriji Ne postoje pokazivai na reference Ne postoje nizovi referenci Moraju da se inicijalizuju prilikom definisanja Ne mogu da im se promene vrednosti (tj. adresa na koju ukazuju, za razliku od pokazivaa)
226
Definisanje reference
Dodaje se modifikator & ispred identifikatora reference Primeri:
int k = 1; int& r = k; // int x = r; // r = 2; // r++; // int* p = &r; // int* p1 = &k;// int y = *p; // *p = 5; // p = 0; // r i k predstavljaju isti int x = 1 k = 2 poveava se k, k = 3 p pokazuje na k p1 pokazuje na k y = 3 k = 5 p ne pokazuje na podatak
227
Primer
int k = 1; int& r = k; // r i k predstavljaju isti int r = 2; // k = 2, pomou r se moe menjati k const int& rc = k; // rc i k predstavljaju isti int rc = 5; // greka, pomou rc ne moe se menjati k
228
Definisanje tipova
Sa typedef se moe dodeliti ime tipu podatka koji je referenca na neki tip Primer typedef double& Rdouble; double a, b; Rdouble ra = a, rb = b; ra = rb = 5; // a = b = 5 Ekvivalentno sa: double &ra = a, &rb = b;
229
Funkcije
230
Funkcije
Rastavljanje sloenijih problema na vie jednostavnijih problema Funkcije su potprogrami koji na osnovu argumenata daju rezultat koji se naziva vrednost funkcije Funkcija moe da daje i druge rezultate koji se nazivaju boni efekti Funkcija ne mora da vraa kao rezultat vrednost funkcije, moe da ima samo bone efekte
231
Definisanje funkcija
Naredba za definisanje funkcije ima opti oblik: tip naziv (niz_argumenata) telo_funkcije tip je tip rezultata koji vraa funkcija, tj. tip vrednosti funkcije naziv je identifikator funkcije niz_argumenata predstavlja argumente funkcije pomou kojih se unose poetne vrednosti telo_funkcije je po formi blok
232
Primer funkcije
long faktorijel(int n) { long rezultat = 1; for(int i=n; i>1; i--) rezultat *= i; return rezultat; }
233
Vrednost funkcije
Tip vrednosti funkcije je tip rezultata koji vraa funkcija Ako funkcija ne vraa vrednost (ima samo bone efekte) tip vrednosti funkcije je void Ako se izostavi tip vrednosti funkcije u definiciji funkcije podrazumeva se tip int Tip vrednosti funkcije moe da bude pokaziva na neki tip (modifikator *), a takoe i referenca (modifikator &) Vrednost funkcije moe biti proizvoljnog skalarnog tipa
moe da bude jedan podatak ne moe da bude niz moe da bude pokaziva na element niza
234
Argumenti funkcije
tip naziv (niz_argumenata) telo_funkcije niz_argumenata ima oblik: argument, argument, ... , argument Pojedinani argument se definie kao podatak: tip naziv_argumenta tip argumenta je proizvoljan standardni tip ili identifikator tipa definisan naredbom typedef
moe da bude i pokaziva na neki tip ili referenca moe da bude i niz oznaka tipa mora da se navede uz svaki argument
235
ili:
double srednjaVrednost(int *niz, int duzina_niza) {...}
237
238
Primer
long faktorijel(int n) { long rezultat = 1; for(int i=n; i>1; i--) rezultat *= i; return rezultat; } void prikazFaktorijel(int a) { printf("faktorijel je %d\n", faktorijel(a)); }
239
Telo funkcije
Po formi je blok Moe da sadri deklarativne i izvrne naredbe Podaci definisani u telu funkcije su lokalni za tu funkciju Formalni argumenti su lokalni za funkciju
moe se smatrati kao da su definisani na poetku bloka pre prve naredbe bloka inicijalizovani su vrednostima stvarnih argumenata
240
Telo funkcije
Povratak iz funkcije u pozivajuu funkciju radi se naredbom return Opti oblik je: return izraz; // Kad funkcija vraa rezultat return; // Kad je tip vrednosti funkcije void Izraz predstavlja vrednost funkcije (vraeni rezultat)
mora po tipu da se slae sa predvienim tipom vrednosti funkcije za numerike tipova radi se automatska konverzija u predvieni tip rezultata
Naredba return moe da se izostavi ako je to poslednja nareba u funkciji iji je rezultat tipa void
241
Naredba return
Unutar tela funkcije moe biti vie naredbi return u razliitim selekcijama Funkcija se zavrava kad se izvri prva naredba return Primer:
long faktorijel(int n) { if(n < 2) return 1; long rezultat = 1; for(int i=n; i>1; i--) rezultat *= i; return rezultat; }
242
243
Primer
Moe (vraanje vrednosti):
int DoubleValue(int nX) { int nValue = nX * 2; return nValue; // Ovde se vraa kopija od nValue } // nValue izlazi iz dosega
Primer
Ne moe (vraanje adrese):
int* DoubleValue(int nX) { int nValue = nX * 2; return &nValue; // Ovde se vraa adresa nValue } // nValue izlazi iz dosega
245
Biblioteke funkcije
U sastavu jezika je standardna biblioteka sa velikim brojem standardnih funkcija
biblioteke funkcije su podeljene u nekoliko grupa na osnovu slinosti deklaracije funkcija navedene su u *.h datotekama (datoteke zaglavlja)
Da bi se koristile standardne funkcije, na poetku programa (tj. datoteke u kojoj se koriste funkcije) dodaje se zaglavlje fajla u kojem su deklarisane standardne funkcije: #include <naziv_datoteke>
246
x[-1, 1] x[-1, 1] rezultat [-/2, /2] rezultat [-, ], mora x ili y da bude 0
248
fmod(x,y)
249
rand()
Pseudosluajan broj tipa int sa uniformnom raspodelom u opsegu [0, RAND_MAX]. RAND_MAX je simbolika konstanta zavisna od raunara, RAND_MAX 32767 Postavljanje poetne vrednosti sekvence pseudosluajnih brojeva koju daje funkcija rand() na n. Podrazumevana poetna vrednost sekvence je 1. n je tipa unsigned int
srand(n)
250
251
254
Pozivanje funkcije
Binarni operator sa operandima
prvi operand je funkcija koja se poziva drugi operand je niz stvarnih argumenata operator je prioriteta 18, grupie se sleva udesno
Opti oblik pozivanja funkcije je: funkcija ( izraz, izraz, ... , izraz) funkcija je funkcija koja se poziva i moe biti
identifikator funkcije adresni izraz ija je vrednost adresa eljene funkcije
izrazi su stvarni argumenti kojim se inicijalizuju formalni argumenti pre izvravanja tela funkcije
255
Stvarni argumenti
Treba da se slau po broju i tipu sa formalnim argumentima Radi se automatska konverzija tipa ako je mogua Mogu da budu adresni izrazi Ako je jedan argument niz izraza stavlja se u zagrade
f(a,b) f(a,(b,c))
Ako je stvarni argument poziv druge funkcije, ona se izrauna i koristi se vrednost
ne sme da bude tipa void
256
Stvarni argumenti
Imena stvarnih argumenata mogu da budu proizvoljna, ali se u praksi najee poklapaju sa imenima formalnih argumenata
257
Primer
#include <stdio.h> long faktorijel(int n) { long rezultat = 1; for(int i=n; i>1; i--) rezultat *= i; return rezultat; } main() { int n; printf("Unesite broj %d\n", &n); printf("faktorijel je %d\n", faktorijel(n)); }
258
259
// p=5
260
261
// p=5
262
265
266
267
269
Reference i funkcije
Reference mogu da budu formalni argumenti i vrednosti funkcija
270
Formalni argument se inicijalizuje podatkom koji je stvarni argument Formalni argument postaje alternativno ime za podatak Promenom vrednosti formalnog argumenta menja se stvarni argument (podatak) Ne kopira se vrednost stvarnog argumenta u formalni argument
uteda prostora i vremena za argumente sloenih tipova
271
272
273
Ako se argument tipa reference ne menja u funkciji treba da se deklarie kao referenca na nepromenljive podatke
dodaje se modifikator const stvarni argument moe biri promenljivi ili nepromenljivi podatak
275
276
Poto se p i q ne menjaju unutar funkcije bilo bi bolje kao to je na prethodnoj stranici, tj.
const int& max(const int& p, const int& q)
277
// b se poveava za 1, b=6
278
Sa pokazivaima je
void polar(double x, double y, double *r, double *fi) { *r = sqrt(x*x + y*y); *fi = (x==0 && y==0) ? 0 : atan2(y, x); }
279
280
Drugaije napisano
int max(int& p, int& q) { int a, &ra = a; if (p>q) ra = p; else ra = q; return ra; // greka, ra je referenca na lokalni podatak }
281
Drugaije napisano
int* max(int p, int q) { int a; if (p>q) a = p; else a = q; return &a; // greka, a je lokalni podatak }
282
Globalni identifikatori
Definiu se naredbama koje se piu izvan tela funkcije Zajedniki su za vei broj funkcija Doseg je od mesta na kojem su deklarisani do kraja datoteke (kae se i datoteki doseg) Podaci sa globalnim identifikatorima se nazivaju globalni podaci
283
Primer
#include <math.h> double x, y, r, fi; void polar() { r = sqrt(x*x + y*y); fi = (x==0 && y==0) ? 0 : atan2(y, x); }
284
Globalni podaci
Globalni podaci su uvek trajni
znaenje modifikatora static kod globalnih podataka se razlikuje, oznaava unutranje povezivanje a ne trajnost podatka (spoljanje povezivanje - extern)
Imaju nulte poetne vrednosti ako nisu inicijalizovani Stvaraju se pre pozivanja bilo koje funkcije ili podatka iz datoteke u kojoj su definisani Postoje do zavretka programa U jeziku C++ treba izbegavati korienje globalnih podataka
285
286
Deklaracija i definicija
Termini deklaracija i definicija se odnose na podatke i funkcije Deklaracija je odreivanje identifikatora i opisivanje podataka ili funkcija bez dodeljivanja memorijskog prostora za smetanje podataka ili funkcija Definicija sadri deklaraciju i dodelu memorijskog prostora za smetanje podataka ili funkcija
prilikom definisanja podatak moe i da se inicijalizuje prilikom definisanja funkcije mora da se navede telo funkcije prevoenjem funkcije dodeljuje joj se memorijski prostror
287
Definisanje tipova
Za identifikatore tipova koji su uvedeni naredbom typedef ne razlikuje se deklaracija i definicija
ne smetaju se u memoriju moe se smatrati da postoji samo definicija
288
Ako nije definisan, globalni podatak mora bar da se deklarie pre korienja
289
290
Deklarisanje funkcije
Funkcije se deklariu navoenjem prazne naredbe ; umesto tela funkcije tip naziv_funkcije ( argumenti ) ; Deklaracija funkcije se naziva i prototip ili potpis (signature) (kao kod apstraktne funkcije u Javi) Prototip funkcije treba da bude naveden u sluajevima kada se neke funkcija poziva na mestu na kojem definicija funkcije nije dostupna prevodiocu. Prototip navodi ime funkcije, tip vrednosti funkcije i broj i tipove argumenata Doseg identifikatora je unutar deklaracije, naziva se prototipski doseg
291
Deklarisanje funkcije
Funkcije mogu da se deklariu vie puta, ali moraju da se definiu tano jednom Deklaracija funkcije sadri sve podatke koji su potrebni za ispravno pozivanje funkcije Identifikatori argumenata u prototipu mogu da se izostave
prevodilac ne koristi identifikatore iz prototipa
Primer double funkcija(double a, int b, short c); double funkcija(double, int, short);
292
Potpuni prototip
Prototip je potpun ako sadri sve informacije, tj. tip vrednosti funkcije i tipove i broj argumenata tip naziv_funkcije ( argumenti ) ; Nepotpuni prototip ima samo tip vrednosti funkcije, a argumenti se ne navode Nepotpuni prototip treba izbegavati
293
Povezivanje identifikatora
Izvorni tekst program se najee stavlja u vie datoteka U jednu datoteku se stavljaju srodne funkcije, ili jedna klasa Datoteke se prevode nezavisno Posle prevoenja povezuju se u izvrni oblik programa esto se prave biblioteke koje sadre prevedeni oblik koda koji se moe koristiti u vie programa
295
296
// Datoteka sa definicijom funkcije #include <math.h> extern double x, y, r, fi; // deklarisanje globalnih podataka void polar() { r = sqrt(x*x + y*y); fi = (x==0 && y==0) ? 0 : atan2(y, x); }
298
300
Glavni program tipa void, ili tipa int ali bez naredbe return, ima sluajnu vrednost kao zavrni status
301
302
Pozivanje funkcije exit moe se uraditi iz bilo koje funkcije unutar programa (nestrukturirani pristup!), a glavni program treba da bude tipa int
303
Komanda echo
Na operativnim sistemima UNIX i MS-DOS komanda echo ispisuje tekst koji je sastavni deo komande: % echo Pozdrav svima! Operativni sistem stvara sledeu struktura koju prosleuje programu bpar vpar P NULL s o v z i d m r a a ! v \0
306
3 e c h o \0 \0
307
Rekurzivni problemi
Neki problemi su po prirodi rekurzivni Fibonacci-jevi brojevi: f0 = 0 f1 = 1 fn = f n 1 + f n 2 , n > 1 Niz je: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Rekurvno reavanje faktorijela 0! = 1 n! = n (n1)! , n > 0
308
Rekurzivni problemi
Rekurzivne funkcije su funkcije koje neposredno ili posredno pozivaju same sebe Prirodno se koriste za reavanje rekurzivnih problema Da bi se rekurzija zavrila mora postojati specijalna vrednost argumenta za koju vrednost funkcije nije definisana rekurzivno
309
Rekurzivne funkcije
Rekurzivno reavanje faktorijela
int faktorijel(int n) { return (n>0) ? (n * faktorijel(n-1)) : 1; }
Rekurzivne funkcije
Rekurzivno reavanje problema je sporije nego iterativno, ako postoji jednostavan nacin da se rekurzivni problem svede na iterativni, kao u sluaju faktorijela
u rekurzivnom reenju faktorijela najvie vremena se gubi na pozivanja funkcije
311
312
313
Pokazivai na funkcije
Moe se definisati pokaziva na funkciju Pokazivai na funkcije mogu da se:
meusobno dodeljuju prenose kao argumenti drugim funkcijama da budu rezultati funkcija da se smetaju u nizove
Pokaziva na funkciju moe da pokazuje na bilo koju funkciju pod uslovom da se slae po tipu sa funkcijom, tj. da su im jednaki:
tip vrednosti funkcije broj i tipovi argumenata
314
315
Primer
Definisanje pokazivaa na funkciju double (*pfun) (float, int); pfun je pokaziva na funkciju ija je vrednost tipa double i koja ima dva argumenta, prvi je tipa float a drugi je tipa int Sledei primer ne predstavlja pokaziva na funkciju, ve funkciju iji je rezultat pokaziva na tip double double *fun (float, int);
316
Definisanje pokazivaa na funkciju double (*pfun)(float, int); Dodela vrednosti pokazivau na funkciju pfun = fun; Pozivanje funkcije preko pokazivaa (*pfun)(x, n); // *pfun(x, n); // greka
317
318
319
320
321
Funkcije iz standardne biblioteke scanf i printf imaju promenljiv broj argumenata, npr. printf("%s%d%lf", str, i, x); Prevodilac ne moe da proveri tip i broj argumenata, pa su greke u sluaju neslaganja nepredvidive 322 Treba izbegavati pisanje ovakvih funkcija
Poto prevodilac mora imati telo funkcije da bi ga ugradio u kod, funkcija se mora navesti:
u svakoj *.cpp datoteci gde se koristi ili u *.h datoteci koja se ukljuuje u *.cpp datoteke
nije pogodno zbog izlaganja tela funkcije javnosti
Primer za inline
Funkcija inline int max(int i, int j) { return i>j ? i : j; } Makro #define max(i,j) ((i) > (j) ? (i) : (j)); Makro nije pogodan zbog viestrukog izraunavanja izraza, (npr. kad ima bonih efekata, tj. pravi greku): max(k++, n++) ((k++) > (n++) ? (k++) : (n++)) // k ili n ce 2 puta biti inkrementirano
324
325
326
Tip vrednosti funkcije nije bitan, moe da bude isti ili razliit Razlike u preklopljenim funkcijama moraju biti takve da prevodilac na osnovu argumenata moe jednoznano da odredi funkciju koja treba da se pozove
328
329
330
331
Pretprocesor
332
Pretprocesor
Pretprocesor je deo prevodioca koji obrauje izvorni tekst programa i stvara konani oblik teksta koji se prevodi Pretprocesor radi sledee
umetanje sadraja tekstualne datoteke na odreeno mesto u izvornom tekstu zamene leksikih simbola novim nizovima simbola uslovno ukljuivanje ili izostavljanje delova teksta
333
Direktive pretprocesora
Radom pretprocesora upravlja se specijalnim naredbama koje se nazivaju direktivama pretprocesora Pisanje direktiva
svaka direktiva je u posebnom redu poinje znakom # ispred kojeg mogu biti samo beli znaci nastavljanje direktive u narednom redu oznaava se znakom \ koji je poslednji znak koji nije beli u redu koji se nastavlja
334
336
337
338
Izmeu identifikatora, zagrada i niza argumenata ne sme biti belih znakova Argumenti su formalni argumenti makroa Formalni argumenti makroa nemaju tipove U tekstu iza identifikatora mora da bude napisan niz stvarnih argumenata makroa unutar zagrada
339
340
342
Uslovno prevoenje
U toku prevoenja delovi programa se mogu izbaciti (nee se prevoditi) Osnovna direktiva za uslovno prevoenje je # if uslov ... # endif uslov je celobrojni konstantni izraz
operandi su konstante ili identifikatori definisani sa define mogu se koristiti operatori za skalarne numerike podatke moe se koristiti specijalni unarni operator defined ako je uslov ispunjen (0) prevodi se deo programa izmeu #if i #endif, inae (=0) se ne prevodi
343
Operator defined
Unarnim operatorom defined se utvruje da li je neki identifikator definisan direktivom define bez obzira da li taj identifikator ima neku vrednost ili ne Izraz je oblika defined identifikator defined (identifikator) Izraz ima vrednost 1 ako je identifikator definisan sa define i jo nije uniten sa undef, inae je vrednost 0
#if i #endif, inae (=0) se ne prevodi
344
346
Viestruko prevoenje spreava se uslovnim prevoenjem Preporuuje se da sve *.h datoteke imaju oblik
// ImeDatoteke.h #ifndef _imedatoteke_h_ #define _imedatoteke_h_ // Definicije #endif
Imena svih datoteka jednog programa moraju biti razliita Mogu se koristiti i drugi oblici identifikatora umesto _imedatoteke_h_, uobiajeno je da sadre ime datoteke
347
Datoteka dat4.h ukljuuje datoteke dat2.h i dat3.h Obe datoteke dat2.h i dat3.h ukljuuju dat1.h Datoteka dat1.h je dva puta ukljuena u datoteku dat4.h, jednom preko dat2.h i drugi put preko dat2.h Pri prevoenju datoteke dat4.h javlja se greka, tip RCoordinate je definisan vie puta
Datoteka dat1.h ukljuuje se u dat4.h preko dat2.h U trenutku ukljuivanja datoteke dat3.h u dat4.h, identifikator _dat1_h_ je definisan, pa se sadraj koji je unutar uslovnog prevoenja iz datoteke dat1.h nee ponovo ukljuiti u dat4.h
349
Razne direktive
Redefinisanje identifikatora __LINE__ # line konstanta # line konstanta datoteka Direktiva za prekidanje prevoenja i ispisivanje poruke # error poruka Direktiva za podeavanje parametara prevoenja # pragma simbol simbol ... simbol
350
351
Datoteke u jeziku C
352
353
Vrste datoteka
Prema nainu smetanja podataka datoteke mogu biti
tekstualne binarne
354
Tekstualne datoteke
Sadre nizove znakova grupisane u redove Znak za prelazak u novi red je '\n' Znakovi u tekstualnim datotekama mogu biti
znakovi koji se ispisuju na ekranu upravljaki znakovi
prelazak u novi red prelazak na novu stranicu tabulacija ...
Binarne datoteke
Sastoje se od niza bajtova iji je sadraj verna slika naina predstavljanja podatka u memoriji Podaci se itaju i upisuju u binarne datoteke bajt po bajt bez konverzije Mogu postojati samo na jedinicama masovne memorije Program mora da zna kako su podaci zapisani u binarnom fajlu, npr. 8 bajtova mogu da predstavljaju
jedan podatak tipa double dva podatka tipa float dva podatka tipa int etiri podatka tipa short
356
...
Zapis
Sadraj datoteke se moe podeliti na manje logike celine koje se nazivaju zapisi
357
Relativne datoteke
moe se pristupati zapisima po proizvoljnom redosledu na osnovu rednog broja zapisa (direktni pristup)
Indeksne datoteke
moe se pristupati zapisima po proizvoljnom redosledu na osnovu sadraja dela zapisa koji se naziva klju (pristup pomou kljua)
358
359
Pristup datoteci
itanje ili upisivanje sa ili bez konverzije
Zatvaranje datoteke
raskidanje veze sa fizikom datotekom unitavanje strukture u memoriji napravljenje pri otvaranju
360
Pokaziva na datoteku
Datoteka je podatak tipa FILE Pokaziva na datoteku je tipa FILE* FILE je strukturirani tip definisan naredbom typedef u fajlu <stdio.h> Definisanje pokazivaa na datoteku FILE* datoteka;
361
Globalni identifikatori
Tri standardne tekstualne datoteke se otvaraju na poetku izvravanja programa Definisana su tri globalna identifikatora za ove datoteke u zaglavlju <stdio.h>
stdin - glavni (standardni) ulaz, predstavlja tastaturu dok se komandom operativnog sistema ne skrene glavni ulaz stdout - glavni (standardni) izlaz, predstavlja ekran dok se komandom operativnog sistema ne skrene glavni izlaz stderr - standardni izlaz za poruke o grekama, predstavlja ekran i ne moe da se skrene na datoteku
362
363
Otvaranje datoteke
FILE* fopen(const char* ime, const char* reim);
ime je naziv datoteke prema sintaksi operativnog sistema i moe biti cela putanja zajedno sa imenom drajva reim je znakovni niz koji oznaava nain korienja datoteke Podrazumeva se tekstualna datoteka, a osnovni rezimi su
"r" za itanje iz postojee datoteke (read) "w" za upisivanje u novu datoteku (write) "a" za dodavanje na kraj nove ili postojee datototeke (append)
364
365
Ako datoteka ne postoji ne moe se otvoriti u reimu "r" Ako datoteka postoji i otvori se u reimu "w", bie unitena prethodna Primeri otvaranja datoteke
FILE* file = fopen("proba.txt", "r"); bool greska = file==NULL; FILE* f = fopen("C:\Demo\binarna.proba.b", "wb");
366
Zatvaranje datoteke
int fclose(FILE* datoteka); datoteka je pokaziva na strukturu datoteke koja se zatvara Rezultat zatvaranja datoteke je
nula u sluaju uspenog zatvaranja simbolika konstanta EOF u sluaju neuspenog zatvaranja
367
368
370
fgets zavrava itanje kad proita n-1 znakova ili znak za kraj reda '\n' i na kraj dodaje znak '\0' gets ita sve znakove do znaka za kraj reda '\n' umesto kojeg u niz tekst dodaje znak '\0' tekst je pokaziva na znakovni niz u koji se upisuje proitani red teksta Vrednost obe funkcije je
pokaziva tekst u sluaju uspenog itanja NULL u sluaju nailaska na kraj datoteke ili u sluaju greke
372
373
Vrednost sve tri funkcije je broj znakova u sluaju uspeha, ili negativna vrednost u sluaju greke
374
Ulazna konverzija argumenta zadata je nizom format Argumenti su adrese podataka ili znakovnih nizova Izvorite je:
datoteka u sluaju funkcije fscanf glavni ulaz u sluaju funkcije scanf znakovni niz u memoriji raunara u sluaju funkcije sscanf, dovoljno dugaak da primi sve argumente i dodatno znak \0
Vrednost sve tri funkcije je broj konvertovanih podataka u sluaju uspeha, ili simbolika konstanta EOF u sluaju greke
375
Funkcija ita iz datoteke datoteka najvie broj podataka veliine veliina u memoriju poevi od adrese niz itanje poinje na mestu gde je zavren prethodni pristup datoteci Programer mora da vodi rauna o logikoj strukturi datoteke, veliini podataka, broju i redosledu Vrednost funkcije je broj proitanih podataka Ako u datoteci nema dovoljno podataka bie proitano manje od broj podataka Za ispitivanje greaka koriste se funkcije feof i ferror
376
377
Funkcija upisuje broj podataka veliine veliina iz memorije poevi od adrese niz u datoteku datoteka Pisanje poinje na mestu gde je zavren prethodni pristup datoteci Programer mora da vodi rauna o logikoj strukturi datoteke, veliini podataka, broju i redosledu Vrednost funkcije je broj upisanih podataka U sluaju greke vrednost funkcije je manja od broj podataka
378
379
Funkcija nalazi trenutnu poziciju u datoteci datoteka Vrednost funkcije je trenutna pozicija u bajtovima u odnosu na poetak datoteke, a u sluaju greke -1L
380
381
Funkcija radi pozicioniranje na mesto u datoteci datoteka koje je na udaljenosti pomeraj bajtova od oznaene reperne take Reperne take se obeleavaju simbolikim konstantama:
poetak datoteke SEEK_SET trenutna pozicija u datoteci SEEK_CUR kraj datoteke SEEK_END
Sledee pristupanje datoteci (itanje ili pisanje) zapoee na poziciji podeenoj funkcijom fseek Vrednost funkcije je nula u sluaju uspeha, a razliita od nule u sluaju greke
382
Signalizacija greaka
Svaka datoteka ima dva logika identifikatora
indikator kraja datoteke indikator greke
383
Signalizacija greaka
void clearerr(FILE* datoteka); Funkcija brie indikatore kraja datoteke i greke int feof(FILE* datoteka); Funkcija ispituje indikator kraja datoteke, ukljuen je ako je vrednost funkcije razliita od nule int ferror(FILE* datoteka); Funkcija ispituje indikator greke datoteke, ukljuen je ako je vrednost funkcije razliita od nule Globalna promenljiva errno, deklarisana u zaglavlju <errno.h>, moe da sadri ifru greke koja nije precizirana standardom
384
385
386
387
Znakovi
388
Znakovni nizovi
Tip za znakovni niz je char[] Na kraju znakovnog niza se dodaje jedan element ija je vrednost jednaka nuli Uvek treba predvideti niz ija je duina za jedan vea od broja elemenata koje treba da sadri niz Primer: da bi sadraj znakovnog niza bio "tri", duina znakovnog niza mora da bude najmanje etiri t r i \0
389
Kodovi znakova
Najee se koristi ASCII kod Znakovi koji se prikazuju na ekranu i koji se tampaju nazivaju se tampajui znakovi
imaju kodove od 32 do 126
slova cifre specijalni znaci
390
Beli znakovi
Beli znakovi ostavljaju belinu izmeu znakova koji se tampaju
razmak skok na novi list (ff form feed) skok u novi red (lf line feed) povratak na poetak reda (cr carriage return) tabulacija (ht horizontal tab) vertikalna tabulacija (vt vertical tab)
391
Znakovne konstante
Znakovne konstante se piu izmeu para apostrofa Konstanta 'A' je:
tipa int u jeziku C, ima vrednost koda navedenog znaka tipa char u jeziku C++
392
Znakovne konstante
Za tampajue znakove navodi se sam znak, npr. 'a' Upravljaki znakovi navode se sa kosom crtom unazad, npr:
'\r' '\n' '\h' '\t' '\v' za povratak na poetak tekueg reda za skok na poetak novog reda za skok na poetak novog lista za horizontalnu tabulaciju za vertikalnu tabulaciju
393
Znakovne konstante
Mogu da se piu navoenjem oktalne vrednosti sa jednim do tri oktalne cifre iza kose crte unazad
primer: '\7' '\15'
Mogu da se piu navoenjem heksadecimalne vrednosti sa dve cifre iza kose crte unazad i znaka x
primer: '\x07' '\X15'
394
Operacije sa znakovima
Ne postoje posebni operatori za obradu znakova Moru se raditi aritmetike operacije sa znakovima
numerika vrednost koda se koristi u izraunavanjima
Primeri:
int i = 'a' 'A'; // i = 32 za ASCII kod char z = 'A' + 32; // z = 'a' za ASCII kod char c = 'G' - 'A' + 'a'; // c='g' za ASCII i EBCIDIC
395
// Identian prethodnom
Prevodilac za svaki znak iz konstantnog znakovnog niza generie po jedan znak i na kraju dodaje znak sa vrednou nula "Pozdrav" je isto to i 'P' 'o' 'z' 'd' 'r' 'a' 'v' '\0'
396
Primer dva niza koji se inicijalizuju istim elementima: const char niz1[] = "Dva"; const char niz2[] = {'D', 'v', 'a', '\0'}; Primer inicijalizacije znakovnog niza: char poruka[] = "Pozdrav"; Primer inicijalizacije pokazivaa ija je poetna vrednost adresa konstante tipa znakovnog niza: char* p_poruka = "Pozdrav";
397
p u s c p s n
o t r e e u e
n o e t t b d
e r d v a o e
d a a r k t l
e k \0 t \0 a j
l \0
\0
\0
\0 a \0
398
Za c konverziju se ne dodaje \0
399
400
Primer
char ime[32], prezime[32]; ... printf("Ime i prezime: %s %1s", ime, prezime);
401
Biblioteke funkcije
Postoje posebne biblioteke funkcije za rad sa znakovnim podacima koje slue za:
itanje i pisanje znakova bez konverzije ispitivanje znakova rad sa znakovnim nizovima konverziju u numerike tipove podataka
402
Ispitivanje znakova
Ispituje se da li je znak slovo, cifra, beli znak, ... Funkcije su u standardnom zaglavlju <ctype.h>
int int int int int int int int int int int int int isalnum(int c) // da li je c alfanumeriki znak isalpha(int c) // da li je c slovo islower(int c) // da li je c malo slovo isupper(int c) // da li je c veliko slovo isdigit(int c) // da li je c decimalna cifra isxdigit(int c) // da li je c heksadecimalna cifra isspace(int c) // da li je c beli znak isgraph(int c) // da li je c tampajui znak ali ne razmak isprint(int c) // da li je c tampajui znak ukljuujui razmak ispunct(int c) // da li je c tampajui znak ali ne slovo ili cifra iscntrl(int c) // da li je c upravljaki znak tolower(int c) // konverzija c u malo slovo toupper(int c) // konverzija c u veliko slovo 404
405
406
407
Strukture u jeziku C
408
Strukture u jeziku C
Strukture su sloeni tipovi podataka koji se sastoje od elemenata proizvoljnog prostog ili sloenog tipa Elementi strukture se nazivaju i polja strukture Polja stukture mogu da budu razliitih tipova
prosti tipovi nizovi strukture
Mogu da se prave nizovi iji su elementi strukture Mogu da postoje pokazivai na strukture
409
410
Definisanje struktura
Opti oblik je: struct ime_strukture { niz_deklaracija } ime_strukture je identifikator strukture
nije identifikator tipa mora da se navodi sa struct ime_strukture
niz_deklaracija je niz deklaracija polja strukture Svaka deklaracija ima oblik naredbe za definisanje podataka: tip polje, polje, ... polje; tip je osnovni tip polja u strukturi polje je idenfikator polja
moe imati modifikator ako je polje niz ili pokaziva
411
Polja strukture
Doseg identifikatora polja je unutar strukture (strukturni doseg) Polja u razliitim strukturama mogu da imaju iste identifikatore
412
413
415
Primer:
typedef struct tacka { int x, y; } Tacka; Tacka a, b; a.x = 5; a.y = 6; b.x = a.x; b.y = a.x;
416
Primer:
typedef struct tacka { int x, y; } Tacka; Tacka a, b; Tacka* pt = &a; // pt pokazuje na taku a (*pt).x = 5; // a.x = 5 pt->y = 6; // a.y = 6 pt = &b; // pt pokazuje na taku b pt->y = a.x; // b.y = 5
417
419
Imenski prostori
420
Imenski prostori
U velikim programima mogu se pojaviti ista globalna imena u razliitim datotekama Imenski prostor slui za grupisanje globalnih imena u vie dosega Svaki imenski prostor ini poseban doseg (prostorni doseg)
421
// // // double g(double x)
424
425
426
// Koristi se Alfa::a
427
428
Primer
namespace Alfa { int a = 55; double f(int); extern int x; double g(double); } Podatak i funkcija deklarisani u imenskom prostoru definiu se izvan imenskog prostora: int Alfa::x = 22; double Alfa::f(int x) { return x + a; }
429
430
431
Preporuka:
za definisanje globalnih podataka i funkcija sa unutranjim povezivanjem treba koristiti bezimeni imenski prostor, a ne modifikator static kao to se radi u jeziku C
432
// p = ::a // q = ::b // Greka, ::a ili Alfa::a // Greka, b ili Alfa::b // Lokalno "b" unutar funkcije // Lokalno "b" // Globalno "b"
433
Primer:
namespace Alfa { // ... namespace Beta { int x = 1; } } int y = Alfa::Beta::x;
434
435
436
} // Deklarisanje promenljivih i funkcija izvan // prostora imena (v. slajdove 428 i 429) int Alfa::b = 3; // Deklarisano sa extern u Alfa int Alfa::g() { return 4; } // Deklaracija u Alfa int Alfa::Beta::a = 5; // Deklarisano sa extern u Beta int Alfa::Beta::f() { return b; } // Alfa::b;
437
438
439
440
Bolje je da se prvo navedu direktive include za sva standardna zaglavlja i da iza njih stavi jedna naredba using namespace std;
442
443
444
Ulaz i izlaz
Ulaz i izlaz nisu deo jezika C++
ostvaruju se pomou bibliotekih klasa
445
Klase za tokove
Klase za rad sa tokovima na hard disku (datotekama):
ofstream samo za izlazne datoteke ifstream samo za ulazne datoteke fstream za ulazno-izlazne datoteke klase su opisane u zaglavlju <fstream> ostringstream samo za smetanje podataka u tokove istringstream samo za uzimanje podataka iz tokova stringstream za uzimanje i smetanje podataka klase su opisane u zaglavlju <sstream>
446
Klasni dijagram
447
Klase za tokove
Klasa ios sadri
zajednike funkcije za sve vrste tokova simbolike konstante
pri korienju se pie npr. ios::in, ios::binary
Osnovna klasa za elementarne radnje sa fizikim ureajima je streambuf Klase slue za rukovanje ulazno-izlaznim baferima Ne pripadaju hijerarhiji izvoenja klasa koja poinje klasom ios
449
Standardni tokovi
Na poetku izvravanja programa automatski se stvaraju sledee dve globalne promenljive tipa tokova: cin glavni (standardni) ulaz, tip istream
tastatura dok se glavni ulaz ne skrene u programu ili operativnom sistemu
450
Standardni tokovi
cerr (standardni) izlaz za poruke, tip ostream
ekran dok se ne izvri skretanje koristi se za poruke o grekama
451
Primer
Primer programa koji uitava dva broja i ispisuje zbir: #include <iostream> using namespace std; void main() { cout << "a,b? "; int a,b; cin >> a >> b; int c = a + b; cout << "a+b= " << c << \n; }
452
453
Klase
Klase
Klase su sloeni tipovi podataka Obezbeuju kapsulaciju i nasleivanje Sastoje se od ureenih nizova elemenata koji mogu da budu meusobno razliitih tipova i koji se nazivaju lanovi klase Podaci klasnih tipova su primerci klase i nazivaju se objekti Pojam podatak obuhvata i vrednosti standardnih tipova i objekte klasnih tipova Skalarni podaci, pokazivai, strukture i objekti su pojedinani podaci Nizovi
2
Klase
lanovi klase
podaci funkcije
Vrednosti podataka lanova ine stanje (vrednost) objekta, i nazivaju se i atributi ili polja klase ili objekta Funkcije lanovi izvode operacije nad podacima lanovima i mogu da menjaju stanje objekta Funkcije lanovi se nazivaju metodi
Klase
Klase su pravi tipovi:
odreuju mogue vrednosti objekata odreuju mogue operacije nad objektima spreavaju izvravanje bilo koje druge operacije nad objektima obezbeuju obaveznu inicijalizaciju objekata obezbeuju unitavanje objekata
Privatnim lanovima moe da se pristupa samo unutar klase Javnim lanovima moe da se pristupa unutar klase i iz delova programa izvan klase U veini sluajeva
podaci lanovi su privatni neki metodi su privatni, a neki javni
5
Definisanje klase
U definiciji klase se navode svi lanovi klase Na osnovu definicije zna se potreban prostor za smetanje objekta te klase u memoriju Klasa se definie opisom class iji je oblik: class Identifikator { lan lan ... public: lan lan ... private: lan lan ... };
Definisanje klase
Identifikator u definiciji klase je identifikator tipa klase
moe da se koristi na svim mestima gde se oekuje identifikator tipa
Definisanje klase
lan u definiciji klase moe da bude
definicija podatka lana klase definicija metoda deklaracija metoda naredba typedef ili enum
uvode indentifikator tipa ili simbolikih konstanti
Ne mogu da se navode inicijalizatori Ne mogu da budu nepostojani (volatile) Ne mogu da budu istog tipa kao klasa kojoj pripadaju, ali mogu da budu pokazivai ili reference na klasu kojoj pripadaju
Definicija metoda
Ima isti oblik kao i definisanje obinih (globalnih) funkcija Podrazumeva se modifikator inline Vrednost metoda moe da bude istog tipa kao i klasa kojoj metod pripada Argumenti metoda mogu da budu istog tipa kao i klasa kojoj metod pripada
10
Deklaracija metoda
Ima isti oblik kao i deklaracija obinih (globalnih) funkcija Metodi koji se samo deklariu u klasi moraju da se definiu izvan klase Za metode definisane izvan klase ne podrazumeva se modifikator inline, ali moe da se doda u definiciji
11
Doseg identifikatora
Identifikatori definisani unutar klase imaju doseg do kraja definicije klase Kae se da lanovi klase imaju klasni doseg
13
Deklarisanje klase
Opti oblik deklaracije klase je class Identifikator; Posle deklaracije
mogu da se definiu pokazivai i reference na objekte klase ne mogu da se definiu objekti klase i da se pristupa lanovima klase
14
15
16
Objekti
Definiu se naredbama za definisanje
tip je identifikator klase
Svaki objekat sadri zaseban komplet svih podataka lanova klase Metodi se u memoriju smetaju samo jednom Metodi se pozivaju za konkretne objekte
metod pozvan za konkretan objekat obrauje podatke lanove iz tog objekta
18
Da se ne bi kopirao objektat treba kao argumente funkcija koristiti pokazivae ili reference
21
Metodi
Pored formalnih argumenata metodi klasa imaju jedan skriveni argument i to je objekat za koji se poziva metod Unutar metoda se pristupa lanovima skrivenog argumenta navoenjem njihovog imena Adresa skrivenog argumenta nalazi se u pokazivau sa imenom this Skriveni argument moe da bude nepromenljiv (const) ili nepostojan (volatile)
22
Pokaziva this
Koristi se unutar metoda za pristupanje objektu za koji je pozvan metod Tip skrivenog parametra je u svakoj klasi je nepromenljiv pokaziva na tu klasu (za klasu T to je T* const) Prema tome, unutar svake klase pokaziva this je tipa te klase
23
Preklapanje metoda
Metodi mogu da se preklapaju Preklopljeni metodi moraju da se razlikuju po broju i / ili tipu arumenata Koji od preklopljenih metoda se poziva odreuje se na osnovu broja i tipa argumenata u trenutku prevoenja
24
Preporuuju se dva metoda: tip& metod (argumenti) ; const tip& metod (argumenti) const; tip* metod (argumenti) ; const tip* metod (argumenti) const;
jedan metod e se pozivati za promenljivi, a drugi za nepromenljivi objekat
26
Primer
int Nesto::f(int x) { int z=x+a; // z = x + this->a return z/b; // z / this->b; } Nesto Nesto::h(Nesto x) { Nesto y; y.a = x.a + this->a; y.b = x.b * a; return y; }
27
28
29
32
33
35
36
37
Prijateljska funkcija moe da bude prijatelj vie klasa istovremeno Primer korienja prijateljske funkcije: kada neka funkcija trba da pristupa lanovima vie klasa, npr. ako elimo da realizujemo mnoenje matrice sa vektorom (klase Matrica, Vektor) Poziv: f(x) umesto x.f()
38
// // // //
Primer za objekte
Statiki objekti Tacka obj1; obj1.koordinate(0,1); Tacka obj2; obj2.koordinate(4,4); Dinamiki objekat Tacka* pObj = new Tacka; pObj->koordinate(5,5); delete pObj; Svaki objekat ima svoje kopije svih podataka lanova
41
0 1 4 4
pObj
m_x m_y
5 5
42
43
mora da se koristi operator za razreenje dosega :: prilikom definisanja mogu da se inicijalizuju, ako ne, podrazumevaju se nule inicijalizacija se obavlja pre pozivanja funkcije main
44
45
Zajedniki metodi
Ne pozivaju se za objekat, tj. nemaju skriveni argument Nemaju pokaziva this Preko identifikatora lana mogu da pristupaju samo zajednikim lanovima (poljima i metodima) Pojedinanim lanovima mogu da pristupaju samo za konkretne objekte koji mogu biti
argumenti zajednikih metoda lokalni podaci zajednikih metoda globalni podaci (static)
46
Zajednikim lanovima se moe pristupati i kad nije napravljen nijedan objekat klase
pristupa im se Klasa::lan
47
// zajedniki metod // greka, mora se pozvati za objekat // objekat // sve tri metode mogu da se pozivaju // za objekat int m = obj.f(); // nain pozivanja koji treba izbegavati int s = obj.h(7) // mora konkretan objekat Abc::g(obj, &obj, obj);
50
51
52
// pc je pokaziva na int polja klase Alfa // obj je objekat klase Alfa // pObj je pokaziva na objekte klase Alfa // pc pokazuje na polje a objekata klase Alfa // obj.a = 1 // pObj->a = 2 // pc pokazuje na polje b objekata klase Alfa // obj.b = 3 // pObj->b = 4
53
Unutranje klase
Klase mogu da se definiu unutar druge klase Koristi se relativno retko i pri tome su unutranje klase vrlo male i najee imaju samo javna polja Dosezi su nezavisni moraju da se koriste operatori ., ->, ili :: Privatni lanovi nisu uzajamno dostupni, osim ako nije re o prijateljskim klasama.
54
Lokalne klase
Klase mogu da se definiu unutar funkcija Lokalne klase imaju blokovski doseg Lokalne klase ne mogu da imaju zajednike lanove (static) Unutar lokalne klase dozvoljeno korienje:
identifikatora tipova trajnih podataka spoljanjih podataka i funkcija nabrojanih konstanti
iz okruujeeg dosega.
56
Primer
int x; void f(){ static int s; int x; extern int g(); class Lok { ... public: int h(){return x} // GREKA: x nije trajan //podatak int j(){return s} // Moe static int k(){return ::x} // Globalan podatak int l(){return g()} // Spoljanja funkcija g() static int a; // GREKA: ne moe static int b; // OK } Lok *p = 0; // Greka: nije u dosegu
57
Strukture
Strukture u jeziku C++ su klase iji su podaci podrazumevano javni Mogu se koristiti modifikatori private i public Nema drugih razlika izmeu struktura i klasa
58
Unije
Sva polja imaju iste poetne adrese u datom trenutku samo jedno moe da ima definisanu vrednost Imalo znaaja u vreme jezika C, kad su hardverske utede u memoriji neto znaile
59
60
Konstruktori
61
Stvaranje objekata
Novi objekti (primerci klasa) mogu da se stvaraju naredbama za definisanje podataka (stalni i prolazni objekti) kao lokalni podaci koji su formalni argumenti funkcija (prolazni objekti) u toku izvravanja sloenih izraza za odlaganje meurezultata (privremeni objekti) izvravanjem operatora new (dinamiki objekti) Stvaranjem objekata: dodeljuje se memorijski prostor moe da se uradi inicijalizacija Polja: inicijalizaciju radi programer. Samo za static polja su podrazumevane vrednosti nula. Konstruktori su specijalni metodi koji rade inicijalizaciju objekata Automatski se pozivaju pri stvaranju objekta
62
Argumenti konstruktora
Mogu da imaju proizvoljan broj argumenata Argumenti ne mogu da budu objekti tipa svoje klase Argumenti mogu da budu pokazivai ili reference na objekte svoje klase Mogu da imaju podrazumevane argumente Ne vraaju nikakvu vrednost, ne koristi se ni void
63
64
Alfa* p1 = new Alfa(a); // poziva se Alfa(Alfa&) Alfa* p2 = new Alfa('c'); // poziva se Alfa(char)
66
67
Definisanje konstruktora
Definiu se kao i druge metode Razlika je to mogu da se navedu inicijalizatori Opti oblik je: Klasa ( argumenti ) : inicijalizator, ... , inicijalizator { Telo } Argumenti, inicijalizatori i telo mogu da se izostave (ali moraju zagrade,() i {} )
68
69
Primeri konstruktora
Alfa::Alfa() : m_a('d'), m_b(1) { } Alfa::Alfa(int i) : m_a(i), m_b(2*i) {} Alfa::Alfa(int i) : m_b(2*i), m_a(i) {} Alfa::Alfa(int i) { m_a = i; m_b = 2*i; }
71
72
Podrazumevani konstruktor
Podrazumevani konstruktor je konstruktor bez argumenata ili konstruktor iji svi argumenti imaju podrazumevane vrednosti Ako se u klasi ne napie konstruktor, automatski se generie javni podrazumevani konstruktor sa praznim telom Obavezno treba definisati podrazumevani konstruktor u klasi koja ima polja pokazivakog tipa Ako treba spreiti pravljenje objekta neke klase, npr. klase iji su svi lanovi zajedniki, treba napraviti privatni podrazumevani konstruktor sa praznim telom
73
74
Konstruktor kopije
Konstruktor kopije ima jedan argument tipa reference na svoju klasu (ako postoje, ostali argumenti moraju imati podrazumevane vrednosti) Slui za inicijalizaciju objekta kopiranjem drugog objekta iste klase Koristi se
u naredbi za definisanje objekta prilikom pozivanja operatora new za inicijalizaciju formalnog argumenta funkcije klasnog tipa
Da bi se spreilo stvaranje kopija objekata, konstruktor kopije treba uiniti privatnim lanom klase
75
76
77
Primer za objekte
Niz obj1; ... Niz obj2(obj1);
e
78
Primer za objekte
Da nije definisan konstruktor kopije bio bi pozvan podrazumevani konstruktor kopije Niz obj1; ... Niz obj2(obj1);
obj1 m_niz m_n obj2 m_niz m_n 5
79
a 5
Konstruktor konverzije
Konstruktor konverzije ima jedan argument Argument moe biti bilo kog tipa osim tipa te klase, moe biti i upuiva Moe se pozvati eksplicitno ili prilikom automatske konverzije Ne moe se spreiti automatska konverzija ako postoji konstruktor konverzije Konstruktorom konverzije se moe definisati konverzija iz nekog drugog tipa u tip klase za koju se taj konstruktor definie
80
Destruktori
84
Unitavanje objekta
Unitavanje objekata se radi:
za stalne objekte: automatski na kraju programa za prolazne objekte: automatski u trenutku naputanja dosega njihovih identifikatora za privremene objekte (meurezultate): automatski im je to mogue za dinamike objekte: na zahtev programera pomou operatora delete ili automatski na kraju programa
Oslobaanje prostora
prostor dodeljen poljima oslobaa se automatski oslobaanje prostora u dinamikoj zoni memorije mora da uradi programer
Destruktori su specijalni metodi koji unitavaju objekat 85 Ako postoje, pozivaju se automatski pri unitavanju objekta
Destruktori
Imaju isto ime kao klasa, sa prefiksom ~: ~Alfa() Klasa moe da ima samo jedan destruktor Destruktor nema parametre Ako u klasi nije definisan destruktor, automatski se definie javni destruktor s praznim telom
class Niz { double* a; int n; public: ... ~Niz () {delete [] a;} ... }
86
87
88
UML
89
Preklapanje operatora
90
Preklapanje operatora
Za operande klasnih tipova mogu da se definiu tumaenja standardnih operatora Primeri
A = (B + C) * D, gde su A, B, C, D matrice A = (B + C) * d, gde su A, B, C nizovi, d je numeriki tip
92
93
Operatorske funkcije
Operatori se ostvaruju operatorskim funkcijama iji je opti oblik: operator op op je simbol operatora Primeri: operator+ operator -operator new // Moe se pisati spojeno // ili odvojeno // Mora se pisati odvojeno
94
Operatorske funkcije
Mogu biti
metodi zajedniki metodi (static) globalne funkcije (najee prijateljske)
Mogu da imaju podrazumevane argumente Mogu se preklapati Vrednost operatorskih funkcija moe biti proizvoljnog tipa, ukljuujui i void
95
Unarni operatori
Operatorska funkcija mora imati jedan operand Moe biti:
metod bez argumenata (ima skriveni argument) globalna funkcija sa jednim argumentom tipa klase za koju se pravi operatorska funkcija
96
Binarni operatori
Operatorska funkcija mora imati dva operanda Moe biti:
metod sa jednim argumentom (drugi je skriveni argument) globalna funkcija sa dva argumenta
bar jedan mora biti tipa klase za koju se pravi operatorska funkcija drugi moe biti proizvoljnog tipa
97
98
99
100
Operand koji podlee bonom efektu moe da bude skriveni argument prirodno da funkcija za preklapanje bude lan klase.
101
Preklapanje operatora
Operatori se preklapaju nezavisno, npr. +, ++, +=, tj. ako preklopimo +, ne znai i da smo automatski preklopili ++ i += Treba izbegavati neoekivana tumaenja operatora, npr. da se sabiranje matrica ili nizova napravi preklapanjem operatora -
102
Preklapanje operatora ++ i - Imaju prefiksni i postfiksni oblik oba operatora su unarna Prefiksni operatori se obino preklapaju kao metodi bez argumenata kao prijateljske funkcije sa jednim argumentom Postfiksni operatori se obino preklapaju kao metodi sa jednim argumentom tipa int
svrha argumenta tipa int nije da se koristi, ve slui da razlikujemo dve preklopljene funkcije (prefiksnu i postfiksnu verziju)
vrednost argumenata tipa int je nula kad se operatorska funkcija poziva kao operator, a ako se poziva kao funkcija ili metod vrednost se prenosi u funkciju
103
Primer preklapanja operatora ++ i -class Kompl { double re, im; public: Kompl(double r, double i) { re = r; im = i; } Kompl& operator++() { ++re; return *this; } // prefiksni
Kompl operator++(int i) // postfiksni { Kompl z = *this; re++; im+=i; return z; } friend Kompl& operator--(Kompl& z) { --z.re; return z; } // prefiksni
Primer preklapanja operatora ++ i -Kompl x(1,3); Kompl a = ++x; Kompl b = x++; // x = (1,3) // x = (2,3), a = (2,3) // Posto je postfiksni // oblik, gleda funkciju // b = (2,3), x = (3,3) x.operator++(2) // c = (3,3), x = --x; // x = (3,5), d = x--; // e = (3,5), x = operator--(x,2) // f = (2,5), x =
c d e f
= = = =
105
106
107
108
Primer konverzija
class Kompl { double re, im; public: Kompl (double r=0, double i=0) { re=r; im=i; } operator double(){ return sqrt(re*re+im*im); } friend double real (Kompl z) { return z.re; } friend double imag (Kompl z) { return z.im; } Kompl operator+ (Kompl z) { z.re += re; z.im += im; return z; } friend ostream& operator<< (ostream& it, const { return it << '(' << z.re << ',' << z.im << }; int main () { Kompl a (1, 2); Kompl b = a; Kompl c = 5;
// // // // //
Inic. ili konverzija. Konverzija u double. Realni deo. Imaginarni deo. Sabiranje.
Kompl& z) ')'; }
cout cout cout cout cout cout cout cout double d=Kompl(3,4); cout
= = = =
" << a " << b " << c " << a + b = " << a + (Kompl)3 = " << (double)a + 3 = " << a + Kompl (3,4) = " << (double)a = " << d
<< endl; << endl; << endl; << endl; << endl; << endl; << endl; << endl; << endl; 109
Preklapanje operatora =
Operator = ima automatsko tumaenje za sve nove klase: kopira sva polja izvorinog objekta u polja odredinog objekta Ako klasa ima polje koje je pokaziva na deo u dinamikoj zoni memorije:
ne kopira se deo iz dinamike zone memorije ako je to potrebno treba preklopiti operator =
111
114
}
Tekst::Tekst(const Tekst& tekst) // Konstruktor kopije { m_txt = new char [strlen(tekst.m_txt) + 1]; strcpy(m_txt, tekst.m_txt);
}
115
117
Preklapanja operatora () u nekoj klasi omoguava korienje objekata u izazima oblika obj(arg1, ..., argN). Na primer, ako se radi o klasi polinoma ovo omoguava da se vrednost polinoma izraunava izrazom oblika p(x) umesto p.izracunaj(x).
118
Preklapanje operatora -> omoguava obrazovanje klasa iji se objekti ponaaju kao pametni pokazivai, koji pored pristupanja objektu urade i neki dodatni posao, na primer broje pristupe objektima ili proveravaju ispravnost pokazivaa.
119
Primer
// Preklapanje operatora -> #include <iostream> using namespace std; struct Obj { double x, y; }; // Korisceni objekat.
class PokObj { // Klasa "pametnih" pokazivaca. Obj* p; // Pokazivac na pridruzeni objekat. int n; // Broj pristupa pridruzenom objektu. public: PokObj (Obj* obj) { n = 0; p = obj; } // Inicijalizacija. Obj* operator-> () { n++; return p; } // Pristup clanu. Obj& operator* () { n++; return *p; } // Pristup objektu. int operator+ () const { return n; } // Broj pristupa. } ;
120
Primer - nastavak
int main () { Obj a; PokObj pa = &a; pa->x = pa->y = 0; cout << +pa << endl; Obj b = *pa; cout << +pa << endl; Obj* pb = &b; pb->x = pb->y = 5; *pa = *pb; cout << +pa << endl; }
// Pise se: 4
121
Objakat t je
odredite podataka proitanih iz ulazne datoteke izvorite podataka za pisanje u izlazne datoteke
Vrednost obe funkcije je referenca na datoteku koja je prvi operand, to omoguava ulanavanje operatora >> i <<
123
Operatori >> i << mogu da se preklapaju i na druge naine koji nisu povezani sa ulazom i izlazom
124
Izvedene klase
126
Izvedene klase
Sline pojave se grupiu na osnovu zajednikih osobina Unutar grupe postoje podgrupe koje imaju sve osobine grupe i jo neke dodatne Primer:
geometrijske slike u ravni imaju
poloaj orijentaciju povrinu obim
krugovi su geometrijske slike koje imaju poluprenik kvadrati su geometrijske slike koje imaju duinu stranice trouglovi su geometrijske slike koje imaju tri stranice
127
Izvedena klasa opisuje podgrupu objekata (apstrakcija) koja ima neke specifine osobine
potklasa klasa potomak klasa dete
129
Za osnovnu klasu se kae da je javna, zatiena ili privatna osnovna klasa date izvedene klase
131
Nasleivanje
Izvedena klasa nasleuje sve lanove osnovne klase Viestruko nasleivanje je kad se izvedena klasa izvodi iz vie osnovnih klasa Ne nasleuju se
konstruktori destruktor operator=()
132
Prijateljske funkcije
Izvedene klase ne nasleuju prijateljske funkcije i klase od osnovne klase Prijatelji osnovne klase se mogu proglasiti prijateljima i u izvedenoj klasi Izvedena klasa moe imati i nove prijatelje
134
Nain izvoenja
Nain izvoenja odreuje kontrolu pristupa lanovima osnovne klase preko primeraka izvedene klase Izvoenje moe biti
javno (public) zatieno (protected) privatno (private)
135
Nain izvoenja
Javno izvoenje
javni lanovi osnovne klase su javni u izvedenoj klasi zatieni lanovi osnovne klase su zatieni u izvedenoj klasi privatni lanovi osnovne klase su privatni u izvedenoj klasi
Zatieno izvoenje
javni i zatieni lanovi osnovne klase su zatieni u izvedenoj klasi privatni lanovi osnovne klase su privatni u izvedenoj klasi
Privatno izvoenje
javni, zatieni i privatni lanovi osnovne klase su privatni u izvedenoj klasi
136
Nain izvoenja
lan osnovne klase zatien zatien zatien privatan privatan privatan privatan privatan
137
Izvoenje struktura
Strukture (struct) su ravnopravne sa klasama Struktura moe da se izvede iz klase ili strukture Klasa moe da se izvede iz strukture Kod izvedenih struktura podrazumeva se javno izvoenje
Iz unija (union) ne mogu da se izvedu drugi tipovi podataka Unije ne mogu da se izvedu iz drugih tipova podataka
138
IzvedenaKlasa
javno izvo enje
IzvedenaKlasa
zatieno izvoenje
IzvedenaKlasa
privatno izvo enje
139
A a
B b
C c
D d
E e 140
Razlikovati polje druge klase od podobjekta osnovne klase, kojem se ne moe pristupiti kao celini, ve samo lanovima pojedinano
141
143
_a, int _b, int _c){ // Gama::c, dodela vrednosti // Gama::b, dodela vrednosti // Alfa::b, pokriveno polje, dodela vrednosti // Alfa::a, dodela vrednosti
145
Redefinisanje metoda
Redefinisanje metoda u izvedenoj klasi ne smatra se preklapanjem imena funkcija. Sve metode osnovne klase koje imaju isto ime kao i metoda izvedene klase postae nevidljive, bez obzira na broj i tipove parametara. Te metode se pozivaju sa ::
147
Primer
class Osn { ... public: void m(); void m(int); }; class Izv: public Osn{ ... public: void m(int); // Pokriva i Osn::m() i Osn::m(int) }; int main() { Izv izv; izv.m(); // Greka: ne vidi se Osn::m() izv.Osn::m() // Moe izv.m(5); // Poziva se Izv::m() izv.Osn::m(5);// poziva se Osn::m(int)
148
U viestrukom izvoenju najee treba izbei viestruko ugraivanje lanova jedne klase u izvedenu klasu Osnovna klasa (A) treba da bude virtuelna za klase koje se neposredno izvode iz nje (B i C) virtuelno izvoenje
dodaje de modifikator virtual prilikom izvoenja
149
// Objekat klase D ima 5 polja // Polje klase D nasleeno od klase A preko klase B // Polje klase D nasleeno od klase B // Polje klase D nasleeno od klase A preko klase C // Polje klase D nasleeno od klase C // Polje klase D
150
1; 2; 3; 4;
// Objekat klase D ima 4 polja // Polje klase D nasleeno od klase A preko B i C // Polje klase D nasleeno od klase B // Polje klase D nasleeno od klase C // Polje klase D
151
B b
C c
B b
C c
D d
D d
152
153
154
155
157
159
161
Primer
class Osn { ... }; class Izv : public Osn { ... }; void f (Osn); int main() { Izv izv; Osn osn; osn = izv; // Dodela vrednosti izv = osn; // Greka: ta dodeliti //specifinim poljima? f(izv); // Inicijalizacija
162
Pokazivai na objekte
Dodela vrednosti pokazivaa na objekte tipa izvedene klase pokazivau na objekte tipa osnovne klase:
za javnu osnovnu klasu radi se automatska konverzija tipa pokazivaa
operacija je bezopasna izvedena klasa ima sve to ima i osnovna klasa, sa istim pravom pristupa
za privatnu ili zatienu osnovnu klasu mogua je dodela samo uz eksplicitnu konverziju tipa, kojom programer saoptava prevodiocu da zna ta radi
pristup u izvedenoj klasi je restriktivniji nego u osnovnoj preko pokazivaa na tip osnovne klase se moe pristupiti lanovima kojima se ne moe pristupiti preko pokazivaa tipa izvedene klase 163 ovaj sluaj treba izbegavati
Pokazivai na objekte
Dodela vrednosti pokazivaa na objekte tipa osnovne klase pokazivau na objekte tipa izvedene klase mogua je samo uz eksplicitnu konverziju tipa
preko pokazivaa na tip izvedene klase se moe pristupiti lanovima koji ne postoje u osnovnoj klasi (moe se pristupiti delu memorije koji ne pripada objektu!) operacija je veoma opasna i treba je maksimalno izbegavati eksplicitnom konverzijom programer saoptava prevodiocu da zna ta radi
164
Reference na objekte
Koriste se kao i pokazivai, s tom razlikom to se referenca mora inicijalizovati Inicijalizacije reference tipa osnovne klase referencom tipa izvedene klase:
za javnu osnovnu klasu radi se automatska konverzija za privatnu ili zatienu osnovnu klasu obavezna je eksplicitna konverzija tipa
Inicijalizacije reference tipa izvedene klase referencom tipa osnovne klase mogua je samo uz eksplicitnu konverziju tipa
165
Reference na objekte
Najei sluajevi inicijalizacije reference su pozivanja funkcija Ako je formalni argument funkcije referenca na osnovnu klasu, moe se kao stvarni argument proslediti objekat ili referenca na izvedenu klasu
uslov je da je izvoenje javno
166
167
168
Virtuelni metodi
Polimorfizam je mogunost razliitog ponaanja programa u zavisnosti od tipa objekata koji se obrauju Polimorfizam se ostvaruje se pomou virtuelnih metoda Virtuelni metod je metod osnovne klase koji moe da se redefinie u izvedenoj klasi Virtuelni metodi se deklariu dodavanjem modifikatora virtual na poetku deklaracije metoda u osnovnoj klasi Za virtuelne metode se u izvedenim klasama podrazumeva modifikator virtual
moe da se navede, ali ne mora
169
Virtuelni metodi
Deklaracija virtuelnog metoda u osnovnoj i izvedenoj klasi mora da bude ista
ista su imena metoda isti su broj i tipovi argumenata isti je tip vrednosti metoda
izuzetak: ako je vrednost metoda u osnovnoj klasi pokaziva ili referenca na osnovnu klasu, u javno izvedenoj klasi vrednost metoda moe da bude pokaziva ili referenca na tu izvedenu klasu
170
171
Ostvarivanje polimorfizma
Prilikom pozivanja metoda pomou pokazivaa ili reference tipa osnovne klase poziva se istoimeni metod one izvedene klase iji primerak u tom trenutku predstavlja dati pokaziva ili referenca Polimorfne klase su klase koje imaju bar jedan virtuelan metod
172
174
Konstruktori i destruktori
Konstruktori ne mogu da budu virtuelni metodi Destruktori mogu da budu virtuelni metodi i to se preporuuje, jer onda unitava i lanove koji ne pripadaju osnovnoj klasi. Ako je destruktor osnovne klase virtuelni metod
objektu izvedene klase se pristupa preko pokazivaa na osnovnu klasu poziva se destruktor osnovne klase izvrie se destruktor izvedene klase
kao i u ostalim sluajevima, posle izvravanja destruktora izvedene klase pozvae se i destruktor osnovne klase
175
// // virtual void vm1();// virtual void vm2(); virtual void vm3(); void m(); // ~Osn();
Obicna metoda
} class Izv: public Osn { int n, *b; public: Izv(); void vm1(); // void vm2(int); // char vm3(); // void m(); // ~Izv(); }
Virtuelna metoda Nije virt. metoda, pokrivanje imena Greka, return tip Obi na metoda
176
177
Apstraktne klase
Virtuelni metod koji nije definisan u osnovnoj klasi naziva se apstraktni metod ili ist virtuelni metod Apstraktni metod se oznaava tako to se u definiciji klase umesto tela metoda stavi =0; Primer deklarisanja apstraktnog metoda int imeMetoda(argumenti)=0; Klasa koja ima bar jedan apstraktni metod je apstraktna klasa U apstraktnoj klasi nema ogranienja za ostale lanove
178
Apstraktne klase
Ne mogu da se naprave objekti apstraktne klase Mogu da se definiu pokazivai i reference tipa apstraktne klase
pokaziva apstraktne klase moe da pokazuje samo na objekte izvedenih klasa (poto objekata osnovne klase nema) isto je i za reference
179
180
181
182
183
184
185
186
Primer za dynamic_cast
class A // Polimorfna osnovna klasa {virtual void vm() {} }; class B: public A // Prva javno izvedena klasa {public: int b; B(int x):b(x) {}}; class C: public A // Duga javno izvedena klasa {public: int c; C(int x):c(x) {}}; int main (){ A* pa = new B(5); //Da li pa pokazuje na B? da if (B* pb = dynamic_cast<B*>(pa)) cout<<pc->b<<endl; //Da li pa pokazuje na C? ne if (C* pb = dynamic_cast<C*>(pa)) cout<<pc->c<<endl; B& ub = dynamic_cast<B&>(pa) // *pa je objekat tipa B cout<<ub.b<<endl; C& uc = dynamic_cast<C&>(pa) // GR: *pa nije tipa B, runtime cout<<uc.c<<endl; // error
187
188
Izuzeci
189
Loe je to je veina funkcija optereena ispitivanjem ta se desilo u pozvanim funkcijama, umesto da to ini samo jedna funkcija
kod postaje veoma komplikovan i teak za odravanje
190
191
Rukovanje izuzecima
Rukovanje izuzecima definie se naredbom try iji je opti oblik
try { // Naredbe u kojima mogu da se pojave izuzeci } catch(tip identifikator) { // Telo: obrada izuzetka ovog tipa } ... catch(tip identifikator) { // Telo: obrada izuzetka ovog tipa } catch(...) { // Univerzalni rukovalac // obrauje izuzetke svih preostalih tipova }
192
Univerzalni rukovalac koji obrauje sve tipove izuzetaka navodi se sa tri take umesto tipa izuzetka
ako se navodi treba da bude poslednji rukovalac koji se navodi u jednoj try naredbi
194
Primer
try { ... radi(); ... } catch(const char* str) { ... // Obrada izuzetka tipa const char* } catch(int i) { ... // Obrada izuzetka tipa int } catch(...) { ... // Obrada izuzetka proizvoljnog tipa }
195
Prijavljivanje izuzetaka
Prijavljivanje (bacanje) izuzetka radi se izrazom oblika throw izraz; Operator throw je unarni prefiksni operator prioriteta 2
nema rezultat, tj. tip rezultata je void
196
Prijavljivanje izuzetaka
Izuzetak moe da se prijavi u bilo kojem delu bloka unutar naredbe try ukljuujui funkcije, metode, konstruktore, destruktore, operatorske funkcije
197
198
Ako se ne navode tipovi izuzetaka koje funkcija moe da prijavi moe se prijaviti bilo koji izuzetak (tj. ako nema throw operatora)
199
Primer
class Izuzetak : public exception { ... }; void radi() throw (char*, int) { ... if(...) throw "greska"; // tip char* ... if(...) throw 5; // tip int ... if(...) throw Izuzetak(); // greka, tip Izuzetak ... }
200
Ako u deklaraciji virtuelnog metoda osnovne klase nisu navedeni izuzeci koje metod moe da prijavi, mogu se navesti izuzeci koje moe da prijavi redefinisani metod izvedene klase
201
Primer
class A { public: virtual void f() throw (int, char); }; class B : public A{ public: void f() throw (int) { } }; /* Sledece nije dozvoljeno */ /* class C : public A { public: void f() { } }; class D : public A { public: void f() throw (int, char, double) { } };*/
202
Ako se u catch delu unutranje naredbe try prijavi izuzetak, on se obrauje u spoljanjoj naredbi try
moe se napisati samo throw; (bez izraza) i u tom sluaju se izuzetak koji se obrauje prosledi spoljanoj naredbi try, tip izraza je isti kao u obuhvatajuoj catch naredbi
Ako u unutranoj naredbi try ne postoji rukovalac za tip izuzetka koji je nastao, i ne postoji univerzalni rukovalac, izuzetak e obraditi spoljanja naredba try
203
Prihvatanje izuzetaka
Rukovalac tipa R moe da prihvati izuzetak tipa I ako:
R i I su isti tipovi R je javna osnovna klasa za klasu I (klasa I je javno izvedena iz klase R) R i I su tipa pokazivaa ili reference i R moe standardnim konverzijama da se pretvori u tip I
204
Ako se navodi, univerzalni rukovaoc catch(...) se navodi kao poslednji u jednoj try naredbi
205
Stvaranje izuzetka
Na mestu prijavljivanja stvara se kopija podatka (objekta) koji je rezultat izraza throw izraz Kopija podatka je privremeni podatak
za izuzetke klasnih tipova u klasi mora da postoji konstruktor kopije
Kopija podatka se prosleuje najbliem rukovaocu koji moe da obradi tip izuzetka (podatka)
ako ne moe da ga obradi nijedan rukovalac try naredbe u kojoj je nastastao prosleuje se spoljanjoj try naredbi i tako redom ako ga nijedna naredba try ne obradi program se prekida
206
Ako se izuzetak pojavi u konstruktoru, unitavaju se samo podaci stvoreni do tog trenutka
207
208
Neprihvaeni i izuzeci
Ako se za izuzetak ne pronae rukovalac izvrava se sistemska funkcija iji je prototip void terminate(); Funkcija terminate() poziva funkciju abort() koja prekida program Moe se zadati da funkcija terminate() poziva drugu funkciju a ne abort()
209
vrednost funkcije set_terminate je pokaziva na prethodnu funkciju koju je pozivala funkcija terminate()
210
Neoekivani izuzeci
Ako funkcija prijavi izuzetak koji nije na spisku izuzetaka predvienih za tu funkciju izvrava se sistemska funkcija iji je prototip: void unexpected(); Funkcija unexpected() poziva funkciju terminate() Moe se zadati da funkcija unexpected() pozove drugu funkciju a ne terminate()
211
vrednost funkcije set_unexpected je pokaziva na prethodnu funkciju koju je pozivala funkcija unexpected() 212
Zaglavlje <exception>
U zaglavlju <exception> opisana je klasa bad_exception i funkcije: terminate(); set_terminate(); unexpected(); set_unexpected(); Funkcija abort() opisana je u zaglavljima <cstdlib> i <stdlib.h>
213
Standardni izuzeci
Izuzetke mogu da prijave neki operatori jezika C++ i metodi standardnih klasa Svi izuzeci koje oni prijavljuju izvedeni su iz osnovne klase exception koja je definisana u zaglavlju <exception>
214
215
Klasa exception
Ima sve metode koji se smatraju obaveznim:
podrazumevani konstruktor konstruktor kopije operator za dodelu vrednosti virtuelni destruktor
Virtuelni metod what vraa pokaziva na tekstualni opis izuzetka Nijedan metod ne prijavljuje nijedan izuzetak Preporuuje se da se za prijavljivanje svojih izuzetaka piu klase koje se izvode iz klase exception
216