Anda di halaman 1dari 55

Algoritmi i strukture podataka

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

Zatieno licencom http://creativecommons.org/licenses/by-nc-sa/2.5/hr/

Creative Commons

slobodno smijete:
dijeliti umnoavati, distribuirati i javnosti priopavati djelo remiksirati preraivati djelo

pod sljedeim uvjetima:


imenovanje. Morate priznati i oznaiti autorstvo djela na nain kako je specificirao autor ili davatelj licence (ali ne nain koji bi sugerirao da Vi ili Vae koritenje njegova djela imate njegovu izravnu podrku). nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe. dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate koristei ga, preradu moete distribuirati samo pod licencom koja je ista ili slina ovoj.

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

Uvod u objektno-orijentirano programiranje u programskom jeziku C++

1.11.2012

Zato OOP? Zbog Fusiform Gyrus!

Fusiform Gyrus!
Algoritmi i strukture podataka, FER, 2008./09.

http://en.wikipedia.org/wiki/Fusiform_gyrus
1.11.2012 4 / 55

Zato OOP? Zbog ogranienosti mozga!

sloenost dananjih raunalnih sustava


banke, osiguranja, trgovaki lanci dravna uprava poslovni sustavi zranih luka, sustavi u avionima Miller (1956)
-

ogranienost ljudskog mozga

ovjek ne moe paralelno misliti o vie od 5 7 mentalnih entiteta

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

Algoritmi i strukture podataka, FER, 2008./09.

Objektni nain razmiljanja

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

to su svi ovi objekti? to im je zajedniko?


1.11.2012 6 / 55

Algoritmi i strukture podataka, FER, 2008./09.

Kategorizacija

kategorizacija

ovjeku prirodna stvar vjeba: kategorizirajte objekte na slikama!

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

opis jednog poslovnog pravila na fakultetu

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

7 / 55

Struktura objekata

svaki objekt ima:

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
-

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

8 / 55

Klase i objekti

koja je razlika izmeu objekta i klase?


Objekt klase VelikiStan

Klasa VelikiStan

Objekt klase MaliStan

Objekt klase VelikiStan

Objekt klase MaliStan Klasa MaliStan

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

9 / 55

Klasa

predloak za stvaranje objekata

ATRIBUTI: nazivMarke nazivModela serijskiBroj kapacitet PONAANJE: prihvatiOdjeu() prihvatiDeterdent() ukljui() iskljui()

Algoritmi i strukture podataka, FER, 2008./09.

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

PONAANJE: prihvatiOdjeu() prihvatiDeterdent() ukljui() iskljui()

Algoritmi i strukture podataka, FER, 2008./09.

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()

prihvatiOdjeu() prihvatiDeterdent() ukljui() iskljui() prihvatiOmekiva() pokreniCentrifugiranje()

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

12 / 55

Apstrakcija

modeliranje objekata tako da se koriste samo bitne komponente stvarnog objekta to znai bitno?

npr. perilica rublja serijskiBroj


-

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

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

13 / 55

Objektno orijentirani jezici

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

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

14 / 55

Hello World
C++ include<iostream.h> main(){
cout << Hello World ;

C include<stdio.h> main(){
printf(Hello World);

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

15 / 55

Zadatak: klasa Student

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

Klasa Student (C++)


Klasa Student
class Student { int id; public: void SetId(int id); int GetId(); }; void Student::SetId(int id){ this->id=id; } int Student::GetId(){ return this->id; }

Koritenje klase Student


int main(){ Student marko; marko.SetId(3); cout << marko.GetId(); return 0; }

OOP_Student1

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

17 / 55

Klasa Student (C++) lanske varijable i metode


class Student { int id; public: void SetId(int id); int GetId(); };

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(); };

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

Objekti, lanske varijable i metode

lanske varijable imaju specifinu vrijednost za svaki objekt metode se definiraju na razini klase te svi objekti koriste iste metode

Objekt Pero klase Student Id = 1 Metode Objekt Ivo klase Student

Klasa Student lanske varijable: Id Metode: GetId() SetId()

Id = 2 Metode Objekt Marko klase Student Id = 3 Metode

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

19 / 55

Klasa Student (C++) definicije metoda


class Student { int id; public: void SetId(int id); int GetId(); };
void Student::SetId(int id){ this->id=id; }

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

int Student::GetId(){ return this->id; }

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

20 / 55

Slanje poruka

objekti meusobno komuniciraju slanjem poruka slanje poruka zapravo je pozivanje metoda

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

21 / 55

Klasa Student (C++) koritenja objekata


class Student { int id; public: void SetId(int id); int GetId(); };
int main(){ Student student; student.SetId(3); student.id = 3; cout << student.id; return 0;

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

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

23 / 55

Javno suelje objekta

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

class Student { int id; public:


J void SetId(int id){ a v this->id=id; n o } s int GetId(){ u return this->id; e l } j e

};

Algoritmi i strukture podataka, FER, 2008./09.

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!

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

26 / 55

Uahurivanje i skrivanje informacija

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

Algoritmi i strukture podataka, FER, 2008./09.

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

class Student { char *id; public: void SetId(int id){


sprintf(this->id, %d, id);

} int GetId(){ return atoi(this->id); } };

Algoritmi i strukture podataka, FER, 2008./09.

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

Vozilo na elektrini pogon:


Napon Izvor napajanja

Vozilo na elektrini pogon

Vozilo na motorni pogon

Vozilo na motorni pogon:


Vrsta goriva Vrsta motora Veliina spremnika za gorivo

Algoritmi i strukture podataka, FER, 2008./09.

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()

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

30 / 55

Asocijacija (povezanost)

neki su objekti meusobno povezani npr. daljinski ureaj i televizor


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

dvosmjerna asocijacija (povezanost)

SLANJE E-MAILA

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

31 / 55

Asocijacija (povezanost)

dvosmjerna povezanost po vie kriterija


SURADNICI PRIJATELJI

jednosmjerna povezanost po vie kriterija

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

32 / 55

Agregacija (sadravanje)

objekt moe biti sastavljen od vie drugih objekata

npr. raunalo je sastavljeno od sredinje jedinice, monitora, mia, tipkovnice itd.

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

33 / 55

Zadatak 1 Zadatak 2 Zadatak 3 Zadatak 4 Zadatak 5 Zadatak 6 Zadatak 7 Zadatak 8

Algoritmi i strukture podataka, FER, 2008./09.

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?

ukratko objasnite nasljeivanje i polimorfizam

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

35 / 55

Zadatak za domau zadau

nadogradite klasu Student:


Uvedite nove privatne lanske varijable
-

Ime (name) Prezime (tipa char*) (surname) Prosjena ocjena (float) (averageGrade)

uvedite nove metode


-

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)

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

36 / 55

ivotni vijek objekata

objekte je mogue stvoriti:


automatski
-

Stog

Automatski!

objekt se smjeta na stog


alokacija
hrpa: new()

operatorom new
-

stvaranje
objekt

objekt se smjeta na gomilu (heap)

u oba sluaja postoje faze:

alokacija memorije za objekta stvaranje objekta koritenje objekta unitavanje objekta oslobaanje memorije

koritenje
objekt
Stog

unitavanje
bitovi
hrpa: delete()

oslobaanje

Pod kontrolom korisnika!

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

37 / 55

Stvaranje i unitavanje objekata

konstruktor (inicijalizacijski postupak)


metoda koje se automatski poziva prilikom stvaranja objekta i koja ima isto ime kao i klasa klasa/objekt moe imati vie konstruktora prilikom stvaranje objekta poziva se samo jedan konstruktor namjena konstruktora je inicijalizacija, tj. davanje poetnog stanja objektu

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

Algoritmi i strukture podataka, FER, 2008./09.

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

Stvaranje i unitavanje objekata na stogu


int main(){ Student vedran(1), damir; Student *kresimir = new Student(2); cout << "U gl. prog.: " << vedran.GetId() << endl; cout << "U gl. prog.: " << damir.GetId() << endl; cout << "U gl. prog.: " << kresimir->GetId() << endl; delete kresimir; return 0; } Stvaram objekt s Stvaram objekt s Stvaram objekt s U gl. prog.: 1 U gl. prog.: 0 U gl. prog.: 2 Unistavam objekt Unistavam objekt Unistavam objekt id=1 id=0 id=2

s id=2 s id=0 s id=1


1.11.2012

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

Algoritmi i strukture podataka, FER, 2008./09.

Namjena konstruktora i destruktora


class Student { U konstruktoru je zauzeta memorija int id; char* name; za pohranu imena public: Student(int id,char *name) { this->id = id; this->name =(char*) malloc(strlen(name) + 1); strcpy(this->name, name); cout << "Stvaram objekt s id=" << this->id << " i imenom: " << this->name << endl; } ~Student(){ cout << "Unistavam objekt s id=" << this->id << " i imenom: " << this->name << endl; free(this->name); } int getId() {return this->id;} U destruktoru je zauzetu memoriju }; potrebno osloboditi
int main(){ Student gordan(420, "Gogo"); }

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

Neke specifinosti konstruktora i destruktora

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

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

42 / 55

Operatori new i delete

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];

delete pFloat; delete [] pInt; delete [] pString;

za brisanje polja mora se koristiti operator delete [] OOP_new_delete


1.11.2012 43 / 55

Algoritmi i strukture podataka, FER, 2008./09.

Plitka kopija objekata (eng. shallow copy)


void PohvaliStudenta(Student student){
cout << "Student s id=" << student.getId() << " je dobio pohvalnicu!" << endl;

} 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

Znakovni niz se nalazi na adresi ADR

OOP_student_4
Algoritmi i strukture podataka, FER, 2008./09. 1.11.2012 44 / 55

Duboka kopija objekata (eng. deep copy)

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)

daje programeru priliku da inicijalizira novostvoreni objekt prije koritenja

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

45 / 55

Kopirajui konstruktor Studenta


class Student { ... Student(const Student &sourceObject) { this->id = sourceObject.id; this->name =(char*) malloc(strlen(sourceObject.name) + 1); strcpy(this->name, sourceObject.name); cout << "Kopiranje objekta s id=" << this->id << endl; } ... };
int main(){ Student vedran(420, "Vedran"); Student noviVedran = vedran; PohvaliStudenta(noviVedran); }

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

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

46 / 55

Dva naina kopiranja objekata

postoje dva naina kopiranja objekata

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

Algoritmi i strukture podataka, FER, 2008./09.

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

Objektni stog Objektni red

1.11.2012

Izvedba stoga strukturom


typedef int tip; struct at { tip element; struct at *sljed; }; typedef struct at atom; typedef struct{ atom *vrh; } Stog;

izvedba koju smo upoznali na prethodnim predavanjima neki nedostaci

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

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

50 / 55

Objektna implementacija stoga


typedef int tip; class Stog{ struct at { tip element; struct at *sljed; }; typedef struct at atom;
atom *vrh; void obrisiStog(); public: Stog(); ~Stog(); int Dodaj (tip element); int Skini (tip *element); }; Definicija strukture koja e prestavljati element liste u okviru stoga je premjetena unutar klase Stog. Na taj nain je definicija tipova struct at i atom vidljiva samo unutar klase Stog.

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

Neki detalji implementacije stoga


void Stog::obrisiStog(){ int element; while(1){ if(Skini(&element) == 0){ break; } } }
Stog::Stog(){ this->vrh = NULL; } Stog::~Stog(){ this->obrisiStog(); }

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

Algoritmi i strukture podataka, FER, 2008./09.

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

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

53 / 55

Zadatak: Objektni red

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

Zadatak za domau zadau

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.

Algoritmi i strukture podataka, FER, 2008./09.

1.11.2012

55 / 55

Anda mungkin juga menyukai