Skripta Progr.i Progr. Jez. C++

85
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. Omogućava objektni pristup rješavanju problema. Nastao je kao naslednik jezika C, pa je zadržao i koncepte tradicionalnog programiranja. Pojavio se osamdesetih godina 20.tog vijeka. Autor jezika je Bjarne Stroustrup.

description

c++

Transcript of Skripta Progr.i Progr. Jez. C++

  • 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