programiranje i algoritmi - katedra za transportnu …ttl.masfak.ni.ac.rs/suk/programiranje i...

43
Sveu č ilite u Zagrebu Fakultet strojarstva i brodogradnje Katedra za osnove konstruiranja N. Pavković, D. Marjanović, N. Bojčetić PROGRAMIRANJE I ALGORITMI Skripta, drugi dio Zagreb, 2005.

Upload: phungnhan

Post on 31-Jan-2018

237 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

S v e u č i l i � t e u Z a g r e b u

F a k u l t e t s t r o j a r s t v a i b r o d o g r a d n j e

Katedra za osnove konstruiranja

N. Pavković, D. Marjanović, N. Bojčetić

PROGRAMIRANJE I ALGORITMI

Skripta, drugi dio

Zagreb, 2005.

Page 2: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

Sadr�aj

Potprogrami i funkcije (elementi modularizacije programa).........................................3 Razmjena podataka između potprograma ............................................................................................4 Vrste potprograma ...............................................................................................................................4 Vrste procedura u Visual Basic-u ........................................................................................................5 Deklariranje procedura ........................................................................................................................5 Deklariranje funkcija ...........................................................................................................................5 Rekurzija..............................................................................................................................................6

STRUKTURE PODATAKA .................................................................................. 7 Polje.............................................................................................................................8 Slog..............................................................................................................................8 Povezana lista .............................................................................................................9 Stog ...........................................................................................................................11 Red ............................................................................................................................12 Struktura stabla..........................................................................................................13

Binarno stablo pretra�ivanja (eng. binary search tree).......................................................................15 Gomila (eng. heap) ............................................................................................................................15

Graf............................................................................................................................15 Matrični prikaz grafova..................................................................................................................................16

ALGORITMI ....................................................................................................... 16 Iteracija ......................................................................................................................17 Primjer uporabe strukture stoga u algoritmu evaluacije aritmetičkog izraza..............19 Algoritmi sortiranja .....................................................................................................20

"Bubble" sort .....................................................................................................................................21 Sortiranje umetanjem.........................................................................................................................22 �Selection sort�..................................................................................................................................22 "Heap" sortiranje................................................................................................................................22 "Shell" sort.........................................................................................................................................22 "Mergesort" (uparivanje i sortiranje) .................................................................................................23 "Quicksort" ........................................................................................................................................23 Indirektno sortiranje...........................................................................................................................23

Algoritmi pretra�ivanja ...............................................................................................23 Slijepo pretra�ivanje ..........................................................................................................................24

Pretra�ivanje liste (niza) ................................................................................................................................24 Pretra�ivanje stabla ........................................................................................................................................24

Usmjereno pretra�ivanje ....................................................................................................................25 Primjeri usmjerenog pretra�ivanja u in�enjerskoj praksi ...............................................................................25

PROGRAMSKI JEZICI....................................................................................... 26 Podjela programskih jezika........................................................................................27 Metodologije (paradigme) programiranja...................................................................27

Imperativno (proceduralno) programiranje........................................................................................27 Programi pokretani događajima .....................................................................................................................28

Funkcijsko programiranje ..................................................................................................................29 Deklarativno (logičko) programiranje ...............................................................................................30 Objektno orijentirana paradigma programiranja................................................................................30

Usporedba proceduralnog i objektnog programiranja ....................................................................................31 OBJEKTNO ORIJENTIRANO PROGRAMIRANJE........................................... 32

Koncept objekta .................................................................................................................................33 Koncept klase.....................................................................................................................................34 Osnovni elementi objektnog modela .................................................................................................36

Učahurenje (enkapsulacija)............................................................................................................................36 Nasljeđivanje .................................................................................................................................................37 Primjer nasljeđivanja metoda.........................................................................................................................39 Vi�eobličje (polimorfizam)............................................................................................................................39

Osnove rada s objektima u .NET Visual Basic-u...............................................................................41 Slo�eni objektno orijentirani programski sustavi...............................................................................42

Koncipiranje slo�enih objektnih sustava........................................................................................................42 Razvoj metoda modeliranja objektno orijentiranih programskih sustava.......................................................42 Unified Modeling Language (UML)..............................................................................................................43

Page 3: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

Potprogrami i funkcije (elementi modularizacije programa) Slo�eni programski problemi mogu se pojednostavniti dekompozicijom programa u manje cjeline. Takve manje cjeline obično nazivamo modulima. Moduli mogu sadr�avati jednu ili vi�e komponenti � programskih procedura. Vrste procedura razlikuju se u programskim jezicima, a obično se dijele na potprograme i funkcije. Mogućnost razbijanja problema na manje cjeline va�no je svojstvo svakog programskog jezika � na taj način olak�ava se razvoj, testiranje, odr�avanje i praćenje programa. Manje logičke cjeline lak�e je testirati zasebno, odnosno nezavisno od ostalih dijelova programa. Nakon otklanjanja svih gre�aka u svakoj manjoj cjelini, one se "sklapaju" u cjelovito programsko rje�enje. Na slijedećoj slici prikazan je primjer dekompozicije slo�enijeg problema � shematski je prikazana hijerarhija poziva modula iz glavnog programa.

GLAVNI PROGRAM ZA PRORACUN ROTORA ELEKTROMOTORA

UCITAVANJE ULAZNIH PODATAKA I PRIPREMA

PRORACUNA

IZRACUN TE�INE ROTORA STATICKI PROGIB ITERACIJA �

PROGIB MAGN. SILA

POCETNA KRUTOST I EKSCENTRICITET

ODREÐIVANJE POJEDINIH FAKTORA

PODJELA VRATILA NA SEGMENTE I

«POLJA»DINAMICKI

PROGIB

PROVJERA VIJEKA

TRAJANJA LE�AJA

METODA «PRIJENOSNIH»

MATRICA

IZRACUN MAKS. NAPREZANJA,

PROGIBA I NAGIBA

KRUTOST LE�AJEVA

METODA «PRIJENOSNIH»

MATRICA

ODREÐIVANJE IZLAZNIH PODATAKA

METODA «PRIJENOSNIH»

MATRICA

Slika 1: Primjer dekompozicije slo�enog programskog sustava na manje module i potprograme

Postoje brojni razlozi i prednosti kori�tenja potprograma: • Smanjiti ponavljanja (redundancije) istih ili sličnih sekvenci programskog koda. • Omogućiti ponovnu uporabu dijelova programskog koda u različitim programima. • Dekompozicija slo�enih problema u manje i jednostavnije cjeline. • Pobolj�anje "čitljivosti" i preglednosti programa. • Repliciranje rje�enja za matematičke funkcije. • Sakrivanje informacija i neva�nih detalja unutar pojedinih dijelova programa. • Smanjenje rizika od gre�aka, lak�e odr�avanje i nadogradnja velikih sustava.

Osnovna je funkcija potprograma "sakrivanje" neva�nih detalja programskog rje�enja. Kori�tenje potprograma omogućuje bolji uvid u tok programa, tako da je pa�nju lak�e posvetiti problemu "�to radi" za razliku od "kako to radi". Općenito, da bi se ostvarila uporaba potprograma, koristi se određene forma naredbe poziva (eng. call). U trenutku izvođenja naredbe poziva potprograma, slijed (kontrola) izvođenja naredbi predaje se pozvanoj cjelini, odnosno prelazi se na izvr�avanje naredbi potprograma. Nakon �to se izvedu sve naredbe pozvanog potprograma, kontrola se vraća "pozivaču" i izvr�avaju se dalje njegove naredbe. Potprogrami mogu biti pozvani iz glavnog programa, ali i sami potprogrami mogu pozivati druge potprograme.

U principima implementacije potprograma među programskim jezicima male su razlike u:

• načinu prevođenja (mogućnost nezavisnog prevođenje i testiranja potprograma kao �to to omogućuje Fortran, za razliku od npr. Pascala gdje se potprogrami deklariraju unutar glavnog programa);

• načinu prijenosa argumenata (po vrijednosti, ili po adresi);

Page 4: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

4

• po vrsti: o procedure-potprogrami čiji poziv je zasebna naredba unutar neke programske

cjeline o funkcije - koje su dio nekog izraza i njihovo referenciranje vraća vrijednost

Osnovne karakteristike potprograma koje razmatramo: • imaju jednu ulaznu točku • pozivajuća procedura (program) se zaustavlja u toku izvr�avanja pozvanog potprograma,

samo jedan potprogram se izvr�ava u danom vremenu • kontrola se uvijek vraća pozivajućoj proceduri po zavr�etku izvr�avanja potprograma

Postupak pozivanja u nekim situacijama drugačiji je u programiranju pokretanom događajima, jer je korisnik programa taj koji u većini slučajeva zapravo bira i poziva procedure, tj. elementi sučelja (odnosno korisnik) direktno sudjeluju u usmjeravanju tijeka izvođenja programa. Međutim dijelovi programa koji se pokreću događajima mogu biti sastavljeni od vi�e potprograma i funkcija, a osim mogućnosti poziva procedure preko sučelja, postoje i procedure koje se pozivaju naredbama unutar programskog koda.

Razmjena podataka između potprograma Potprogrami su zasebne programske jedinice koje stoga alociraju i različite (nepovezane) dijelove memorije za svoje varijable. Jedan potprogram "ne zna" za varijable drugoga, odnosno nema direktnog pristupa do adresa memorijskih lokacija na kojima su varijable drugih potprograma. Drugim riječima, potprogrami i "ne znaju" za postojanje drugih potprograma. Stoga pri pozivu potprograma ili funkcije pozvanoj cjelini treba "prenijeti" ulazne podatke, a pri zavr�etku pozvana cjelina treba "vratiti" rezultate programu koji ga je pozvao. Postoji nekoliko načina prijenosa (razmjene) podataka između potprograma:

• Globalne varijable: o U ovom načinu varijable kojima treba pristupati vi�e programskih cjelina

deklariraju se "izvan" svake od njih, u posebnom "zajedničkom" dijelu memorije kojem imaju pristup sve programske cjeline. Uobičajeno je reći da su globalne varijable "vidljive" u svim potprogramima.

• Prenose se vrijednosti varijabli (call by value): o Kopira se vrijednost lokalne varijable iz pozivajuće procedure u lokalnu varijablu

pozvane procedure. Ako pozvana procedura promijeni vrijednost varijable, to utječe samo na lokalnu kopiju u pozvanoj proceduri.

• Prenose se adrese varijabli (call by reference): o Pozvana procedura dobiva pristup lokalnim varijablama iz pozivajuće procedure.

Pozvana procedura mo�e trajno promijeniti vrijednost varijablama čije su adrese prenesene.

Ako nije drukčije navedeno, u Visual Basic-u se podrazumijeva �call by reference�. Pojmovi dosega i trajanja varijabli va�ni su za razumijevanje prijenosa podataka (vrijednosti varijabli) između potprograma. Ova tematika detaljno je obja�njena u poglavlju o varijablama. Trajanje varijable je va�no ako �elimo zadr�ati vrijednost lokalne varijable pri ponovnom pozivu potprograma � u tom slučaju lokalnu varijablu treba deklarirati kao "statičku", ali tu mogućnost nemaju svi programski jezici.

Vrste potprograma Uobičajena je podjela potprograma na dvije osnovne vrste:

• Funkcije, (function) koje imaju od nula do vi�e ulaznih argumenata i vraćaju jedan rezultat. Funkcije se pozivaju kao dio izraza, npr. A = fun(B). Pojam "vraćanja" vrijednosti zapravo je izračunavanje vrijednosti funkcije koja se dalje tretira kao i ostale varijable u izrazu.

Page 5: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

5

• Općenite potprograme (subroutine) koji imaju od nula do vi�e ulaznih argumenata i vi�e izlaznih rezultata koje predaju argumentima. Pozivaju se najče�će posebnom naredbom iza koje slijedi ime potprograma i lista ulaznih i izlaznih argumenata.

Navođenje pojedinačnih podvrsta i načina implementacija potprograma u pojedinim jezicima zahtijevalo bi previ�e vremena i prostora. Također postoje i razlike u terminologiji � neki jezici koriste termin "subroutine" kojeg prevodimo kao "potprogram" dok drugi jezici zapravo za isti pojam koriste termin "procedure" koji prevodimo kao "procedura". Za funkcije se također koriste i termini "funkcijski potprogram" ili "funkcijska procedura". Bez obzira na razlike u terminologiji, osnovna razlika između dvije vrste programskih jedinica je u načinu poziva i broju izlaznih argumenata. U daljnjem tekstu obraditi će se vrste potprograma samo za programski jezik Visual Basic.

Vrste procedura u Visual Basic-u Zajednički naziv svih vrsta potprograma u Visual Basic-u je "procedura" (eng. procedure). Postoje tri vrste procedura:

• procedure vezane uz događaje (event procedures) � pozivaju se aktiviranjem nekog događaja (npr. "klik" mi�em na neki objekt na formi)

• opće� procedure (general procedures) � pozivaju se naredbom Call • funkcijske procedure (function procedures) � pozivaju se kao dio izraza

Deklariranje procedura Opće procedure kao i procedure vezane uz događaje deklariraju se sa rezerviranom riječi "Sub" iza koje slijedi naziv procedure i lista argumenata.

[Public | Private] Sub name [(arglist)] [statements] [Exit Sub] [statements] End Sub

arglist:

[ByVal | ByRef] varname[( )]

Dvije su vrste procedura vezanih uz događaje:

Događaj vezan uz kontrolu na formi: Private Sub controlname_eventname (arguments ) statements End Sub

Događaj vezan uz formu: Private Sub Form_eventname (arguments) statements End Sub

Deklariranje funkcija Funkcijske procedure deklariraju se sa rezerviranom riječi "Function" iza koje slijedi naziv procedure i lista argumenata. Barem jedanput prije naredbe "Exit Function" ili "End Function" mora se pojaviti naredba oblika ime funkcije = izraz, jer se tom naredbom dodjeljuje vrijednost koju funkcija "vraća" u pozivajuću proceduru.

Page 6: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

6

[Public | Private] Function name [(arglist)] [statements] [name = expression] [Exit Function] [statements] [name = expression]

End Function

arglist:

[ByVal | ByRef] varname[( )]

Rekurzija Rekurzija je va�an koncept u računalnoj znanosti jer se mnogi algoritmi mogu pomoću nje najbolje prikazati. Rekurzija je zapravo i jedan način implementacije potprograma � u nekim jezicima potprogram mo�e pozvati samog sebe uzrokujući zaustavljanje svojeg procesa izvr�avanja za vrijeme dok traje drugi "ugnje�đeni" proces izvr�avanja istog potprograma.

Kao primjer za bolje razumijevanje rekurzije razmotrimo definiciju predaka određene osobe:

• roditelji neke osobe su njeni preci (osnovni slučaj) • roditelji bilo kojeg pretka su također preci osobe koju razmatramo (korak rekurzije)

Rekurzivna procedura dakle poziva samu sebe ili sadr�i poziv neke druge procedure koja bi mogla rezultirati pozivom originalne procedure. Da bi se izbjeglo beskonačno izvođenje programa:

• mora postojati određeni kriterij (temeljni kriterij) za koji procedura ne poziva samu sebe • svaki put kad procedura pozove samu sebe (direktno ili indirektno) mora biti bli�e

temeljnom kriteriju

Neki jezici (npr. FORTRAN) ne podr�avaju rekurziju. Rekurzivni programi su kraći, ali izvođenje programa je dulje. Za pohranjivanje rezultata i povratak iz rekurzije koristi se struktura podataka stog. Primjer rekurzivno definirane funkcije je slijedeća definicija funkcije faktorijela:

f(0) = 1 f(n) = n * f(n − 1) za svaki cijeli broj n > 0

Prema danoj definiciji f(3) računa se kako slijedi: f(3) = 3 * f(3 − 1) = 3 * f(2) = 3 * 2 * f(2 − 1) = 3 * 2 * f(1) = 3 * 2 * 1 * f(1 − 1) = 3 * 2 * 1 * f(0) = 3 * 2 * 1 * 1 = 6

Slijedeći primjer rekurzivne funkcije u programskom jeziku C također izračunava faktorijel cijelog broja n:

int fakt(int n){ if (n <= 1) { return 1; } else { return n * fakt(n-1); } }

Page 7: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

7

STRUKTURE PODATAKA U računalnoj znanosti pojam "struktura podataka" označava način pohrane podataka u računalu koji omogućava efikasnu uporabu tih podataka. Vrlo često dobar odabir strukture podataka omogućuje i uporabu efikasnijeg algoritma obrade. Različite vrste struktura podataka odgovaraju različitim vrstama programskih problema, dapače neke strukture su visokospecijalizirane samo za određene zadatke. U razvoju slo�enih programskih sustava, izbor struktura podataka koje će se primjeniti jedan je od najva�nijih koraka. Iskustva razvoja velikih programskih sustava pokazala su da kvaliteta i performanse konačnih rje�enja u mnogome ovise o izboru najpogodnijih struktura podataka. Nakon �to su odabrane strukture podataka, često je odmah s time određen i algoritam kojeg treba upotrijebiti.

Ukratko, mo�emo reći da je �struktura podataka� logički ili matematički model određene organizacije podataka. Slijedeće strukture podataka i operacije na njima temelji su računalne znanosti jer su osnovni elementi brojnih algoritama:

• Polje (eng. array) � sekvencijalni niz podataka istog tipa koje imaju zajedničko ime • Slog (eng. record) - skup podataka koji mogu biti različitog tipa, niz slogova obično je

dio datoteke ili tablice • Lista, povezana lista (eng. linked list) � niz elemenata koji sadr�e podatke i pokazivače

na slijedeći element • Stog (eng. stack) � niz elemenata u kojem se dodavanje i brisanje mogu obavljati samo

na jednom kraju niza • Red (eng. queue) � niz elemenata u kojem je dodavanje moguće samo na jednom kraju a

brisanje samo na drugom kraju • Stablo, binarno stablo (eng. binary tree) � hijerarhijska struktura u kojoj svaki element

mo�e imati samo jednog prethodnika • Graf (eng. graph) � općenita struktura u kojoj svaki element mo�e biti povezan sa vi�e

drugih elemenata

Navedimo četiri osnovne operacije na strukturama podataka koje se primjenjuju na svim vrstama struktura:

• pristup i obrada preko svih podataka (eng. traversing): o pristup svakom elementu strukture točno jedanput, da bi se određeni podatak

obradio (procesirao) primjer � učitavanje polja ili matrice • pretra�ivanje (eng. searching):

o pronala�enje lokacije elementa strukture koji sadr�i �eljenu vrijednost, ili pronala�enje svih elemenata strukture koji ispunjavaju jedan ili vi�e uvjeta

• dodavanje novog elementa u strukturu • brisanje određenog elementa iz strukture

Strukture podataka dijele se na linearne i nelinearne. Struktura je linearna ako njeni elementi tvore niz, odnosno slijed � linearnu listu. Dva su osnovna načina prikaza linearnih struktura u memoriji računala:

• linearna veza između elemenata ostvarena slijedom memorijskih lokacija � to je karakteristično za polja

• linearna veza između elemenata ostvarena pokazivačima � karakteristično za povezane liste

Nelinearne strukture su stabla i grafovi. Pored već navedenih operacija pristupa i obrade, pretra�ivanja, dodavanja i brisanja, na linearne strukture se primjenjuju i operacije sortiranja (eng. sorting) po određenom redoslijedu i spajanja (eng. merging) � kombiniranja dvije liste u jednu. Izbor određene vrste linearne strukture za danu situaciju ovisi o relativnoj učestalosti primjene pojedine od navedenih operacija.

Page 8: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

8

Polje Struktura polja (eng. array) vrlo se često upotrebljava. Na poljima se jednostavno primjenjuju operacije prolaza, pretra�ivanja i sortiranja, stoga se polja koriste za pohranu relativno permanentnih (statičnih) skupova podataka. S druge strane, u situacijama gdje se veličina strukture ili sami podaci konstantno mijenjaju, povezane liste su pogodnije strukture od polja. Osnovni prikaz i obja�njenje strukture polja već je dan ranije, stoga ga ovdje nećemo ponavljati. Polje zauzima sekvencijalni niz memorijskih lokacija, a elementima polja pristupa se preko indeksa, dakle fizički redoslijed memorijskih lokacija određuje povezanost elemenata polja.

Osnovni nedostaci polja su slijedeći: • te�ko je dodavati i brisati elemente nakon �to se elementima pridru�e vrijednosti • u većini jezika problematično je povećati alokaciju memorije za elemente polja

Zbog navedenih nedostataka polja se smatraju statičkim strukturama podataka.

Algoritam "pristupa i obrade" (eng. traversing) svih elemenata polja vrlo često se koristi npr. kod učitavanja ili ispisa elemenata polja ili kao dio drugih algoritama:

1. postavi brojač na početnu vrijednost jednaku indeksu početnog elementa polja 2. ponavljaj korake 3 i 4 tako dugo dok je brojač manji od indeksa krajnjeg elementa

polja 3. pristupi elementu polja i primjeni �eljenu obradu na njemu 4. povećaj vrijednost brojača za 1

Slog Slog (eng. record) je skup međusobno povezanih (ali heterogenih) podataka koje obično nazivamo polja ili atributi. Zapisi nekih vrsta datoteka su zapravo skupovi slogova, odnosno takve datoteke su linearne liste slogova. Va�no je naglasiti osnovne razlike između sloga i polja:

• elementi sloga mogu biti nehomogeni podaci (različitih tipova) • ne mora postojati "prirodni" redoslijed elemenata sloga, elementi se označavaju

imenima atributa Skup slogova mo�emo promatrati i kao tablicu u kojoj svaki stupac ima svoje ime i odgovara pojedinom polju (atributu) sloga. Takva struktura čini osnovu tzv. relacijskih baza podataka. Pojedini atribut sloga mora imati isti tip u svim slogovima. Jedan od mogućih načina pohrane i manipulacije sa slogovima je kori�tenje vi�e paralelnih polja pri čemu svakom atributu sloga odgovara jedno polje, odnosno elementi različitih polja sa istom vrijedno�ću indeksa pripadaju jednom slogu. Drugi način manipulacije sa slogovima je kori�tenje različitih sintaktičkih elemenata specifičnih za određeni jezik � neki jezici imaju ugrađenu strukturu sloga.

Primjer sloga sa podacima o studentima - prvi redak tablice sadr�i nazive atributa u slogu, a prikazan je niz od �est slogova:

IME PREZIME MATIČNI BROJ

DATUM ROĐENJA

UPISANA GODINA

Ime 1 Prezime 1 0038512345 05.04.1984. 1 Ime 4 Prezime 4 0038512766 12.08.1984. 1 Ime 8 Prezime 8 0038576238 30.01.1982. 3 Ime 2 Prezime 2 0038636686 25.10.1983. 2 Ime 3 Prezime 3 0038578798 05.04.1984. 2 Ime 5 Prezime 5 0037987987 09.07.1980. 4

Page 9: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

9

Povezana lista Povezana lista (eng. linked list) je linearna struktura elemenata u kojoj je redoslijed određen pokazivačima. Za razliku od polja, svaki element liste sadr�i pokazivač (eng. pointer) na slijedeći element. Po�to pokazivač sadr�i adresu slijedećeg elementa u listi, sukcesivni elementi liste ne moraju biti spremljeni u sukcesivnom nizu memorijskih lokacija. Na taj način fizički redoslijed memorijskih lokacija nema nikakav utjecaj na redoslijed elemenata u listi. Za razliku od polja, vrlo jednostavno je dodavanje i brisanje elemenata iz liste.

Svaki element (čvor) povezane liste sastoji se od dva dijela:

1. Podatak 2. Pokazivač koji sadr�i adresu slijedećeg čvora u listi

Zadnji čvor sadr�i tzv. �null� pokazivač koji označava kraj liste. Lista sadr�i posebni pokazivač koji sadr�i adresu prvog čvora u listi.

Slika 2: � primjer povezane liste sa 6 čvorova

Algoritam operacije �pristupa i obrade� svih elemenata povezane liste (eng. traversing a linked list):

1. Postavi pokazivač (PTR) na početak 2. Ponavljaj korake 3 i 4 dok je PTR različit od �null� 3. Pristupi elementu liste i izvr�i �eljenu obradu 4. Postavi pokazivač (PTR) na slijedeći element

PTR

Slika 3: postupak pristupa i obrade elemenata povezane liste

Najče�ći način prikaza povezane liste u memoriji je kori�tenjem dva paralelna polja i varijablom (pokazivačem) koja sadr�i adresu prvog člana liste. Na slici 4 prikazan je primjer sa poljima "DATA" i " "POINT". Svakom čvoru liste odgovara po jedan element iz svakog polja, s time da ti elementi imaju istu vrijednost indeksa. Polje "DATA" sadr�i podatke svakog čvora, a polje "POINT" sadr�i lokaciju slijedećeg čvora, odnosno podatka u listi. Varijabla "START" sadr�i lokaciju početnog čvora u listi. Ako slo�imo po redoslijedu elemente liste, dobiti ćemo tekst "PRIMJER".

x

POCETAK

CVOR (ELEMENT LISTE)

POKAZIVAC NA SLIJEDECIELEMENT

PODACIKRAJ LISTE

Page 10: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

10

1

2

3

4

5

6

7

8

9

10

11

12

9 R

R

J

P

E

M

3

4

7

6

0

11

10

DATA POINT

START

I

Slika 4: Prikaz povezane liste u memoriji pomoću dva paralelna polja

Na slici 5 shematski je prikazano dodavanje elementa u povezanu listu. Prije dodavanja novog elementa čvor A pokazuje na slijedeći čvor B. Nakon umetanja novog čvora između čvorova A i B, čvor A pokazuje na novi čvor N, a čvor N pokazuje na čvor B.

x

START

x

Cvor A

Cvor A

Cvor B

Cvor B

a) Prije umetanja

b) Nakon umetanja

START

Cvor N

Slika 5: dodavanje elementa u povezanu listu

Na sličan način, mijenjanjem lokacije na koju pokazuje pokazivač realizira se i brisanje elementa iz povezane liste. Dvostruko povezane liste (slika 6) mogu se procesirati (obilaziti) u dva smjera � od početka do kraja i obrnuto. Svaki čvor (element) dvostruko povezane liste osim podatka, sadr�i i dva pokazivača � na prethodni i na slijedeći čvor u listi.

x

pocetak

x

kraj

cvor N

podatak

pokazivac na prethodni cvor

pokazivac na slijedeci cvor

Slika 6: dvostruko povezana lista

Page 11: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

11

Stog Polja i povezane liste dozvoljavaju dodavanje i oduzimanje (brisanje) elemenata na bilo kojem mjestu � početku, kraju ili između. Postoje određene situacije u programiranju kada �elimo ograničiti dodavanja i brisanja elemenata samo na kraj ili početak liste. Linearna struktura u kojoj se elementi mogu dodavati ili oduzimati samo na jednom kraju zove se stog (eng. stack). Slika 7 je shematski prikaz takve strukture � nije moguće izvaditi ili umetnuti bilo koji element iz sredine prije nego se "skinu" svi elementi iznad njega. Iz toga slijedi da je zadnji dodani element ujedno i onaj koji će se prvi izvaditi. Stoga je drugi uobičajeni naziv za strukturu stoga : �LIFO� lista (eng. last in � first out). Drugim riječima stog je struktura podataka kod koje se posljednji pohranjeni podatak prvi uzima u obradu.

Osnovne operacije na stogu su:

• dodavanje (umetanje) elementa na stog (eng. push)

• brisanje (oduzimanje) elementa

iz stoga (eng. pop)

Slika 7: shematski prikaz strukture stoga

Premda se čini da je stog vrlo restriktivna struktura podataka, on ima brojne vrlo va�ne primjene u računalnoj znanosti. Prikaz i manipulacija sa stogom mo�e se realizirati statičkom strukturom podataka. U jednodimenzionalno polje zadane strukture dodaju se ili bri�u pojedine stavke po principu "LastInFirstOut" (LIFO). Pojedina operacija dodaj ili bri�i zahtijeva jednako vremena bez obzira na broj pohranjenih podataka. Situacija da je stog pun mo�e zahtijevati alociranje dodatne memorije i ponovno izvođenje programa. Prazan stog ne mora značiti pogre�ku.

A B E N

1 2 3 4 5 6 7 8

STOG

4 10MAXVRH

9 10

Slika 8: prikaz stoga pomoću jednodimenzionalnog polja

Na slici 8 prikazan je primjer implementacije strukture stoga pomoću jednodimenzionalnog polja "STOG", te varijable "VRH" koja sadr�i trenutnu poziciju najvi�eg (gornjeg) elementa i varijable "MAX" koja sadr�i maksimalni broj elemenata u stogu. Struktura stoga često se upotrebljava u situacijama kada određene korake obrade treba odgoditi do trenutka ispunjenja drugih uvjeta. Primjeri uporabe strukture stoga detaljnije su obja�njeni u poglavlju "Algoritmi".

dodavanjeoduzimanje

Page 12: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

12

Red Red (eng. queue) je linearna struktura u kojoj se elementi dodaju isključivo na jednom kraju, a oduzimaju isključivo na drugom kraju. Strukturu reda lako je predočiti analogijom sa istim pojmom u svakodnevnom �ivotu � npr. redom ispred blagajne u dućanu. Svaka nova osoba koja dođe zauzima mjesto na kraju reda, a osoba sa početka reda plaća svoju robu i odlazi. Drugi uobičajeni naziv za ovu strukturu je �FIFO� lista (eng. first in � first out).

Slika 9: red osoba

Struktura reda mo�e se u računalu implementirati na različite načine, a najče�će se koristi jedno jednodimenzionalno polje i dvije varijable (pokazivača) koje sadr�e lokacije početka i kraja reda, odnosno lokacije početnog i krajnjeg elementa u redu. Takav način implementacije reda prikazan je na slici 10.

AAA BBB CCC DDD

1 2 3 4 5 6 ... N

QUEUE

BBB CCC DDD

1 2 3 4 5 6 ... N

QUEUE

BBB CCC DDD EEE FFF

1 2 3 4 5 6 ... N

QUEUE

CCC DDD EEE FFF

1 2 3 4 5 6 ... N

QUEUE

a) pocetak: 1kraj: 4

b) pocetak: 2kraj: 4

c) pocetak: 2kraj: 6

d) pocetak: 3kraj: 6

Slika 10: Implementacija strukture reda pomoću polja

Varijabla "početak" sadr�i lokaciju prvog elementa na početku reda, a varijabla "kraj" lokaciju zadnjeg elementa na kraju reda. Inicijalno red sadr�i 4 elementa, u drugom koraku bri�e se prvi element sa početka reda, u trećem koraku dodaju se dva nova elementa na kraj reda, a u četvrtom koraku bri�e se element sa početka reda. Uočite da se uz ovakav način brisanja i dodavanja elemenata stalno "pomičemo u desno", tj. za zapis elemenata reda koristi se zapravo samo jedan segment polja, a nakon svakog brisanja povećava se početni dio polja koje ostaje neiskori�teno. Ovaj problem mo�e se rije�iti tako da u određenom trenutku premjestimo krajnji član reda na početak polja, tj. da napravimo tzv. cirkularno polje.

Page 13: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

13

Na slici 11 prikazan je primjer kori�tenja cirkularnog polja za red koji mo�e sadr�avati maksimalno pet članova. Ako cirkularno polje sadr�i općenito n članova, tada polje(1) slijedi iza polje(n) i na taj način ponovno se iskori�tava početni dio polja nakon �to su elementi reda iz njega obrisani. U oba načina implementacije strukture reda pomoću polja mo�e doći do tzv. preljeva (eng. overflow), tj. situacije da u polju nema vi�e dovoljno mjesta za dodavanje novog člana u red.

Slika 11: Implementacija strukture reda pomoću tzv. cirkularnog polja

Struktura stabla Za razliku od prethodno razmatranih linearnih struktura, stablo (eng. tree) je nelinearna struktura koja se koristi za prikaz hijerarhijskih odnosa između elemenata. Primjer strukture stabla koju koristimo u svakodnevnom radu je struktura direktorija, odnosno organizacija datotečnog sustava na računalu. Strukture stabla koje ćemo ovdje razmatrati sastoje se od čvorova (eng. nodes) i veza između njih koje uobičajeno nazivamo grane. Takva stabla imaju jedan početni čvor na vrhu hijerarhije, npr. u strukturi direktorija to je tzv. korijenski (osnovni) direktorij (eng. root directory.) Jedna od najva�nijih vrsta strukture stabla u računalstvu je tzv. binarno stablo. U binarnom stablu (eng. binary tree) svaki čvor ima ili najvi�e dva sljedbenika ili samo jednog ili nijednog sljedbenika. Na slici 12 prikazan je primjer binarnog stabla sa 11 čvorova. Čvorovi A, B i C imaju dva sljedbenika, čvorovi E i J po jednog sljedbenika, a čvorovi D, F, G, L i K nemaju sljedbenika. Čvorovi bez sljedbenika nazivaju se terminalni čvorovi.

A B C

B C

B C D E

D E

F D E

F E

F G H E

F G H

G H

G H K

K

POCETAK: 0KRAJ: 0

RED (QUEUE)

1 2 3 4 5

a) inicijano prazan red:

b) A, B i C ukljuceni:

c) A iskljucen:

d) D a zatim i E ukljuceni:

e) B i C iskljuceni:

f) F ukljucen:

g) D iskljucen:

h) G a zatim i H ukljucen:

i) E iskljucen:

j) F iskljucen:

k) K ukljucen:

l) G i H iskljuceni:

m) K iskljucen, RED prazan:

POCETAK: 2KRAJ: 3

POCETAK: 2KRAJ: 5

POCETAK: 4KRAJ: 5

POCETAK: 1KRAJ: 3

POCETAK: 4KRAJ: 1

POCETAK: 5KRAJ: 1

POCETAK: 5KRAJ: 3

POCETAK: 1KRAJ: 3

POCETAK: 2KRAJ: 3

POCETAK: 2KRAJ: 4

POCETAK: 4KRAJ: 4

POCETAK: 0KRAJ: 0

Page 14: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

14

Slika 12: Primjer binarnog stabla

Jedna od primjena strukture binarnog stabla je prikaz aritmetičkog izraza koji se koristi u procesu prevođenja programa u strojni jezik. Kori�tenje tri paralelna polja jedan je od načina prikaza binarnog stabla u memoriji (slika 13). Polje INFO sadr�i podatak o nazivu pojedinog čvora, polje LIJEVO sadr�i lokaciju lijevog sljedbenika, a polje DESNO lokaciju desnog sljedbenika pojedinog čvora. Varijabla KORIJEN pokazuje na lokaciju početnog (korijenskog) čvora, a varijabla AVAIL pokazuje na lokaciju prvog slobodnog indeksa sva tri paralelna polja za upis podataka slijedećeg čvora koji bi se dodao u stablo.

A

B C

D E

F

G x H

J K

L

x

x x x

xx

xx

xx x

KORIJEN

Slika 13: Prikaz binarnog stabla u memoriji pomoću tri paralelna polja

A

B

ED

F

C

HG

J K

L

16

17

18

19

20

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

K

C

G

A

H

L

B

F

E

0

3

0

14

10

17

0

9

4

18

19

0

12

15

16

0

6

0

2

1

0

13

0

0

J

D

11

7

0

20

0

0

0

5

8

INFO LIJEVO DESNO

KORIJEN

AVAIL

Page 15: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

15

Binarno stablo pretra�ivanja (eng. binary search tree) Binarno stablo pretra�ivanja jedna je od najva�nijih struktura podataka u računalnoj znanosti Za svaki čvor ove strukture vrijedi:

vrijednost u čvoru je veća od svih vrijednosti u lijevom podstablu i manja od svih vrijednosti u desnom podstablu

Slika 14: Primjer binarnog stabla pretra�ivanja

Gomila (eng. heap) Gomila je vrsta strukture stabla koja se koristi u jednom od algoritama sortiranja. Struktura gomile je binarno stablo u kojem za svaki čvor vrijedi slijedeće: vrijednost u čvoru je veća ili jednaka od vrijednosti svih čvorova ispod njega (svih sljedbenika).

Slika 15: Primjer strukture gomile

Graf Struktura grafa (eng. graph) također je nelinearna.

Definicija grafa:

Graf G sadr�i dva konačna skupa: skup točaka V, koje nazivamo čvorovima, i skup linija povezivanja E, koje nazivamo bridovima. Pri tome svaki brid povezuje dva čvora.

G = (V, E)

Definicija usmjerenog grafa:

Usmjereni graf G = (V, E) je graf u kojem svaki brid e = (i,j) ima smjer od "inicijalne točke" (čvora) do "terminalne točke" (čvora). Pod uvjetom da su suprotnih smjerova, u usmjerenom grafu mogu postojati dva brida koja povezuju iste čvorove.

Graf G je povezan ako i samo ako postoji jednostavna putanja između bilo koja dva čvora u G.

Ako svakom bridu grafa pripada neki podatak, takav graf se naziva označenim. Ako su bridovima grafa pridru�ene pozitivne numeričke vrijednosti, onda se takav graf naziva te�inski ili graf sa te�inskim faktorima.

Page 16: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

16

A

B

D

EC

B

A

E

D

C

1

745

6

8

2

a) graf b) graf sa te�inskim faktorima

F

F2

3

Slika 16: Primjer prikaza strukture grafa

Matrični prikaz grafova Čvorovi grafa obično se označavaju s v1, v2, �. ili jednostavno brojevima, a bridovi s e1, e2, �. ili s njihove dvije krajnje točke (čvora) npr.: e1= (1,4), e2=(1,2) Brid (vi, vj) je svojstven (upadan, zavisan, eng. "incident") čvoru vi (vrhu); isto vrijedi za vj. Broj bridova svojstvenih čvoru v naziva se stupanj čvora v.

Dva čvora nazivamo susjednim (eng. "adjacent") čvorovima grafa ako su povezani bridom, odnosno ako čine dvije krajnje točke brida. Za računalni prikaz grafova najpogodnije je koristiti matrice, pa slijedi prikaz nekoliko oblika matričnih prikaza grafova.

Definicija matrice susjedstva (eng. adjacency matrix) grafa G:

[ ]( )

⎭⎬⎫

⎩⎨⎧

=

=

brida nema ako0bridimaako1 ji,G

a

aA

ij

ij

Matrica susjedstva općeg grafa je simetrična. Element matrice susjedstva usmjerenog grafa, aij = 1, onda kad postoji usmjereni brid (od čvora i prema čvoru j). Matrica susjedstva usmjerenog grafa nije simetrična.

Definicija matrice incidencije grafa G:

[ ]

⎪⎭

⎪⎬

⎪⎩

⎪⎨

⎧−+

=

=

jkjk

jka

aA

jk

jk

čvor dira ne grana ako0čvor u ulazi grana ako 1

čvora iz izlazi grana ako1

ALGORITMI Poznavanje algoritama temelj je uspje�nog programiranja, pogotovu u razvoju slo�enih programskih sustava. Predviđena satnica predavanja i vje�bi dopu�ta izlaganje samo najjednostavnijih osnovnih algoritama. Granicu između "osnovnih" i "slo�enih" algoritama te�ko je postaviti. Zadaci na vje�bama prezentiraju neke od temeljnih algoritama obrade numeričkih podataka koji se javljaju u in�enjerskoj praksi. Najjednostavniji algoritmi pogodni su za početak učenja programiranja, pri čemu je vrlo bitno izgraditi i usvojiti način razmi�ljanja i postupke rje�avanja problema pri programiranju. Na vje�bama se prvo obrađuju algoritmi operacija s nizovima � učitavanje niza, sumiranje članova niza, pronala�enje minimalnog i/ili maksimalnog elementa niza, sortiranje, tra�enje i ispis članova niza koji zadovoljavaju određene uvjete. Nakon usvajanja navedenih algoritama na nizovima isti i slični algoritmi se obrađuju i na matricama. Pri tome se za nizove koristi struktura

Page 17: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

17

jednodimenzionalnog polja, a za matrice dvodimenzionalna polja. Navedeni algoritmi detaljno su obrazlo�eni u podlogama za vje�be, stoga se ovdje neće izlagati. U ovom poglavlju posebna je pa�nja posvećena postupku iteracije, jer se ona vrlo često javlja kao dio slo�enijih problema u in�enjerskoj praksi. Nakon toga dan je jedan primjer uporabe strukture stoga u algoritmu za određivanje vrijednosti numeričkog izraza., te primjer najjednostavnijeg algoritma sortiranja niza brojeva. Poglavlje zavr�ava informativnim pregledom algoritama sortiranja i pretra�ivanja. Potrebno je napomenuti da su ovdje izlo�ene samo neke odabrane klase (vrste) algoritama, a za svako ozbiljnije studiranje algoritama potrebno je proučiti specijaliziranu literaturu. Algoritmi se mogu klasificirati na mnogo različitih načina, a kriteriji pojedinih klasifikacija predmet su kontinuiranih rasprava u okru�ju računalne znanosti. Jedan način klasifikacije algoritama je prema metodologiji primjenjenoj u kreiranju algoritma. Moguće je razlučiti određen broj različitih metodologija (paradigmi):

• "Podijeli i vladaj" � ponavlja se postupak reduciranja slo�enog problema na vi�e jednostavnijih (manjih) cjelina, dok cjeline ne postanu dovoljno male da bi bile lako rje�ive. Reduciranje se obično ponavlja na rekurzivan način.

• "Dinamičko programiranje" � pogodno je za probleme u kojima se cjelokupno rje�enje mo�e kreirati na način da se rje�enja istih podproblema upotrijebe za rje�avanje brojnih različitih instanci problema. Ovaj pristup nastoji izbjeći "rje�avanje već rije�enog".

• "Greedy" metoda � slična je dinamičkom programiranju, osim �to u svim koracima nemamo rje�enje podproblema, pa se u takvim slučajevima radi "greedy" izbor onoga �to se čini najpogodnijim u tom trenutku.

• Linearno programiranje � Ovaj način rje�avanja problema svodi se na kreiranje sustava linearnih nejednad�bi, nakon čega se nastoji maksimizirati ili minimalizirati ulazne veličine.

• Pretra�ivanje i enumeracija � mnogi problemi (npr. igranje �aha) mogu se modelirati pomoću grafova. Algoritmi specifikacije pravila za kretanje (pretra�ivanje) po strukturi grafa korisni su za ovakve probleme.

• Probabilistički i heuristički postupci ne odgovaraju u potpunosti definiciji algoritma, jer generiraju rje�enja na temelju slučajnih odabira.

• Genetički algoritmi nastoje pronaći rje�enje opona�anjem biolo�kih evolucijskih procesa - ciklusima slučajnih mutacija generiraju se sukcesivne "generacije rje�enja".

Drugi način klasifikacije algoritama je prema načinu implementacije. Rekurzivni algoritam poziva (referencira) samog sebe do trenutka ispunjenja određenog uvjeta, a takva metoda uobičajena je u tzv. funkcijskom programiranju. Algoritmi se uobičajeno razmatraju sa pretpostavkom da računalo izvodi jednu po jednu instrukciju, odnosno podrazumijeva se jednoprocesorska arhitektura. Takve algoritme zovemo serijski algoritmi za razliku od paralelnih algoritama koji koriste prednosti vi�eprocesorskih arhitektura računala.

Iteracija Postupak iteracije nastoji rije�iti problem nala�enjem sukcesivnih aproksimacija točnom rje�enju, polazeći od inicijalne pretpostavke. Najče�će se radi o rje�avanju jednad�be ili sustava jednad�bi, kada ima vi�e nepoznanica nego jednad�bi. Za linearne sustave jednad�bi postoje dvije osnovne vrste iterativnih metoda: stacionarne i općenitije Krylove metode podprostora. Stacionarne iterativne metode rje�avaju sustav linearnih jednad�bi sa operatorom koji je aproksimacija originala i na temelju mjerenja gre�ke formiraju korekcijsku jednad�bu za koju se navedeni proces ponavlja. Stacionarne metode jednostavne su za implementaciju i analizu, ali konvergencija k točnom rje�enju garantirana je samo za određene klase matrica. Iteracija je jedan od najva�nijih i vrlo čestih postupaka u rje�avanju in�enjerskih problema. Kod slo�enijih jednad�bi, "ručno" računanje brojnih koraka postaje mukotrpno i vrlo podlo�no gre�kama, pogotovo ako se zahtijeva velika točnost rje�enja. Stoga je daleko lak�e, br�e, točnije i

Page 18: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

18

efikasnije takve probleme rje�avati računalnim programima. U počecima razvoja računala i programskih jezika upravo su numerički problemi bili prevladavajuće područje primjene računala. Sve iterativne metode karakterizira postupak rje�avanja zadataka usmjerenim poku�ajima. Ovisno o pojedinom problemu razlikovati će se načini pribli�avanja (konvergiranja) k rje�enju, odnosno korigiranja početnih pretpostavki. Da bi mogli osigurati pribli�avanje rje�enju, nu�no je poznavati karakter funkcija u odabranom području. Moramo naglasiti da bilo koji iterativni postupak daje uvijek samo pribli�no rje�enje! Iteracija se primjenjuje se kad jednostavnim matematičkim postupcima nije moguće naći egzaktno rje�enje.

Postupak iteracije mo�e se sa�eti na tri osnovna koraka:

1. Pretpostaviti rje�enje 2. Provjeriti da li pretpostavljeno rje�enje zadovoljava uvjete 3. Ako rje�enje zadovoljava uvjete, postupak se prekida i ispisuje se rje�enje

Ako rje�enje ne zadovoljava uvjete, treba korigirati pretpostavke i vratiti se na prethodni korak.

Drugi i treći korak ponavljaju se tako dugo dok se ne pronađe zadovoljavajuće rje�enje. Ako na adekvatan način ne korigiramo pretpostavljeno rje�enje, mo�e se dogoditi da nema konvergencije prema rje�enju i da se iteracija protegne na beskonačno ponavljanje drugog i trećeg koraka. Stoga obično treba uključiti i kontrolu realiziranog broja koraka, te ako je taj broj prevelik treba prekinuti postupak. Takve situacije događaju se obično ako ne poznajemo dovoljno dobro pona�anje funkcija u okolini rje�enja, ali mo�e biti i drugih uzroka izostanka konvergencije. Treba napomenuti da je programiranje slo�enijih iterativnih postupaka vrlo "osjetljiv" posao za kojeg je potrebno određeno iskustvo i poznavanje problema numeričke analize. Treba uvijek imati na umu na računalo radi sa konačnim brojem decimala i da kod određenih problema mo�e doći do multiplikacije gre�ke na taj način da nije moguće doći niti do pribli�nog rje�enja. Na slici 17 prikazani su grafovi dviju funkcija. Presjeci�te grafova je rje�enje kojeg tra�imo. Na ovom primjeru biti će izlo�ena metoda binarnog pretra�ivanja, tj. rje�enje tra�imo tako da kontinuirano smanjujemo interval u kojem bi se trebalo naći rje�enje tako dugo dok sam interval ne postane manji od zadane točnosti. Funkcija f1 kontinuirano pada na cijelom promatranom području (prije i nakon sjeci�ta), a funkcija f2 kontinuirano raste na cijelom promatranom području. Tra�imo pribli�no rje�enje sa točno�ću ε, tj. tra�imo onu vrijednost x za koju će se y1 i y2 razlikovati za manje od ε. Za početnu pretpostavku uzimamo vrijednost x0. Izračuna se vrijednost y1 = f1(x0) i vrijednost y2 = f2(x0) i nakon toga provjeriti da li pretpostavljeno rje�enje zadovoljava uvjete. Dakle treba provjeriti da li je apsolutna vrijednost razlike y1 i y2 manja od zahtijevane točnosti ε: Abs(y1-y2) < ε. Daljnji postupak pribli�avanja rje�enju prikazan je na slici 18.

Slika 17: početni korak iteracije

∆ X1

y1 = f (X)

y2 = f (X)

x, y1=Y2

Xo

(Y-ε, Y+ε)

Page 19: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

19

Slika 18: pribli�avanje rje�enju u postupku iteracije

Da bi osigurali konvergenciju postupka, moramo u svakom trenutku, odnosno u svakom koraku znati s koje strane rje�enja se nalazi na�a pretpostavka. To znači i da moramo biti sigurni s koje strane rje�enja smo krenuli i u kojem smjeru. Npr. da smo pretpostavili x0 > x i nastavili dalje dodavati korekciju, dalje bi se samo neprestano udaljavali od rje�enja. Stoga dakle na prikazanom primjeru pretpostavljamo da je x0 sigurno manji od x. Ukoliko je Abs(y1-y2) > ε, treba korigirati početnu pretpostavku. Ako smo sigurni da se nalazimo lijevo od rje�enja, treba dakle dodati određeni iznos (∆x1) i ponovno izračunati y1 i y2. Nakon svake korekcije treba ustanoviti da li smo jo� uvijek s iste strane rje�enja ili smo pre�li na drugu stranu. Ako poznajemo karakter funkcija u promatranom području onda mo�emo zaključiti gdje se nalazimo u odnosu na rje�enje na temelju odnosa y1 i y2. Na prikazanom primjeru u području od x0 do x y1 je uvijek veće od y2, a desno od x y2 je veće od y1. Dakle da bi pravilno korigirali pretpostavku, moramo prvo ustanoviti da li se nalazimo s lijeve ili s desne strane rje�enja. Ako je pretpostavka s lijeve strane, za korekciju treba dodati određeni iznos, a ako je pretpostavka s desne strane rje�enja, pri korekciji potrebno je oduzeti određeni iznos! Ako bi korekcije radili tako da dodajemo i oduzimamo uvijek iste iznose, postupak bi "plesao" po istim točkama oko rje�enja, bez konvergencije. Dakle, nakon �to "pređemo" s druge strane rje�enja treba oduzeti ili dodati različit iznos od korekcije u prethodnom koraku. U ovom primjeru nakon "promjene strane" iznos nove korekcije jednak je polovini iznosa korekcije u prethodnom koraku. Uočite na ne mo�emo uvijek točno znati u kojem koraku će se preći s jedne strane na drugu stranu od rje�enja, stoga algoritam određivanja korekcije mora uvijek pripremiti iznos korekcije za suprotni smjer, tj. za jedan korak unaprijed.

Primjer uporabe strukture stoga u algoritmu evaluacije aritmetičkog izraza Ovdje će biti izlo�en pojednostavljeni algoritam evaluacije numeričkog izraza kao primjer jednog od brojnih algoritama u kojima se koristi struktura stoga. Algoritam učitava aritmetički izraz kao niz znakova (string), a zadaća mu je izračunati vrijednost tako učitanog aritmetičkog izraza.

∆ X1

y1 = f (X)

∆ X1∆ X1

∆ X2∆ X2

∆ X1 ∆ X1

∆ X2

y2 = f (X)

x, y1=Y2

(X-ε, X+ε)

Xo

(Y- ε , Y+ ε )

Page 20: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

20

Radi pojednostavljenja algoritma u ovom primjeru uvedena su slijedeća ograničenja: • izraz sadr�i samo jednoznamenkaste cijele brojeve i operatore zbrajanja, oduzimanja,

mno�enja i dijeljenja, • izraz je već transformiran u "reverznu poljsku notaciju"

Reverzna poljska notacija zapis je izraza u kome su operatori zapisani iza operanada:

a + b → a b +

Algoritam evaluacije izraza:

1. Dodaj �)� na kraj izraza � da bi se označio kraj izraza 2. �skeniraj� (�parsiraj�) izraz s lijeva na desno i ponavljaj korake 3 i 4 dok se ne dostigne

�)� (oznaka kraja izraza) 3. Ako je pronađen operand, stavi ga na stog, tj. na vrh stoga 4. Ako je pronađen operator �o�:

a. Uzmi dva elementa sa vrha stoga (A je na vrhu, a B ispod njega) b. Izračunaj B �o� A c. Stavi rezultat na vrh stoga

5. Kada se obradi cijeli izraz do oznake kraja, vrijednost izraza jednaka je elementu na vrhu stoga

"Parsiranje" izraza je postupak kojim se redom obrađuje znak po znak iz učitanog niza, tj. izdvaja se pojedini znak i ustanovljava se da li je to znamenka ili operand. U slučaju vi�eznamenkastih brojeva, postupak parsiranja je slo�eniji jer treba ustanoviti za svaki broj početak i kraj niza znamenki. U slijedećoj tablici prikazani su svi koraci parsiranja izraza: 5 * ( 6 + 2 ) � 12 / 4 koji zapisan u reverznoj poljskoj notaciji glasi: 5 6 2 + * 12 4 / - U drugom stupcu tablice zapisan je simbol koji se trenutno obrađuje, a u trećem stupcu vide se svi podaci u stogu, odnosno trenutno stanje stoga. Pri tome je vrh stoga s lijeve strane, a kraj s desne strane.

korak simbol stog 1 5 5 2 6 5,6 3 2 5,6,2 4 + 5,8 5 * 40 6 12 40,12 7 4 40,12,4 8 / 40,3 9 - 37 10 )

Algoritmi sortiranja Algoritam sortiranja postavlja elemente neke liste u određeni redoslijed. Najče�će se sortira po numeričkom redoslijedu ili po abecedi (leksikografski redoslijed). Efikasni algoritmi sortiranja preduvjet su uspje�nosti nekih drugih algoritama � npr. onih algoritama pretra�ivanja koji zahtijevaju sortiranu listu da bi u njoj mogli pronaći određeni član. Većina algoritama sortiranja

Page 21: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

21

zasniva se na metodologiji "podijeli i vladaj" � tj. ponavlja se postupak reduciranja slo�enog problema na vi�e jednostavnijih (manjih) cjelina, odnosno veliki niz se dijeli na vi�e manjih nizova koji se zasebno sortiraju. Takvi zasebno sortirani segmenti zatim se spajaju u konačno sortirani niz. Reduciranje niza se obično ponavlja na rekurzivan način. Algoritmi sortiranja najvi�e se razlikuju u operacijama odnosno načinima dijeljenja na podnizove i spajanja u konačno sortirani niz.

"Bubble" sort Ovo je jedna od najjednostavnijih metoda sortiranja koja efikasno funkcionira samo za relativno maleni broj elemenata koji se sortiraju. Za veći broj elemenata ova metoda je prespora. Stoga se ova metoda vrlo rijetko upotrebljava osim za edukacijske svrhe. Najveći član u polju postavlja se na kraj polja, a u ostatku polja se na jednak način tra�i najveći član. Niz kojeg treba sortirati ima n članova. Osnovna je ideja premje�tanje najvećeg člana niza na posljednje mjesto, a zatim se postupak ponavlja za prvih n-1 članova niza, jer je na n-toj poziciji već najveći član. Postupak premje�tanja određenog člana niza na njegovo mjesto sastoji se od sukcesivnih usporedbi susjednih članova niza. Ukoliko je određeni član niza manji od onog koji slijedi iza njega, izvr�ava se zamjena njihovog redoslijeda. Niz je nu�no sortiran kada se postupak uspoređivanja (počev�i od prvog člana niza do zadnjeg nesortiranog) ponovi n-1 puta. Prvi puta nu�no je izvr�iti n-1 usporedbu, da bi najveći član do�ao na posljednje mjesto u nizu. U svakom će sljedećem prolazu kroz niz broj usporedbi biti manji za jedan. PRIMJER: broj članova niza: n = 4 članovi niza: 7, 2, 6, 1 7 > 2 ! 2, 7, 6, 1 j = 1 ⎫ 7 > 6 ! 2, 6, 7, 1 } 3 usporedbe | 7 > 1 ! 2, 6, 1, 7 i = 1, n � j | | 3 prolaza kroz podatke 2 < 6 ! 2, 6, 1, 7 j = 2 | 6 > 1 ! 2, 1, 6, 7 } 2 usporedbe ⎬ n � 1 prolaz i = 1, n � j | prolaz | j = 1, n - 1 j = 3 | 2 > 1 ! 1, 2, 6, 7 } 1 usporedba | i = 1, n � j ⎭ Algoritam "bubble" sort metode u pseudokodu: 1. Učitati broj članova niza N 2. Učitati niz u jednodimenzionalno polje X 3. Petlja J = 1, N � 1

petlja I = 1, N � J ako je X ( I ) > X ( I + 1) onda izvr�i zamjenu sadr�aja dva susjedna člana polja:

Y = X ( I ) X ( I ) = X ( I + 1 ) X ( I + 1 ) = Y

4. Ispisati sortirani niz X.

Page 22: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

22

Sortiranje umetanjem Ova metoda slična je prethodnoj, ali je ipak ne�to efikasnija. Element niza uspoređuje se sa svim prethodnim elementima dok se ne pronađe slijedeći manji element. Na taj način element niza "umeće" se na svoju poziciju u sortiranom dijelu niza. Sortiranje umetanjem daje dobre rezultate za male liste (do 30 elemenata).

� 24 4 3 15 9 7 � (-) ? � 4 24 3 15 9 7 � (----) ? � 3 4 24 15 9 7 � (--------) ? � 3 4 15 24 9 7 � (-------------) ? � 3 4 9 15 24 7 � (-----------------) ? � 3 4 7 9 15 24

�Selection sort� Ova metoda tra�i najmanji element u nesortiranom dijelu polja i stavlja ga na svoje mjesto.

� 4 9 3 15 24 7 � (------------------------) � 3 9 4 15 24 7 � (--------------------) � 3 4 9 15 24 7 � (-----------------) � 3 4 7 15 24 9 � (-------------) � 3 4 7 9 24 15 � (---------) � 3 4 7 9 15 24

"Heap" sortiranje "Heap" sortiranje pripada u familiju "selekcijskih" algoritama sortiranja. Takvi algoritmi sortiranja određuju prvo najveći (ili najmanji) element u listi te ga postavljaju na kraj (ili početak) liste, te na isti način nastavljaju sa ostatkom liste. "Heapsort" izvr�ava ovaj zadatak kori�tenjem strukture podataka koja se zove gomila (eng. heap). Podsjetimo se da je struktura gomile binarno stablo u kojem za svaki čvor vrijedi da je vrijednost u čvoru veća ili jednaka od vrijednosti svih njegovih sljedbenika. Lista se pretvara u gomilu, a korijenski čvor je sigurno najveći element liste. Korijenski čvor gomile se izuzima i stavlja se na kraj sortirane liste, tj. gomila se skraćuje za 1 element i ponovno pode�ava.

"Shell" sort Donald Shell objavio je ovu metodu 1959. To je zapravo unaprijeđena "bubble" metoda i metoda "umetanja" na način da se elementi pomiču u redoslijedu za vi�e pozicija istovremeno. Implementacija ove metode mo�e se opisati kao "preslagivanje" liste (niza) u dvodimenzionalno polje i zatim sortiranje stupaca takvog polja metodom umetanja. I ova metoda nije efikasna za velike liste, ali je jedna od najbr�ih za liste reda veličine oko 1000 elemenata. Prednost je ove metode �to ima male zahtjeve za memorijom.

Page 23: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

23

"Mergesort" (uparivanje i sortiranje) Ovaj algoritam koristi strategiju "podijeli pa vladaj". Niz se rekurzivno dijeli u segmente koji se zasebno sortiraju, a zatim se sortirani segmenti spajaju u konačno sortirani niz. U primjeru na slici 19 niz je podijeljen na dva segmenta koji su nakon sortiranja ponovo spojeni u jedan niz.

Slika 19: Primjer "mergesort" metode

"Quicksort" "Quicksort" je do sada najbr�i poznati algoritam za sortiranje. I ovo je rekurzivni algoritam zasnovan na strategiji "podijeli pa vladaj". Algoritam se sastoji od slijedećih koraka:

1. Odabir jednog člana niza, tzv. "pivot-a". 2. Raspodijeliti članove niza na taj način da sve elemente manje od pivot-a stavimo ispred

njega (podniz 1), a sve članove veće od pivot-a stavimo iza njega (podniz 2). Nakon te raspodjele "pivot" se nalazi na svojoj konačnoj poziciji.

3. Rekurzivno sortirati svaki podniz na isti način.

Slika 20: raspodjela niza na dva podniza oko odabranog "pivot-a" x

Rekurzija se prekida na nizovima od jednog ili niti jednog elementa, koji su sami po sebi sortirani. "Quicksort" algoritam u svakoj iteraciji stavlja barem jedan element niza na njegovu konačnu poziciju. Izbor "pivot-a" nije jednoznačno određen, a nije niti jednoznačno određeno �to učiniti s članovima polja jednakim "pivot-u", pa to postaje pitanje realizacije algoritma.

Indirektno sortiranje Ako treba sortirati velike strukture, npr. slogove koji sadr�e vi�e polja: matični broj studenta, prezime, ime, adresa, upisani predmeti i ocjene itd., tada nema smisla obavljati mnogo zamjena velikog broja podataka. Ako se slogovi sortiraju npr. po matičnom broju, tada se izdvoje u posebno polje matični brojevi s pripadnim pokazivačima na ostale podatke. Sortira se (bilo kojim od postupaka) samo takvo izdvojeno polje.

Algoritmi pretra�ivanja U računalnoj znanosti algoritam pretra�ivanja u �irem kontekstu je algoritam koji daje rje�enje nekog problema nakon evaluacije skupa mogućih rje�enja. Skup svih mogućih rje�enja problema naziva se uobičajeno "prostor pretra�ivanja". Osnovna podjela algoritama pretra�ivanja je na tzv. "slijepe" (eng. blind, uninformed search) i "usmjerene" (engl. directed, informed search).

Page 24: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

24

Slijepo pretra�ivanje Strategija slijepog pretra�ivanja ne uzima u obzir specifičnu prirodu problema. Na taj način "slijepi" algoritmi pretra�ivanja mogu se poopćiti, odnosno na isti način mogu se primjeniti na �iroko područje problema. Međutim većina prostora pretra�ivanja je vrlo velika, te ovakvi algoritmi nisu efikasni osim za male primjere (većinom za edukacijske svrhe). Slijepo pretra�ivanje napreduje sistematski kroz prostor pretra�ivanja ili po nekom prethodno definiranom redoslijedu ili birajući redoslijed evaluacije slučajno.

Pretra�ivanje liste (niza) Ovo je najjednostavnija vrsta algoritma pretra�ivanja. Cilj je pronaći određeni element prema nekom ključu - element koji ima određenu vrijednost ili sadr�i informaciju povezanu sa ključem. To je jedan od najče�ćih problema u računalstvu, pa je slo�enost i struktura ovakvih algoritama temeljito proučena. Najjednostavniji takav algoritam je linearno pretra�ivanje, koje jednostavno sekvencijalno ispituje jedan po jedan element iz liste. Vrijeme izvođenja je dugačko, ali ovaj algoritam se mo�e direktno primjeniti na "neobrađenu" listu, za razliku od algoritama koji npr. zahtijevaju da lista bude sortirana. Binarno pretra�ivanje započinje na polovici liste i nastavlja se stalnim raspolavljanjem intervala u kojem bi se mogao naći tra�eni zapis. Prosječni broj pretra�ivanja je log2 n -1, gdje je n broj elemenata u listi. Za binarno pretra�ivanje lista mora biti sortirana i mora biti omogućen direktan pristup svim elementima liste (�to je va�no kod npr. pretra�ivanja slogova datoteke). Za vrlo velike liste efikasniji je algoritam interpolacijskog pretra�ivanja.

Pretra�ivanje stabla Algoritmi pretra�ivanja strukture stabla čine jezgru tehnika pretra�ivanja. Pretra�uju se čvorovi stabla koji se uzimaju iz strukture podataka te se generiraju njihovi sljedbenici i dodaju u strukturu. Struktura reda koristi se za čuvanje generiranih i jo� neistra�enih čvorova. Redoslijed kojim se čvorovi pohranjuju u red za ispitivanje i uklanjanje određuje tip pretra�ivanja. Postoje dva osnovna načina pretra�ivanja strukture stabla:

Pretra�ivanje u �irinu (engl. breadth-first search) - ispituju se svi čvorovi na određenoj razini prije prelaska na slijedeću razinu. Pretra�ivanje u dubinu (engl. depth-first search) - pretra�uje poniranjem niz stablo �to je br�e moguće tako da uvijek generira djecu zadnjeg pro�irenog čvora dok ne dođe do rje�enja (ili dok ne pređe zadani limit dubine).

Algoritam pretra�ivanja u dubinu razlikuje se od onog u �irinu po redoslijedu kojim je taj čvor stavljen u red - novostvorena djeca stavljaju se na početak reda tako da se ona prva ispituju.

A A

B C

D

E F G

B C

DD D

C E F GB

G GA A

E F GC E F GB

G GA A Slika 21: Pretra�ivanje strukture stabla po �irini i po dubini

Za pretra�ivanje strukture grafa također postoji nekoliko algoritama, a neki od njih zapravo su pro�irenja algoritama za pretra�ivanje strukture stabla.

Page 25: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

25

Usmjereno pretra�ivanje Za razliku od slijepog pretra�ivanja, usmjereno pretra�ivanje koristi informacije o naravi problema kao vodilje koje mogu bitno ubrzati pronala�enje rje�enja - �to je vi�e podataka dostupno postupku pretra�ivanja to je pretra�ivanje efikasnije. Takve informacije obično se nazivaju heurističke � temelje se na iskustvenim pravilima i tehnikama prosuđivanja koje mogu pomoći, ali nu�no ne osiguravaju pronala�enje rje�enja. Heurističke informacije mogu se oblikovati u heurističku evaluacijsku funkciju koja zavisi od pojedinog čvora i od cilja koji se tra�i. Većina algoritama za usmjereno pretra�ivanje namijenjena je za strukture stabla, npr. algoritam "najboljeg prvog" (eng. best-first search) koji zadr�ava procjene vrijednosti heurističkih funkcija svih prethodno generiranih čvorova i izabire najbolji za nastavak potrage. Svi mogući potezi u nekoj igri (npr. �ah ili "kri�ić � kru�ić") mogu se prikazati strukturom stabla. Takva struktura prikazuje prostor mogućih stanja koja nastupaju tijekom igre. Pretra�ivanje takve strukture u svrhu pronala�enja efikasne strategije planiranja slijedećih poteza dodatno je ote�ano jer treba razmatrati i sve moguće poteze koje mo�e povući drugi igrač. Računalni programi za ovakve namjene pripadaju u domenu umjetne inteligencije, osnovne vrste algoritama za pretra�ivanje u ovakvoj vrsti problema su (engleski nazivi): minimax algoritam), search tree pruning i alpha-beta pruning (pruning � kresati, očistiti). Slika 22 sadr�i samo mali dio ukupnog prostora mogućih stanja u igri "kri�ić � kru�ić", tj. na svakoj razini nakon druge "ekspandiran" je samo jedan čvor (prikazani su sljedbenici samo jednog čvora stabla), makar i svi ostali čvorovi te razine imaju isti broj sljedbenika.

X X XX X

X X X

X X X X X X X

O O OO O O

O O O

O O O O O O O O

OO

OO

OO OO O O O

OO

O Slika 22: Dio prostora stanja igre "kri�ić � kru�ić"

U većini sličnih prostora stanja izra�en je problem tzv. "kombinatoričke eksplozije", tj. sa svakim novim elementom uzetim u obzir, eksponencijalno raste broj mogućih kombinacija odnosno stanja koje treba pretra�ivati.

Primjeri usmjerenog pretra�ivanja u in�enjerskoj praksi U in�enjerskoj praksi (najče�će u konstruiranju) vrlo česti su problemi zadovoljenja ograničenja. Umjesto putanje kroz prostor stanja, rje�enje je ovdje skup vrijednosti koje poprima skup varijabli. Proizvod koji se konstruira mora zadovoljiti skup funkcionalnih zahtjeva. Funkcionalni zahtjevi ispunjavaju se indirektno mijenjanjem jednog ili vi�e parametara konstrukcije, fizičkog oblika i operativnih uvjeta. Uobičajeno je da se funkcionalni zahtjevi izra�avaju kao funkcije parametara konstrukcije, drugih funkcionalnih zahtjeva i različitih "internih varijabli" ("prijelaznih ili

Page 26: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

26

pomoćnih" varijabli). Interne varijable i parametri konstrukcije čine vektor nepoznanica konstrukcije P = [p1, p2, p3, �, pn]. Funkcionalni zahtjevi čine vektor F = [F1, F2, F3, �, Fn].

Relacije između zahtjeva i nepoznanica mogu se izraziti kao: fi ( F, P ) = 0 i = 1, k gj ( F, P ) ≤ Gj j = 1, s Navedene jednad�be i nejednad�be u terminologiji znanosti o konstruiranju nazivaju se "ograničenja". Pri tome neke od navedenih relacija ne moraju sadr�avati funkcionalne zahtjeve, nego samo parametre i "interne varijable". Često je vrlo te�ko pronaći skup vrijednosti varijabli (nepoznanica konstrukcije) tako da budu jednako kvalitetno zadovoljeni svi funkcionalni zahtjevi, jer pojedini zahtjevi često budu u koliziji. Metode rje�avanja problema ograničenja uključuju kombinatoričko pretra�ivanje i "backtracking".

U novije vrijeme brojna su istra�ivanja tzv. genetičkih algoritama koji simuliraju procese biolo�ke evolucije i koriste ih za pronala�enje puta prema rje�enju problema.

PROGRAMSKI JEZICI Programski jezik zapravo je skup sintaktičkih i semantičkih pravila koja definiraju računalni program. Jezik omogućuje programeru precizno specificiranje na kojim podacima će računalo djelovati, kako će ti podaci biti spremljeni i prikazani, te koje akcije treba poduzeti za različite uvjete. Kompleksne računalne aplikacije danas nalazimo gotovo u svakom aspektu modernog �ivota: medicinski uređaji, elektrane, video igre, sustavi u automobilu itd. Mnoge aplikacije sadr�e milione linija koda (naredbi) od kojih se očekuje da rade ispravno u svim situacijama. Softver općenito mora biti izuzetno pouzdan - posljedice gre�ki mogu biti u rangu od nelagode pa do �ivotne opasnosti. �to je potrebna veća pouzdanost, to je i razvoj skuplji, pa uvijek treba tra�iti kompromis između cijene i pouzdanosti. Navedenim problemima bave se stručnjaci iz područja softverskog in�enjerstva (eng. software engineering). Tehnike softverskog in�enjerstva nastoje unaprijediti funkcionalnost i pouzdanost programa, uz istovremeno povećanje efikasnosti i olak�avanje procesa razvoja softvera. Problemi softverskog in�enjerstva ujedno su i ciljevi daljnjeg razvoja programskih jezika. Povijesni razvoj programskih jezika, tehnika i metodologija programiranja mo�e se promatrati kroz nekoliko osnovnih problema. Početkom sedamdesetih godina pro�log stoljeća do�lo je do razvoja prvih izuzetno velikih programskih sustava koji su postavili pitanje kako se mo�emo nositi sa veličinom i slo�eno�ću modernih računalnih programa, odnosno kako planirati i realizirati procese razvoja takvih sustava? Neprestana konkurentska borba na tr�i�tu potakla je razvoj mnogih metoda i alata kojima se nastoji smanjiti vrijeme i cijenu razvoja slo�enih programa. Ono �to i danas "najvi�e boli" svakog korisnika bilo koje aplikacije je kako povećati pouzdanost, odnosno minimizirati količinu "bugova" s kojima aplikacija izlazi na tr�i�te.

U ovom poglavlju izlo�en je kratki pregled podjele programskih jezika po različitim kriterijima, a zatim slijedi opis četiri metodologije (paradigme) programiranja koje su u svojim osnovama bitno različite kao i područja njihove namjene. Razlike između programskih jezika najbolje je promatrati upravo kroz vrste metodologije programiranja kojima pripadaju, a ne po detaljima implementacije ili perfromansi. Nastanak različitih metodologija uvjetovan je pro�irenjem sa početnog kori�tenja softvera isključivo za numeričke probleme na sve aspekte �ivota, ali i svim ranije izlo�enim problemima kojima se bavi softversko in�enjerstvo. Objektno orijentirana metodologija je danas prevladavajuća metodologija programiranja u razvoju velikih i slo�enih programskih sustava za većinu područja primjene računala. Stoga je objektno programiranje izlo�eno puno op�irnije od ostalih metodologija, tj. posvećeno mu je cijelo poglavlje koje slijedi iza ovog poglavlja.

Page 27: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

27

Podjela programskih jezika Mnogo je kriterija po kojima mo�emo izvr�iti podjele svih postojećih programskih jezika. Podjela prema namjeni dosta je relativna - prvi razvijeni jezici bili su za numeričke i znanstvene probleme (FORTRAN, ALGOL) i za poslovne probleme (COBOL). Daljnjim razvojem područja namjene su se stalno pro�irivala, mogli bi se npr. izdvojiti jezici za područje umjetne inteligencije (LISP, PROLOG), jezici za manipuliranje sa bazama podataka (SQL) itd. Velik dio dana�njih modernih jezika mo�e se smatrati vi�enamjenskima.

Kako je već navedeno najveće razlike između programskih jezika mogu se razlučiti po načinu rada, odnosno prema metodologiji (paradigmi) programiranja. Četiri osnovne (najče�će kori�tene paradigme su imperativna (proceduralna), funkcijska, logička i objektno orijentirana. Svaka od njih detaljnije je obrađena u ovom poglavlju. Neki jezici ne mogu se svrstati isključivo u jednu paradigmu pa ih nazivamo hibridnima. Primjer takvog jezika je C++, koji se uobičajeno smatra objektnim jezikom, ali nema sva svojstva "čistog" objektnog jezika, a s druge strane ima i većinu karakteristika proceduralnog jezika.

Va�an je kriterij "proceduralnosti" � u proceduralnim programskim jezicima slijed naredbi određuje KAKO obaviti neki posao, a u neproceduralnim jezicima slijed naredbi određuje �TO treba učiniti.

Sa aspekta strukturiranosti razlikujemo nestrukturirane i strukturirane programske jezike.

Sa aspekta povijesnog razvoja odnosno generacijske podjele razlikujemo jezike prve, druge, treće i četvrte generacije. Jezici četvrte generacije bitno olak�avaju i ubrzavaju proces razvoja softvera (npr. SQL jezik koji se koristi za baze podataka).

Metodologije (paradigme) programiranja Metode koncipiranja, modeliranja i programiranja kompleksnih programskih sustava pro�le su u svom razvojnom putu nekoliko faza kroz koje se iskristaliziralo vi�e različitih pristupa koji se obično nazivaju paradigmama (eng. paradigm). U ovom kontekstu riječ "paradigm" pogodno bi bilo prevesti kao "obrazac". Ovdje će biti dani prikazi proceduralnog, funkcijskog, logičkog i objektno orijentiranog programiranja. Paradigma programiranja određuje način koncipiranja programa, ali prvenstveno i način izvr�avanja programa. Na primjer u objektnom programiranju, programer promatra program kao skup objekata koji međusobno komuniciraju, dok u funkcijskom programiranju program mo�emo promatrati kao niz evaluacija funkcija. Različiti programski jezici podr�avaju različite paradigme programiranja. Većina jezika podr�ava samo jednu paradigmu, a ima i jezika koji mogu podr�ati i vi�e paradigmi npr. C++, Common Lisp, Python i Oz. Npr. C++ podr�ava elemente proceduralnog programiranja, objektnog programiranja i generičkog programiranja. U jeziku C++ moguće je napisati "čisto" proceduralni program, "čisto" objektni program ili program koji sadr�i elemente obje paradigme.

Imperativno (proceduralno) programiranje Imperativno programiranje opisuje računalni proces u smislu stanja programa i naredbi koje mijenjaju stanje, odnosno programi su niz naredbi koje računalo treba izvesti. Hardverska implementacija većine računala je imperativna, tj. većina hardvera konstruirana je da izvr�ava strojni jezik napisan u imperativnom stilu. Na toj razini, stanje programa je definirano sadr�ajem memorije i naredbama strojnog jezika. Vi�i imperativni programski jezici upotrebljavaju varijable i kompleksnije naredbe, ali i oni slijede istu paradigmu. Po�to su temeljne ideje imperativnog programiranja "ugrađene" u hardver, većina programskih jezika je imperativna. Imperativni jezici posti�u funkcionalnost dodjeljivanjem vrijednosti varijablama i ispitivanjem vrijednosti varijabli. Naredba dodjeljivanja vrijednosti zapravo izvodi operaciju na informaciji u memoriji. Vi�i programski jezici omogućuju izračunavanje slo�enih mje�ovitih izraza koji su

Page 28: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

28

kombinacija aritmetičkih, relacijskih i logičkih operatora te poziva funkcija. Nakon izračunavanja vrijednost izraza dodjeljuje se memorijskoj lokaciji. Petlje ponavljaju niz naredbi određeni broj puta ili do promjene određenog uvjeta. Uvjetno grananje omogućuje izvođenje bloka naredbi samo pod određenim uvjetima. Naredbe bezuvjetnog grananja uključuju tzv. bezuvjetni skok i poziv procedure odnosno potprograma. Imperativno (proceduralno) programiranje najče�će se upotrebljava za rje�avanje većine problema u in�enjerskoj praksi. Va�no je ovdje napomenuti da se sve �to je izlo�eno u poglavlju "osnovni koncepti programskih jezika" odnosi na imperativne jezike, jer druge paradigme imaju neke dijelove koncepata rije�ene na bitno drugačiji način! Zadaci koji se obrađuju na vje�bama iz kolegija "Programiranje i algoritmi" napravljeni su imperativnim stilom. Visual Basic .NET hibridni je jezik kao i C++, pa spomenuti zadaci sadr�e i neke elemente objektne paradigme.

Programi pokretani događajima Razvoj računalne grafike potaknu je i razvoj grafičkih sučelja koja koristimo pri radu sa programskim sustavima, kao i u procesu razvoja programa. Programe prvih imperativnih jezika računala su učitavala pomoću bu�enih kartica. Slijedio je period uporabe alfanumeričkih terminala kada se za unos naredbi i pokretanje programa koristila tipkovnica, uz mogućnost prikaza upisanog teksta i/ili izlaznih podataka na ekranu. U to vrijeme većina programa izvodila se u slijedećim koracima:

1. pokretanje programa upisivanjem odgovarajuće naredbe operativnog sustava, 2. upisivanje ulaznih podataka, 3. program obrađuje podatke, ispisuje izlazne podatke i zavr�ava s radom.

U ovakvom načinu rada program kontrolira redoslijed izvođenja pojedinih dijelova programskog koda. Izvođenje počinje prvom "izvr�nom" naredbom i slijedi unaprijed određene putanje do zadnje naredbe kojom se prekida izvr�avanje. Pojava mi�a i grafičkih elemenata u sučelju operativnog sustava znatno je unaprijedila mogućnosti komunikacije s računalom. Tada se razvija posebna vrsta upravljanja sa radom programa � programiranje pokretano događajima (eng. event driven programming). U programu upravljanom događajima programski kod ne slijedi u cijelosti unaprijed određene putanje, već se izvode različiti dijelovi programskog koda kao odgovori na događaje. Događaji mogu biti pokrenuti akcijom korisnika, porukama sustava ili drugih programa te samog programa. Redoslijed tih događaja određuje segmente putanje kojom će programski kod biti izveden. Unutar jedne procedure koja reagira na pojedini događaj putanja izvođenja i dalje je određena naredbama po imperativnom principu. Primjer implementacije programiranja pokretanog događajima je Visual Basic .NET, i ostale razvojne okoline s prefiksom "Visual". Događaji su prete�no akcije korisnika kao �to je klik mi�em ili odabir stavke iz izbornika, ali mogu biti i rezultat akcije nekog drugog dijela programskog koda. U toku rada programa poseban dio sustava obrađuje događaje te poziva (aktivira) odgovarajuće dijelove programskog koda (procedure) � slika 23.

događaj(event)

programski kod 1(event procedure 1)

programski kod 2(event procedure 2)

programski kod 3(event procedure 3)

procesiranje događaja(event processor)

Slika 23: program pokretan događajima

Page 29: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

29

Budući da se ne mo�e predvidjeti redoslijed događaja (pa niti koji će se događaji "dogoditi", a koji ne), programski kod mora uzeti u obzir neke pretpostavke o "općem stanju" (sučelja i podataka) kada se počne izvoditi � npr. sadr�i li polje za upis podatka neku vrijednost ili ne i sl. Ovdje je potrebno napomenuti da je vrlo te�ko grafički prikazati putanje izvr�avanja programa u ovakvim situacijama. Standardni elementi dijagrama toka razvijeni su u doba prije nastanka tehnike programiranja pokretanog događajima i nisu naknadno prilagođavani ovoj tehnici, pa ne sadr�e sve elemente potrebne za prikaz situacija koje mogu nastupiti u programima upravljanim događajima.

Proces rada aplikacije upravljane događajima mo�e se opisati slijedećim koracima:

1. Početak izvođenja aplikacije � učitava se i prikazuje sučelje (u Visual Basicu se zove forma) kao poseban "prozor" na ekranu.

2. Forma ili kontrola na formi prima događaj. Događaj mo�e biti uzrokovan akcijom korisnika (npr. "klik" mi�em), sustavom (npr. mjerač vremena), ili posredno programskim kodom (npr. događaj "Load" pri učitavanju forme).

3. Ako postoji programski kod u odgovarajućoj "event proceduri" ona se izvodi. 4. Aplikacija nakon toga čeka na idući događaj.

Koraci 2, 3 i 4 se ponavljaju, sve dok korisnik ili naredba u programskom kodu ne prekinu izvođenje aplikacije.

Programiranje pokretano događajima nije svojstveno određenoj paradigmi programiranja, nego se radi o načinu rada sa programom tijekom njegova izvođenja.

Funkcijsko programiranje Funkcijsko programiranje vrsta je paradigme koja tretira računalni proces kao evaluaciju matematičkih funkcija. Za razliku od imperativnog programiranja, funkcijsko programiranje nagla�ava evaluaciju funkcijskih izraza umjesto izvođenja niza naredbi. Neki mehanizmi i operacije karakteristični za imperativno programiranje u funkcijskom programiranju ne postoje ili su rije�eni na drugi način. Na primjer u striktnom funkcijskom programiranju nema eksplicitne alokacije memorije, niti eksplicitnog dodjeljivanja vrijednosti varijablama. Te operacije izvode se automatski prilikom poziva funkcije, �to ima za posljedicu da se eliminira tzv. popratni efekt poziva funkcije (eng. side effect), karakterističan za imperativne jezike. Na taj način eliminiraju se i negativne posljedice popratnih efekata poziva funkcije koje postoje u imperativnim jezicima. Za određeni skup parametara, rezultat poziva funkcije u funkcijskom jeziku biti će uvijek isti bez obzira gdje ili kada je poziv funkcije izvr�en. Na taj način osigurava se tzv. referencijalna transparentnost koja uvelike olak�ava dokazivanje ispravnosti programa i omogućuje automatsko određivanje dijelova programa koji se mogu nezavisno izvr�avati u paralelnim procesima. Ponavljanje dijelova programskog koda u smislu petlji ne postoji u funkcijskim jezicima, nego se takvi procesi rje�avaju rekurzijom. Rekurzija mo�e poprimiti mnoge oblike u funkcijskim jezicima i općenito se smatra da je efikasnija od mehanizama petlji u imperativnim jezicima. To je i jedan od razloga da i većina imperativnih jezika podr�ava rekurziju (iznimke su npr. FORTRAN 77 i COBOL prije 2002). Funkcijski jezici specificiraju �TO treba napraviti, ostavljajući detalje organizacije podataka i redoslijeda izvođenja interpreteru, dakle naglasak je na tome �to će biti izračunato, a ne kako će biti izračunato. Imperativni jezici detaljno opisuju KAKO treba doći do rezultata, i to kori�tenjem postojeće arhitekture računala (hardvera).

Predstavnici "čistih" funkcijskih jezika su Haskell i ML. Jezik LISP pripada funkcijskoj paradigmi, ali nije "čisti" funkcijski jezik, iako je najra�ireniji u uporabi.

U tabeli koja slijedi dana je paralelna usporedba imperativnog i funkcijskog programiranja.

Page 30: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

30

IMPERATIVNO FUNKCIJSKO

Program: niz naredbi za von Neumann-ovu arhitekturu računala

Program: skup definicija funkcija (neovisan o strojnom kodu računala)

Izvr�ava se niz naredbi Izvr�avanje evaluacijom izraza Iteracija Rekurzija Varijable se mijenjaju tijekom izvr�avanja Varijablama se samo jednom pridru�uje

vrijednost Primjer: i := 0; sum := 0; while (i < n) do i := i + 1; sum := sum + i end;

Primjer: func sum(n:int) : int; if n = 0 then 0 else n + sum(n-1) end;

Deklarativno (logičko) programiranje Deklarativno programiranje uključuje kreiranje skupa relacija koje opisuju prostor rje�enja. Interpretacija specifičnih koraka na putu pronala�enja rje�enja ostavlja se interpreteru. Drugim riječima znanje sadr�ano u skupu relacija interpreter upotrebljava na različite načine za rje�avanje različitih �upita�. Takve relacije mogu biti činjenice i pravila. Kao i funkcijsko, deklarativno programiranje definira �TO treba učiniti, a KAKO će se to učiniti ostavlja se interpreteru. Stoga deklarativna rje�enja imaju dvije nezavisne faze: deklariranje i interpretiranje. Deklarativni jezici opisuju relacije (odnose) između varijabli u kontekstu funkcija, pravila nasljeđivanja ili definiranja pojmova. Proces izvođenja programa (interpreterom ili compilerom) primjenjuje određeni algoritam na te relacije da bi generirao rezultat (najče�će je to odgovor na neki upit). Prednosti deklarativne paradigme ogledaju se u tome da se rje�enje problema mo�e prikazati na apstraktnoj razini, bez ula�enja u irelevantne detalje. Na taj način rje�enje postaje preglednije i razumljivije. Logika interpretera (tj. u njega ugrađeni algoritmi) mo�e se primjeniti na �irokom području problema, tj. deklarativnih specifikacija. Deklarativni jezici intenzivno se upotrebljavaju u slijedećim područjima: umjetna inteligencija, problemi zadovoljavanja ograničenja, baze podataka, upravljanje konfiguracijama, komunikacija između procesa. Poznatiji predstavnici deklarativnih jezika su Prolog (PROgramming in LOGic) i SQL (Structured Query Language).

Objektno orijentirana paradigma programiranja Objektno orijentirano programiranje (u daljnjem tekstu upotrebljavati će se i skraćenica OOP) danas prevladava kao osnovna metodologija (paradigma) koja se upotrebljava pri razvoju gotovo svih slo�enih programskih sustava. Zbog va�nosti OOP, ovoj metodologiji će biti posvećeno puno vi�e prostora nego ostalim metodologijama. Za rje�avanje jednostavnijih problema pogodno je i dovoljno i imperativno (proceduralno) programiranje. Kao uvod u izlaganje objektno orijentiranog programiranja najprije ćemo izvr�iti usporedbu proceduralnog programiranja (s kojim smo se bavili u dosada�njem dijelu izlaganja) i objektno orijentiranog programiranja. Treba napomenuti da varijable, izrazi i osnovne kontrolne strukture na razini naredbi na jednak način egzistiraju i u proceduralnom i u objektnom programiranju.

Page 31: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

31

Usporedba proceduralnog i objektnog programiranja Nedovoljno informirani programeri početnici često nepotrebno uspoređuju programske jezike različitih kategorija i paradigmi, pa npr. izvode zaključke kao: C++ ima puno vi�e "toga" pa je stoga puno bolji jezik od C-a, pa ću onda samo njega koristiti i slično. Pri odabiru programskog jezika za rje�avanje nekog problema, odnosno za izradu slo�enije aplikacije, nu�no je poznavati karakteristike paradigme programiranja kojoj jezik pripada. Stoga je u dodatku 2 ovih skripata dana detaljna usporedba proceduralnog i objektnog programiranja, kao dvije danas dominantne paradigme u in�enjerskoj praksi. U okviru ovog poglavlja navedene su samo osnovne razlike proceduralnog i objektnog programiranja. Programski sustav mo�e se definirati kao skup mehanizama koji izvode određene operacije nad podacima. To znači da proces koncipiranja programskog sustava mo�emo promatrati sa dva aspekta: mo�emo se usredotočiti primarno na procedure (funkcije) ili primarno na podatke. Bit razlike između tradicionalnih proceduralnih metodologija i novih objektno orijentiranih le�i u primarnom fokusu (�ari�tu). Proceduralne tehnike usredotočuju se na funkcije sustava - "�to sustav radi" (eng. what is it doing), a objektno orijentirane tehnike usredotočuju se na podatke (objekte) sustava - "čemu su podvrgnuti" (eng. what is being done to). Takva naizgled jednostavna promjena fokusa dovodi do radikalne promjene procesa koncipiranja programskog sustava. Proceduralno programiranje karakterizira "top-down" pristup u razvoju sustava, poznat i kao dekompozicija funkcija. Kreće se od općih postavki o procesu rje�avanja problema prema sve detaljnijim odredbama o svakom specifičnom zadatku u procesu. Dekompozicija se odvija striktno po funkcionalnim linijama, odnosno vodi se računa samo o tome "�to koji modul radi". Primjer "top-down" dekompozicije procedure za prikupljanje podataka prikazan je na slici 24.

Procedura zaučitavanjepodataka

Otvaranjedatoteka

Verificiranjeulaznih podataka

Učitavanjepodataka

Korigiranjepodataka

Korekcijapodatka 1

Kreiranjedirektorija

Kreiranje novihtablica

Korekcijapojedninog

podatka

Korekcija prvegrupe podataka

Korekcijapodatka 2

Korekcijapodatka 3

Korekcija drugegrupe podataka

Slika 24: Primjer "top-down" dekompozicije

Rezime osnovnih razlika proceduralnog i objektnog programiranja dan je u slijedećoj tabeli:

PROCEDURALNO (IMPERATIVNO) OBJEKTNO

naglasak na proceduralnoj apstrakciji "top-down" razvoj programa stupnjevano pobolj�avanje pogodno za manje programe

naglasak na apstrakciji podataka "bottom-up" razvoj programa ponovo upotrebljiva rje�enja pogodno za velike programske sustave

Page 32: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

32

Prednost " Top-down" koncepcije (pristupa) je u tome da omogućuje fokusiranje na manje detalja istovremeno, smanjujući na taj način razinu kompleksnosti u svakoj fazi procesa razvoja. Stoga takav pristup dalje najbolje rezultate kod problema koji su čisto hijerarhijske prirode. Na�alost, mnogi problemi stvarnog svijeta (stvarni problemi) nisu hijerarhijski. "Top-down" pristup temeljen na funkcijama ima i druge nedostatke koji dolaze do izra�aja pri razvoju i odr�avanju vrlo velikih sustava:

• te�ko je razvijati "funkcionalnu točku gledanja" (eng. functional viewpoint) • realne sustave problematično je karakterizirati funkcionalno • funkcionalni fokus gubi pregled podataka • producira se programski kod koji je te�ko iznova upotrebljiv

OBJEKTNO ORIJENTIRANO PROGRAMIRANJE Objektno orijentirani pristup modeliranju i programiranju kombinira podatke i naredbe (programski kod) koje manipuliraju s podacima u jedinstveni koncept � OBJEKT. Va�no je naglasiti da se objektno orijentirano programiranje ne bavi programiranjem u smislu razvoja algoritama i struktura podataka, nego ga treba promatrati kao skup sredstava za organiziranje programa, odnosno općenitije kao tehnike za koncipiranje programa. Osnovni gradbeni element jezika je objekt a ne algoritam (�to ne znači da se algoritmi zanemaruju). U objektno orijentiranom pristupu naglasak je na modeliranju stvarnosti u domeni problema umjesto stvaranja arhitekture modela sustava koja vodi k implementaciji. Temeljna je ideja (princip) objektno orijentiranog programiranja: modelirati računalni program kao skup objekata koji komuniciraju (funkcioniraju) zajedno da bi postigli cilj zadatka postavljenog cjelokupnom sustavu. Pri tome svaki objekt modelira entitet ili događaj iz aplikacijskog problema (domene, "stvarnog svijeta") � objekti mogu obuhvaćati apstrakcije kompleksnih fenomena ili mogu reprezentirati elemente programskog sustava (npr. stogove ili upravljanje grafičkim prikazom). Dakle objekti su osnovna sredstva strukturiranja programa, odnosno čine sredi�nji programski (softverski) koncept OOP. Objekt obuhvaća identitet, strukturu i pona�anje aplikacijskih entiteta koje reprezentira (modelira). Operacijski gledano, objekti kontroliraju računalni proces. Iz perspektive razvoja programa, najva�nija karakteristika objekata nije njihovo pona�anje kao takvo, nego činjenica da se pona�anje objekta mo�e opisati apstraktnom karakterizacijom njegova sučelja. Takva apstraktna karakterizacija dovoljna je za početno koncipiranje sustava. Stvarno pona�anje objekta mo�e se implementirati i doraditi kasnije, prema potrebama.

U stvarnom svijetu mnogi objekti su slični - imaju zajednička svojstva i pona�anje. Ipak, svaki objekt ima svoj identitet i svoje jedinstvene vrijednosti (unutar) zajedničkih svojstava. Unatoč jedinstvenosti identiteta i vrijednosti svakog objekta, smislenije je opisivati objekte u grupama. Objektno orijentirani program opisuje objekte koji se pojavljuju u aplikaciji - to čini sa klasama čije instance su objekti. Dakle "objekt" je programski (softverski) koncept koji modelira aplikacijski entitet. "Klasa" je programski (softverski) koncept koji opisuje skup objekata.

Objekti se mogu usporediti sa varijablama u tradicionalnim programskim jezicima. Ipak, postoji značajna razlika između objekta i varijable. Varijabla obuhvaća samo "podatkovni" (informacijski) aspekt objekta (vrijednost), ali ne i pona�anje.

Kombinacija strukture podataka i deklaracije funkcija, zajedno sa sposobno�ću da iz sebe kreira instance različitih identiteta, naziva se klasom u objektno orijentiranim programskim jezicima. Klasa usko povezuje strukture podataka i njima pridru�ene procedure koje ih obrađuju.

Objektna tehnologija razvoja sustava koristi isti model kroz cijeli proces razvoja sustava: - započeti sa objektno orijentiranom analizom - konvertirati rezultate analize u objektne koncepte - napisati objektno orijentirane programe

Page 33: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

33

Dakle, mo�da najveća prednost objektne tehnologije je u konzistentnosti modela tijekom cijelog procesa razvoja programskog sustava. �to je sustav kompleksniji i veći, ta prednost vi�e dolazi do izra�aja. Vjerojatno najva�niji doprinos objektne orijentacije programerskoj praksi je upotreba nasljeđivanja pri određivanju relacija između objekata, odnosno klasa objekata. Nasljeđivanje omogućuje inkrementalno dodavanje funkcionalnosti (specifikaciji). Na taj način osigurano je bolje konceptualno modeliranje - mogu se izvući zajednički dijelovi specifikacije i omogućena je ponovna upotrebljivost specifikacije programskog koda. Ako se (disciplinirano) primjenjuje na odgovarajući način, nasljeđivanje omogućuje postupan razvoj specifikacije tipa klase objekata. Različiti objekti različitih tipova mogu se promatrati kao elementi zajedničkog "super" tipa.

Navedimo uvjete koje mora ispunjavati programski jezik da bude objektno orijentiran:

Treba podr�avati objekte koji predstavljaju apstrakciju entiteta iz domene problema. Objekti moraju imati mogućnost skrivanja lokalnog stanja i posjedovati sučelje koje definira operacije nad tim objektima. Objekti moraju pripadati nekoj klasi (razredu), a klase mogu nasljeđivati svojstva od nadklasa. U ovom trenutku sigurno se nameće pitanje da li je opravdano koristiti objektno orijentirano programiranje kada iste zadatke mo�emo rije�iti i napisati i u jeziku koji nije objektan? Prednosti ove paradigme i metodologije prvenstveno se očituju pri razvoju velikih i slo�enih programskih sustava. Apstrakcija podataka (eng. data abstraction) pridonosi lak�em razumijevanju i snala�enju u programskom kodu � objekt čine strukture podataka zajedno sa procedurama nad tim podacima. Ponovna iskoristivost programskog koda (eng. code reusability) uvelike olak�ava proces razvoja i posebno odr�avanja - jednom napisani kod se koristi vi�e puta i na vi�e različitih načina. Ukoliko je potrebno promijeniti ili dodati neke postupke u već definiranu klasu, to se izvodi jednostavno pomoću nasljeđivanja i vi�eobličja. Ovom metodologijom programski sustavi se grade na osnovi stabilnih međuformi, tako da sustav evoluira tijekom vremena.

Jedno od primarnih svojstava objekta je kombiniranje struktura podataka i funkcionalnosti - programski kod i svi relevantni podaci su "spakirani" zajedno. Objekt mo�emo promatrati kao da se nalazi unutar "čahure" (kapsule) koja osigurava da podaci i kod egzistiraju zajedno. Čahura također slu�i i kao za�tita od neautoriziranog pristupa internim podacima i operacijama objekta. Dozvola pristupa mora se eksplicitno definirati.

Koncept objekta Osnovni elementi objekata su atributi i operacije. Atribut je informacijski detalj svojstven objektu. Ovisno o konkretnom programskom jeziku, atributi se nazivaju i varijablama ili svojstvenim poljima (eng. member fields). Operacija je funkcionalni detalj svojstven objektu i spremljen kao dio objekta. Za operacije se koriste i nazivi svojstvena funkcija (eng. member function) ili metoda.

atributi

operacije

suče

lje

objekt

unutra�njost vanjski svijet Slika 25: Dijagram objekta � "unutra�njost" i "vanjski svijet"

Page 34: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

34

Pri modeliranju sustava korisno je prikazivati objekte i klase pomoću dijagrama. Dijagram objekta nagla�ava objekt kao ne�to �to ograničava svoju "unutra�njost" i komunicira sa "vanjskim svijetom". Objekti su dobro definirane konstrukcije prikaza konkretnih ili konceptualnih entiteta. Navesti ćemo značajke objekata: Objekti: " "Enkapsuliraju" strukturalne značajke - atribute.

- Atributi: - određuju moguća stanja objekta - su ekstrahirani iz domene upotrebom deklarativne ili informacijske apstrakcije - mogu biti jednostavni ili kompleksni tipovi podatka - mogu imati jednu ili vi�e (skup) vrijednosti

" "Enkapsuliraju" značajke pona�anja - operacije. - Operacije:

- određuju moguća pona�anja objekta - su ekstrahirane iz domene upotrebom proceduralne ili procesno orijentirane

apstrakcije - sadr�e ulazne i izlazne parametre, te vrijednosti koje "vraćaju" - se pozivaju kao odgovor na primanje poruke

" Mogu biti aktivni i pasivni. - Aktivni objekti imaju "nit kontrole" (eng. thread of control) i mogu inicirati aktivnosti. - Pasivni objekti samo primaju zahtjeve od ostalih objekata i nemaju "nit kontrole".

" Mogu biti "stalni" (eng. persistent) ili tranzijentni (eng. transient). Stalni objekti postoje i nakon prestanka postojanja njihovih kreatora, a tranzijentni objekti postoje samo za vrijeme postojanja njihovog kreatora.

" Imaju identitet, tj. svaki objekt je jedinstven. " Sudjeluju u relacijama i događajima. " Sadr�e semantiku, odnosno značenje i svrhu unutar problema ili rje�enja. " Mogu biti kompleksni, s mogućno�ću reduciranja u podređene objekte, ili mogu biti

primitivni, bez mogućnosti reduciranja. " Objekti su instance klasa. Ka�e se da objekti "instanciraju" klase. Relacija između objekta i

klase je poznata kao "is-a" relacija. Dakle "objekt" je programski (softverski) koncept koji modelira aplikacijski entitet. "Klasa" je programski (softverski) koncept koji opisuje skup objekata.

Koncept klase Unatoč jedinstvenosti identiteta i vrijednosti svakog objekta, smislenije je opisivati objekte u grupama. To se čini sa klasama čije instance su objekti. Klasa opisuje skup entiteta koji imaju zajedničke temelje koncepta. Kombinacija strukture podataka i deklaracije funkcija, zajedno sa sposobno�ću da iz sebe kreira instance različitih identiteta, naziva se klasom u objektno orijentiranim programskim jezicima. Klasa usko povezuje strukture podataka i njima pridru�ene procedure koje ih obrađuju.

Objekt je instanca klase, a klase slu�e kao predlo�ci za kreiranje objekata. Klase imaju �ivotni ciklus koji dijele sa svojim objektima (slika 26).

Page 35: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

35

�ivotni ciklus jedne klase

�ivotni cilkus skupaobjekata klase

inicijalizacija konstrukcija destrukcija finalizacijaselekcije

mutacije

Slika 26: �ivotni ciklus klase i njenih objekata

Navesti ćemo značajke klasa:

Klase: " Se bave implementacijom uniformnih strukturalnih značajki i značajki pona�anja. " Imaju sposobnost definiranja uzoraka za objekte klase. Klasa određuje strukturu i pona�anje

tih objekata. " Imaju sposobnost kreiranja objekata. Klasa se mo�e promatrati kao "tvornica objekata". Klase

također mogu odr�avati reference na sve svoje objekte. " "Enkapsuliraju" strukturalne značajke - atribute.

- Atributi: - su implementirani klasom - mogu biti vezani uz objekte klase - svaki objekt mo�e imati svoju vrijednost, tj.

atribut objekta je unutar dosega određenog objekta - mogu biti vezani sa klasom kao cjelinom - svi objekti klase dijele istu vrijednost,

tj. atributi klase su unutar dosega svih objekata klase " "Enkapsuliraju" značajke pona�anja - operacije.

- Operacije: - Su implementirane kao metode ili potprogrami, a obično se nazivaju servisima

koje nudi klasa (ili njeni objekti) - mogu biti vezane uz objekte klase, odnosno primjenjene na objekte klase - mogu biti vezane sa klasom kao cjelinom, odnosno primjenjene na samu klasu - mogu biti apstraktne, tj. mogu imati specificirano samo sučelje, bez

implementacije, ali takve klase ne mogu imati instance " Definiraju pristupačnost atributa i operacija iz vanjskog svijeta prema objektu klase.

Razlikuju se tri vrste pristupa: - "public" - svi drugi objekti imaju pristup - "protected" - pristup imaju objekti unutar iste klase - "private" - nema pristupa iz vanjskog svijeta prema značajkama objekta

" Mogu imati posebne mehanizme (protokole) kroz koje drugi objekti mogu doprijeti do atributa i operacija, odnosno mijenjati ih, dodavati i brisati.

" Mogu biti parametrizirane, tj. zahtijevati parametre definiranja da bi postale sposobne za kreiranje objekata. Parametrizirane klase obično se nazivaju i generičke klase ili "klase predlo�ci" (template classes).

" Mogu omogućiti svojim objektima da budu klasificirani kao statički ili dinamički. Za razliku od statičkih, dinamički objekti mogu mijenjati svoje klase.

" Omogućuju objektima da pripadaju direktno u vi�e klasa.

Page 36: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

36

" Imaju �ivotni ciklus koji dijele sa svojim objektima (slika 26). �ivotni ciklus naznačen je slijedećim vrstama operacija:

- operacije inicijalizacije - pozivaju se pri kreiranju prvog objekta klase - operacije konstrukcije (eng. constructor operations) objekata - operacije selekcije (eng. selector operations) koje daju sučelje za "dobivanje"

informacija o objektu ili klasi i iz objekta ili klase - operacije mutacije (eng. mutator operations) koje daju sučelje za "postavljanje"

informacija o objektu ili klasi i iz objekta ili klase - operacije destrukcije (eng. destructor operations) koje uni�tavaju objekte - finalne operacije koje deinicijaliziraju klasu, a pozivaju se pri uni�tenju

posljednjeg objekta klase " Sudjeluju u relacijama i događajima. " Definiraju implementaciju za svoje objekte. " Mogu biti kompleksne, s mogućno�ću reduciranja u podređene klase, ili mogu biti primitivne,

bez mogućnosti reduciranja. Pojam kategorizacije je uobičajen u konvencionalnim metodama prikaza znanja - npr. zoolozi koriste hijerarhijsku kategorizaciju vrsta. Relacije između kategorija obično su tipa "jest" (eng. "is a", "is instance of"), npr. automobil je (jest) vozilo. Objektno orijentirano programiranje temelji se na ideji povezivanja klasa sa "is a" relacijama.

Klasa opisuje strukture podataka i funkcionalnost svojih instanci. Nema uvijek potrebe da klasa ima instance. Klasa mo�e poslu�iti i kao osnovna klasa hijerarhije koja apstrahira zajednička svojstva nekoliko deriviranih klasa. Apstraktna klasa je dakle klasa koja slu�i kao zajednička osnovna klasa i neće imati instance.

Kompozitni objekt je agregacija drugih objekata, odnosno sadr�i kompoziciju ili agregaciju drugih objekata kao podobjekata u svojoj implementaciji. Takvi podobjekti mogu biti instance klasa koje predstavljaju entitete, ili mogu i sami biti kompozitni objekti. Na taj način mo�e se kreirati vi�erazinska hijerarhija sadr�avanja (uključivanja) objekata. Kompozitni objekt upravlja postojanjem i međuzavisnostima svojih podobjekata, odnosno upravlja skupovima instanci podobjekata.

Osnovni elementi objektnog modela U ovom poglavlju izlo�iti ćemo slijedeće osnovne elemente koji moraju postojati da bi neki model entiteta i pojava iz stvarnog svijeta u programskom sustavu bio objektno orijentiran:

• Apstrakcija (abstraction) � realizira se pojmovima klase i objekta, koji su već detaljno izlo�eni

• Učahurivanje (encapsulation) • Nasljeđivanje (inheritance) • Vi�eobličje (polymorphism)

Učahurenje (enkapsulacija) Jedno od primarnih svojstava objekta je kombiniranje struktura podataka i funkcionalnosti - programski kod i svi relevantni podaci su "spakirani" zajedno. Objekt mo�emo promatrati kao da se nalazi unutar "čahure" (kapsule) koja osigurava da podaci i kod egzistiraju zajedno. Čahura također slu�i i kao za�tita od neautoriziranog pristupa internim podacima i operacijama objekta. Dozvola pristupa mora se eksplicitno definirati. Razlikujemo dva načina pristupa - pristup od strane klijenata (objekata koji nisu hijerarhijski povezani s objektom kojem se pristupa) i pristup od strane podklasa iz hijerarhije klasa kojoj pripada objekt.

Page 37: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

37

Slika 27: Zone pristupa objektu

Svi atributi i operacije koji su potpuno unutar objekta, skriveni su od vanjskog svijeta, odnosno oni su "učahureni" (eng. encapsulated). Ostali objekti nemaju pristup do njih. Atributi i operacije koji djelomično izlaze iz okvira objekta pristupačni su "vanjskom svijetu" i oni čine sučelje objekta. Razlikujemo dva načina pristupa (slika 27) - pristup od strane klijenata (objekata koji nisu hijerarhijski povezani s objektom kojem se pristupa) i pristup od strane podklasa iz hijerarhije klasa kojoj pripada objekt. Enkapsulacija promovira modularnost, tj. objekti se moraju promatrati kao blokovi za gradnju kompleksnog sustava. Kad se jednom dostigne odgovarajuća modularizacija, moguće je odgoditi konačne odluke o implementaciji. To svojstvo omogućuje brzu izradu prototipa modela. Enkapsulacija omogućuje separaciju procesa kreiranja klase na faze specifikacije i implementacije. Specifikaciju mo�e izraditi specijalist za koncipiranje programskih sustava (eng. "software designer"), a implementaciju programer. Vrste pristupa u .NET Visual Basic-u:

REZERVIRANA RIJEČ

DOSTUPNOST

public član je dostupan svima

protected članu se mo�e pristupiti samo iz klase koja ga definira i iz klasa koje od nje nasljeđuju

friend član je dostupan iz svih klasa unutar istog programa (projekta)

private član je dostupan samo unutar klase

protected friend unija protected i friend

Nasljeđivanje Usporedba klasa sa konvencionalnim načinima kategorizacije dovodi do izra�aja pojam hijerarhije klasa (nasljeđivanje). "Podklase" su zapravo pro�irenja i/ili specijalizacije postojećih klasa i nasljeđuju njihova svojstva. Objektno orijentirani programski jezici upotrebljavaju klase za kategorizaciju entiteta koji se pojavljuju u aplikacijama. Relacije između kategorija obično su tipa "jest" (engl. "is a", "is instance of"), npr. automobil je (jest) vozilo. Kad je hijerarhija jednom postavljena, jednostavno se pro�iruje. Da bi se opisao novi koncept (entitet), nije nu�no

private

protected

public

sučelje premapodklasama

suče

lje p

rem

akl

ijent

ima

atributi

operacije

suče

lje

objekt

unutra�njost vanjski svijet

Page 38: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

38

opisati sva njegova svojstva. Dovoljno je opisati samo razlike u odnosu na koncept unutar postojeće hijerarhije.

� Najjednostavniji način definiranja podklase je pro�irivanje osnovne klase s novom deriviranom klasom. Podklasa nastoji pro�iriti svojstva definrana osnovne klase.

� Drugi način definiranja podklase je specijalizacija. U tom slučaju osnovna klasa se upotrebljava za definiranje derivirane klase koja specijalizira svojstva osnovne klase.

� Nasljeđivanje nije ograničeno na jednu osnovnu klasu. Klasa se mo�e deklarirati i kao ekstenzija dvije ili vi�e klasa, u tom slučaju govorimo o vi�estrukom nasljeđivanju.

� U kompleksnim hijerarhijama klasa mo�e se dogoditi da se osnovna klasa pojavljuje vi�e nego jedanput., odnosno da neke "superklase" (klase koje se dalje deriviraju) imaju zajedničku osnovnu klasu. Svojstva koja se nasljeđuju iz tih "superklasa" ponavljaju se tada u deriviranim klasama i u tom slučaju govorimo o ponovljenom nasljeđivanju. Drugim riječima, isto svojstvo mo�e biti naslijeđeno od različitih "superklasa" koje su to svojstvo naslijedile od zajedničkog "pretka".

Slika 28: Vrste nasljeđivanja

Slika 29: Primjer hijerarhijske strukture klasa

prikaz proizvoda

identifikator : Stringopis : Stringodgovorna osoba : Stringograničenja upotrebe : Stringstatus : String

3D CAD model

konstrukcijska dokumentacija

sastavnica proizvoda

lista zahtjeva

ugovorna dokumentacija

tehničke upute

standardi

interni standardi

opći standardi

tehnolo�ka dokumentacija

tehnički proračunicrte�

radionički crte�

sklopni crte�

dispozicijski crte�

Normalno naslijeđivanje Ponovljeno naslijeđivanje Vi�estruko naslijeđivanje

Page 39: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

39

Primjer nasljeđivanja metoda Ovdje je dan primjer programskog koda u .NET Visual Basic-u za ilustraciju kako jedna klasa nasljeđuje metodu od druge klase koja joj je nadređena i u kojoj je ta metoda definirana. Klasa "Class1" sadr�i dvije metode "Method1" i "Method2". Obje metode imaju samo po jednu naredbu ("MessageBox") koja ispisuje tekst na ekranu. Klasa "Class2" nasljeđuje sve (obje) metode iz klase "Class1" naredbom "Inherits Class1". U klasi "Class2" redefinira se metoda "Method2" pomoću rezervirane riječi "Overrides", odnosno programski kod metode "Method2" raditi će drugačije pozvan iz objekta klase "Class1" nego kad je pozvan iz objekta klase "Class2". "Method1" nije promijenjena u "Class2" pa će njen poziv rezultirati ispisom istog teksta, bez obzira iz kojeg objekta bude pozvana. Public Class Class1 Sub Method1() MessageBox.Show("ovo je prva metoda u osnovnoj klasi.") End Sub Overridable Sub Method2() MessageBox.Show("ovo je druga metoda u osnovnoj klasi.") End Sub End Class Public Class Class2 Inherits Class1 Public Field2 As Integer Overrides Sub Method2() MessageBox.Show("ovo je metoda u deriviranoj klasi.") End Sub End Class Private Sub primjer_Click() Dim C1 As New Class1() Dim C2 As New Class2() C1.Method1() 'poziv prve metode u osnovnoj klasi. C1.Method2() 'poziv druge metode u osnovnoj klasi. C2.Method1() 'poziv metode naslijeđene iz osnovne klase. C2.Method2() 'poziv metode iz derivirane klase. End Sub Procedura Sub primjer_Click() sadr�i instanciranje objekta C1 iz klase Class1 i objekta C2 iz klase Class2. Nakon toga oba objekta pozivaju obje metode, a rezlutat ispisa na ekranu je slijedeći:

ovo je prva metoda u osnovnoj klasi. ovo je druga metoda u osnovnoj klasi. ovo je prva metoda u osnovnoj klasi. ovo je metoda u deriviranoj klasi.

Vi�eobličje (polimorfizam) Polimorfizam (vi�eobličje, vi�evrsnost) znači imati sposobnost preuzeti mnogo varijanti oblika. U objektno orijentiranoj tehnologiji to se odnosi na mogućnost entiteta da se u tijeku izvođenja pove�e sa instancama različitih klasa. U objektno orijentiranim jezicima mogu se razlučiti dva oblika polimorfizma - inkluzijski i operacijski.

• Inkluzijski polimorfizam implementira se mehanizmom nasljeđivanja. Taj način polimorfizma omogućuje da se objekt tretira kao da je pripadnik vi�e vrsta istovremeno.

Page 40: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

40

Objekt koji je instanca jedne klase mo�e se upotrijebiti kao da je isto tako i instanca druge klase, uz uvjet da je prvi objekt podklasa drugog.

• Operacijski polimorfizam implicira da se operacije mogu primjeniti na različite tipove koji pripadaju nepovezanim skupinama. Drugim riječima, operacije istog naziva mogu se primjeniti na različite objekte koji nisu inkluzijski povezani. Postoje dvije vrste operacijskog polimorfizma - parametarski i "preopterećenje operatora".

o Preopterećenje (eng. overloading) implicira da se ista operacija upotrebljava za različita implementacijska tijela. U takvom slučaju dvije operacije dijele isto ime, ali imaju potpuno različito pona�anje.

o U parametarskom polimorfizmu, operacija radi na isti način za mnogo tipova, implementirajući isto pona�anje. Takve operacije obično se nazivaju generičke funkcije. Generička funkcija mo�e raditi sa argumentima bilo kojeg tipa, općenito pokazujući isto pona�anje, nezavisno od tipova argumenata.

Polimorfizam, u kombinaciji sa dinamičkim povezivanjem (eng. dynamic binding) omogućava gradnju fleksibilnih sustava koje je lak�e pro�irivati. Dinamičko povezivanje je mogućnost da se objekt pove�e sa operacijom tek u tijeku izvođenja programa. Drugim riječima dinamičko povezivanje odla�e povezivanje poziva funkcije i ciljnog bloka programskog koda do trenutka izvođenja programa. Neki načini implementacije vi�eobličja u .NET Visual Basic-u:

• Overloading (preopterećenje) o Različite verzije metoda imaju isto ime ali prihvaćaju različite količine

parametara ili različite tipove parametara • Overriding (prekoračenje)

o Metode zamjenjuju naslijeđene metode koje nisu prikladne u deriviranoj klasi. Derivirane klase nasljeđuju prekoračene metode

• Shadowing (skrivanje) o sakriveni članovi lokalno zamjenjuju članove koji imaju veći doseg

Primjer preoterećenja u .NET Visual Basic-u: Overloads Sub Display(ByVal theChar As Char) ' programski kod koji prikazuje znakovni podatak. End Sub Overloads Sub Display(ByVal theInteger As Integer) ' programski kod koji prikazuje cjelobrojni podatak. End Sub Overloads Sub Display(ByVal theDouble As Double) ' programski kod koji prikazuje decimalni broj. End Sub Display("9") - poziv procedure �Display� za ispis znaka (znamenke) 9 Display(9) - poziv procedure �Display� za ispis cjelobrojne vrijednosti 9 Display(9.9) - poziv procedure �Display� za ispis realne vrijednosti 9.9 Bez preopetećenja � različita imena za različite procedure: Sub DisplayChar(ByVal theChar As Char) Sub DisplayInt(ByVal theInteger As Integer) Sub DisplayDouble(ByVal theDouble As Double)

Page 41: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

41

Osnove rada s objektima u .NET Visual Basic-u Kontrole na traci s alatima (Toolbox) predstavljaju klase. Postavljanjem kontrole na formu zapravo se kreira objekt � instanca klase. Forma je isto tako klasa. U izvođenju programa Visual Basic .NET kreira instancu forme, odnosno te klase. Objekti se kreiraju kao identične kopije svojih klasa. U tijeku svojeg postojanja kao individualnih objekata, mogu im se mijenjati svojstva. Polja (Fields) i Svojstva (Properties) predstavljaju informacije koje objekt sadr�i. Polja su ekvivalentna varijablama � mo�e im se direktno pristupiti. Svojstvima se vrijednosti pridru�uju ili predaju pod kontrolom specijalnih procedura �Property Get� i �Property Set� koje omogućuju postavljanje i provjeru dodatnih uvjeta pri manipulaciji sa vrijednostima svojstava. Deklariranje polja (field):

Dim X As Integer = 8

Deklariranje instance klase: Dim Obj1 As New Class1

Pridru�ivanje vrijednosti polja (varijable) "X" svojstvu �Prop1�: Obj1.Prop1 = X

Polju (varijabli) �X� pridru�uje se vrijednost svojstva �Prop1� uvećana za 1: X = Obj1.Prop1 + 1

Pridru�ivanje vrijednosti polju "Field1" objekta �Obj1�: Obj1.Field1 = X

Metode (Methods) predstavljaju akcije koje objekt mo�e izvr�iti. Metode su procedure definirane unutar klase. Upotrebljavaju se kao i �sub� procedure ili funkcije, ali im se pristupa preko objekta kojem pripadaju. Slijedeći fragment programskog koda poziva funkciju i �sub� proceduru deklarirane unutar klase:

Deklariranje objekta kao instance klase: Dim Obj2 As New Class2 Dim Y As Integer

Pridru�ivanje vrijednosti koju vraća metoda deklarirana kao funkcija: Y = Obj2.GetNumber

Poziv metode deklarirane kao �sub� procedura (subroutine): Obj2.StoreNumber(Y)

Događaji (Events) su poruke koje objekt prima od ili �alje drugim objektima ili aplikacijama. Događaji omogućuju objektima da izvode akcije kad god dođe do specifične pojave. Događaji dolaze od drugih objekata, aplikacija ili od ulaznih akcija korisnika programa (npr. klik mi�em).

Page 42: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

42

Primjer kreiranja instanci klase: Klasa koja sadr�i metodu �ShowFrm� za definiranje i instanciranje nove forme: Public Class ShowMe Sub ShowFrm() Dim frmNew As Form1 frmNew = New Form1 frmNew.Show() frmNew.WindowState = 1 End Sub End Class Procedura koja kreira novu instancu klase �ShowMe� i poziva njenu metodu �ShowFrm� Private Sub Button1_Click() Dim clsNew As New ShowMe clsNew.ShowFrm() End Sub

Svaki poziv procedure Button1_Click() rezultirati će otvaranjem i prikazivanjem nove forme na ekranu.

Sintaksa �Class� naredbe u .NET Visual Basic-u: [ Public | Private | Protected | Friend | Protected Friend ] [ Shadows ] [ MustInherit | NotInheritable ] Class name [ Inherits classname ] [ Implements interfacenames ] [ statements ] End Class

Slo�eni objektno orijentirani programski sustavi

Koncipiranje slo�enih objektnih sustava Neki autori definiraju objektno orijentirano koncipiranje kao "konstrukciju programskih sustava u obliku strukturiranih skupova (kolekcija) implementacija apstraktnih tipova podataka. Objekt se mo�e promatrati kao smislena povezanost određenog znanja i određenih operacija. Izgraditi sustav sa objektno orijentiranim pristupom, znači analizirati problem i pronaći objekte uključene u sustav. Opće značajke i pona�anje tih objekata modeliraju se i implementiraju kao klase u objektno orijentiranom programskom jeziku. Kada se jednom objekti domene problema modeliraju i kreiraju kao klase, te klase se spajaju zajedno u modeliranju sustava u računalnom okviru. Takav "bottom-up" pristup, temeljen na podacima, koristi prija�nje napore kao polugu za kreiranje sustava izgrađenih od "gotovih dijelova".

Razvoj metoda modeliranja objektno orijentiranih programskih sustava Prvi problem s kojim se suočavaju programeri koji razvijaju sustave kori�tenjem objektnih tehnologija jest izbor odgovarajuće metodologije za proces razvoja. Od početaka razvoja objektnih jezika do devedesetih godina razvijeno je i kori�teno mnogo različitih metodologija, svaka sa svojom varijantom notacije. Od početnih desetak do�lo se do oko 50 metoda koje su kori�tene između 1989. i 1994. Te metode neki autori nazivaju metodama prve generacije. Takvo stanje bilo je na neki način kaotično, jer niti jedna metoda nije prevladavala niti je mogla

Page 43: PROGRAMIRANJE I ALGORITMI - Katedra za transportnu …ttl.masfak.ni.ac.rs/SUK/Programiranje i algoritmi 2.pdf · glavni program za proracun rotora elektromotora ucitavanje ulaznih

43

zadovoljiti sve zahtjeve iz prakse. Sve su te metode imale neke zajedničke koncepte, ali izra�ene na različite načine. Takvo stanje čak je i odvraćalo od upotrebe objektne tehnologije. Put prema spajanju i unifikaciji metoda počeo je sredinom devedesetih godina, kada se javljaju metode druge generacije. U tom periodu razvija se nekoliko pravaca standardizacije, npr. CORBA, OPEN i UML. U isto vrijeme tri metode se izdvajaju kao najprominentnije: Booch-ova, OMT (Rumbaugh) i OOSE (Jacobson). Spomenuta tri autora spajaju svoje metode i započinju razvoj UML-a (Unified Modeling Language), čiju prvu verziju prikazuju 1995. OMG (Object Management Group) konzorcij za razvoj programskih sustava preuzima ulogu katalizatora za spajanje svih nastojanja u razvoju i standardizaciji UML-a. Okuplja se veliki broj tvrtki i iskusnih metodičara, te u srpnju 1997. nastaje prvi prijedlog standarda. Nakon slijedećeg koraka dorade, u studenom 1997. OMG grupa prihvaća UML kao standardni jezik modeliranja. Tako UML postaje temelj za de facto standard u domeni objektno orijentirane analize i koncipiranja. To ne znači da su sve ostale metode odmah istisnute, ali primjetan je trend sve veće upotrebe UML-a.

Unified Modeling Language (UML) UML je, prema definiciji njegovih autora, jezik za vizualiziranje, specificiranje, konstruiranje i dokumentiranje rezultata procesa razvoja softvera kao i za modeliranje poslovnog sustava. UML također omogućuje pohranu, razmjenu i primjenu znanja u procesima rje�avanja problema. UML ne propisuje nikakav određeni pristup rje�avanju problema, nego se mo�e prilagoditi svakom pristupu. Autori UML-a jasno razdvajaju jezik za modeliranje od razvojnog procesa. Iako će se UML koristiti u sklopu definiranih procesa, pokazuje se da različite organizacije, različiti tipovi projekata i različite problemske domene, tra�e i različite odgovarajuće razvojne procese. Primjerice, razvojni proces prikladan za tvrtku koja proizvodi programe za obradbu teksta za �iroko tr�i�te ne mo�e biti istovjetan razvojnom procesu za poznatog naručitelja, recimo, u zrakoplovnoj industriji. Međutim, jezik za objektno modeliranje mo�e biti jedinstven. Treba naglasiti i da UML nije samo notacija (način crtanja pojedinih dijagrama). To je skup koncepata u objektnom modeliranju. Kao i svaki jezik, UML ima definiranu sintaksu (ovdje je to grafička notacija i niz pravila vezanih uz dijagrame) i semantiku. Razvoj semantike jezika iziskivao je najvi�e napora, posebno u usklađivanju postojećih i uvođenju novih koncepata. Trebalo je definirati jezik koji je dovoljno bogat, a istodobno potpuno precizan. Semantika UML-a opisana je i metamodelom u samome UML-u. UML je pogodan za modeliranje �irokog spektra programskih sustava, npr. velikih poslovnih informacijskih sustava, distribuiranih Web aplikacija, pa i vrlo kompleksnih sustava realnog vremena.