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.

Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

  • Upload
    buithu

  • View
    234

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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.

Page 2: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

2

Prvi program:

#include<iostream.h> int main( ) { // ovo je komentar, a sledi naredba izlaza cout<<”Programiranje”<<endl; return 0; }

Znak # (eng. hash) je signal za predprocesor. Svaki put kad se pokrene kompajler, prije kompajlera pokrene se i predprocesor.

#include je uputa (direktiva) kompajleru da u program uključi tzv. zaglavlje biblioteke sa imenom "iostream.h".

iostream.h sadrži definicije naredbi: ulaza ( cin>>), izlaza (cout<<),prelaska u novi red

1.Compile(Ctrl+F7)

2.Build

3.Execute Program

Page 3: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

3

( endl; ). include je instrukcija predprocesora koja se može interpretirati kao "Ovo što slijedi je ime biblioteke. Nađi tu biblioteku i pročitaj je tačno ovdje int main ( ) Svaki program u C++ mora imati jednu main( ) funkciju. Tip int ispred funkcije određuje tip vrijednosti koju će po završetku izvođenja vratiti funkcija main( ) sa naredbom return. Na kraju bloka nalazi se naredba return 0;. Tom naredbom glavni program vraca pozivnom programu broj 0, a to je poruka operativnom sistemu da je program uspješno završen ( 0 znači OK ). U programskim jezicima funkcija je obično potprogram koji vraća neku vrijednost ili rezultat, mada imamo i funkcije koje ne vraćaju nikakvu vrijednost, odnosno funkcije koje vraćaju void (void znači ništa). Nakon zaglavlja funkcije slijedi tijelo funkcije. Tijelo funkcije počinje znakom "{", a završava znakom "}". Između vitičastih zagrada nalaze se nijedna ili više naredbi, odnosno blok naredbi i taj blok naredbi čini tijelo funkcije.

Naredbe određuju ili definišu redoslijed izvršavanja programa, izračunavaju vrijednosti ili ne rade ništa . Svaka naredba u C++ završava sa znakom ";"

Komentar:

// ovo je komentar, a sledi naredba // izlaza

"cout" je naredba za ispis i uvijek se piše: cout<< Operatorom "<<" upućuje se podatak koji slijedi na ekran ( output stream )

Tekst “Programiranje " koji se nalazi između navodnika, predstavlja niz znakova koji šaljemo na izlaz (ekran).

cout<<"programiranje"<<endl; Dakle, gornja naredba se može interpretirati kao: Pošalji niz znakova: “Programiranje " na ekran.

Page 4: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

4

Isti program možemo napisati i ovako: #include<iostream> using namespace std; int main( ) { cout<<"programiranje"<<endl; return 0; }

using namespace std; omogućuje pristup standardnom prostoru sa imenima ( namespace) koji se naziva std.

Pitanja: 1 Šta znači: #include 2 Kakva je uloga main( ) funkcije 3 Kakvu poruku predstavlja naredba return 0 ? 4 Napiši deklaraciju funkcije main() koja ne vraca ništa i objasni 5 Kako počinje i završava blok naredbi u C++ ? 6 Kako se završava svaka naredba u C++?

Komentari Komentar sadrži tekst koji se ne prevodi na mašinski jezik. Sve što sledi posle znaka "//" ignoriše se od strane kompajlera.

Sve unutar znakova "/*" i "*/" se ignoriše.

Komentari dakle ne ulaze u izvršni kôd programa i služe programerima za opis značenja pojedinih naredbi ili dijelova kôda.

Komentari se mogu pisati u zasebnom redu ili redovima, što se obično odnosi za duže opise, na primjer šta određeni program ili funkcija radi.

Za krace komentare, na primjer za opise promjenljivih ili nekih operacija, komentar se piše u nastavku naredbe.

Page 5: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 znači da funkcija main kao rezultat vrača cjelobrojnu vrednost

return 0; /* poslije rezervisane reči return pišemo šta vrača funkcija, u ovom slučaju nula 0 znači da je program uspješno završen */ void main( ) /* void znači da funkcija main ne vrača ništa, i na kraju ove funkcije ne pišemo naredbu return 0; */ cout<<"programiranje"<<endl; /* endl; znači ispiši tekst programiranje na izlazu a zatim prebaci kursor u sledeći red */

Identifikatori U mnogim dijelovima C++ programa (promjenjivim, funkcijama, klasama) potrebno je dati određeno ime, tzv. identifikator. Imena koja dodjeljujemo identifikatorima su proizvoljna, uz uslov da se poštuju sljedeća pravila: Identifikator može biti sastavljen od kombinacije slova iz engleske abecede (A - Z, a - z),

brojeva (0-9) i znaka za podcrtavanje "_" Prvi znak mora biti slovo ili znak za podcrtavanje ( identifikator ne sme počinjati brojem) Identifikator ne smije biti jednak nekoj rezervisanoj riječi (asm, auto, delete, do...) ili

nekoj od alternativnih oznaka operatora (and, not, or, xor...). Programski jezik C++ razlikuje velika i mala slova u imenima Imena promenljivih koja su dobro odabrana asociraju korisniku za šta se koriste!

Rezervisane reči u C++

asm continue float new signed try auto default for operator sizeof typedef break delete friend private static union case do goto protected struct unsignedcatch double if public switch virtual char else inline register template void class enum int return this volatile const extern long short throw while

Page 6: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

6

Pitanja: 1. Komentari služe za... 2. Kako pišemo komentare, napiši primjer i objasni 3. Identifikatori su... 4. Navedi pravila pisanja identifikatora

Osnovni tipovi podataka

Svaki program koji nešto radi, sadrži podatke koje obrađuje. Ti podaci mogu biti u obliku promjenjivih i konstanti. Promjenjive mogu mijenjati svoju vrijednost, dok su konstante stalne u toku izvođenja programa. Svaku promjenjivu koju koristimo u programu moramo deklarisati. Deklaracija promjenjive može se nalaziti ispred funkcije main – u tom slučaju se radi o tzv. globalnoj promjenjivoj, odnosno, promjenjivoj dostupnoj u svim dijelovima programa.

#include<iostream> using namespace std; int x,y; // x i y su globalne cjelobrojne promjenjive void main( ) {

x=5; y=3; cout<<x+y<<endl; } Također promjenjivu možemo deklarisati i unutar bilo koje funkcije u programu: #include<iostream> using namespace std; void main( ) { int x,y; // x i y su lokalne cjelobrojne promjenjive

x=5;

Page 7: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

7

y=3; cout<<x+y<<endl; } Promjenjivu deklarišemo tako da navedemo prvo njen tip a zatim naziv: int x; int a=2; Svaki podatak ima dodijeljenu oznaku tipa koja govori o tome kako se dotični podatak

smješta u memoriju računara, koji su njegovi dozvoljeni rasponi vrijednosti, kakve su operacije moguće s tim podatkom i sl.

U C++ sve promenljive moraju imati tip. U C++ sve promenljive moraju se prvo deklarisati da bi se mogle koristiti.

Tipovi promjenjivih Integer – ( cjelobrojni tip ) cjelobrojni brojevi: short godina=18; (zauzima 2 bajta) (signed)

int plata=22000; (zauzima 2 bajta) (signed)

long cena=420000; (zauzima 4 bajta) (signed)

unsigned int vek=21; (može primiti samo poz. vrednosti) Realni brojevi ( realni tip ) : float kamata=0.01;(zauzima 4 bajta)

double pi=3.141592654;(zauzima 8 bajtova)

long double rad=4.11E-3; (zauzima 10 bajtova) Char – ( znakovni tip ) slova:

char ch_1=‘A’, ch_3= -42; (zauzima 1 bajt) (signed)

unsigned ch_2=2;

Page 8: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

8

Brojevi U programski jezik C++ ugrađena su dva osnovna tipa brojeva: cijeli brojevi (eng. integers ) i realni brojevi (eng. floating-point ). Cjelobrojna promjenjiva deklariše se sa int . Raspon promjenjive int je od -32768 do

32767. int a=5; int b(2); Ako se ukaže potreba za većim cijelim brojevima promjenjivu možemo deklarirati sa long int ili samo long .

long int c = 548234581; int x = a + 4 ; // ovo je izraz a = b = c + d //Ovo je OK! a = b + 3 = c //GREŠKA!

Ako je potrebno računati sa decimalnim brojevima, najčešće se koriste promjenjive tipa float i double :

float pi= 3.141593; float nabojelektrona=-1.6e-19; Praznine unutar broja, na primjer iza predznaka, ili između cifara i slova «e» nisu dozvoljene.

Znakovi Znakovne konstante tipa char pišu se uglavnom kao samo jedan znak unutar jednostrukih znakova navoda: char Slovo = 'a'; cout << 'b' << endl; char konstante i promjenjive mogu se upoređivati poput brojeva: cout << ('a' < 'b') << endl; cout << (a < B) << endl; cout << ('A' > 'a') << endl;

pri čemu se u biti upoređuju njihovi brojni ekvivalenti u nekom od standarda. Najrašireniji je ASCII niz (skraćenica od American Standard Code for Information Interchange) u kojem su svim ispisanim znakovima, brojevima i slovima engleskog alfabeta pridruženi brojevi od 32 do 127, dok specijalni znakovi imaju kôdove od 0 do 31 uključivo. U prethodnom primjeru, prva naredba ispisuje 1, jer je ASCII kôd malog slova a (97) manji od kôda za malo slovo b (98).

Page 9: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

9

Druga naredba ispisuje 0, jer je ASCII kôd slova B jednak 66 (nije važno što je B po abecedi iza a!). Treća naredba ispisuje 0, jer za veliko slovo A kôd iznosi 65.

Logički tip podataka

Logički podaci su takvi podaci koji mogu poprimiti samo dvije vrijednosti, na primjer: da/ne, istina/laž, dan/noć. Jezik C++ za prikaz podataka logičkog tipa ima ugrađen tip bool, koji može poprimiti vrijednosti true (engl. true - tačno) ili false (engl. false - pogrešno):

bool JeLiDanasNedjelja = true; bool SunceSije = false;

Pri ispisu logičkih tipova, te pri njihovom korištenju u aritmetičkim izrazima, logički tipovi se pretvaraju u int: true se pretvara u cjelobrojni 1, a false u 0.

Konstante U programima se često koriste simboličke veličine čija se vrijednost tokom izvođenja ne želi mijenjati. To mogu biti fizičke ili matematičke konstante, ali i parametri poput maksimalnog broja prozora ili maksimalne dužine znakovnog niza, koji se inicijalizuju prije prevođenja kôda i ulaze u izvršni kôd kao konstante Konstante definišemo navođenjem ključne riječi const, tipa podataka i naziva konstante, a zatim joj odmah dodjeljujemo vrijednost. U main funkciji, konstanta više ne može promijeniti vrijednost. Na svaki pokušaj promjene vrijednosti takve promjenljive, kompajler će javiti grešku: const double pi = 3.14159265359; pi = 2 * pi; // greška! Drugi često korišteni pristup zasniva se na predprocesorskoj naredbi #define:

#define PI 3.14159265359 ( na kraju ovog reda ne piše se tačka-zarez)

Page 10: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

10

Miješanje tipova promjenljivih u brojnim izrazima

U brojnim izrazima možemo navoditi promjenljive deklarisane različito; možemo miješati tipove. Uopšteno, C++ vrši konverziju “manjeg” tipa u “veći”. Npr. ako dodate double na integer promjenljivu, C++ najprije pretvori integer u double, a zatim vrši sabiranje. Rezultat je, naravno, tipa float. Automatska konverzija je samo privremena, te se nakon izvršene operacije tip podataka zapravo ne mijenja.

Šta učiniti želimo li podijeliti dvije cjelobrojne promjenljive, a da pritom ne izgubimo decimalna mjesta? Za eksplicitnu promjenu tipa varijable primijenjujemo operator dodjele tipa (engl. type cast, kraće samo cast): int a = 1; int b = 3; float c = (float)a / (float)b;

Navođenjem rezervisanih riječi float u zagradama ispred operanada njihove vrijednosti se pretvaraju u decimalne brojeve prije operacije dijeljenja, tako da je rezultat korektan. Da ne bi bilo zabune, same varijable a i b i nadalje ostaju tipa int.

Pitanja:

1. Koji su to osnovni tipovi podataka? 2. Kako se deklariše cjelobrojna varijabla? 3. Kako se deklariše realna varijabla? 4. Znakovni tip podataka 5. Konstante 6. Logički tip podataka 7. Objasniti miješanje tipova

Zadatak 1 Napišite program koji će ispisati na ekranu vaše ime i adresu. Zadatak 2 Napišite program koji će na ekranu ispisati u jednom redu brojeve 2002 i 12.34.

Page 11: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

11

Standarni ulaz/izlaz Naredba izlaza cout<<

Za ispis vrijednosti koristi se naredba cout<<, a za učitavanje podataka sa tastature naredba

cin>>. Da bismo koristili cout<< i cin>>, u program moramo uključiti biblioteku standarnih ulazno/izlaznih funkcija iostream.h. cout<< šalje podatke na standardni izlazni uređaj. Standardni izlazni uređaj je monitor, iako se izlaz može preusmjeriti i na drugi uređaj. U opštem slučaju, cout<< koristimo na slijedeći način: cout << podaci << podaci;//svaki novi podatak koji šaljemo na izlaz pišemo poslije << pri čemu podaci mogu biti promjenljive, niz znakova, izrazi ili njihova kombinacija. Npr. da bismo odštampali rečenicu: “Ja ucim programiranje.” zadajemo naredbu cout << “ Ja ucim programiranje “; cout<< ne obezbjeđuje automatski prelazak kursora u slijedeću liniju. To znači da će nakon izvršavanje naredbe cout kursor ostati u istom redu, iza poslednjeg odštampanog karaktera stringa navedenog u navodnicima. Za prelazak u novi red koristimo objekat endl : cout << “ Ja ucim programiranje “<<endl; ili možemo upotrebiti “\n”; cout << “ Ja ucim programiranje\n”; cout može kao parametre uzimati i promjenljive. Prilikom štampanja, cout će odštampati vrijednosti promjenljive. Npr. int i; i=5; cout << i; Umjesto nevedene naredbe cout, možemo navesti i cout << “i=” << i; Kao parametar cout možemo zadati i izraz. Tako npr.

Izlaz: Ja ucim programiranje _

Izlaz: Ja ucim programiranje _

Izlaz: 5

Izlaz: i=5

Kursor ostaje da treperi posle ispisanog teksta

Poslije ispisanog teksta kursor je prebačen u novi red

Page 12: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

12

cout << “zbir=” << (i+j); prikazat će na ekranu zbir= “ zbir vrijednosti promjenljivh i i j” Šta će biti odštampano nakon slijedećih naredbi? cout << “Linija 1”; cout << “Linija 2”; cout << “Linija 3”; Odgovor je Linija 1Linija 2 Linija3 što vjerovatno ne želite. cout omogucava formatiranje izlaza korištenjem skupa specijalnih karaktera. Tako npr., u cout možete uključiti specijalan karakter \n koji nazvačava prelazak na novu liniju, kada god želite pomjeriti kursor nakon ispisa stringa navedenog u cout. To postižemo naredbom: cout << “Linija 1\n”; cout << “Linija 2\n”; cout << “Linija 3\n”; što daje kao rezultat: Linija 1 Linija 2 Linija 3 Ukoliko želimo preskočiti više od jedne linije, zadajemo onoliko \n koliko linija želimo preskočiti. Ako želimo štampati tabelu možemo koristi specijalni karakter \t. Npr. da bismo odštampali tabelu u kojoj prikazujemo broj učenika koji uče ruski i engleski po razredima, program bi izgledao ovako: #include <iostream.h> int main( ) { cout << "razred" << "\tRusi" << "\tEnglezi" << "\n"; cout <<"IIe1\t20\ t 8\n"; cout <<"IIe2\t15\ t 13\n"; cout <<"IIe3\t5\ t 23\n"; return 0 ; }

Page 13: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

13

Pored spomenutih, za formatiranje izlaza možemo koristiti i druge specijalne znakove, kao što je prikazano : \n novi red \t horizontalni tabulator \a zvučni signal (alert)

Naredba ulaza cin>> cin >> promjenljiva; cin učitava vrijednost koju korisnik unosi pomoću tastature i dodjeljuje je promjenljivoj čije ime navedemo kao parametar. Postoji velika razlika između dodjele vrijednosti promjenljvoj pomoću cin i pomoću operatora dodjele( = ). Iako obje naredbe u osnovi dodjeljuju vrijednost promjenljivoj, dodjela vrijednosti promjenljivoj pomoću operatora dodjele vrši se unutar programa. Naredbom dodjele programer tačno definiše egzaktnu vrijednost promjenljivoj. Svaki put kada startujete program, ta promjenljiva dobit će istu vrijednost. Kada koristite cin, promjenljiva će dobiti vrijednost koju korisnik učita. To može biti bilo koja vrijednost i ovisi o korisniku. Korištenje cin može biti uzrok problema – cin očekuje da korisnik upiše tačno određeni tip podataka. Npr. ako je parametar cin promjenljiva tipa int, onda korisnik može upisati samo cio broj. U principu, korisnik može postupiti i drugačije. Da bi se ovo izbjeglo može pomoći ako prije svakog cin zadamo i cout u kome korisniku ispišemo kakvu vrijednost od njega očekujemo. Npr. cout << “Unesite cio broj =”; cin>> i; Pomoću cin možemo učitati i više od jedne promjenljive. Npr. cin >> i >> j >> k; očekuje od korisnika tri brojne vrijednosti. Nakon unosa svake od tih vrijednosti korisnik mora pritisnuti taster Enter da bi omogučio učitavanje slijedeće vrijednosti

Page 14: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 odgovarajuće operacije.

Operator pridruživanja: Operatorom pridruživanja mjenja se vrijednost nekog objekta (variable), pri čemu tip objekta ostaje nepromjenjen .Najčešći operator pridruživanja je (=), kojim se objektu na ljevoj strani pridružuje neka vrijednost s desne strane. primjer:

int i = 5; i = 3; cout << i ;

U prvom redu primjera deklariše se cjelobrojna promjenjiva te joj se pridružuje 5. U drugom redu promjenjivoj je pridružen broj 3.U zadnjem redu ispisuje se nova vrijednost promjenjive tj. 3. Operator dodjele tipa: Ponekad je potrebno podijeliti dvije cijelobrojne varijable te rezultat pridružiti nekoj realnoj varijabli: primjer: int Brojnik = 1; int Nazivnik = 4; float Kolicnik = Brojnik / Nazivnik; cout << Kolicnik << endl; Izvođenjem ovog primjera na ekranu će se ispisati nula. Iako je rezultat djeljenja pridružen realnoj promjenjivoj, to pridruživanje slijedi tek nakon što je operacija djeljenja dva cijela broja završena, pa je prevodilac automatski odbacio decimalna mjesta rezultata. Za dobivanje točnog rezultata potrebno je koristiti operator dodjele tipa, s njime bi naš primjer izgledao ovako: int Brojnik = 1; int Nazivnik = 4; float Kolicnik = (float)Brojnik / (float)Nazivnik; cout << Kolicnik << endl;

Page 15: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

15

Navođenjem ključnih riječi float u zagradama ispred operanada, njihove vrijednosti pretvaraju se u decimalne prije operacije djeljenja, tako da je rezultat korektan.

Aritmetički operatori

Za ugrađene tipove podataka definirani su osnovni operatori (sabiranje,oduzimanje,množenje,dijeljenje). Ti operatori se mogu podijeliti na unarne, koji djeluju samo na jedan objekt, te na

binarne za koje su neophodna dva objekta.

Unarni operatori: +x, -x, x++, ++x, x--, --x. predznaci +X unarni plus

-X unarni minus

inkremencija X++ uvećaj nakon

primjer: int i=1; cout<<(i++)<<endl; // ispisuje 1, pa tek onda povećava ’i’

++X uvećaj prije

primjer: int i=1; cout<<(++i)<<endl; // ispisuje 2

dekremencija X-- umanji nakon --X umanji prije

Operator ++ uvećava vrijednost varijable za 1, a operator -- umanjuje vrijednost varijable za 1. Tako naredbe: x=x+1 z=z-1 možemo zamijeniti naredbama: x++ z— Operator inkrement (dekrement) različito se ponaša kada je napisan ispred promjenljive i kada

Page 16: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 množenje binarni operatori x / y dijeljenje x % y modul (vraća ostatak dijeljenja dva cijela broja) Operator Primjer ekvivalentan izraz += x+=500; x=x+500;

-= x-=50; x=x-50;

*= x*=1.2; x=x*1.2;

/= x/=.50; x=x/.50;

%= x%=7; x=x%7; operator ime primer rezultat

+ sabiranje 12 + 4.9 16.9 - oduzimanje 3.98 - 4 -0.02 * množenje 2*3.4 6.8 / deljenje 9/2.0 4.5

% ostatak deljenja

13%3 1

Page 17: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

17

Logički operatori

Logički operatori koriste se za formiranje složenih logičkih izraza. C++ koristi sledeće logičke operatore: operator ime primer

! negacija !(5==5) // daje 0

&& Logičko I (AND) 5<6 && 6<6 // daje 0

|| Logičko ILI (OR) 5<6 || 6<6 // daje 1

Rezultat logičke operacije je 0 ili 1 Naredni primer ilustruje upotrebu logičkih operatora: #include<iostream.h> main( ) {

int i=1; int j=0; cout<< (i&&j)<<'' ''<<(i || j)<< '' ''<< (!i)<<endl; return 0;

} i ima rezultat : 0 1 0

Operatori poređenja

Operatori poređenja koriste se za formiranje jednostavnih logičkih izraza. Kao rezultat poređenja dobija se logička vrednost : 0 - logička laž ili 1 - logička istina.

< manje od > veće od <= manje ili jednako >= veće ili jednako

Page 18: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

18

= = jednako != različito

Naredni primer ilustruje upotrebu operatora poređenja: #include<iostream.h> main() { cout<<(5= = 5)<<endl; //1 cout<<(5<=4)<<''\n''; //0 return 0; } Operator Ime Primer Rezultat

== jednakost 5==5 1

!= nejednakost 5!=5 0

< manje od 5<5.5 1

<= manje ili jednako 5<=5.5 1

> veće od 5>5 0

>= veće ili jednako 6.3>=5 1

Bit operatori

Obzirom da se svaki podatak interno predstavlja u binarnom zapisu, kao niz bitova, u nekim slučajevima su potrebne efikasne metode za manipulisanje pojedinačnim bitovima. U jezicima C i C++ na raspolaganju je šest operatora:

& konjukcija na nivou bitova

| disjunkcija na nivou bitova

^ ekskluzivna disjunkcija na nivou bitova ( isključivo ili)

~ komplement na nivou bitova

>> pomeranje udesno sa postavljanjem levih bitova na 0

Page 19: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

19

<< pomeranje ulevo sa postavljanjem desnih bitova na 0

Naredni primer ilustruje upotrebu operatora za operacije na nivou bitova: #include<iostream.h> main( ) { unsigned char a=85; unsigned char b=~a; //komplement od a cout<<(int)a<<endl; //85 cout<<(int)b<<endl; //170 return 0; } Ovaj primer će ispisati broj 85 i njegov bitovni komplement, broj 170

Operator sizeof

Operator sizeof je unarni operator koji kao rezultat daje broj bajtova što ih operand zauzima u memoriji računala: primjer: cout <<“Veličina memorije za čuvanje podatka tipa int je :”<< sizeof(int) <<” bajtova” << endl; Ispisuje 2; Operator sizeof primjenjuje se na izraze kod kojih se traži dužina rezultata.Ti izrazi mogu biti pokazivači, reference, polja, korisnički definirane klase, strukture, unije i objekte. Pitanja:

1. Koja se naredba koristi za ispis vrijednosti na izlaz 2. Koju naredbu koristimo da bi dodjelili vrijednost nekoj promjenjivoj sa tastature 3. Čemu služe operatori 4. Objasniti unarne operatore 5. Binarni operatori 6. Bit operatori 7. Objasni sizeof operator 8. Logički operatori

Page 20: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

20

a<0

kraj

Broj je negativan

DANEa<0

kraj

Broj je negativan

DANE

NAREDBE ZA KONTROLU TOKA PROGRAMA

Izvođenje programa ponekad zavisi od ulaznih podataka ili od međurezultata obrade Struktura kod koje se zavisno od stanja podataka izvršava jedan od mogućih dijelova programa naziva se grananje.

Grananje toka naredbom if Naredba if omogućava uslovno grananje toka programa ovisno o tome da li je ili nije zadovoljen uslov naveden iza ključne riječi if: Jednostruki izbor: if (a<0) cout<<''Broj a je negativan!''<<endl; } // kraj U slučaju da: ako je uslov tačan treba da se izvrše dvije ili više naredbi (te naredbe pišemo u bloku između velikih zagrada ): if ( a<0 ) { // početak bloka naredbi cout<<”a=”<<a<<endl; cout<<''Broj a je negativan!''<<endl; } // završetak bloka naredbi } // kraj Ako je vrijednost logičkog izraza tačna (ako je a<0 ->DA) izvršava se blok naredbi koji se nalazi posle if naredbe (cout<<''Broj a je negativan!''<<endl; a zatim kraj ) Ako je vrijednost logičkog izraza netačna prva naredba ili blok naredbi posle if naredbe se preskače i izvršavaju naredne naredbe ( u ovom slučaju kraj). uslov koji se javlja u naredbi if (kao i u drugim kontrolnim strukturama) je Boolean tipa - ili je tačan (true) ili netačan (false).

U C++: vrednost 0 je false (netačno) sve ostale vrednosti su true (tačno)

if (a<0)

Page 21: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 odsječka, primijenit ćemo sljedeći 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 različit od nule, izvest će se prvi blok naredbi (direktni blok). Po završetku bloka izvođenje programa nastavlja se od prve naredbe iza drugog bloka. Ako izraz daje kao rezultat nulu, preskače se prvi blok, a izvodi samo drugi blok (alternativni blok) naredbi, nakon čega se nastavlja izvođenje naredbi koje slijede. Uslovni operator ? Iako ne spada među naredbe za kontrolu toka programa, uslovni operator po strukturi je sličan if-else bloku : uslov ? izraz1 : izraz2 ; Ako izraz uslov daje logičku istinu, izračunava se izraz1, a u protivnom izraz2. U primjeru:

x = (x < 0) ? -x : x; // x = abs(x) ako je x negativan, izračunava se prvi izraz, te se varijabli x na lijevoj strani znaka jednakosti pridružuje njegova pozitivna vrijednost, tj. varijabla x mijenja svoj predznak. Naprotiv, ako je x pozitivan, tada se izračunava drugi izraz i varijabli x na lijevoj strani pridružuje njegova nepromijenjena vrijednost. Izraz u uslovu mora kao rezultat vraćati aritmetički tip ili pokazivač. Alternativni izrazi desno od znaka upitnika moraju davati rezultat istog tipa ili se moraju dati svesti na isti tip preko

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;

Page 22: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

22

ugrađenih pravila konverzije. Uslovni operator koristite samo za jednostavna ispitivanja kada naredba stane u jednu liniju. U protivnom kôd postaje nepregledan. Primer upoterbe uslovnog operatora: #include<iostream.h> int main() { int a; cout<<"a="; cin>>a; cout<< (a>0 ? ("pozitivan broj") : ("negativan broj"))<<endl; return 0; }

Zadatak:

1. Napisati program koji proverava da li je unesena celobrojna vrednost: paran ili neparan broj.

2. Napisati program koji proverava da li je unesena celobrojna vrednost: paran ili neparan

broj i ako se radi o parnom broju ispisuje rezultat njegovog deljenja sa 2. Složenija naredba izbora je naredba switch :

Operator switch Kada izraz uslova daje više različitih rezultata, a za svaki od njih treba provesti različite odsječke programa, tada je umjesto if grananja često preglednije koristiti switch grananje. Kod tog grananja se prvo izračunava neki izraz koji daje cjelobrojni rezultat. Ovisno o tom rezultatu, tok programa se preusmjerava na neku od grana unutar switch bloka naredbi. Opšta sintaksa switch grananja izgleda ovako: switch (izraz) { case konstanta_1: naredba_11; naredba_12; ...; break;

Page 23: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 izvršava na sljedeći način: vrijednost izraza u zagradi (izraz) iza rezervisane riječi switch se upoređuje sa vrijednosti neke od konstanti navedenih iza labele case. Ukoliko je vrijednost tog izraza jednaka vrijednosti neke od konstanti iza labele case, izvršavanje programa se nastavlja od tog mjesta. Ako vrijednost izraza nije jednaka niti jednoj od vrijednosti konstanti navedenih iza labele case, izvršavanje programa se nastavlja od mjesta unutar bloka označenog labelom default, ako postoji. U slučaju da vrijednost izraza nije jednaka vrijednosti neke konstante, a blok naredbi sa labelom default ne postoji, tada se preskače cijeli switch blok i izvršava se dalji dio programa. Default labela je opcionalna (nije obavezna), međutim, korištenje default labele je dobra programerska praksa. Blok naredbi iza default labele će biti izvršen samo u slučaju ako nije izvršena niti jedna od case labela.

Page 24: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<iostream.h> main() { char a; cout<<"Unesite jedno slovo:"; cin>>a; cout<<"Slovo "<<a; switch (a) { case 'A': case 'a': cout<<" je samoglasnik A."<<endl; break; case 'E': case 'e': cout<<" je samoglasnik E."<<endl; break; case 'O': case 'o': cout<<" je samoglasnik O."<<endl; break; case 'I': case 'i': cout<<" je samoglasnik I."<<endl; break; case 'U': case 'u': cout<<" je samoglasnik U."<<endl; break; default: cout<<" nije samoglasnik."<<endl; } return 0; } Pitanja:

1. Objasniti if naredbu-jednostruki izbor 2. Objasniti if naredbu-dvostruki izbor 3. Kada koristimo switch naredbu grananja

Page 25: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

25

prekidprekidponavljanjaponavljanja

n = 10

i = 1

i = i + 1

i <= n

dada

nene

i prekidprekidponavljanjaponavljanja

n = 10

i = 1

i = i + 1

i <= n

dada

nene

i

n = 10

i = 1

i = i + 1

i <= n

dada

nene

i

Operator for Često u programima treba ponavljati dijelove programa. Ako je broj ponavljanja poznat prije ulaska u petlju, najprikladnije je koristiti for petlju.To je najopštija vrsta petlje i ima sljedeći oblik: for ( početni_izraz ; uslov_izvođenja ; izraz_prirasta) blok naredbi

Postupak izvođenja for ciklusa je sljedeći:

1. Izračunava se početni izraz. Najčešće je to pridruživanje početne vrijednosti brojaču kojim se kontroliše ponavljanje petlje

2. Izračunava se uslov izvođenja, izraz čiji rezultat

mora biti tipa bool. Ako je rezultat jednak logičkoj neistini, preskače se blok naredbi i program se nastavlja prvom naredbom iza bloka

3. Ako je uslov izvođenja jednak logičkoj istini, izvodi se blok naredbi

4. Na kraju se izračunava izraz prirasta. Program se vraća na početak petlje,te se ona ponavlja od tačke 2.

Primjer: Napisati for naredbu za štampanje prvih n neparnih brojeva. #include<iostream.h> main() { int n; cout<<"n="; cin>>n; int a=1; for (int i=1; i<n; i++) { cout<<a<<endl;

Page 26: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 izračunavaju i štampaju svi brojevi djeljivi sa 5 do n. 2. Napisati program koji izračunava sumu parnih ( neparnih) brojeva od 1 do zadatog

broja n. Pitanja:

1. Objasnite djelovanje for petlje. 2. Objesniti ulogu početnog izraza, uslova izvođenja i izraza prirasta 3. Šta je to “beskonačna petlja”. Kako može nastati? 4. Napisati program koji ispisuje prvih10 brojeva u jednoj koloni 5. Napisati program koji ispisuje prvih10 brojeva u jednom redu 6. Napisati program koji ispisuje prvih10 brojeva u jednoj koloni od broja 10 do 0 7. Napisati program koji ispisuje prvih10 brojeva u jednom redu od broja 10 do 0 8. Napisati program koji ispisuje u jednoj koloni

brojeve od 1 do 20 djeljive sa 2

Operator while

while petlja se koristi uglavnom za ponavljanje dijela programa kod kojeg broj ponavljanja nije unapred poznat. Sintaksa while bloka je:

while (uslov_izvođenja) blok_naredbi uslov izvođenja je izraz čiji je rezultat tipa bool.

Redosled izvođenja while petljeje sljedeći:

1. izračunava se logički izraz uslov_izvođenja.

2. ako je rezultat jednak logičkoj neistini, preskače se blok_naredbi i program se nastavlja od prve naredbe posle while petlje.

3. ako je uslov_izvođenja jednak logičkoj istini izvodi se blok_naredbi. Zatim se program vraća na while naredbu i izvodi od tačke 1.

a <10

a = 1

a ++

dada

nene

a

Prekid ponavljanja

a <10

a = 1

a ++

dada

nene

a

Prekid ponavljanja

Page 27: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<iostream.h> void main() { int i,n,s; s=i=0; while (i<10) { cout<<"unesi broj:"; cin>>n; s+=n; i++; } cout<<"zbir je: "<<s<<endl; }

do-while petlja

Za razliku od naredbe while, naredba do proverava ispunjenost uslova tek nakon izvršavanja date naredbe, zbog čega se ona obavezno izvršava bar jedanput. Sintaksa naredbe do je:

do naredba; while(neki_uslov);

Primer: Napisati program koji sabira brojeve sa ulaza sve dok se ne unese 0. #include<iostream.h> main() { int n,s; s=0;

do { cin>>n; s+=n; } while ( n!=0 ) ;

cout<<''Zbir je ''<< s<<endl; return 0; }

Page 28: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<iostream.h> void main() { int ocjena; do { cout<<"Unesi ocjenu:"; cin>>ocjena; } while((ocjena<1)||(ocjena>5)); cout<<"ocjena:"<<ocjena<<endl; }

Naredbe break , continue i goto Naredba break može se koristiti samo u petljama i u switch grananjima. Ovom naredbom u petljama se prekida izvođenje: for, while ili do while petlje. //Pomoću while ciklusa unositi proizvoljne cijele brojeve, za svaki neparni broj //neka piše komentar "neparan broj!", a ako unesemo paran broj upotrebiti break //naredbu koja će prekinuti izvođenje ciklusa #include<iostream.h> int main ( ) { int i,n; i=1; while(i<4) //početak ciklusa, ispitivanje uslova { cout<<("unesite jedan broj:"); cin>>n; if (n %2==0) //ako je ostatak celob.delenja jednak nuli break; //(broj je paran) prekida se izvđenje ciklusa cout<<"neparan broj: "<<n<<endl; i++; } return 0; }

Page 29: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

29

Naredba continue takođe uzrokuje skok programa na kraj petlje, ali se zatim njeno ponavljanje nastavlja. Treba izbjegavati često korištenje break i continue naredbi u petljama, jer one narušavaju struktuiranost programa.Koriste se samo za posebna stanja, kada ne postoji drugi prikladan način da se izvođenje naredbi prekine.Naredba continue može se izbjeći if blokom. Naredba goto omogućava bezuslovni skok na neku drugu naredbu unutar iste funkcije.Opšti oblik je:

goto ime_oznake;

ime_oznake (identifikator) je simboličko ime koje se mora nalaziti ispred naredbe na koju se želi prenijeti kontrola, odvojen znakom : (dvotačka). Naredba na koju se želi skočiti može se nalaziti bilo gdje (ispred ili iza naredbe goto) unutar iste funkcije. Pitanja:

1. operator for 2. operator while 3. Naredbe break , continue i goto 4. do while petlja

Page 30: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 obraćamo jednim imenom. Nakon brojeva, stringovi su sledeći najčešće korišćeni tipovi podataka u mnogim programima.

° String tip nije osnovni tip podataka kao npr. char, int ili float. ° Definiše se u <string> biblioteci i dio je ANSI standarda za C++. #include<iostream> #include<string> using namespace std; int main( ) { string ime,prezime; cout<<"unesite ime:"; cin>>ime; cout<<"unesite prezime:"; cin>>prezime; cout<<"\n\n\tIme\tPrezime\n\n"; cout<<"\t"<<ime<<"\t"<<prezime<<endl; return 0; }

U mnogim slučejevima važno je odrediti dužinu stringa, npr. #include<iostream> #include<string> using namespace std; int main( ) { string grad; cout<<"unesite naziv grada:"; cin>>grad; cout<<"grad:"<<grad<<endl; cout << "Duzina stringa " <<grad<< "je " << grad.length( ); return 0; }

Ukoliko želimo dva stringa spojiti u treći, onda možemo koristiti operator +. Operatori =, kao i obično za dodjelu vrijednosti. npr. string s1,s2,s3; s3=s1+s2;

Pitanja: 1. Kada koristimo string promjenjive 2. Kako možemo provjeriti kolika je dužina stringa 3. Kako se spajaju string promjenjive

Ako će u programu biti primenjen tip podataka string obavezno se mora uključiti biblioteka <string> u zaglavlje programa

Funkcija koja vraća dužinu stringa

Page 31: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

31

Pokazivački tip

Jedan od najmoćnijih alata koji su na raspolaganju C++ programeru je pokazivač, kojim se direktno manipuliše memorijom kompjutera. Pokazivač je promenjiva koja sadrži memorijsku adresu promenjive na koju pokazuje. Svaka promjenjiva koja se deklariše u programu tokom svog života zauzima određeni prostor u memoriji. Mjesto u memoriji koje je dodjeljeno nekoj promjenjivoj određeno je njenom adresom, koja je fiksna sve dok posmatrana promjenjiva postoji Npr imamo promjenjivu: int x=5; pri nailasku na ovu deklaraciju rezerviše se odgovarajući prostor u memoriji za smještanje sadržaja ( x=5) promjenjive x adrese .... 1234 1235 1236 1237 1238 1239 1240 1241 x promjenjiva x ima adresu 1237 i na toj adresi smještena je vrijednost 5 int *p; // ovo je deklaracija pokazivača koji pokazuje na cjelobrojnu vrijednost adrese .... 1234 1235 1236 1237 1238 1239 1240 1241 x p Kao i svaka druga promjenljiva, i pokazivačka promjenljiva zauzima određeni prostor u memoriji. Pokazivaču je moguće dodjeliti adresu nekog objekta (npr. promjenljive) uz pomoć unarnog prefiksnog operatora “&”, p=&x; adrese .... 1234 1235 1236 1237 1238 1239 1240 1241 x p pokazivač p sada pokazuje na adresu promjenjive x (1237) cout<<*p // 5 cout<<p // 1237, p je pokazivač koji pokazuje na adresu promjenjive x cout<<&p // 1240, adresa pokazivačke promjenjive cout<<&x // 1237, ovo je adresa promjenjive x

5

5

5 1237

Page 32: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

32

Adresa promenjive može se odrediti upotrebom operatora adresa: & #include<iostream.h> int main() { int a=5; cout<<a<<"\t"<<&a<<endl; //5 0x0012FF7C return 0; }

Svaka promenjiva ima adresu.Ta adresa može se čuvati u pokazivaču. Pokazivač se može deklarisati tako da pokazuje na bilo koji tip podataka. Kreiranje pokazivača:

1) int *pb=0; ovo je deklaracija pokazivača pb na tip int, to znači da se pb deklariše za čuvanje adrese od int.

U ovom primjeru pb se inicijalizuje na 0.Pokazivač, čija je vrednost 0,naziva se null pokazivač.Svi pokazivači, kada se kreiraju, trebalo bi da budu inicijalizovani na nešto. 2) int a,*pb; // deklaracija pokazivača pb na tip int a=5; pb=&a; // pokazivač pb pokazuje na adresu promjenjive a

3) int *pb=&a //pokazivaču pb dodjeljuje se adresa promenjive a

Pokazivač pb čuva adresu promenjive a: cout<<pb; // 0x0012FF7C

Pomoću adrese koja se čuva u pokazivaču može se pristupiti vrednosti na toj adresi. (indirekcija): cout<<*pb; // 5

Nekoj novoj promenjivoj c možemo dodjeliti vrednost promenjive a upotrebom pokazivača pb: c=*pb; //uzmi vrednost koja se čuva na adresi u pb i dodjeli je promenjivoj c

#include<iostream.h> int main() { int a,*pb; a=5; pb=&a; cout<<a<<"\t"<<&a<<endl; cout<<*pb<<"\t"<<pb<<endl; return 0; } Pitanja:

1. Šta je to pokazivač i kako se kreira 2. Kako se može provjeriti koja je adresa neke promjenjive 3. Šta se dobija na izlazu poslije naredbe cout<<p ; ako je *p pokazivač na cjelobrojnu vrijednost 4. Šta se dobija na izlazu poslije naredbe cout<<*p ; ako je *p pokazivač na cjelobrojnu

vrijednost 5. Šta se dobija na izlazu poslije naredbe cout<<&p ; ako je *p pokazivač na cjelobrojnu

vrijednost

Page 33: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

33

FUNKCIJE

Funkcija je zaseban blok naredbi koji se pišu prije ili poslije main( ). Funkcija je potprogram (logicka cjelina) koja se poziva i izvodi po potrebi jednom ili veći broj puta na mjestima gdje je to potrebno. Korisnik mora znati šta funkcija radi, ali mu nije bitno kako ona to radi.( npr. Funkcija koja računa površinu kvadrata, funkcija koja određuje maximum od tri unesena broja, ....) Funkciju treba deklarisati prije prvog poziva, Svaka funkcija prije svog poziva u programu trebala bi biti deklarisana. Deklaracija saopštava kompajleru ime, povratni tip i parametre funkcije primjer deklaracije funkcije koja računa površinu kvadrata: int Povrsina_Kvadrata ( int a); ime funkcije Deklaraciju funkcije koja računa površinu kvadrata možemo napisati i ovako: int Povrsina_Kvadrata ( int); Definicija funkcije mora oblikom u potpunosti odgovarati deklaraciji ( tip funkcije, broj, redoslijed i tip argumenata) i sadržati sve naredbe te funkcije. Definicija saopštava kompajleru kako funkcija radi. Svi pozivi funkcije će se prilikom povezivanja programa usmjeriti na tu definiciju Definicija funkcije:

int Povrsina_Kvadrata ( int a) {

int P; P=a*a; tijelo funkcije return P;

}

Povratni tip - Određuje kakav će biti tip podatka kojeg će funkcija vratitit naredbom return poslije poziva te funkcije - Vriednost koju funkcija vraća određuje se naredbom return u definiciji funkcije - Ako funkcija ne vraća ništa onda se piše da je tip podatka void

Formalni argumenti ( parametri ) funkcije - formalni podaci koji se predaju funkciji prilikom njenog poziva - njihov je broj proizvoljan, funkcija može biti i bez argumenata ili sa neodređenim brojem argumenata - u deklaraciji se imena argumenata mogu izostaviti

int znači da funkcija vraća kao rezultat cjelobrojnu vrijednos

Poslije return pišemo vrijednost koju vraća funkcija Kod funkcije koja ne vaća ništa ne piše se return

Page 34: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 može pozvati drugu funkciju, ali i samu sebe (rekurzija). Deklaracija daje prototip funkcije. Ona ne sadržava opis šta i kako funkcija radi. Funkcija može imati n argumenata, a može biti i bez argumenata Naredbe koje se izvode po pozivu funkcije čine tijelo funkcije (engl. function body). I glavni program, main( ), je zapravo funkcija (potprogram), ali onaj koji se poziva od strane operativnog sistema. Kada se program pokrene, izvršavanje uvijek započinje od funkcije main, bez obzira gdje se ona nalazi unutar programa. Tijelo funkcije main, je glavni program, dok su sve ostale funkcije potprogrami. Ostale funkcije se izvršavaju onog trenutka kada se eksplicitno pozovu. Poziv funkcije se vrši navođenjem njenog imena iza kojeg slijede zagrade, unutar kojih se navode parametri (argumenti) funkcije, ukoliko postoje. Korišćenje funkcija u programu zahteva da prvo deklarišete funkciju, pa da je definišete. Poziv funkcije Nakon što je funkcija deklarisana, možemo je pozvati iz bilo kojeg dijela programa navođenjem naziva funkcije sa odgovarajućom listom argumenata: Povrsina_Kvadrata ( 5 ); Prilikom poziva funkcije formalni argumenti zamjene se sa stvarnim argumentima tj. sa konkretnom vrijednošću ( npr 5 ):

broj argumenata u pozivu funkcije mora biti jednak broju argumenata u definiciji funkcije tipovi stvarnih argumenata moraju se podudarati sa tipovima odgovarajućih formalnih

argumenata ( istog tipa ili se konverzijom mogu svesti na tipove formalnih parametara) imena formalnih argumenata ne moraju biti jednaka imenima stvarnih argumenata

Primer 1. Napisati funkciju koja računa površinu kvadrata. Iz glavnog programa pozvati funkciju i prikazati površinu za unesenu stranicu kvadrata #include<iostream.h>

int povrsina(int); //deklaracija funkcije koja računa površinu kvadrata void main( ) { int x; cout<<"stranica kvadrata je x=:"; cin>>x; cout<<"povrsina kvadrata je P= "<< povrsina(x) <<endl; } // sledi definicija funkcije koja računa površinu kvadrata int povrsina(int a) { return a*a ; definicija funkcije }

poziv funkcije:povrsina x je stvarni argument

Page 35: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

35

Isti zadatak možemo da uradimi i ovako : #include<iostream.h> int povrsina(int x) { return x*x ; } void main( ) { int a; cout<<"stranica kvadrata je a=:"; cin>>x; cout<<"povrsina kvadrata je P= "<< povrsina(a) <<endl; } Lokalne promenjive Promenjive deklarisane unutar nekog bloka (uključujući i blok funkcije) su lokalne promenjive i one se mogu koristiti samo unutar bloka u kojem su i deklarisane. Globalne promenjive Pored lokalnih promenjivih postoje i globalne promenjive. To su promenjive koje su deklarisane izvan svih blokova. Njihov videokrug je cijeli program počevši od mjesta na kojem su definisane pa do kraja programa.

#include<iostream.h> int i; // i je globalna promenjiva void ispis( ) { for(i=1; i<5; i++) cout<<"ispis brojeva:\t"<<i<<endl; } void main( ) { i=10; cout<<"u funkciji main:\t"<<i<<endl; ispis(); //poziv funkcije ispis cout<<"u funkciji main:\t"<<i<<endl; }

poziv funkcije:povrsina x je stvarni argument

prvo se izvršavaju naredbe main funkcije sa tastature unesemo vrednost za promjenjivu a i zatim sledi poziv funkcije (i tek tada izvršavaju se naredbe funkcije Površina_Kvadrata

naredbe funkcije Površina_Kvadrata izvršavaju se pri svakom pozivu te funkcije u osnovnom programu

Page 36: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 izvršavaju naredbe funkcije 4. Kako pozivamo funkciju 5. Za koje promjenjive kažemo da su globalne a za koje da su lokalne promjenjive 6. Napisati funkciju koja računa faktorijel unjetog broja. 7. Napisati funkciju koja prikazuje parne brojeve 8. Neka se sa tastature unose brojevi a1,a2 i a3. Napiši funkciju koja prikazuje najveći broj i

program koji poziva tu funkciju. #include<iostream.h> void maxmin(int a, int b) { int z; z=(a>b) ? a: b; cout<<"max je:"<<z<<endl; definicija funkcije koja traži max od unesena dva broja return; } int main( ) { int x,y; cout<<"unesite dva broja:"; cin>>x>>y; maxmin(x,y); // poziv funkcije return 0; } #include<iostream.h> #include<conio.h> int main( ) { int x,y; void max(int x,int y); // deklaracija funkcije cout<<"unesite dva broja:"; cin>>x>>y; max(x,y); // poziv funkcije return 0; }

Page 37: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<<"max je:"<<z<<endl; definicija funkcije } else cout<<"brojevi su isti!"<<endl; getch( ); }

PRENOS ARGUMENATA FUNKCIJE

Vrste prenosa: po vrednosti prenos kao pokazivač prenos kao referenca

Prenos argumenata po vrednosti podrazumeva da se pri pozivu funkcije u operativnoj memoriji prave kopije za sve parametre funkcije. Funkcija radi sa tim kopijama i u trenutku završetka rada funkcije te kopije se brišu iz operativne memorije. To automatski onemogućava da argument funkcije bude promenjen u funkciji, a da to bude vidljivo u pozivajućem modulu.

#include<iostream> #include<math.h> using namespace std; //definicija funkcije void Povrsina_Kvadrata(int x) { cout<<"P="<<pow(x,2)<<endl; Program Output } // osnovni program int main( ) { int a; cout<<"a="; cin>>a; Povrsina_Kvadrata( a ); // poziv funkcije return 0; }

Izvršavanje programa kreće od main( ) int a int a;

npr. a=5

Poziv funkcije

Izvršavaju je naredbe funkcije x=a x=5 P=52

a= 5 P=25 .....

Page 38: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

38

Primjer funkcije koja vrši zamjenu vrijednosti dvije promjenjive #include<iostream> using namespace std; //definicija funkcije: void Zamena_vrednosti(int x,int y) // x i y se prenose po vrijednosti { int pom; pom=x; x=y; y=pom; cout<<"Rezultat funkcije:\n"; cout<<"\t\tprvi broj="<<x<<"\t\t"<<"drugi broj="<<y<<"\n\n\n"; } // osnovni program: int main( ) { int prvi_b,drugi_b; cout<<"prvi_b="; cin>>prvi_b; cout<<"drugi_b="; cin>>drugi_b; Zamena_vrednosti(prvi_b,drugi_b); // poziv funkcije cout<<"vrijednosti promjenjivih posle poziva funkcije:\n"; cout<<"\t\tprvi broj="<<prvi_b<<"\t\t"<<"drugi broj="<<drugi_b<<endl; return 0; } Program Output

Page 39: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

39

Osim prenosa argumenata po vrednosti, moguće je koristiti pokazivače i reference kao argumente. U tom slučaju funkcija ne vrši obradu nad kopijama podataka nego nad originalnim podacima. Svaka promena formalnog argumenta reflektovaće se na original, stvarni argument. Pokazivači kao argumenti:

#include<iostream> using namespace std; //definicija funkcije void Zamena_vrednosti(int *x,int *y) // argumenti funkcije su pokazivači na promjenjive { int pom; pom=*x; *x=*y; *y=pom; cout<<"Rezultat funkcije:\n"; cout<<"\t\tprvi broj="<<*x<<"\t\t"<<"drugi broj="<<*y<<"\n\n\n"; } // osnovni program int main( ) { int prvi_b,drugi_b; cout<<"prvi_b="; cin>>prvi_b; cout<<"drugi_b="; cin>>drugi_b; Zamena_vrednosti(&prvi_b,&drugi_b); //pri pozivu funkciji prosljeđujemo adrese argumenata cout<<"vrijednosti promjenjivih posle poziva funkcije:\n"; cout<<"\t\tprvi broj="<<prvi_b<<"\t\t"<<"drugi broj="<<drugi_b<<endl; return 0; } Program Output

Page 40: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

40

Reference kao argumenti: Referenca se označava znakom & Referenca je drugo ime za promjenjivu Upotreba referenci omogućuje promjenu vrijednosti stvarnih argumenata Referenca se prilikom svoje inicijalizacije “čvrsto vezuje” za objekat kojim se inicijalizuje. Ova veza se više nikako ne može raskinuti, što znači da referenca, do kraja svog životnog

veka, upućuje na jedan isti objekat. Svako navođenje neke reference u programu, posle trenutka njene inicijalizacije, predstavlja

posredan pristup do referenciranog objekta. #include<iostream> using namespace std; //definicija funkcije void Zamena_vrednosti(int &x,int &y) // x i y se prenose po referenci { int pom; pom=x; x=y; y=pom; cout<<"Rezultat funkcije:\n"; cout<<"\t\tprvi broj="<<x<<"\t\t"<<"drugi broj="<<y<<"\n\n\n"; } // osnovni program int main( ) { int prvi_b,drugi_b; // stvarni argumenti cout<<"prvi_b="; cin>>prvi_b; cout<<"drugi_b="; cin>>drugi_b; Zamena_vrednosti(prvi_b,drugi_b); // funkcija se poziva argumentima a ne njihovim adresama cout<<"vrijednosti promjenjivih posle poziva funkcije:\n"; cout<<"\t\tprvi broj="<<prvi_b<<"\t\t"<<"drugi broj="<<drugi_b<<endl; return 0; } Program Output

Page 41: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

41

Preopterećenje funkcije Preopterećenje omogućuje upotrebu istog imena za različite funkcije, pri čemu se te funkcije međusobno razlikuju po tipu argumenata u svom zaglavlju. Primer:

#include<iostream.h> void funkcija(int n) { cout<<"n="<<n<<endl; } void funkcija(float n){ cout<<"n="<<n<<endl; } void main( ) { int a=5; float b=3.125; funkcija(a); //celobrojni argument funkcija(b); //realni argumenat }

Funkcije se mogu preopterećivati funkcijama koje imaju jednak povratni tip rezultata: float povrsina( int ); float povrsina( float ); Funkcije se ne mogu preopterećivati po povratnom tipu: float povrsina( int ); double povrsina( int ); Funkcije se ne mogu preopterećivati ako se razlikuju samo u podrazumjevanim argumentima: int povrsina( int x=5 ); floatpovrsina( int ); Funkcije se ne mogu preopterećivati ako se razlikuju samo po vrijednosti ili referenci na nju: int povrsina(int x ); long povrsina( int &rx);

Page 42: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

42

Rekurzija omogućuje da funkcija poziva samu sebe Postupak pozivanje funkcije iz funkcije naziva se rekurzija. Primjer: napisati funkciju koja računa faktorijel unesenog broja ( faktorijel npr broja 4 se računa: 4!=1*2*3*4 )

#include<iostream.h> int factorial( int x ) { if (x == 1) return(1); else return(x * factorial (x-1 ) ); } void main( ) { int a; cout<<"a="; cin>>a; cout<<"a!="<<factorial( a )<<endl; } Pitanja:

1. Koje imamo vrste prenosa argumenata funkciji 2. Objasniti prenos argumenata po vrijednosti 3. Objasniti prenos argumenata po referenci 4. Objasni preopterećenje funkcije 5. Šta predstavlja rekurzija

Page 43: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

43

NIZOVI

Niz predstavlja skup objekata istog tipa koji nisu pojedinačno imenovani već se identifikuju svojom pozicijom (indeksom) u nizu. Objekti od kojih se niz sastoji nazivaju se elementi niza Nizovi se koriste kada radimo sa više podataka istog tipa koji čine neku cjelinu, a trebamo ih sačuvati radi daljе obrade U memoriji niz zauzima kontinuirani prostor

° Jednodimenzionalni nizovi ° Višedimenzionalni nizovi

Jednodimenzionalni nizovi

• Nizovi se koriste kada radimo sa više podataka istog tipa koji čine neku cjelinu, a trebamo ih sačuvati radi daljnje obrade

Npr. Posmatramo niz od 10 izmjerenih temperatura.

Definišemo niz pod nazivom: tem[10] T1, T2, T3, T4, T5, T6, T7, T8, T9, 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 definišemo niz od n elemenata, poslednji element je n-1.

• Ako pokušamo da pristupimo elementu na poziciji n dolazi do greške!

• Pojedini elementi numerisani su redom 0, 1, 2, 3, …

• Ti brojevi zovu se indeksi i preko njih se može direktno pristupiti bilo kojem elementu niza(polja)

• Ako je a ime niza od n elemenata, tada su pojedini elementi označeni s: a[0], a[1], a[2], …, a[n-1]

• Indeks ukazuje koliko je neki element udaljen od početnog 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 možemo dodjeliti vrednost pomoću naredbe cin:

Page 44: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<<a[2]; //12 Učitavanje i ispis elemenata niza Primjer: Dodjeliti vrijednosti elementima niza a[5] i iste prikazati u jednom redu

#include<iostream.h> #include<iomanip.h> int main() { int a[5]; //ucitavanje elemenata niza: for(int i=0;i<5;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } // prikazivanje elemenata niza for(i=0;i<5;i++) cout<<setw(5)<<a[i]; cout<<endl; return 0; }

Pronalaženje najvećeg elementa niza Pretpostavimo da je prvi element polja najveći( max= a[0] ). Zatim provjeravamo (pomoću ciklusa naredbe if )da li među preostalim elementima ima neki koji je veći od trenutno najvećeg. Ako ima izjednačimo ga sa promjenjivom koja predstavlja max ( max= a[i] ).

#include<iostream.h> int main ( ) { const int n=5; int a[n]; cout<<"unesite 5 cijelih brojeva:\n"; for(int i=0;i<n;i++) cin>>a[i]; // pronalazenje najveceg elementa int max=a[0]; for(i=0;i<n;i++) if(a[i]>max) max=a[i]; cout<<"najveci element je:"<<max<<endl; return 0; }

Page 45: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

45

Sortiranje Napisati program kojim se uređuje niz cijelih brojeva u rastućem redosledu

#include<iostream.h> #include<iomanip.h> int main() { const int n=5; int a[n]; cout<<"unesite 5 cijelih brojeva:\n"; for(int i=0;i<n;i++) cin>>a[i]; // sortiranje for(i=0;i<n;i++) for(int j=i+1; j<n; j++ ) if(a[i]>a[j]) { int pom=a[i]; a[i]=a[j]; a[j]=pom; } // prikazivanje sortiranih elemenata for(i=0;i<n;i++) cout<<setw(7)<<a[i]; cout<<endl; return 0; }

• Niz je moguće inicijalizirati prilikom njegove deklaracije. Npr. int a[4] = {22, 33, 66, 55}; char slova[3] = {'a', 'b', 'c'};

• Ako je broj elemenata u listi manji od veličine niza, preostali elementi jednaki su 0. npr.

float x[5] = {2.5, 1.2}; int y[100] = { }; Prva dva elementa niza x sadrže 2.5 i 1.2, a ostali nule. Niz y ima 100 elemenata koji su jednaki nuli.

• Veličinu niza moguće je izostaviti: Npr. int b[ ] = {55, 33, 66}; Veličina niza b je u tom slučaju 3

• Ako niz nije inicijaliziran, sadržaj elemenata (prije nego im dodijelimo vrijednost) je posve slučajan!

Page 46: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

46

VIŠEDIMENZIONALNI NIZOVI Dvodimenzionalni niz - Matrica Primjeri tabelarnog ( matričnog ) prikaza podataka: Tablica množenja:

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

Veličina odnosno dimenzije matrice određene 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)

Page 47: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

47

Deklaracija višedimenzionalnog niza: int x[50][20]; - deklaracija dvodimenzionalnog niza sa 50*20 integera char y[10][30][100] -deklaracija trodimenzionalnog niza sa 10*30*100 karaktera Višedimenzionalni niz se deklariše tako da se dodaju srednje zagrade, gde broj srednjih zagrada određuje dimenziju tog niza, a unutar zagrada treba upisati broj elemenata u toj dimenziji. x[7][9]=120; - element 7,9 poprima vrednost 120 Dvodimenzionalni niz može biti inicijaliziran na sledeći naćin: float m[2][3]={2.5,1,8,6,0,4.8}; ili float m[2][3]= { {2.5,1,8}, {6,0,4.8} } Ukoliko neka od grupa ima manje elemenata od dimenzije retka, ostali elementi će biti inicijalizirani nulama.

• Pristup elementu niza znači korišćenje vrednosti datog elementa niza ili dodelu vrednosti datom elementu u nizu

• Pristup elementu je operacija koja se ponavlja onoliko puta koliko ima elemenata u nizu Npr. A[2][3]=5; // elementu matrice koji se nalazi na preseku drugog reda i treće kolone dodjeljena je vrijednost 5 Može i ovako: cin>> A[2][3]; cout<< A[2][3]; // prikazivanje vrijednosti elementa matrice A[2][3] //Npisati naredbu for kojom se učitavaju elementi //matrice n(3x4) vrsta po vrsta, a zatim matricu prikazati #include<iostream.h> int main() { int n[3][4]; //deklaracija matrice m(3x4) for(int i=0; i<3; i++) for(int j=0; j<4; j++) cin>>n[i][j]; //učitavanje elemenata matrice for(i=0;i<3;i++) { for(int j=0;j<4;j++) // prikazivanje matrice cout<<" "<<n[i][j]<<" "; // ispisuje jedan red elemenata cout<<endl; // prebacuje kursor u sledeći red } return 0; }

Page 48: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

48

Znakovni niz

definicija i ispis

Znakovni nizovi su jednodimenzionalni nizovi koji služe za prikazivanje tekstova: Na kraju niza automatski se postavlja nul-znak (engl. null-character). Nije ga potrebno eksplicitno navoditi, ali treba o njemu voditi računa. char tekst [ ] = { 'm','a','r','i','j','a','n','a',’ \0’ } ; // definicija cout << tekst << endl ; // ispis

char ime[ ] = ” Marijana ” ; // definicija cout << ime; // ispis

ili

char ime [10] ; // definicija cout << ” unesite jedno ime : “; cin >> ime; cout << ime ; // ispis

Ispisuje samo do prve praznine i prekida izvođenje. Ovo se rješava upotrebom funkcijskih članova get ( ) i getline ( ) : char tekst[20]; char tekst [ 20 ]; cin.get(tekst,sizeof(tekst)); cin.getline( tekst, sizeof ( tekst )) ; cout<<tekst<<endl; cout<<tekst<<endl;

get ( ) sa argumentima: Učitava znak po znak. Prekida učitavanje kad naiđe na ‘\n’ koji ostaje u nizu, pa se može učitati najviše

(dužina-1) znakova. Zaključni nul-znak dodaje se automatski.

getline ( ) :

Učitava znak po znak. Prekida učitavanje kad naiđe na ‘\n’. Automatski uklanja ‘\n’ i dodaje ‘\0’. Također vrlo pogodan način za učitavanje znakovnih nizova Pitanja:

1. Kada koristimo nizove 2. Kako se deklariše jednodimenzionalni niz 3. Kako se pristupa elementima niza 4. Objasni deklaraciju višedimenzionalnog niza 5. Kako se pristupa elementima višedimenzionalnog niza 6. Objasniti kako koristimo funkcije get( ) i getline( )

Page 49: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

49

DATOTEKE Svi programi koje smo do sada pisali posjedovali su suštinski nedostatak da se svi uneseni podaci gube onog trenutka kada se program završi.Poznato je da se ovaj problem rješava uvođenjem datoteka koje predstavljaju strukturu podataka koja omogućava trajno smještanje informacija na nekom od uređaja vanjske memorije(obično na hard disku). Svaki program u C++ programskom jeziku, koji se koristi datotekama po pravilu ima tri osnovna dijela:

- dio u kojem se datoteka otvara i priprema za U/I - dio u kojem se u datoteku upisuju podaci, ili se iz nje ispisuju - dio u kojem se datoteka zatvara

C++ biblioteka tokova podržava tri razreda za rad s ulazom/izlazom kod datoteka:

- ifstream - čitanje datoteke s diska - ofstream - pisanje u datoteku na disku - fstream - podržava i čitanje i pisanje u datoteku

Pisanje u datoteku:

- U datoteku brojevi.txt upisati prvih 20 brojeva

#include<fstream.h> int main() { ofstream imedat("brojevi.txt"); for(int i=1; i<=20; i++) imedat<<i<<" "; imedat.close(); return 0; }

Čitanje iz datoteke sa diska: - Pročitati podatke iz datoteke brojevi.txt

#include<fstream.h> void main() { ifstream broj("brojevi.txt"); for(int i=1;i<=20;i++) { broj>>i; cout<<i<<" "; } broj.close( ); }

Page 50: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 neuspješno - noreplace // ako datoteka postoji otvaranje je neuspješno - binary // binarna datoteka

U datoteku brojevi.txt dopišite vaše ime:

#include<fstream.h> int main() { char ime[20]; ofstream upis("brojevi.txt",ios::ate|ios::app); cin>>ime; upis<<ime; upis.close(); return 0; }

#include<fstream.h> void main() { char b[10]; int a; ifstream k("w.txt",ios::in); for(int i=1;i<20;i++) { k>>a; cout<<a<<" ";} cout<<endl; k>>b; cout<<b; k.close(); }

Page 51: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

51

STRUKTURE

Strukture predstavaljaju složene tipove podataka koji čuvaju skupine raznorodnih podataka, koji se mogu razlikovati kako po prirodi tako i po tipu, i kojima se, za razliku od nizova, ne pristupa po indeksu već po imenu. Pri deklaraciji strukture se iza rezervisane reči struct u vitičastim zagradama navode deklaracije individualnih elemenata od kojih se struktura sastoji. struct ucenikIIIe2 { string ime; int br_god; članovi strukture float op_us; } ; Deklaracija promjenjivih strukturnog tipa može se izvršiti na sledeći naćin: ucenikIIIe2 u1, u2, u3; ili ovako: struct ucenikIIIe2 { string ime; int br_god; float op_us; } u1, u2, u3 ; // ovo se smatra lošim stilom pisanja, koji treba izbjegavati Pojedinačna polja (atributi,podaci članovi) unutar slogovnih promjenjivih ponašaju se poput individualnih promjenjivih odgovarajućeg tipa, kojima se pristupa tako što prvo navedemo ime slogovne promjenjive, zatim znak (operator) tačka ( . ) i, konačno, ime polja unutar slogovne promjenjive : cin >> u1.ime ; cout << u1.ime << endl ; bilo koja slogovna promjenjiva može se čitava dodjeliti drugoj slogovnoj promjenjivoj istog tipa : u1 = u2 ; Primjer: Napisati strukturni tip “ucenikIIIe2” koji opisuje ucenika u školi, sa atributima: ime, broj godina i opšti uspjeh #include<iostream> #include<string> using namespace std; struct ucenikIIIe2 {

Naziv strukture

Page 52: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 << " ime: " ; cin >> u1.ime ; cout << " br_god: "; cin >> u1.br_god ; cout << " op_us: " ; cin >> u1.op_us ; } Zadatak: Za napisani program dodati u strukturni tip attribute: ukupan broj izostanaka i vladanje. Izlaz treba da glasi: Aco ima 17 god, opsti uspjeh 4.25, ukupno 5 izostanaka i primjerno vladanje Ana ima 17 god, opsti uspjeh 4.54, ukupno 3 izostanaka i primjerno vladanje Pitanja:

1. Kada se koriste datoteke 2. Objasniti pisanje u datoteku 3. Objasniti čitanje iz datoteke 4. Strukture su.. 5. Kako deklarišemo strukturu 6. Kako se deklarišu promjenjive strukturnog tipa 7. Kako pristupamo članovima strukture

Page 53: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

53

II polugodiste KLASE

Programski jezik C++ je karakterističan po tome što programeru dopušta da kreira svoj tip podatka. U tu svrhu se koriste klase. Klasa je korisnički definisan tip podataka. Klase su temelj objektno orijentisanog pristupa programiranju. Klase omogućavaju programeru modeliranje objekata koji imaju atribute ( predstavljene kao podaci ) i ponašanje ili operacije ( predstavljene kao funkcije ili metode ) Klasa predstavlja apstrakciju koja definiše zajednička svojstva i zajedničke postupke koji su svojstveni svim objektima nekog tipa. Npr. Kreiramo klasu Mačak, za opis mačke koristimo podatke koji su zajednički za zve mačke: ime, broj godina, prede,lovi miša... ime, broj godina i slični podaci se predstavljaju kao atributi a ponašanje mačke kao što je prede, lovi miša i sl. Predstavlja se u klasi kao metoda ( funkcija ). class Macak klasa je samo opis zajedničkih osobina i postupaka karakterističnih za sve mačke 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.

Mačak: string ime; int br_god; void spava( ); void lovi_misa( );

Page 54: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

54

Primjer: #include<iostream> #include<string> using namespace std; class Macak { public: // način pristupa članovima klase string ime; //atribut

string prede ( ) // ovo je metoda koja opisuje ponašanje mačke { return " ZZ Z zz...z.ZZZ"; }

}; // na kraju klase obavezno ide }; int main( ) { Macak spavalica; // kreiramo objekat cout<<"unesi ime:"; cin>>spavalica.ime; // pomoću kreiranog objekta obracamo se članovima klase cout<<"Macak "<<spavalica.ime <<" voli da prede "<<spavalica.prede( )<<endl; return 0; } Članovi klase su :

- atributi (podaci, osobine ) koji opisuju stanje objekta i - metode (funkcije, ponašanje ) namjenjene definisanju operacija

nad podacima klase Jedan primjerak ( instanca, pojava) klase naziva se objektom te klase Klasa ima sekcije koje određuju pravo pristupa članovima Način pristupa članovima klase može biti:

private (privatni) public (javni) protected (zaštićeni)

Svaka sekcija započinje labelom sekcije (rezervisana reč)

1. Članovi (podaci ili funkcije) klase iza rezervisane reči private: nazivaju se privatnim (engl. private) članovima zaštićeni su od pristupa spolja (kapsulirani su) njima mogu pristupati samo metode klase (i prijatelji)

Page 55: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

55

2. Članovi iza rezervisane reči public: nazivaju se javnim (engl. public) članovima dostupni su spolja bez ograničenja

3. Članovi iza rezervisane reči protected:

nazivaju se zaštićenim (engl. protected) članovima dostupni su metodama date klase, kao i klasa izvedenih iz te klase nisu dostupni ostalim funkcijama

Prava pristupa :

Redosled sekcija public, protected i private je proizvoljan (preporučuje se navedeni redosled) Može biti više sekcija iste vrste Podrazumevana sekcija (do prve labele) je privatna Preporuka je da se klase projektuju tako da nemaju javne atribute

Ako nije ništa navedeno, podrazumijeva se privatni pristup

Obratiti pažnju na način pisanja metoda:

string prede ( ) { //otvorimo veliku zagradu i pišemo naredbe te metode return " ZZ Z zz...z.ZZZ"; //ono što metoda vrača piše se posle return } //na kraju metode obavezno zatoriti veliku zagradu

Primjer metode koja ne vraća ništa:

void prede ( ) {

cout<< " ZZ Z zz...z.ZZZ"; //ako metoda ne vraća ništa ne piše se return }

Prvo pišemo kog tipa je rezultat metode

Ime metode

Obavezno male zagrade sa argumentima metode

Void znači da metoda ne vraća išta

Page 56: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

56

Deklaracija klase ''class'' definiše atribute i metode Primjer deklaracije klase: class pravougaonik { public: int a, b ; // a i b su atributi klase void prikazi ( ) { // prikazi( ) je metoda klase

cout<<"a = " << a << endl ; cout<<"b = " << b << endl;

} }; //deklaracija klase uvjek se završava sa ;

Primjer: Napisati klasu pravougaonik koja definiše sledeće članove: a - stranica (javni atribut,cjelobrojnog tipa), b - stranica (javni atribut,cjelobrojnog tipa), prikazi ( ) - javna metoda, tipa void, koja prikazuje stranice pravougaonika. A zatim napisati test program koji dodjeljuje vrednosti atributima klase i poziva metodu klase.

#include<iostream.h> class pravougaonik { public: int a, b ; void prikazi ( ) { cout<<"a = " << a << endl ; cout<<"b = " << b << endl; } }; void main ( ) { pravougaonik p1; // p1 je jedan konkretan pravougaonik cout<<"prva stranica je :"; cin>>p1.a; cout<<"druga stranica je :"; cin>>p1.b; p1.prikazi( ); }

Page 57: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

57

Deklaracija metode Funkcije koje se deklarišu u klasi nazivaju se metode. Prostor njihove upotrebe je klasa. One ne postoje izvan klase. Metode se mogu pozvati samo unutar klase ili ih može pozvati instanca (objekat) klase. Pomoću metoda klase se može pristupiti svim atributima klase bez obzira na njihova ograničenja pristupa. Metoda u C++ mora biti prije upotrebe deklarisana, a zatim i definisana. Metode se kao i atributi mogu deklarisati upotrebom rezervisanih riječi public, protected i private. Metode deklarisane kao public omogućuju pristup svim dijelovima klase. Metode private služe za interni rad s klasom. Korisnik ih ne može pozivati. Zato su privatne i skrivene od vanjskog svijeta. Korisnik ne može pozivati i metode protected. Njima mogu pristupiti samo klase koje nasljeđuju metode svojih nadklasa. Slijedi primjer deklaracije metode.

class kvadrat { private: int a; // atribut public: void dodjela ( int x); // Deklaracija metode };

U klasi kvadrat deklarisana je metoda: void dodjela ( int x ) ; Povratni tip podataka metode void dodjela ( int x ) je void, naziv metode je dodjela, a metoda ima samo jedan argument tipa int. U sljedećem se koraku deklarisana metoda mora definisati. To znači detaljno prikazati šta radi metoda. Svi detalji moraju biti poznati, a oni se mogu definisati unutar ili izvan klase. class kvadrat { private: int a ; // atribut public: void dodjela (int x) { //definicija metode u klasi a = x ; } }; Primjer definicije metode izvan klase Ako su metode složenije i sadrže veći broj programskih redaka onda je definicija unutar klase suviše nepregledna. Zato je bolje metodu u klasi deklarisati a definisati izvan klase. U definiciji metode izvan klase u upotrebi je tzv. operator klase ( class operator ), a njegov simbol je „::“. Naziva se i operator područja vrijednosti.

Page 58: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 definišu šta će metoda raditi. Primjena metoda Poziv ili upotreba metode zahtjeva navođenje naziva objekta, naziva metode i parametara metode. Primjer K1. dodjela ( 5 ); Primjer: Napisati klasu kvadrat sa sledećim članovima: stranica a – atribut i metode: dodjeli( ), povrsina( ), obim( ),dijagonala( ) i rezultati( ). #include<iostream.h> #include<math.h> class kvadrat{ private: int a; public: void dodjela(int x); int povrsina(); int obim(); double dijagonala(); void rezultat(); }; void kvadrat::dodjela(int x) { a=x; } int kvadrat::povrsina( ) { return a*a; } int kvadrat::obim( ) { return 4*a; }

Page 59: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

59

double kvadrat::dijagonala( ) { return a*sqrt(2);} void kvadrat::rezultat( ) { cout<<a<<"\t"<<povrsina()<<"\t"<<obim()<<"\t"<<dijagonala()<<"\n";} void main( ) { kvadrat k1; k1.dodjela(5); k1.rezultat(); }

Konstantne funkcije članice

- Funkcija članica može samo da čita stanje ili da menja stanje objekta. - Funkcije članice koje ne menjaju stanje objekta nazivaju se inspektori ili selektori. - Funkcija članica koja menja stanje objekta naziva se mutator ili modifikator. - Dobra praksa je da se korisnicima klase navede da li neka funkcija članica menja unutrašnje stanje

objekta. - Da je funkcija članica inspektor, korisniku klase govori reč const napisana iza zaglavlja funkcije. - Ovakve funkcije članice nazivaju se konstantnim funkcijama članicama Primer: Napisati klasu ptrougao koja ima atribute a i b tipa int(katete pravouglog trougla) i metode: dodeli( int at, int bt), H( ). U osnovnoj main funkciji kreirati dva trougla ( objekta) T1 I T2, pozvati metode i za oba objekta prikazati hipotenuze #include<iostream.h> #include<math.h> class ptrougao { int a,b; public: void dodeli(int at,int bt); //modifikator, menja stanje objekta double H()const; //selektor, ne menja stanje objekta }; void ptrougao::dodeli(int at,int bt) { a=at; b=bt; } double ptrougao::H()const { return sqrt(pow(a,2)+pow(b,2)); } int main( ) { ptrougao T1; int x,y; cout<<"unesite katete p.trougla:"; cin>>x>>y;

Page 60: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

60

T1.dodeli(x,y); cout<<"hipo je c="<<T1.H( )<<endl; return 0; }

Pokazivač this

Iz jedne klase moguće je definisati neograničen broj objekata Klasa ne zna nazive svojih objekata Pomoću pokazivača this moguće je unutar klase doznati adresu objekta, odnosno:

*this predstavlja sam taj objekt na način kako je dostupan iz koda klase Primjer: #include<iostream.h> class ad { public: int a,b; void m( ) { cout<<"adresa objekta preko kojeg je metoda pozvana:"; cout<<(int)this<<endl; cout<<"vrijednosti atributa su:"<<endl; cout<<"a="<<this->a<<endl; cout<<"b="<<this->b<<endl; } }; ad o1,o2; int main ( ) { o1.a=5; o1.b=2; cout<<"adresa objekta o1:"<<(int)&o1<<endl; o1.m(); o2.a=7; o2.b=9; cout<<"adresa objekta o2:"<<(int)&o2<<endl; o2.m(); return 0; } #include<iostream.h> const double pi=3.1415; class krug { private: int r; public: void dodela(int rr) { r=rr; }; double obim( ) {

Page 61: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

61

return 2*r*pi; }; void adresa( ) { cout<<"adresa objekta je:"<<(int)this<<endl; cout<<"poluprecnik ima vrednost r="<<this->r<<endl; }; }; krug k; void main( ) { int r1; cout<<"unesite poluprecnik prvog objekta r1="; cin>>r1; k.dodela(r1); cout<<"obim je O="<<k.obim( )<<endl; cout<<endl; k.adresa( ); }

Zajednički članovi klasa

Zajednički (statički) podaci članovi

Pri kreiranju objekata klase, za svaki objekat se kreira poseban komplet podataka članova. Podatak član može biti deklarisan kao statički pomoću specifikatora static ispred tipa. Postoji samo jedan primjerak statičkog podatka člana za cijelu klasu ( zajednički podatak za sve objekte

klase).

Class broj { private: static int a; int b; public: //… };

Statički član mora da se definiše izvan definicije klase i izvan definicije funkcija. U definiciji može da se koristi samo konstantan izraz. Dodjela inicijalne vrijednosti statičkom članu se vrši prije poziva main( ). Obraćanje statičkom članu van klase vrši se preko operatora :: Za prethodni primjer: int broj::a=5; Statički članovi se uglavnom koriste kada svi primjerci jedne klase treba da dijele neku zajedničku

informaciju.

Page 62: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

62

Primjer: Napisati klasu krug koja u privatnom dijelu ima statički član pi i atribut r(poluprečnik), u javnom dijelu deklarisati dvije metode: unos i obim #include<iostream.h> class krug { private: static double pi; double r; public: void unos( ); double obim( ); }; double krug::pi=3.1415; void krug::unos( ) { cout<<"r="; cin>>r; } double krug::obim() { double O=2*r*pi; return O; } void main( ) { krug k; k.unos( ); cout<<"O="<<k.obim( )<<endl; }

PRIJATELJI KLASA

Često je potrebno da se klasa projektuje tako da ima i “povlaštene“ korisnike, odnosno funkcije ili druge klase koje imaju pravo pristupa njenim privatnim članovima. Takve funkcije i klase nazivaju se prijateljima(friends). Prijateljske funkcije: -unutar deklaracije klase moguće je izvjesne obične funkcije (koje nisu funkcije članice klase) proglasiti prijateljima klase tako što se unutar deklaracije klase navade rezervisana riječ friend, a zatim prototip funkcije koju proglašavamo prijateljem. Ovim funkcija ne postaje funkcija članica (tj. i dalje se poziva kao obična funkcija), samo dobija pravo pristupa privatnim atributima klase.

Page 63: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 sledeće metode: dodela(), prikaz() i prijateljsku funkciju sabiranje(kom k1,kom k2) koja sabira dva kompleksna broja. #include<iostream.h> class kom {

private: int a,b; //realni i imaginarni dio kompleksnog broja public: void dodela(int x,int y); friend void sabiranje(kom k1,kom k2); //prijateljska funkcija void prikaz( );

}; void kom::dodela(int x,int y) { a=x; b=y; } //definicija prijateljske funkcije, u zagradi se piše ime klase i objekta te klase: void sabiranje(kom k1,kom k2) { int x=k1.a+k2.a; int y=k1.b+k2.b; cout<<x<<"+j"<<y<<endl; } void kom::prikaz( ) { cout<<this->a<<"+j"<<this->b<<endl; } void main( ) { char u='j'; //imaginarna jedinica kom A,B; //A i B su objekti klase kom A.dodela(4,3,u); B.dodela(3,4,u); cout<<"prvi kompleksni broj je: A="; A.prikaz(); cout<<"drugi kompleksni broj je: B="; B.prikaz(); cout<<"zbir kompleksnih brojeva je: Z="; sabiranje(A,B); //poziv prijateljske funkcije, u zagradi se prikazuju objekti }

Page 64: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

64

Vježba: -u klasu kom dodajte:

još jednu prijateljsku funkciju koja računa modul kompleksnog broja: modul(kom k), imaginarnu jedinicu predstavite kao statički član (static char c[ ] )

Prijateljske klase

Ako je potrebno da sve funkcije članice klase krug budu prijateljske funkcije klasi kvadrat, onda se klasa krug deklariše kao prijateljska klasa (friend class krug) klasi kvadrat.Tada sve funkcije članice klase krug mogu da pristupaju privatnim članovima klase kvadrat. class kvadrat { friend class krug; //… };

Prijateljske klase se obično koriste kada neke dvije klase imaju bliže međusobne veze. Prijateljstvo nije simetrično, ako je klasa krug prijatelj klasi kvadrat to ne znači da je klasa kvadrat

prijatelj klasi krug. Prijateljsvo nije tranzitivna relacija, ako je klasa krug prijatelj klasi kvadrat, a klasa trougao prijatelj

klasi krug, klasa trougao nije prijatelj klasi kvadrat, već to mora eksplicitno da se naglasi(ako je potrebno).

Primjer: Napisati dvije međusobno prijateljske klase: krug i kvadrat koje računaju površine kruga i kvadrata koji opisuje krug. #include<iostream.h> #include<math.h> class kvadrat; class krug {

private: double r; static double pi; public: friend class kvadrat; //klasa kvadrat je prijatelj klasi krug void dodela(double a){r=a;}; double pov(){return pow(r,2)*pi;}; void Ukvadratu(kvadrat kv); //metoda koja se obraća klasi kvadrat

}; double krug::pi=3.14159; //definicija statičkog člana

Page 65: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 obraća 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 obrača se klasi krug cout<<kr.pov()<<endl; cout<<kva.pov()<<endl;

}

KONSTRUKTORI U C++ se inicijalizacija i uništavanje objekata lako izvršavaju pomoću konstruktora i destruktora. Ove specijalne funkcije članice kontrolišu kako se objekat pravi ili uništava. Konstruktor je funkcija koja konstruiše objekat U programu, instanciranje objekta uvjek podrazumjeva rezervisanje dovoljne količine memorije za smještanje podataka o stanju objekta. Specijalni metod koji rezerviše memoriju za nove primjerke objekata se naziva konstruktor. Pored rezervacije memorije, konstruktor može da bude proširen uključivanjem i drugih procesa kao što je inicijalizacija stanja objekta.

Page 66: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

66

Konstruktor objekta u C++ ima tri važna aspekta: Uzima isto ime kao i klasa Može da ima argumente Ne može da vrati vrednost

Postoje tri osnovna tipa konstruktora:

1. podrazumjevani (default) konstruktor 2. konstruktor sa parametrima (korisnički definisani konstruktor) 3. konstruktor kopije (copy konstruktor, za prepis vrjednosti)

Podrazumjevani konstruktor Ovaj konstruktor ne poseduje parametre, i ne vrši nikakvu drugu akciju sem zauzeća memorije. Svaka klasa ima, ili bi bar trebalo da ima, podrazumjevani konstruktor (konstruktor bez argumenata).

Ako u klasi nije definisan nijedan konstruktor, prevodilac će dodati podrazumjevani konstruktor. To je skriveni konstruktor i nije neka složena fukcija; on inicijalizuje sve podatke članove vrjednošću nula.

Ako se vratite i deklaraciji klase dodate konstruktore, podrazumjevani konstruktor koji je napravio prevodilac jednostavno će nestati- više ga neće biti.

Uvjek navedite podrazumjevani konstruktor, čak i kada on ništa ne radi. Tako ćete se osigurati da podrazumjevani konstruktor ne nestane ako se vratite i dodate druge konstruktore u program Primjer:

#include<iostream> #include<math.h>

class kvadrat { private: int stranica; public: kvadrat( ) {stranica=0; } //podrazumjevani konstruktor int povrsina( ){ return pow(stranica,2); } void izlaz( ) { cout<<"a="<<stranica<<endl;

cout<<"P="<<povrsina()<<endl; }

}; int main( ) { kvadrat k1; //poziv podrazumjevanog konstruktora k1.povrsina( ); k1.izlaz( ); return 0; }

Page 67: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

67

Vježba: Klasi kvadrat dodati metodu preuzmi() koja stranici dodjeljuje vrednost, a u glavnom programu kreirajte novi objekat k2 i pozovite metodu preuzmi(), povrsina() i izlaz(). #include<iostream> #include<math.h> using namespace std; class kvadrat{ private: int stranica; public: kvadrat( ) {stranica=0;} void preuzmi(int a ) {stranica=a;} int povrsina( ) {return pow(stranica,2);} void izlaz( ) { cout<<"a="<<stranica<<endl; cout<<"P="<<povrsina()<<endl;} }; int main( ) { kvadrat k1; k1.povrsina( ); k1.izlaz( ); kvadrat k2; k2.preuzmi(5); k2.povrsina( ); k2.izlaz( ); return 0;}

Konstruktor sa parametrima (korisnički definisani konstruktor)

Preko podrazumjevanog konstruktora nije moguće prenjeti bilo kakav parametar, niti izvršiti poziv bilo kojeg drugog procesa kao što je inicijalizcija vrjednosti atributa. Ovakav postupak se može izvesti pisanjem korisnički definisanih konstruktor metoda, koje sadrže argumente. Moguće da postoji više od jednog konstruktora u klasi. Time se obezbeđuje da se definišu različite verzije sa razlikom u parametrima. Konstruktori sa parametrima se izvršavaju ukoliko se prilikom deklaracije odgovarajućeg objekta u zagradama navedu parametri koje treba proslijediti u konstruktore. #include<iostream.h> class pravougaonik { private: int a,b; public: pravougaonik(){a=0;b=0;} //podrazumjevani konstruktor pravougaonik(int x,int y){a=x;b=y;} //konstruktor sa parametrima pravougaonik(int c){a=c;b=0;}; //konstruktor sa parametrima

Page 68: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<<"stranice su: "<<endl; cout<<"\t\t"<<"a="<<a<<endl; cout<<"\t\t"<<"b="<<b<<endl; cout<<"povrsina je:"<<"P="<<povrsina( )<<endl; } }; void main( ) { pravougaonik p1; //pozivanje prvog konstruktora p1.postavi(3,4); p1.povrsina( ); p1.ispisi( ); pravougaonik p2(4,5); //pozivanje drugog konstruktora long pov=p2.povrsina(); cout<<”P=”<<pov; pravougaonik p3(7); //pozivanje trećeg konstruktora p3.povrsina( ); p3.ispisi( ); } Vježba: Klasi pravougaonik dodajte metodu: void obim() i void dijagonala() i iste pozovite za kreirane objekte

Konstruktor kopije

Kada se objekat k1 inicijalizuje drugim objektom k2 iste klase, C++ će podrazumjevano (ugrađeno) izvršiti prostu inicijalizaciju redom članova objekta k1 članovima objekta k2. To ponekad nije dobro (često ako objekti sadrže članove koji su pokazivači ili reference), pa programer treba da ima potpunu kontrolu nad inicijalizacijom objekta drugim objektom iste klase. Za ovu svrhu služi tzv. konstruktor kopije. To je konstruktor klase „broj” koji se može pozvati sa samo jednim stvarnim argumentom tipa „broj”. Taj konstruktor se poziva kada se objekat inicijalizuje objektom iste klase ( pomoću znaka = ili sa zagradama ). Konstruktor kopije nikad ne smje imati formalni argument tipa „broj” , a može argument tipa broj & ili najčešće const broj &. #include<iostream.h> class broj{ int re, im;

Page 69: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<<re<<"+j"<<im<<endl; } broj(broj &z){ definicija re=z.re+2; kopi konstruktora im=z.im*3; } }; void main( ) { broj k1; k1.postavi(3,4); k1.prikazi( ); broj k2=k1; // poziv kopi konstruktora cout<<"drugi broj je:"; k2.prikazi( ); } Parametar kopirnog konstruktora je referenca već postojećeg objekta. U tijelu ovog kopirnog konstruktora kopira se vrijednost svih članskih promjenjivih postojećeg objekta u promjenjve deklarisanog objekta. Zadatak: //Napisati klasu: “kbroj” koja predstavlja kompleksni broj. U javnom dijelu deklarisati - podrazumjevani konstruktor, - metodu postavi, - metodu prikazi, - prijateljsku funkciju sabiranje. Uglavnom programu kreirati dva kompleksna broja (objekta)k1 i k2(k2=k1) pomoću kopi konstruktora a

zatim pozovi sve metode

#include<iostream.h> class broj{ int re; int im; public: broj(){re=0;im=0;} void postavi(int r,int i){

Page 70: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

70

re=r; im=i;} void prikazi(){cout<<re<<"+j"<<im<<endl;} int rea(int a){return re=a;} broj(const broj &z); }; broj::broj(const broj &z){ re=z.re+2; im=z.im*3; } void main(){ broj k1; k1.postavi(3,4); k1.prikazi(); broj k2=k1; cout<<"drugi broj je:"; k2.prikazi(); k2.rea(7); k2.prikazi(); } //Napisati klasu kbroj koja predstavlja kompleksni broj.U javnom dijelu deklarisati //podrazumjevani konstruktor,metode postavi i prikazi,prijateljsku funkciju sabiranje. //Uglavnom programu kreirati dva k.broja(objekta) k1 i k2(k2=k1) pomocu kopi konstruktora a //zatim pozovi sve metode. #include<iostream.h> #include<math.h> class broj{ double re; double im; public: broj(){re=0;im=0;} broj (double a,double b); void prikazi(); void friend sab(broj d1,broj d2); double modul(); double argument(); }; broj::broj(double a,double b){ re=a; im=b;} void broj::prikazi(){ cout<<re<<"+j"<<im<<endl;} void sab(broj d1,broj d2){ double x=d1.re+d2.re; double y=d1.im+d2.im;

Page 71: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

71

cout<<x<<"+j"<<y<<endl;} double broj::modul( ) { return sqrt(pow(re,2)+pow(im,2));}; double broj::argument( ) { return atan2(im,re);} void main(){ broj k1(1,sqrt(3)); cout<<"k1="; k1.prikazi( ); broj k2=k1; cout<<"k2="; k2.prikazi( ); cout<<"k1+k2="; sab(k1,k2); cout<<"|k1|="; cout<<k1.modul()<<endl; cout<<"argument za k1:"<<k1.argument( )*57.3<<endl; }

DESTRUKTOR Ukoliko nam neki objekti više nisu potrebni, preporučljivo je njihovo brisanje kako bi oslobodili što više memorijskog prostora.To se radi pomoću specijalne metode – destruktora. Destruktor je zadužen za “red i mir” u programu.

• Klasa može imati samo jedan destruktor.

• Destruktor nema argumenata i nikad ne vraća vrednost.

• Ime destruktora se sastoji od znaka ~ i imena klase: ~broj( )

• Destruktor se automatski poziva kada objekt jedne klase gubi svoju važnost.

#include<iostream.h> #include<math.h> class trougao{ private: double a,b; public: trougao(){a=0;b=0;} // podrazumjevani konstruktor trougao(double x,double y){a=x;b=y;} //konstruktor sa parametrima double hipo(){return sqrt(pow(a,2)+pow(b,2));} double obim(){return a+b+hipo();} double pov(){return a*b/2;} ~trougao(){ definicija cout<<"sada je objekat unisten!"<<endl;} destruktora };

Page 72: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

72

void main(){ trougao t1(3,4); //poziv konstruktora sa parametrima cout<<"c="<<t1.hipo()<<endl; cout<<"O="<<t1.obim()<<endl; cout<<"P="<<t1.pov()<<endl; }

#include<iostream.h> #include<math.h> class kom { private: int a,b; //realni i imaginarni dio kompleksnog broja static char c[]; //imaginarni operator public: kom(int x=0,int y=0); //konstruktor friend void sabiranje(kom k1,kom k2); //prijateljska funkcija void prikaz(); friend double modul(kom k); ~kom(); //destruktor }; char kom::c[]="j"; kom::kom(int x,int y) { a=x; b=y; } double modul(kom k){ return sqrt(pow(k.a,2)+pow(k.b,2));} void sabiranje(kom k1,kom k2) { int x=k1.a+k2.a; int y=k1.b+k2.b; cout<<x<<"+"<<k2.c<<y<<endl; } void kom::prikaz() { cout<<this->a<<"+"<<c<<this->b<<endl; } kom::~kom(){ cout<<"objekat se oprasta od programa!!"<<endl;} void main(){ kom A(3,4),B(6,8); //poziv konstruktora cout<<"prvi kompleksni broj je: A="; A.prikaz();

Page 73: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

73

cout<<"drugi kompleksni broj je: B="; B.prikaz(); cout<<"zbir kompleksnih brojeva je: Z="; sabiranje(A,B); cout<<endl; cout<<"\n\nModul kompl.broja A je:"<<modul(A)<<endl; cout<<"\n\nModul kompl.broja B je:"<<modul(B)<<endl; }

Preklapanje operatora

C++ ne dozvoljava kreiranje novih operatora, ali dozvoljava postojećim operatorima preklapanje kada se koriste sa novim tipom. Preklapanje operatora nije automatsko, operator mora pisati operator funkcije za izvršavanje željenih operacija. Funkcije za preklapanje operatora mogu biti funkcije članice klase (member functions) i funkcije koje nisu članice klase (nonmember) i koje su u tom slučaju friend funkcije. U programskom jeziku C++ postoji nešto što se zove operatorska funkcija i ona je uvijek oblika “operator @()”, gdje je @ operator koji ta operatorska funkcija obrađuje. Operatorske funkcije se mogu preklapati na dva načina: kao prijateljske funkcije klase ili kao metode klase. Pored toga povratna vrijednost i broj parametara operatorske funkcije zavisi od tipa operatora: unarni i binarni. Pretpostavimo da su nam u programu potrebni kompleksni brojevi i operacije nad njima. Treba nam struktura podataka koja će, pomoću osnovnih (u jezik ugrađenih) tipova,predstaviti strukturu kompleksnog broja, a takođe i funkcije koje će realizovati operacije nad kompleksnim brojevima. #include<iostream.h> #include<math.h> class kom{ private: double re,im; char *g; public: kom(double a=0,double b=0) {re=a;im=b;} //sledi operatorska funkcija: friend kom operator+(kom a1,kom b1) { kom k(0,0); k.re=a1.re+b1.re; k.im=a1.im+b1.im; return k; }

Page 74: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

74

void prikaz( ){ if (im>0) g="+j"; else g="-j"; cout<<re<<g<<fabs(im)<<endl;} ~kom( ) { }; }; void main( ) { kom A(3,-14), B(-6,8); kom C=A+B; C.prikaz( ); }

Napisati dvije operatorske funkcije (kao prijateljske) koje vrše sabiranje i oduzimanje dva kompleksna broja u klasi “kom”.

#include<iostream.h> #include<math.h> class kom{ private: double re,im; char *g; //imagin.jedinica public: kom(double a=0,double b=0) {re=a;im=b;} //sledi operatorska funkcija: friend kom operator+(kom a1,kom b1) { kom k(0,0); k.re=a1.re+b1.re; k.im=a1.im+b1.im; return k; } void prikaz() { if (im>0) g="+j"; else g="-j"; cout<<re<<g<<fabs(im)<<endl; } ~kom( ){ }; };

void main( ) { kom A(3,-14), B(-6,8); kom C=A+B; // -3-j6 C.prikaz(); }

Page 75: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

75

Operatori new i delete Operatorske fukcije new i delete su statičke funkcije članice ( čak i ako nisu tako deklarisane). Razlog: one se pozivaju pre nego što je objekat stvarno kreiran, odnosno pošto je uništen. Unutar tjela ovih operatorskih funkcija ne treba pozivati konstruktor, odnosno destruktor. Konstruktor se poziva posle operatorske funkcije new. Destruktor se poziva pre operatorske funkcije delete. Ove operatorske funkcije služe samo da obezbede prostor za smeštanje objekta i da ga posle oslobode. U glavnom programu prvo se deklariše pokazivač na objekat klase krug:

krug *d; a zatim kreiramo objekat pomoću operatora new:

d=new krug(5); //dinamičko kreiranje objekta Operator new služi za dinamičko alociranje memorije.Tako kreirani objekti se nazivaju dinamički objekti. Kada više nisu potrebni ovi objekti, treba izvršiti dealokaciju memorije.To se ostvaruje pomoću operatora delete:

delete d; Djelovanje operatora delete se odvija u dva koraka.Prvo se vrši poziv destruktora objekta, a zatim se prethodno zauzeta memorija dealocira i označava kao slobodna za ponovno korištenje.Nakon izvršene dealokacije vrijednost pokazivača d je neodređena. Rezervisana memorija pomoću new operatora ( dinamičko dodjeljivanje memorije) zahtijeva da se ponovo oslobodi ( pomoću operatora delete )

#include<iostream.h> class pravougaonik { private: int a,b; public: //slede deklaracije metoda: pravougaonik( ); pravougaonik(int x,int y); void obim( ); void pov( ); ~pravougaonik( ); }; //slede definicije metoda: pravougaonik::pravougaonik( ) { a=0;b=0; } pravougaonik::pravougaonik(int x,int y) { a=x;b=y; }

Page 76: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

76

void pravougaonik::obim( ) { cout<<"O="; cout<<2*(a+b)<<endl; } void pravougaonik::pov( ) { cout<<"P="; cout<< a*b<<endl; } pravougaonik::~pravougaonik( ) { cout<<“brisanje objekta"<<endl; } void main( ) { //deklaracija pokazivača p1: pravougaonik *p1; //kreiranje objekta: p1=new pravougaonik(4,5); p1->obim( ); p1->pov( ); delete p1; }

Page 77: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

77

II polugodiste

NASLEĐIVANJE I IZVEDENE KLASE

Jedan od najvažnijih mehanizama u objektno orijentisanim programskim jezicima je nasleđivanje klasa. Nasleđivanje podrazumeva mogućnost da se nova klasa opiše na osnovu neke postojeće uz zadržavanje svih njenih svojstava i dodavanja novih atributa i metoda. Pomoću mehanizma nasleđivanja definiše se izvedena klasa na osnovu jedne ili više baznih klasa. Ako je klasa „B“ nasledila klasu „A“, kaže se da je klasa „A“ osnovna klasa, a klasa „B“ izvedena klasa. Može se reći i da je klasa „A“ nadklasa, a klasa „B“ podklasa, ili da je klasa „A“ roditelj a klasa „B“ dete. Da bi se klasa izvela iz postojeće klase, nije potrebno menjati postojeću klasu, niti je ponovo prevoditi. Izvedena klasa se deklariše navođenjem reči public i naziva osnovne klase, iza znaka : ( dvotačka ). Nasljeđivanje je korisno u slučaju kada se pomoću osnovne klase može izvesti više klasa. Primjer klasa Poligon može biti osnovna klasa za definiciju klasa Pravougaonik i Trougao. U klasi Poligon možemo deklarisati članove koji su zajednički za klasu Trougao i Pravougaonik. To su širina i visina poligona. U klasama Pravougaonik i Trougao, koje su izvedene klase, definisat ćemo funkciju kojom se računa površina poligona – Povrsina( ). #include<iostream.h> class poligon { protected: int visina,sirina; public: 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<<"a="<<sirina<<endl; osnovne klase cout<<"b="<<visina<<endl;

Pravougaonik Trougao

Poligon

Page 78: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<<"P="<<t1.povrsina( )<<endl; pravougaonik p1; p1.postavi(3,5); p1.ispisi( ); cout<<"P="<<p1.povrsina( )<<endl; } Atribute sirina i visina deklarisali smo koristeći rezervisanu reč - specifikator protected. Taj specifikator ima sličnu namjenu kao i specifikator private, u smislu da se protected članovi ne mogu koristiti kao javni članovi. Razlika specifikatora private i protected je u tome što se protected članovi mogu koristiti u izvedenim klasama, a private članovi se mogu koristiti samo u klasi u kojoj su deklarisani. Rezervisane reči public, private i protected se koriste i kao specifikatori tipa naslijeđivanja. U našem primjeru, klase Pravougaonik i Trougao su deklarisane s oznakom naslijeđivanja tipa public, tj. class Pravougaonik: public Poligon; class Trougao: public Poligon; Riječ public označava da specifikatori pristupa varijablama iz osnovne klase vrijede i u izvedenim klasama. Ponekad se za specifikator naslijeđivanja koriste riječi private ili protected. U tom slučaju se mijenja značaj pristupa članovima temeljne klase na način da specifikator naslijeđivanja određuje minimalnu razinu pristupa članovima koji su definirani u temeljnoj klasi.

Page 79: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

79

Pravo pristupa prema tipu naslijeđivanja prikazano je u slijedećoj tablici:

Pravo pristupa u osnovnoj klasi Tip nasljeđivanja

public protected private public protected private

public protected private

protected protected private

private private private

Ako se nasljeđivanje vrši s protected ili private, tada se ne može javno pristupiti članovima koji su u osnovnoj klasi deklarirani kao public. Ukoliko se ne označi način naslijeđivanja, podrazumjeva se da izvedena klasa ima private specifikator naslijeđivanja. Šta se sve nasljeđuje iz osnovne klase? U pravilu, iz osnovne se klase nasljeđuju sve članske funkcije i promjenjive osim: • konstruktora i destruktora • operatora = • prijateljskih funkcija i klasa #include <iostream> using namespace std; class Poligon { protected: int sirina, visina; public: void postavi (int a, int b) { sirina=a; visina=b;} int Sirina() {return sirina;} int Visina() {return visina;} }; class Pravokutnik: public Poligon { public: int Povrsina (void) { return (sirina * visina); } }; class Trokut: public Poligon { public: int Povrsina (void) { return (sirina * visina / 2); } }; int main () { Pravokutnik pr; Trokut tr; pr.postavi (4,5); tr.postavi (4,5); cout << pr.Povrsina() << endl; cout << tr.Povrsina() << endl; return 0;

Page 80: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

80

} Kada je nasleđivanje javno to znači da svi nasleđeni članovi zadržavaju isti nivo pristupa. Ako je vrsta nasleđivanja zaštićena (protected), tada oni članovi koji su bili javni (public) ili zaštićeni (protected) postaju zaštićeni.Privatni članovi bazne klase uopšte ne postoje u izvedenoj klasi, tj. iako se fizički (na nivou implementacije) nasleđuju, logički možemo reći da se ne nasleđuju (ne možemo im pristupiti iz izvedene klase). Ako je vrsta nasleđivanja privatna (private) tada sve što je nasleđeno postaje privatno.

Konstruktori i destruktori izvedenih klasa U izvdenoj klasi treba deklarisati samo atribute ili metode koje dodajemo. Svi ostali atributi i metode prosto se nasleđuju iz osnovne klase. Po pravilu, iz osnovne se klase nasljeđuju sve članske funkcije i atributi osim: • konstruktora i destruktora • operatora = • prijateljskih funkcija i klasa Ukoliko je osnovna klasa posjedovala konstruktore, izvedena klasa ih mora ponovo definisati. Razlog za ovo je činjenica da su konstruktori namjenjeni da inicijaliziraju elemente objekta, a objekti nasljeđene klase gotovo uvijek imaju dodatne atribute koje konstruktori osnovne klase ne mogu da inicijaliziraju ( s obzirom da ne postoje u osnonoj klasi). Konstruktor izvedene klase gotovo uvijek treba da odradi sve što je radio i konstruktor osnovne klase, a nakon toga da odradi akcije specifične za izvedenu klasu. Prilikom kreiranja objekta izvedene klase, poziva se konstruktor te klase, ali i konstruktor osnovne klase Da bismo izbjegli potrebu za prepisivanjem koda, konstruktor izvedene klase gotovo po pravilu treba da pozove konstruktor osnovne klase. To se radi navođenjem imena osnovne klase i argumenata poziva konstruktora osnovne klase. #include <iostream> #include<string>

Page 81: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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<<"\nStudent "<<ime_i_prezime ; cout<<" ima index: "<<broj_indexa;} ~Student( ) { cout<<"pozvan destruktor osnovne klase"<<endl;} }; class DiplomiraniStudent: public Student { private: int god_dipl; public: DiplomiraniStudent (string ip, int bi,int gd) : Student(ip,bi) {god_dipl=gd;} void ispisi( ) { Student::ispisi( ); cout<<" diplomirao je "<<god_dipl<<" godine"<<endl;} ~DiplomiraniStudent( ) { cout<<"pozvan destruktor izvedene klase"<<endl;} }; int main ( ) { Student s1("Marko Markovic",523); DiplomiraniStudent ds1("Petar Petrovic",234,2003); s1.ispisi( ); ds1.ispisi( ); return 0; } Pri kreiranju objekta izvedene klase redosled poziva konstruktora je sledeći: . prvo se poziva konstruktor osnovne klase a zatim konstruktor izvedene klase Pri uništavanju objekta, redosled poziva destruktora je uvek obratan.

POLIMORFIZAM

Polimorfizam u objektno orjentisanom programiranju označava manipulaciju različitim oblicima a dopušta se atributima i funkcijama u programu da se ponašaju različito u različitim kontekstima. Polimorfizam predstavlja mogućnost da se atributi i metode koji se koriste ponašaju dvosmisleno, tako da njihovo značenje zavisi od konteksta. C++ obezbeđuje tri različita tipa polimorfizma: virtualne (virtuelne) funkcije, preopterećivanje (engl.

Page 82: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 specifično za svaku izvedenu klasu, nazivaju se virtuelne funkcije (engl. virtual functions). ∗ Virtuelna funkcija se u osnovnoj klasi deklariše pomoću ključne reči virtual na početku deklaracije. Prilikom definisanja virtuelnih funkcija u izvedenim klasama ne mora se stavljati reč virtual, ali se to preporučuje radi povećanja čitljivosti i razumljivosti programa. ∗ Prilikom poziva odaziva se ona funkcija koja pripada klasi kojoj i objekat koji prima poziv. ∗ U izvedenoj klasi u kojoj virtuelna funkcija nije definisana, važi značenje te virtuelne funkcije iz osnovne klase. ∗ Deklaracija neke virtuelne funkcije u svakoj izvedenoj klasi mora da se u potpunosti slaže sa deklaracijom te funkcije u osnovnoj klasi (broj i tipovi argumenata, kao i tip rezultata). #include<iostream> #include<string> #include<math.h> using namespace std; const double pi=3.1415; class poligon{ protected: string naziv; float sirina,visina; public: poligon( ){ } poligon(string n,float a,float b) { naziv=n;sirina=a;visina=b;} virtual float povrsina( ){return 0;} virtual float obim( ){return 0;} void ispisi(){ cout<<"ime poligona je: "<<naziv; cout<<"\tpovrsina je P="<<povrsina(); cout<<"\tobim je O="<<obim()<<endl;} ~poligon (){cout<<"poligon"<<endl;} }; class krug:public poligon { private: float r; public: krug( ){} krug(string n,float R){ naziv=n;r=R;} virtual float povrsina( ){ return (pow(r,2)*pi);} virtual float obim( ){ return 2*r*pi;}

Page 83: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

PROGRAMIRANJE I PROGRAMSKI JEZICI C++ IIIe2, IIIe3

Dragana T. školska: 2009 / 2010

83

~krug( ){cout<<"krug"<<endl;} }; class trokut :public poligon{ public: trokut( ){} trokut(string n,float a,float b):poligon(n,a,b){ } virtual float povrsina( ){ return sirina*visina/2;} virtual float obim( ){return 2*(sirina+visina);} ~trokut(){cout<<"trokut"<<endl;} }; void main(){ krug k1("krug",10); trokut t1("trokut",4,5); k1.ispisi( ); t1.ispisi( ); }

Apstraktne klase

Virtualna funkcija koja nije definisana za osnovnu klasu naziva se čistom virtualnom funkcijom. Deklaracija čiste virtualne funkcije u osnovnoj klasi sadrži umjesto tjela =0

Klasa koja sadrži barem jednu čistu virtualnu funkciju naziva se apstraktnom klasom. Apstraktna klasa ne može imati objekte ( instance ), već se iz nje samo mogu izvoditi druge klase.

Mogu da se formiraju pokazivači i reference na apstraktnu klasu. Pokazivači i reference na apstraktnu klasu mogu da ukazuju samo na objekte izvedenih konkretnih

klasa.

Apstraktna klasa predstavlja samo generalizaciju izvedenih klasa. Primjer: Napisati apstraktnu klasu lik koja sadrži čisto virtualne funkcije : void pov ( ) i double obim ( ) #include<iostream.h> class lik { protected:

Page 84: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 << " lik \ n " ; } };

class pravougaonik : public lik { public: pravougaonik ( float x, float y ) : lik ( x, y ) { } void pov ( ) { cout << " P = " << a*b << endl ; } double obim ( ) { return 2*(a+b) ; } ~ pravougaonik ( ) {cout << " p " << endl ; } }; void main ( ) { lik *z1 = new pravougaonik ( 5,6 ) ; z1 -> pov ( ) ; cout << " O = " ; cout << z1 -> obim ( ) << endl ; delete z1 ; } Zadatak : Napisanom programu dodati :

u osnovnu klasu funkciju ispisi izvedene klase : kvadrat, pravougli_trougao i krug.

Višestruko nasleđivanje

Kada klasa nasleđuje više osnovnih klasa radi se o višestrukom nasleđivanju ( engl. multiple

inheritance ). Primjer: konj je životinja, ali je i prevozno sredstvo. Pri tome ni životinja nije vrsta prevoznog

sredstva, ni obrnuto. Izvedena klasa konj se deklariše kao naslednik više osnovnih klasa ( prev_sred i zivotinja ), tako što se

u zaglavlju deklaracije navode osnovne klase: class konj : public prev_sred, public zivotinja { Ispred svake osnovne klase treba da stoji reč public, da bi izvedena klasa nasleđivala prava pristupa

članovima. Sva navedena pravila o nasleđenim članovima važe i ovde. Konstruktori osnovnih klasa se pozivaju pre konstruktora članova izvedene klase i konstruktora

Page 85: Osnove objektno orijentisanog programiranja Microsoft ...draganato.webs.com/materijali/C++/Skripta progr.i progr. jez. C++.pdf · Osnove objektno orijentisanog programiranja Microsoft

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 izvršavaju na kraju, posle destruktora izvedene klase i destruktora

članova. # include < iostream > # include < string > using namespace std; class prev_sred { protected: string vrsta; //zivotinja,biciklo,automobil... int v; //brzina public: prev_sred ( string vr, int brz ) { vrsta=vr; v=brz; } int sredb ( ) { return v; } ~ prev_sred ( ) { cout << " prevozno sredstvo " << endl; } }; class zivotinja { protected: string vrsta_z; //konj,pas,.. public: zivotinja ( string v_z ) { vrsta_z = v_z; } void hrana ( ) { cout << " biljojed " << endl; } ~zivotinja ( ) { cout << " zivotinje " << endl; } }; class konj:public prev_sred, public zivotinja { private: string vrsta_k; public: konj ( string vr_v, int br1, string v_z1, string v_k1) :prev_sred ( vr_v, br1 ), zivotinja ( v_z1 ) { v_k1 = vrsta_k; } ~konj ( ) { cout << "konj" << endl; } }; void main ( ) { konj k1 ( " zivotinja ", 30, " konj ", " poni " ); cout << " srednja brzina: " << k1.sredb ( ) << endl; k1.hrana ( ) ; } Zadatak: Program preurediti tako da izlaz bude : prevozno sredstvo moze biti zivotinja, npr konj kao sto je poni koji ima srednju brzinu: 30 i pripada grupi: biljojeda