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