PROGRAMIRANJE I ALGORITMI

Similar documents
Biznis scenario: sekcije pk * id_sekcije * naziv. projekti pk * id_projekta * naziv ꓳ profesor fk * id_sekcije

Struktura indeksa: B-stablo. ls/swd/btree/btree.html

SAS On Demand. Video: Upute za registraciju:

Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri.

SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan.

Programiranje. Nastava: prof.dr.sc. Dražena Gašpar. Datum:

GUI Layout Manager-i. Bojan Tomić Branislav Vidojević

Podešavanje za eduroam ios

Upute za korištenje makronaredbi gml2dwg i gml2dgn

Port Community System

IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI

Uvod u relacione baze podataka

Implementacija sparsnih matrica upotrebom listi u programskom jeziku C

int[] brojilo; // polje cjelih brojeva double[] vrijednosti; // polje realnih brojeva

Nejednakosti s faktorijelima

CJENIK APLIKACIJE CERAMIC PRO PROIZVODA STAKLO PLASTIKA AUTO LAK KOŽA I TEKSTIL ALU FELGE SVJETLA

STABLA ODLUČIVANJA. Jelena Jovanovic. Web:

1. Instalacija programske podrške

Advertising on the Web

Tutorijal za Štefice za upload slika na forum.

PROJEKTNI PRORAČUN 1

BENCHMARKING HOSTELA

Eduroam O Eduroam servisu edu roam Uputstvo za podešavanje Eduroam konekcije NAPOMENA: Microsoft Windows XP Change advanced settings

Sveučilište Jurja Dobrile u Puli Odjel za informacijsko komunikacijske znanosti TOMISLAV ĐURANOVIĆ USPOREDBA ALGORITAMA SORTIRANJA.

Priprema podataka. NIKOLA MILIKIĆ URL:

AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje. Marko Eremija Sastanak administratora, Beograd,

3. Obavljanje ulazno-izlaznih operacija, prekidni rad

Klasterizacija. NIKOLA MILIKIĆ URL:

KAPACITET USB GB. Laserska gravura. po jednoj strani. Digitalna štampa, pun kolor, po jednoj strani USB GB 8 GB 16 GB.

Naredba je uputa računalu za obavljanje određene operacije.

CJENOVNIK KABLOVSKA TV DIGITALNA TV INTERNET USLUGE

Pregled algoritama sortiranja

Tema 11 Analiza algoritama, pretraživanje i sortiranjeu jeziku Python

Idejno rješenje: Dubrovnik Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020.

Struktura i organizacija baza podataka

KONFIGURACIJA MODEMA. ZyXEL Prestige 660RU

MS Excel VBA za studente kemije

Windows Easy Transfer

VBA moduli. mr Milovan Milivojević dipl. ing. Visa Poslovno Tehnička Škola - Užice

PASCAL - Skripta sa zadacima i rješenjima -

RJEŠAVANJE BUGARSKOG SOLITERA

1.7 Predstavljanje negativnih brojeva u binarnom sistemu

Otpremanje video snimka na YouTube

Direktan link ka kursu:

OTVARANJE BAZE PODATAKA I IZRADA TABLICE U MICROSOFT ACCESS-u

Da bi se napravio izvještaj u Accessu potrebno je na izborniku Create odabrati karticu naredbi Reports.

NIS PETROL. Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a

Strukture podataka. Strukture podataka su složeni tipovi podataka

PODSUSTAV ZA UPRAVLJANJE SPREMNIKOM UGRADBENOG RAČUNALA

RAČUNALSTVO ZBIRKA ZADATAKA

STRUKTURNO KABLIRANJE

Služi za brisanje prethodno upisanih sadržaja u čitavom worksheetu. Opcija nije nužna, ali je korisna.

PROGRAMSKI JEZIK VISUAL BASIC ZBIRKA ZADATAKA

TRAJANJE AKCIJE ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT

Mindomo online aplikacija za izradu umnih mapa

Korak X1 X2 X3 F O U R T W START {0,1}

UPITI (Queries) U MICROSOFT ACCESSU XP

Ciljevi. Poslije kompletiranja ove lekcije trebalo bi se moći:

MINISTRY OF THE SEA, TRANSPORT AND INFRASTRUCTURE

Statistička analiza algoritama za dinamičko upravljanje spremnikom

Tema 2: Uvod u sisteme za podršku odlučivanju (VEŽBE)

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

OBJEKTNO ORIJENTISANO PROGRAMIRANJE

Programiranje III razred

Office 365, upute za korištenje elektroničke pošte

Primjer 3 Prikaz i interpretacija rezultata

STRUČNA PRAKSA B-PRO TEMA 13

Trening: Obzor financijsko izvještavanje i osnovne ugovorne obveze

Primjeri pitanja iz 1. ili 2. skupine (za 2 ili 4 boda po pitanju) -

Slobodni softver za digitalne arhive: EPrints u Knjižnici Filozofskog fakulteta u Zagrebu

4. Stabla odlučivanja

Sveučilište Jurja Dobrile u Puli Odjel za informacijsko-komunikacijske tehnologije ANTONIO VUK DATOTEKE U PROGRAMSKOM JEZIKU C++ Završni rad

Objektno orjentirano programiranje

INTEGRISANO RAZVOJNO OKRUŽENJE VISUAL STUDIO 2013

TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ

UPUTE ZA RAD S MODULOM "ČLANOVI" U SUSTAVU "VATRONET"

JEDINSTVENI PORTAL POREZNE UPRAVE. Priručnik za instalaciju Google Chrome dodatka. (Opera preglednik)

Fakultet strojarstva i brodogradnje ZAVRŠNI RAD

WWF. Jahorina

MASKE U MICROSOFT ACCESS-u

Natjecateljsko programiranje Autor i predavač ovog predavanja: Bruno Rahle Kontakt Kontakt mob: 099/BRAHLE0

ECONOMIC EVALUATION OF TOBACCO VARIETIES OF TOBACCO TYPE PRILEP EKONOMSKO OCJENIVANJE SORTE DUHANA TIPA PRILEP

CRNA GORA

WELLNESS & SPA YOUR SERENITY IS OUR PRIORITY. VAŠ MIR JE NAŠ PRIORITET!

EKSPLORATIVNA ANALIZA PODATAKA IZ SUSTAVA ZA ISPORUKU OGLASA

Sudoku. Ivo Doko, Saša Buzov. PMF Matematički odsjek, Sveučilište u Zagrebu

Iskustva video konferencija u školskim projektima

LabVIEW-ZADACI. 1. Napisati program u LabVIEW-u koji računa zbir dva broja.

DEFINISANJE TURISTIČKE TRAŽNJE

UPUTE ZA INSTALACIJU PROGRAMA FINBOLT 2007 tvrtke BOLTANO d.o.o.

INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY

11 Analiza i dizajn informacionih sistema

Izrada kalkulatora u C#

RANI BOOKING TURSKA LJETO 2017

UNIVERZITET U BEOGRADU RUDARSKO GEOLOŠKI FAKULTET DEPARTMAN ZA HIDROGEOLOGIJU ZBORNIK RADOVA. ZLATIBOR maj godine

Bušilice nove generacije. ImpactDrill

Sveučilište Jurja Dobrile u Puli Fakultet ekonomije i turizma «Dr. Mijo Mirković» Josip Bošnjak. Fizički dizajn baze podataka.

Bear management in Croatia

OTVARANJE BAZE PODATAKA U MICROSOFT ACCESSU XP

SVEUČILIŠTE U ZAGREBU FAKULTET STROJARSTVA I BRODOGRADNJE ZAVRŠNI RAD Voditelj rada: Prof.dr.sc. Dorian Marjanović Ante Čamber Zagreb, FSB Sveuč

Transcription:

Sveuč ilište 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.

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

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 ODREÐIVANJE IZLAZNIH PODATAKA ODREÐIVANJE POJEDINIH FAKTORA PODJELA VRATILA NA SEGMENTE I «POLJA» POCETNA KRUTOST I EKSCENTRICITET METODA «PRIJENOSNIH» MATRICA KRUTOST LEŽAJEVA DINAMICKI PROGIB IZRACUN MAKS. NAPREZANJA, PROGIBA I NAGIBA PROVJERA VIJEKA TRAJANJA LEŽAJA METODA «PRIJENOSNIH» MATRICA 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);

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. 4

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. 5

[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); } } 6

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. 7

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 8

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. POCETAK CVOR (ELEMENT LISTE) x POKAZIVAC NA SLIJEDECI ELEMENT PODACI Slika 2: primjer povezane liste sa 6 čvorova KRAJ LISTE 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". 9

DATA POINT START 1 2 9 3 R 6 4 5 6 7 8 9 10 11 12 R I J P E M 0 11 10 3 4 7 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. START Cvor A Cvor B x START a) Prije umetanja Cvor A Cvor B x Cvor N b) Nakon umetanja 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. pocetak podatak pokazivac na prethodni cvor pokazivac na slijedeci cvor kraj x x cvor N Slika 6: dvostruko povezana lista 10

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. dodavanje oduzimanje 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 STOG 1 2 3 4 5 6 7 8 9 10 VRH 4 10 MAX 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". 11

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. QUEUE a) pocetak: 1 kraj: 4 AAA BBB CCC DDD 1 2 3 4 5 6... N QUEUE b) pocetak: 2 kraj: 4 BBB CCC DDD 1 2 3 4 5 6... N QUEUE c) pocetak: 2 kraj: 6 BBB CCC DDD EEE FFF 1 2 3 4 5 6... N QUEUE d) pocetak: 3 kraj: 6 CCC DDD EEE FFF 1 2 3 4 5 6... N 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. 12

a) inicijano prazan red: POCETAK: 0 KRAJ: 0 RED (QUEUE) 1 2 3 4 5 Na slici 11 prikazan je primjer korištenja cirkularnog polja za red koji može sadržavati maksimalno pet članova. b) A, B i C ukljuceni: c) A iskljucen: d) D a zatim i E ukljuceni: e) B i C iskljuceni: f) F ukljucen: POCETAK: 1 KRAJ: 3 POCETAK: 2 KRAJ: 3 POCETAK: 2 KRAJ: 5 POCETAK: 4 KRAJ: 5 POCETAK: 4 KRAJ: 1 A B C B C B C D E D E F D E 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. g) D iskljucen: POCETAK: 5 KRAJ: 1 F E h) G a zatim i H ukljucen: POCETAK: 5 KRAJ: 3 F G H E i) E iskljucen: POCETAK: 1 KRAJ: 3 F G H j) F iskljucen: POCETAK: 2 KRAJ: 3 G H k) K ukljucen: POCETAK: 2 KRAJ: 4 G H K l) G i H iskljuceni: POCETAK: 4 KRAJ: 4 K m) K iskljucen, RED prazan: POCETAK: 0 KRAJ: 0 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. 13

A B C D E G H F J K 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. L KORIJEN 1 INFO K LIJEVO DESNO 0 0 A KORIJEN 5 2 3 C G 3 0 6 0 B C 4 14 x D x E x x G x H AVAIL 8 5 6 A H 10 17 2 1 x F x J x x K x 7 L 0 0 8 9 x L x 9 4 10 B 18 13 11 19 12 F 0 0 13 E 12 0 14 15 15 16 16 11 17 J 7 0 18 D 0 0 19 20 20 0 Slika 13: Prikaz binarnog stabla u memoriji pomoću tri paralelna polja 14

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. 15

B D F 2 B 1 E 5 4 7 A C E A 8 C 3 6 2 D F a) graf b) graf sa težinskim faktorima Slika 16: Primjer prikaza strukture grafa Matrični prikaz grafova Čvorovi grafa obično se označavaju s v 1, v 2,. ili jednostavno brojevima, a bridovi s e 1, e 2,. ili s njihove dvije krajnje točke (čvora) npr.: e 1 = (1,4), e 2 =(1,2) Brid (v i, v j ) je svojstven (upadan, zavisan, eng. "incident") čvoru v i (vrhu); isto vrijedi za v j. 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: A = a ij [ a ] ij ( i, ) 1 ako G ima brid j = 0 ako nema brida Matrica susjedstva općeg grafa je simetrična. Element matrice susjedstva usmjerenog grafa, a ij = 1, onda kad postoji usmjereni brid (od čvora i prema čvoru j). Matrica susjedstva usmjerenog grafa nije simetrična. Definicija matrice incidencije grafa G: A = a jk [ a ] jk + 1 ako grana k izlazi iz čvora j = 1ako grana k ulazi u čvor j 0 ako grana k ne dira čvor j 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 16

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 17

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. y1 = f (X) x, y1=y2 (Y-ε, Y+ε) y2 = f (X) Xo X1 Slika 17: početni korak iteracije 18

(X-ε, X+ε) y1 = f (X) x, y1=y2 (Y- ε, Y+ ε ) y2 = f (X) Xo X1 X1 X1 X1 X2 X2 X2 X1 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. 19

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 20

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. 21

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. 22

"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). 23