Prof. dr. sc. Damir Kalpi Prof. dr. sc. Vedran Mornar Prof. dr. sc. Kreimir Fertalj Doc. dr. sc. Gordan Gledec Dr. sc. Zvonimir Vanjak Dr. sc. Ivica Botiki, dipl. ing. Mr. sc. Boris Milainovi
1.11.2012
Creative Commons
slobodno smijete:
dijeliti umnoavati, distribuirati i javnosti priopavati djelo remiksirati preraivati djelo
U sluaju daljnjeg koritenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji nain da to uinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta mogue je odstupiti, ako dobijete doputenje nositelja autorskog prava. Nita u ovoj licenci ne naruava ili ograniava autorova moralna prava.
Tekst licencije preuzet je s http://creativecommons.org/.
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 2 / 55
1.11.2012
Fusiform Gyrus!
Algoritmi i strukture podataka, FER, 2008./09.
http://en.wikipedia.org/wiki/Fusiform_gyrus
1.11.2012 4 / 55
banke, osiguranja, trgovaki lanci dravna uprava poslovni sustavi zranih luka, sustavi u avionima Miller (1956)
-
Edsger Dijkstra (prvi raunarac u Nizozemskoj; autor pretee lanka A Case against the GO TO Statement)
-
The competent programmer is fully aware of the strictly limited size of his own scull; therefore, he approaches the programming task in full humility
1.11.2012 5 / 55
objektni pogled na svijet prati ovjekov prirodni nain razmiljanja sve je objekt! objekti su svuda oko nas:
kebap iz Istanbula orba iz Bukureta pudding iz Londona nockerln iz Salzburga croissant iz Pariza knedli iz Praga
Kategorizacija
kategorizacija
program koji razvijamo odnosi se na tzv. domenu svaka poslovna domena ima svoje objekte
fakultet: studenti, nastavnici, ispiti itd. ministarstvo: pismena, predmeti, zapisnici itd. Student mora sakupiti 50% bodova da bi proao ispit
1.11.2012
7 / 55
Struktura objekata
atribute (svojstva)
-
podatkovni dio objekata svaki objekt ima vlastite vrijednosti atributa operacije koje objekt nudi operacije se izvravaju nad objektom operacije mogu utjecati na atribute objekta
ponaanje
-
1.11.2012
8 / 55
Klase i objekti
Klasa VelikiStan
1.11.2012
9 / 55
Klasa
ATRIBUTI: nazivMarke nazivModela serijskiBroj kapacitet PONAANJE: prihvatiOdjeu() prihvatiDeterdent() ukljui() iskljui()
1.11.2012
10 / 55
Modeliranje
modeliranje (u raunarstvu)
proces kojim komadi stvarnog svijeta pojednostavljujemo prema vlastitim potrebama ATRIBUTI:
nazivMarke nazivModela serijskiBroj kapacitet
MODELIRANJE
KLASA PerilicaRublja
1.11.2012
11 / 55
Preciznost modela
ovisno o zahtjevima po nau aplikaciju, model moe biti manje ili vie precizan
ATRIBUTI:
nazivMarke nazivModela serijskiBroj kapacitet volumenBubnja motor vrstaMotora
ATRIBUTI:
nazivMarke nazivModela serijskiBroj kapacitet
KLASA PerilicaRublja
KLASA PerilicaRublja
PONAANJE:
PONAANJE:
prihvatiOdjeu() prihvatiDeterdent() ukljui() iskljui()
1.11.2012
12 / 55
Apstrakcija
modeliranje objekata tako da se koriste samo bitne komponente stvarnog objekta to znai bitno?
bitan ako modeliramo sustav u kojem biljeimo koliko je koja perilica oprala nebitan ako izraujemo program koji upravlja smjerom okretanja bubnja perilice
ATRIBUTI:
nazivMarke nazivModela serijskiBroj kapacitet volumenBubnja motor vrstaMotora
KLASA PerilicaRublja
1.11.2012
13 / 55
Simula (1967.) prvi programski jezik sa svojstvima objektno-orijentirane paradigme namijenjen izgradnji sustava za simulaciju uveden pojam klase / razreda Smalltalk (1972.) prvi pravi (isti) objektno-orijentiran programski jezik (sve je objekt) razvijen u laboratoriju Xerox PARC Smalltalk-80 je najkoritenija verzija C++ hibridni objektno-orijentirani jezik nastao iz C-a - ispoetka se zvao C s razredima (C with Classes) razvio ga je Bjarne Stroustrup (1983.) u Bell Labs poetna ANSI standardizacija dovrena je (tek) 1998., a 2003. je izdana standardna verzija s ispravljenim pogrekama trenutno se radi na razvoju novog standarda C++0x C++ je predak danas iroko koritenih jezika - Java, C# i VB.NET
1.11.2012
14 / 55
Hello World
C++ include<iostream.h> main(){
cout << Hello World ;
C include<stdio.h> main(){
printf(Hello World);
1.11.2012
15 / 55
U programskom jeziku C++ napraviti klasu Student koja sadri lansku varijablu id za pohranu identifikatora studenta. Klasa mora imati i metode pristupa lanskog varijabli SetId i GetId.
OOP_Student_1
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 16 / 55
OOP_Student1
1.11.2012
17 / 55
id je lanska varijabla klase Student lanske varijable koristimo kako bismo pohranili atribute objekata
SetId i GetId su metode klase Student metode koristimo kako bismo realizirali ponaanje objekata u primjeru su dane samo deklaracije metoda (nema tijela metoda, tj. nema programskih redaka)
18 / 55
class Student { int id; public: void SetId(int id); int GetId(); };
1.11.2012
lanske varijable imaju specifinu vrijednost za svaki objekt metode se definiraju na razini klase te svi objekti koriste iste metode
1.11.2012
19 / 55
metode SetId i GetId definirane su izvan klase Student operator odreivanja dosega (::) koristi se kako bi se naznailo da metode pripadaju klasi Student kljuna rije this predstavlja adresu aktualnog objekta
1.11.2012
20 / 55
Slanje poruka
objekti meusobno komuniciraju slanjem poruka slanje poruka zapravo je pozivanje metoda
1.11.2012
21 / 55
svim lanskim varijablama i metodama klase se moe bez ogranienja pristupati iz metoda unutar te klase pristup lanskim metodama i varijablama klase se moe ograniiti ako im se pristupa iz neke druge klase pristup se u C++ ograniava kljunom rijei private
ako se modifikator vidljivosti ne navede, pretpostavlja se private modifikator vidljivosti public specificira da nema ogranienja vidljivosti
}
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 22 / 55
Modifikatori vidljivosti
metode klasa (i struktura) u programskom jeziku C++ imaju tri modifikatora vidljivosti:
public lanske varijable i metode vidljive svim korisnicima (klijentima) koji imaju pristup klasi private lanske varijable i metode vidljive samo metodama klase u kojoj su definirane protected (jednom drugom prilikom)
s pomou modifikatora vidljivosti ograniava se pristup ograniavanje pristupa provodi se ve pri prevoenju programa
1.11.2012
23 / 55
javno suelje objekta predstavljaju javne metode javno suelje koristi se za komunikaciju s ostalim objektima/metodama javnim sueljem objekt izlae samo one lanske varijable/metode za koje smatra da trebaju biti vidljive ostatku svijeta
};
1.11.2012
24 / 55
Pristup objektu
metode objekta mogu pristupati svim lanskim varijablama i metodama klijenti mogu vidjeti samo javne lanske varijable i metode
Klijent
public
Objekt klase Student
SetId
GetId id
private
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 25 / 55
Uahurivanje
uahurivanjem (enkapsulacijom) klasa skriva neke atribute i neka ponaanja od ostalih klasa kako radi Hi-Fi audio sustav? tako dugo dok ureaj radi, nas to zapravo ni ne zanima!
1.11.2012
26 / 55
uahurivanjem se postie slaba povezanost objekata slabom povezanou objekti postaju neovisniji i interne promjene jednog objekta ne utjeu na rad drugog audio sustav, iako djeluje kao cjelina, sastavljen je od meusobno neovisnih i odvojivih komponenti ako se jedna komponenta pokvari, ostale i dalje nastavljaju s radom
1.11.2012
27 / 55
Student i uahurivanje
pretpostavimo da je uveden novi sustav dodjele identifikatora, ime su identifikatori postali znakovni nizovi i metode SetId i GetId trebale bi primati i vraati pokaziva na znakovni niz ali, to znai da se svi pozivi klijenata koji koriste navedene metode moraju mijenjati (uvesti tip char* umjesto tipa int)
Dolo je do izmjena u implementaciji (int -> char*), ali su pozivi metoda ostali isti
1.11.2012
28 / 55
Nasljeivanje
odnos izmeu klasa kod kojeg se jedna klasa stvara na temelju druge tako da joj se dodaju specifini atributi i ponaanje Vozilo:
Vozilo
Brzina Snaga Broj sjedeih mjesta
1.11.2012
29 / 55
Vieoblije (polimorfizam)
slina ponaanja razliitih klasa svaka klasa za sebe precizno definira zajedniko ponaanje klase: vrata, ormar, poklon
ponaanje: otvori()
1.11.2012
30 / 55
Asocijacija (povezanost)
meusobno povezani, jer daljinskim ureajem ukljuujemo televizor povezani su jednosmjerno, jer televizor ne moe slati poruke daljinskom ureaju ako oba objekta mogu slati poruke jedan drugome
SLANJE E-MAILA
1.11.2012
31 / 55
Asocijacija (povezanost)
1.11.2012
32 / 55
Agregacija (sadravanje)
1.11.2012
33 / 55
1.11.2012
34 / 55
Teorijska pitanja
objasnite to su to apstrakcija i enkapsulacija koja je razlika izmeu klasa i objekata? objasnite kako se dobrom definicijom javnog suelja ostvaruje uahurivanje to su to modifikatori vidljivosti?
ukratko objasnite svaki od njih kako odabirom modifikatora vidljivosti ostvarujemo uahurivanje?
1.11.2012
35 / 55
Ime (name) Prezime (tipa char*) (surname) Prosjena ocjena (float) (averageGrade)
SetName, GetName, SetSurname, GetSurname, SetGrade, GetGrade metodu ToString koja vraa niz znakova s informacijama o studentu u obliku Prezime, Ime (Id): Prosjena ocjena (npr. Ivo Ivi (1): 2,2)
1.11.2012
36 / 55
automatski
-
Stog
Automatski!
operatorom new
-
stvaranje
objekt
alokacija memorije za objekta stvaranje objekta koritenje objekta unitavanje objekta oslobaanje memorije
koritenje
objekt
Stog
unitavanje
bitovi
hrpa: delete()
oslobaanje
1.11.2012
37 / 55
destruktor
metoda koje se automatski poziva prilikom unitavanja objekta i koja ima isto ime kao i klasa, uz prefiks ~ klasa/objekt moe imati samo jedan destruktor ne moe imati ni povratne vrijednosti niti parametara namjena destruktora je oslobaanje resursa za koje nema smisla da budu zauzeti nakon to je objekt postao nepotreban
1.11.2012
38 / 55
Konstruktori i destruktori
class Student { Podrazumijevani konstruktor (bez int id; parametara) public: KONSTRUKTORI Student(){ this->id = 0; cout << "Constructing " << this->id << endl; } Student(int id) { this->id = id; cout << "Constructing " << this->id << endl; } ~Student(){ cout << "Destructing " << this->id << endl; } DESTRUKTOR int GetId() {return id;} };
OOP_Student_2
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 39 / 55
Student st2; stvara se objekt na stogu nakon stvaranja automatski se poziva podrazumijevani konstruktor Student st1(1); stvara se objekt na stogu nakon stvaranja poziva se konstruktor s parametrom int id. Student *st3 = new Student(2); stvara se objekt na gomili (heapu) nakon stvaranja automatski se poziva podrazumijevani konstruktor s parametrom int id. za stvaranje objekta treba definirati pokaziva i upotrijebiti operator new (objekt = pokaziva (4 byte) na stogu + memorija zauzeta na gomili) delete st3; unitavanje objekta poziva ga korisnik eksplicitno, koritenjem operatora delete
OOP_Student_2
40 / 55
Stvaram objekt s id=420 i imenom: Gogo Unistavam objekt s id=420 i imenom: Gogo
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012
OOP_student_3
41 / 55
ako na razini klase nije definiran ni jedan konstruktor, automatski se stvara podrazumijevani konstruktor s praznim tijelom ako na razini klase postoje definirani konstruktori, podrazumijevani se konstruktor nee automatski stvoriti destruktori se pozivaju redoslijedom obrnutim od redoslijeda poziva konstruktora destruktori se pozivaju kada objekt izae iz dosega ili kada se pozove delete
1.11.2012
42 / 55
operatorima new i delete stvaraju se i unitavaju objekti na gomili new i delete nisu namijenjeni iskljuivo za stvaranje i unitavanje objekata: predstavljaju proirenje mogunosti malloc i free type safe verzija tono se zna za kakav tip podatka se alocira memorija primjeri:
float int char *pFloat = new float; *pInt = new int[10]; *pString = new char[20];
} int main(){ Student vedran(420, "Vedran"); Student noviVedran = vedran; PohvaliStudenta(noviVedran); } Stvaranje objekta s id=420 Student s id=420 je dobio pohvalnicu! Unistavanje objekta s id=420; adresa name=9190080 Unistavanje objekta s id=420; adresa name=9190080 Program puca! Zato? Prilikom poziva operatora = te prilikom poziva funkcije sadraj objekta se kopira byte po byte. Nastaju tri razliita objekta (svaki na svojoj memorijskoj lokaciji) s istim sadrajem. vedran Id=420 Name={ADR} noviVedran Id=420 Name={ADR} student Id=420 Name={ADR}
Vedran
OOP_student_4
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 44 / 55
ako elimo kontrolirati nain na koji se objekt kopira, moemo definirati tzv. kopirajui konstruktor kopirajui konstruktor automatski se poziva kada se kopiranjem nekog objekta stvara novi
prilikom pridruivanja (operator =) prilikom poziva funkcije (objekt kao parametar funkcije)
1.11.2012
45 / 55
Prilikom svakog kopiranja objekta rezervira se posebni (novi) memorijski prostor za pohranu znakovnog niza! Tako desktruktori ne dolaze u konflikt i svaki oslobaa svoj memorijski prostor!
Stvaranje objekta s id=420 Kopiranje objekta s id=420 Kopiranje objekta s id=420 Student s id=420 je dobio pohvalnicu! Unistavanje objekta s id=420; adresa name=13599392 Unistavanje objekta s id=420; adresa name=13598992 Unistavanje objekta s id=420; adresa name=13580992
1.11.2012
46 / 55
stvaranje duboke kopije kopirajui konstruktor stvara u potpunosti novu kopiju objekta - za razred Student to znai alociranje nove memorije i preuzimanje elemenata znakovnog niza iz objekta predanog kopirajuem konstruktoru stvaranje plitke kopije stvara se novi objekt, ali on nastavlja dijeliti dio stanja s objektom na temelju kojega je nastao - za razred Student to znai da nakon stvaranja objekta i nakon poziva kopirajueg konstruktora postoje dva objekta koji pokazuju na istu memoriju (polje znakova) - doi e do problema kad se pozovu destruktori za ta dva objekta: prvi poziv destruktora proi e bez problema, ali kad se pozove destruktor za drugi objekt, pokuaj oslobaanja ve osloboene memorije uzrokovat e pogreku
1.11.2012
47 / 55
Primjeri:
razred Trokut: izgraditi razred Trokut koji e predstavljati koncept trokuta kao geometrijskog lika koji ima definiranu duljinu svake od tri stranice i ugraenu funkcionalnost za izraunavanje povrine i opsega trokuta
razred KompleksniBroj: izgraditi razred KompleksniBroj koji e predstavljati (matematiki) koncept kompleksnog broja. Razred mora sadravati dvije varijable koje e predstavljati realni i imaginarni dio i pruati funkcionalnost za obavljanje matematikih operacija s kompleksnim brojevima (zbrajanje, oduzimanje, mnoenje i dijeljenje) OOP_Trokut
OOP_KompleksniBroj
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 48 / 55
1.11.2012
void init_stog(Stog *stog){ stog->vrh = NULL; } int dodaj (tip element, Stog *stog) { ... } int skini (tip *element, Stog *stog) { ... }
klijent moe mijenjati izvedbu (svatko moe mijenjati varijablu vrh) - loe realizirano uahurivanje fukcije za inicijalizaciju stoga, dodavanje na stog i skidanje sa stoga odvojene su od strukture koja predstavlja stog klijent se mora brinuti o tome da pravovremeno pozove funkciju init_stog
1.11.2012
50 / 55
Privatna varijabla vrh pokazuje na element na vrhu stoga. Privatna metoda obrisiStog se koristi za pranjenje stoga
Javne metode klase su vidljive svim klijentima koji koriste objekte ove klase.
OOP_Stog
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 51 / 55
Metoda obrisiStog se poziva u destruktoru objekta klase Stog kako bi se oslobodila sva memorija koju stog zauzima (svi elementi skinuli sa stoga) Prilikom stvaranja objekta klase Stog potrebno je obaviti inicijalizaciju varijable vrh na NULL (poetno stanje). U destruktoru je potrebno osloboditi svu memoriju koju stog zauzima. To je najelegantnije napraviti pozivom funkcije obrisiStog.
int Stog::Dodaj (tip element) { atom *novi; if ((novi = (atom *) malloc(sizeof(atom))) != NULL) { novi->element = element; novi->sljed = this->vrh;
this->vrh = novi;
return 1; } else return 0; }
OOP_Stog
1.11.2012 52 / 55
Rad sa stogom
int main(){ Stog *stog = new Stog(); stog->Dodaj(3); stog->Dodaj(4); int element; stog->Skini(&element); delete stog; }
klijent smije koristiti samo javno suelje objekta (metode Dodaj i Skini) inicijalizacija objekta stog obavlja se automatski pri njegovom stvaranju u destruktoru se prije unitavanja objekta oslobaa sva zauzeta memorija
OOP_Stog
1.11.2012
53 / 55
U programskom jeziku C++ realizirati objektni red. Klasa Red mora imati javno suelje koje se sastoji od metoda Dodaj i Skini. Red mora biti realiziran jednostuko povezanom listom. Implementacija se mora sastojati od pokazivaa na ulaz i izlaz iz reda. Konstuktorom je potrebno obaviti inicijalizaciju reda, a destruktorom oslobaanje zauzete memorije.
OOP_Red
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 54 / 55
Koritenjem prethodno definiranih objektnih implementacija reda i stoga napisati funkciju koja sadraj stoga prepisuje u red. Poredak elemenata u odredinom nije bitan. Izraditi rekurzivnu i nerekurzivnu verziju funkcije.
1.11.2012
55 / 55