Strukture Podataka i Algoritmi Skripta SVE

February 26, 2017 | Author: 4k45h4 | Category: N/A
Share Embed Donate


Short Description

Strukture podataka i algoritmi...

Description

1

Rješavanje problema metodom postepenog profinjavanja Predmet “Strukture podataka i algoritmi” na nekim fakultetima za IT i poslovnu informatiku može se smatrati prelaznim, ukoliko su studenti I godine na prethodnim predavanjima i vježbama radili programiranje u C-u ili C++, i savladali njihovu sintaksu. Na višim godinama, ako se odlučite za smjer računarstvo (IT), naglasak će više biti na modeliranju problema. Ovaj predmet u našem primjeru nije prelaz, ne znamo C ili C++, a učimo kako da modeliramo programerske probleme, najčešće pristupe modeliranju i najčešće implementacije. Radi toga, u svoja predavanja uključio sam i osnove sintakse u C i C++ jeziku i kroz primjere implementacije pojedinih tipova i struktura podataka u raznim algoritmima problema omogućio studentima ovladavanje strukturnim i objektno orijentisanim programiranjem, i to tačno onoliko koliko nam je za ovu priliku bilo potrebno. Uvod: Pojam tipa, apstraktnog tipa i strukture podataka. Elementi od kojih se gradi struktura: polje, zapis, pointer, kursor. Pojam algoritma, zapisivanje i analiziranje algoritama. Pregled raznih apstraktnih tipova: Lista, stog (stack), red, uređeno i binarno stablo, skup, rječnik, prioritetni red, preslikavanje. Pregled raznih struktura podataka: Vezana lista i druge vezane strukture, hash tablica, binarno stablo traženja, gomila (heap). Algoritmi za obavljanje osnovnih operacija nad strukturama: Ubacivanje i izbacivanje podataka, traženje, ispis sadržaja i sl. Primjena opisanih struktura u složenijim algoritmima: Sortiranje i sažimanje nizova podataka, izvrednjavanje aritmetičkih izraza, razni rekurzivni postupci. Općenite tehnike (strategije) za konstrukciju algoritama: "Podijeli pa vladaj", dinamičko programiranje, "pohlepni" pristup, "backtracking", lokalno pretraživanje.

1.1 Važnost modeliranja Modeliranje ima veliku važnost u programiranju jer se naizgled ili stvarno teški problemi dobrim modeliranjem mogu lakše ili brže riješiti. Rješivost: u nekoj formulaciji problem se može činiti nerješiv Složenost razni modeli, strukture podataka i algortmi mogu povećati brzinu izvođenja (smanjiti vremensku složenost) ili smanjiti prostor potreban za izvođenje (smanjiti prostornu složenost)

1.2 Pojmovi

2 Uvodimo neke pojmove koji se koriste na ovom kolegiju: Model predstavlja formulaciju problema (koji se javlja u praksi, ”iz života”) u terminima matematičkih objekata (niz, grafovi, stabla i slično) Apstraktni tip podataka je apstraktno zadat tip podataka (obično složeni) zajedno sa operacijama. Implementacija operacija nije nužno zadata. Struktura podataka je eksplicitna implementacija tipa podataka iz apstraktnog tipa podataka. To može biti skupina varijabli u nekom programskom jeziku zajedno sa vezama među varijablama. Rješavanje problema je postupak postepenog profinjavanja u kojem: -

prvo postavljamo matematički model i algoritam u neformalnom jeziku koji koristi matematičke pojmove, zatim stvaramo apstraktni tip podataka, i algoritam zapisujemo u pseudo-jeziku koji koristi operacije iz ATP, te konačno apstraktni tip podataka i algoritam u pseudokodu prevodimo u strukture podataka u stvarnom programskom jeziku i algoritam zapisan u stvarnom programskom jeziku, što nam predstavlja rješenje problema.

Pri rješavanju ćemo se koristiti slikovitim prikazima čestih struktura koji su vidljivi na narednoj slici (slika 1.1.).

Slika 1.1: Slikoviti prikazi čestih struktura a) ćelija, b) polje, c) zapis, d) pokazivač (pointer), e) kursor

3

Metoda postepenog profinjavanja

Slika 1.2: Skica postupka postepenog profinjavanja

Savremeni, najčešće objektno orijentisani, jezici poput C++, Jave ili C# jezika uobičajeno dolaze sa standardnim bibliotekama koje implementiraju razne ATP (uključujući i sve koji se obrađuju na vježbama) koje tada možemo koristiti na nivou ATP-a, bez ulaženja u implementaciju.

Klasifikacija programskih jezika Generacijska klasifikacija -

Prva generacija (Mašinski jezici) Druga generacija (Asembler jezici) Treća generacija (Jezici višeg nivoa) Četvrta generacija (Objektni i jezici posebne namjene)

Prvi kompjuterski jezik bio je asemblerski jezik (assembly language) koji izgleda kao engleske riječi kojima su zamijenjene “jedinice” i “nule” “prirodnog” mašinskog jezika. Kada pišete asemblerskim jezikom vi regularno zaobilazite aplikativni softver i komunicirate direktno sa CPU, BIOS i MS-DOS. Korišćenje asemblerskog jezika pomaže vam da shvatite šta se stvarno dešava unutar računara. Korišćenje asemblera ima i druge koristi. Poznato je da je brži i do 100 puta od Basic-a. Koristi memoriju efikasnije od mnogih viših programskih jezika i najbolji je jezik za kontrolu I/O jedinica, posebno video ekrana.

4 Programski jezici su jezici kojima se pišu računarski programi. Svaki programski jezik koristi vlastiti, ograničeni skup riječi koje imaju posebna značenja. Takve se riječi nazivaju ključnim riječima. Za svaki programski jezik propisana su pravila slaganja ključnih riječi u naredbe. Takva se pravila nazivaju sintaksa. Ako se ne zadovolji propisana sintaksa, program će biti neispravan i neće se moći izvršiti. Prvu generaciju predstavljaju jezici na mašinskom nivou. Pojavljuju se sa prvim komercijalnim računarima (1953). Programiranje je izvođeno binarnim kodom tj. skupinama nula i jedinica ( 0 i 1 ). Komande se direktno pišu u mašinskom jeziku, to jest kao niz naredbi koje se učitavaju u komandni registar procesora i tamo izvode. Komande su naravno zavisne od procesora i zbog toga je prenošenje sa računara na računar (portovanje) ovakvih programa skoro nemoguće. Danas se ovakav način direktnog programiranje ne koristi, osim u posebnim slučajevima, npr. kada se radi o kritičnim hardverskim operacijama. Drugu generaciju čine simbolički asembleri. Kod njih se umjesto skupina nula i jedinica (binarnog koda) koriste simboli ili mnemonici. Prvi put programi se počinju prevoditi (kompajlirati). Uvode se i podprogrami, a jezički procesi se dijele na prevođenje i tumačenje. Asemblerski jezici sastoje se od jednostavnih instrukcija koje se direktno i jednoznačno mogu prevesti u mašinski kod koji se direktno izvršava. Iako mnogo pogodnije i od mašinskog programiranja, asemblersko programiranje karakteriše velika količina posla koju programer mora obaviti, zbog činjenice da su operacije i dalje elementarne. Treća generacija (3GL) odlikuje se visokim nivoom instrukcija. Jedna naredba ovih programskih jezika prevodi se u više naredbi mašinskoj jezika. Odlikuje ih nezavisnost od računara, što znači da nije potrebno poznavati arhitekturu, instrukcije i registre računara za koji se programira. Programi su bili prenosivi. Najvažniji predstavnici: -

FORTRAN ALGOL BASIC COBOL LISP PL/I C C++ PASCAL MODULA-2

Četvrta generacija je produkt naglog razvoja tehnologije 80-tih godina. Dostupnost računara je sve veća i povećana je potražnja za programskom opremom. Olakšano je korištenje jezika zbog prirodnije interakcije sa korisnikom. Ove jezike nazivamo jezike posebne namjene za određene klase problema.

5

Elementi programskog jezika Većina komandi svakog programskog jezika može se podijeliti u 5 glavnih kategorija: -

Obrada ulaznih podataka o Podatke preuzeti sa tastature, iz datoteke ili nekog drugog izvora. Obrada izlaznih podataka o Podatke predati monitoru, datoteci, bazi podataka ili nekom drugom medijumu. Matematička obrada podataka o Podatke obraditi pomoću matematičke operacije, kao npr. sabiranje, oduzimanje ili dijeljenje. Poređenje i izbor o Provjera određenih uslova i kontrola izvršavanja komandi. Ponavljanje o Posebnim pravilima regulisano ponavljanje izvršavanja komandi (obično sa varijacijama podataka ili pravila ponavljanja).

Svaki programer piše programski kód u nekom programskom jeziku. Različiti programski jezici podržavaju različite stilove programiranja (programska paradigma). Različiti programski jezici zahtijevaju i različite nivoe znanja, umijeća i detalja koje programer treba posjedovati. Programska paradigma određuje stil programiranja. Programska paradigma određuje pogled koji programer ima nad programom i njegovih izvršavanjem. Na primjer, u objektnom programiranju programer razmišlja o programu kao o skupu interaktivnih objekata, dok u funkcionalnom programiranju na program gleda kao na redoslijed naredbi. Neki programski jezici su načinjeni da podržavaju samo jednu paradigmu (kao Java i Smalltalk za objektno programiranje, dok Haskell i Scheme podržavaju funkcionalno programiranje). Takođe, imamo jezike koji koji podržavaju više paradigmi (kao što je LISP, Python i Oz). Primjeri paradigmi -

Strukturno programiranje, nasuprot Nestrukturno programiranje Imperativno programiranje, nasuprot Deklarativno programiranje Proceduralno programiranje, nasuprot Funkcionalno programiranje Skalarno programiranje, nasuprot Grupisano programiranje

6 -

Ograničeno programiranje, nasuprot Logičko programiranje Komponentno programiranje (kao u OLE) Aspektno programiranje (kao u AspectJ) Pravilno bazirano programiranje (kao u Mathematica) Tabelarno programiranje (kao u Microsoft FoxPro) Cjevovodno programiranje (kao kod UNIX komandnim linijama) Objektno orijentisano programiranje Paralelno programiranje.

Uvod u računarsko programiranje Programiranje Računarsko programiranje (en. programming) je vještina pomoću koje korisnik stvara i izvršava algoritme koristeći određene programske jezike da bi napravio računarski program. Programiranje sadrži elemente umjetnosti, nauke, matematike i konstruisanja. Računarski program, softverski program ili jednostavno program (eng. Computer program; software program, program) je spisak naredbi napisan u nekom programskom jeziku namijenjen za određenu računarsku platformu. Računarski programi napisani u nekom programskom jeziku su razumljivi čovjeku, ali te naredbe ne razumije i računar, zbog toga se kód računarskog programa pomoću kompajlera mora prevesti u binarni kód da bi ga računar razumio i uopšte izvršavao.

7

Hello world je prvi program koji se pravi na evropskim fakultetima. To je najčešće jedan od prvih programa koje naprave programeri početnici u cilju upoznavanja sa osnovama programerskih vještina. Ovaj program obično ispisuje poruku ("Hello world", tj. "Pozdrav svijete") na osnovni izlaz (output) pri izvršavanju.

8

9

Kompajler (en. compiler) je prevodilac programskog jezika i njegovih instrukcija u mašinski kod (nule i jedinice).

10

Računarski softver ili softver (en. software) je u računarski program napisan tako da je njegov sadržaj lagano promjeniti (moguće i pomoću nekog programa) i koji je upisan u neku hardversku jedinicu. Glavni zadatak softvera je da upravlja hardverom, izvršava izračunavanja, te da obezbijedi komunikaciju sa ostalim, isto tako, softverom, tačnije rečeno -programom. Termin "software" prvi put koristi John W. Tukey 1957. godine. Alan Turing, britanski matematičar (1912-1954), je bio prvi koji je propisao koncept softvera u svom naučnom radu. Softver ne može raditi bez hardvera, kao što hardver ne može raditi bez softvera. Na hardveru (kao što je hard disk) se nalazi softver (kao što je operativni sistem) koji upravlja hardverom. Obično, softver sa hard diska se učitava na RAM memoriju odakle se prosljeđuje procesoru koji izvšava naredbe koje sadrži neki program (softver). Najniži nivo softvera je mašinski kód (binarni kód), najjednostavniji oblik programa koji je obično teško promijeniti. Softver se zato češće piše u programskim jezicima višeg nivoa koje ljudi mnogo bolje razumiju nego li nule i jedinice. Za prevođenje programskih naredbi koristi se kompajler koji ponovo prevodi taj kód u, najniži, mašinski kód koji računar razumije (nule i jedinice).

11 Podjela softvera prema namjeni Računarski softver se dijeli na tri glavne grupe: sistemski softver, izvršni softver, programski softver. – Sistemski softver pokreće računar. To može biti operativni sistem, drajver, server, razni alati i ostalo. Operativni sistem dobija pravo da upravlja cjelokupnim računarom, podacima, procesima itd. Najpoznatiji operativni sistemi su Microsoft Windows, Linux i Mac OS X. – Izvršni softver omogućava korisniku da izvršava određene zadatke. To može biti poslovni softver, edukacioni softver, baza podataka, office paketi i ostalo. – Programski softver je obično alat koji pomaže nekom programeru da izvrši neki zadatak koristeći neki programski jezik. To može biti uređivač teksta, kompajler, interpreter, linker, debugger i tako dalje. U računarskoj grafici se koristi termin grafički softver, koji je specijalizovan za rad sa grafikom. Termini za određene vrste softvera: Otvoreni softver (en. Open source software) odnosi se na softver čiji je izvorni kod dostupan unutar "open source" licence svim korisnicima koji ga mogu mijenjati, prepravljati i poboljašvati njegov sadržaj. To znači da uz 'open source' programe dolazi i čitav izvorni kód u nekom programskom jeziku, što nije slučaj sa plaćenim softverom.

Primjeri otvorenog softvera Danas postoji mnogo otvorenih softvera koji obuhvataju skoro svaku vrstu softvera, kao što su obrađivači teksta (OpenOffice.org), antivirusni programi (ClamAV), internet pretraživači (Mozilla Firefox), email klijenti (KMail), obrađivač filma (VirtualDub), svirači filma (Media Player Classic), 3D grafički program za modeliranje (Blender 3D), obrađivači zvuka (Audacity), program za sažimanje podataka (7-Zip) kao i čitavi operativni sistemi (Linux, BSD/UNIX itd.) Freeware je vrsta softwarea, koja se može zakonski koristiti bez kupovine ili plaćanja licence. Freeware se ne smije zamijeniti sa open source software-om, koji je sasvim drugačiji izraz. Mnogi poznati programi (software), pogotovo oni koji imaju veze sa internetom, su freeware, kao na primjer Adobe Reader ili Microsoftov internet browser Internet Explorer. Podkategorija freeware-a je adware, gdje se software može koristiti besplatno, ali koji sadrži reklame u sebi. Postoje i druge, manje ili više egkzotične, varijante, kao npr. postcardware, gdje korisnik mora poslati razglednicu iz svog grada ili područja osobi koja je napravila dotični software.

12 Često se može donirati novac ili oprema osobama koje su napravile freeware, ali je to isključivo na volonterskoj bazi, jer inače ne bi se radilo o freeware-u.

Shareware, ili u direktnom prevodu sa engleskog jezika "dijeljena roba", je pojam pod kojim se podrazumjeva način distribucije proizvoda (najčešće softvera) na taj način da je kupcu omogućeno prethodno isprobavanje proizvoda prije nego isti bude plaćen. Ovaj pojam se najčešće koristi u informatici za softver koji je distribuisan uz odgodu plaćanja na neki unaprijed definisani period. Shareware softver je obično potpuno funkcionalan neki određeni period nakon čega ga je potrebno ukloniti sa računara. U ugovoru (EULA) koji dolazi uz instalaciju softvera, opisane su obaveze korisnika prema proizvođaču. One mogu biti pravne ili moralne. Da bi zaštitili svoj interes proizvođači implementiraju posebne funkcionalnosti koje su u stanju potpuno onesposobiti program nakon isteka dozvoljenog roka upotrebe programa. Dalja upotreba je omogućena samo unošenjem ispravnih podataka o registraciji ili aktiviranjem od strane kompanijinog web sajta. Osim ovoga, prave se posebni sistemi zaštite koji onemogućavaju zlonamjerne korisnike od višestrukog instalisanja programa ili pomjeranja datuma internog sata. Loše strane ovakvog distribuisanja softvera su evidentne samo za proizvođače. Ogledaju se u tome da je zlonamjerniku vrlo lako naći način da zaobiđe zaštite, pa na crnom tržištu za svaki ovakav proizvod vrlo brzo bude javno objavljen serijski broj, ili čak mali programčić, key generator, koji je u stanju da na osnovu unesenog imena generiše odgovarajući serijski broj za određeni program. Vremenom kompanije pokušavaju sve sofisticiranije načine zaštite svojih interesa, no bezuspješno. Najpoznatiji shareware programi -

Zaštita

-

Ad-Aware

-

Arhiveri

-

WinZip

-

WinRAR

-

Download manageri

-

GetRight

Slobodan softver (en. free software), definisan od strane Free Software fondacije, je softver koji se može koristiti, kopirati, mijenjati i redistribuisati bez ikakvih restrikcija.

13

Programiranje-nastanak programa Pravljenje nekog programa uključuje: -

Analizu potreba Tehnički opis Dizajn i arhitekturu Kodiranje Prevođenje Isprobavanje Dokumentovanje Održavanje

Program je skup naredbi nanizanih strogo otvrđenim redosljedom, čijim se izvršenjem obavlja željeni posao. Osoba koja piše (kodira) program naziva se programer, a postupak nastanka programa naziva se programiranje ili kodiranje. Programiranje je pisanje niza naredbi koje čine program. Taj korak tijesno je vezan za programski jezik u kojemu se program piše, a često i od hardverske opreme na kojoj se program izvodi. Logički način na koji programer može predočiti jedan te isti zadatak je višestruk i uključuje i maštovitost programera. Može se slikovito reći da je programer graditelj koji slažući naredbe (cigle) na određeni način gradi program (kuću). Pri tome on pri ugradnji svake naredbe (cigle) mora imati na umu i cijeli program (građevinu). Od vještine programera uveliko zavisi stabilnost i kvalitet programa. Asembler-Simbolički jezik niskog nivoa Simbolički jezici nastali su kako bi ljudima olakšali programiranje jer ljudi lakše pamte simbole nego binarne brojeve. Asembler (engl. assembler) je simbolički jezik u kome je svaka binarna naredba mašinskog jezika predočena odgovarajućim simbolom. Naredbe mašinskog jezika pišu se simbolima koji se najčešće sastoje od kombinacije nekoliko slova, npr.: - ADD - SUB - CMP

14 Svaka od tih kombinacija slova obično je kratica engleskog opisa naredbe pa se lako pamti. Program napisan u asembleru mora biti preveden u binarni oblik da bi ga centralna jedinica za obradu razumjela. Simbole u binarni oblik prevodi program prevodilac. Programi pisani u asembleru su nešto čitljiviji i lakši za razumijevanje od binarnog zapisa, ali ih je još uvijek vrlo teško pisati i ispravljati. Oni zavise od vrste i unutrašnje građe računara (procesora) pa se u načelu mogu izvršavati samo na procesoru za koji su pisani.

Simbolički jezici višeg nivoa Da bi se još više olakšalo programiranje i da bi se isti program mogao izvršavati na različitim računarima (procesorima) stvoren je niz simboličkih jezika visokog nivoa. Kod simboličkih jezika visokog nivoa više naredbi mašinskog jezika se predstavlja jednom simboličkom naredbom. Programi napisani u nekom od viših programskih jezika u načelu su nezavisni od računara (tačnije od procesora) na kome se izvršavaju. Naredbe viših programskih jezika mnogo su više nalik govornom jeziku, lakše su za pamćenje i upotrebu od naredbi simboličkih jezika nižeg nivoa. Simbolički jezici visokog nivoa mogu biti: - jezici opšte namjene - jezici prilagođeni određenoj vrsti problema. U drugoj polovini 20.-og vijeka nastaju programski jezici FORTRAN, COBOL, BASIC, PASCAL, programski jezik C i mnogi drugi. Nastanak programa

Nastanak programa može se podijeliti na: - pisanje izvornog koda, - prevođenje izvornog koda,

15 - povezivanje u izvršni kod, - provjeravanje programa. Izvorni kod Kombinacijom naredbi programskog jezika nastaje izvorni kod (engl. source code). Izvorni kod moguće je pisati u bilo kojem programu za uređivanje teksta (engl. text editor). Sprema se u datoteku nastavka *.cpp Izvršni oblik Programi se mogu izvršiti na računaru samo ako su u binarnom, izvršnom obliku (engl. executable). Izvršna datoteka je oblik programa i može se neposredno izvršiti na računarlu za koji je prevedena. Prevodilac Izvorni kod se prevodi u izvršni uz pomoć programa prevodioca. Pri tome se provjerava sintaksa napisanog izvornog kóda. *.obj Prevođenjem nastaje datoteka objektnog kóda (engl. object code), nastavka *.obj. Objektni kód je međukorak do izvršnog koda i uz ostalo omogućava uključivanje gotovih dijelova programa iz drugih datoteka. Povezivač- Linker

Program koji povezuje objektnu datoteku s bibliotekama i drugim potrebnim datotekama naziva se povezivač (engl. linker). Rezultat uspješnog povezivanja je izvršna datoteka (*.exe). Pogreške Tokom rada mogu se javiti tri vrste pogrešaka: - sintaktičke pogreške (engl. compile-time error), otkriva ih program prevodilac, - pogreške povezivanja (engl. link-time error), otkriva ih program povezivač-linker, - logičke pogreške (engl. run-time error), mora ih pronaći korisnik sam.

UVOD U PROGRAME PREVODIOCE Uvod

16 Čovjeku je stran jezik kojega "razumije" računar. Zbog toga je bilo potrebno razviti posredničke mehanizme koji obavljaju pretvorbu prirodnog jezika (čovjeku razumljivog) u mašinski jezik (računaru razumljiv). Oni mogu biti: • prevodioci kompajleri, i • prevodioci interpreteri.

Kompajler Kompajler (engl. compiler) – program koji prevodi izvorni kod (engl. source code) programa zapisanog u jeziku visokog nivoa u mašinski (mašinski) jezik (engl. machine code, object code) samo jednom i to tokom prevođenja ili kompajliranja. Postoje i kompajleri koji prevode iz jednog jezika visokog nivoau drugi jezik visokog nivoa (npr. Cfront – UNIX C++ kompajler koji prevodi C++ u C).

Istorijat Prvi računari nisu koristili kompajlere, jer su imali malo memorije i malo operativnih mogućnosti, a korisnici su unosili binarni, mašinski jezik direktno, pomoću prekidača na kontrolnoj ploči. U kasnim 40-im, programeri su otkrili da se mašinski jezik može prikazati pomoću mnemonika i da računari mogu te mnemonike prevesti u mašinski jezik. Među prve jednostavne kompajlere ubrajaju se: Short Code (1949. g), A-O (1951.g), Autocode (1952.g). Prvi upotrebljivi kompajler napisali su Laning i Zierler tokom 1953.i 1954. godine. John Backus, na čelu tima koji je razvijao FORTRAN, zaslužan je za uvođenje prvog potpunog kompajlera 1957. godine. Podjela kompajlera

17 -

Jednoprolazni kompajler (engl. one pass compiler) Višeprolazni kompajler (engl. two pass compiler / three pass compiler) Istorodni kompajler (engl. native compiler) Križni kompajler (engl. cross compiler) Optimirajući kompajler (engl. optimising compiler)

Jednoprolazni kompajler – očitava izvorni program samo jednom i to je dovoljno za prevođenje u mašinski jezik. Višeprolazni kompajler – najprije prevodi program u višem jeziku (C, Pascal) u asembler ili u neki međujezik , a tek zatim u binarni oblik mašinskog jezika. Prevoditi se može u dva (engl. two pass compiler) ili tri prolaza (engl. three pass compiler). Istorodni kompajler – koristi se na istoj vrsti računara na kojem je program i preveden. Ukršteni (križni) kompajler – koristi se na jednoj vrsti računara, a prevedeni program na drugoj. Optimirajući kompajler – nastoji prevedeni program učiniti što kraćim i bržim pri izvođenju.

Struktura programa kompajlerskog prevodioca

Proces kompajliranja možemo podijeliti u nekoliko faza, koje su dio front end-a ili back end-a. Rijetko se spominje i middle end. Svi osim najmanjih kompajlera imaju više od dvije faze. 

Pretprocesiranje – faza koju zahtjevaju neki jezici (npr. C) za izvođenje procesa kao što su uslovna kompilacija i zamjena korištenjem makroalgoritama. U slučaju C-a pretprocesiranje uključuje i leksičku analizu.

18 

Leksička analiza – prvi korak u stvaranju programskog jezika. Izvršava se nad znakovima programskog jezika od kojih je sastavljen izvorni kod, čitajući pri tome jedan po jedan i pretvarajući u utvrđene jedinice ili lekseme.

Pretprocesiranje: Npr., promotrimo sljedeće:  Ovo je rečenica.

gdje je:





Veliko O početak iskaza



Razmaknica “ ” odvaja riječi



“.” je simbol za završetak iskaza

Leksička analiza dijeli tekst programa u riječi ili “tokens”.

Npr., 

If x = y then z = 1; else z = 2

Šta su dijelovi ovog teksta? Dijelovi – jedinice ovog teksta su: If, x, y, then, z, 1, else, z, 2.

Sintaktička analiza – analiziranje sintakse, postupak provjeravanja i odlučivanja o tome da li je niz ulaznih znakova programskog jezika ispravan. Promotrimo prethodni primjer, ali sada sa ciljem provođenja sintaktičke analize:

19

Semantička analiza – analiza jezika usmjerena na značenje riječi. Omogućava utvrđivanje semantičkih pogrešaka u iskazima programskog jezika. Kompajlerska analiza – proces prikupljanja informacija o programu iz međuprikaza izvornih datoteka. (U fazama front end-a analizira se izvorni kod kako bi se izgradio unutarnji prikaz programa, tj. međuprikaz.) Tipične analize su npr. definisanje-korištenje i korištenje-definisanje varijabli i analiza pokazivača. Precizne analize su osnova za svaku optimizaciju. Optimizacija – međuprikaz se transformiše u funkcionalno ekvivalentne, ali brže ili manje oblike. Popularne optimizacije su povećanje ulaznih linija, eliminacija mrtvih kodova, proširenje konstanti, transformacija petlji, alokacija registara... Generisanje koda – transformisani međuprikaz jezika se prevodi u izlazni jezik, obično istorodni mašinski jezik sistema. To uključuje odluke o resursima sistema i pohranjivanju, npr. odlučivanje o tome koju varijablu spremiti u registar i/ili memoriju, te odabir i vremenski raspored mašinskih instrukcija zajedno s njihovim sistemom za adresiranje.

Grafički prikaz strukture programa prevodioca

20 Kompajler vs. Interpreter Mnogi ljudi dijele više programske jezike u kompajlirane i interpretirane jezike. No, u samom programskom jeziku niti jedan dio ne zahtjeva da bude kompajliran ili interpretiran. Kompajleri i interpreteri su samo implementacije jezika, a ne jezici sami. Kategorizacija je obično odraz najpopularnijih ili najraširenijih implementacija jezika. Npr. Basic se smatra interpretiranim jezikom, a C kompajliranim, unatoč postojanju Basic kompajlera i C interpretera. INTERPRETERI – programi prevodioci, koji za razliku od kompajlera prevode i odmah izvršavaju svaku naredbu višeg programskog jezika. Pomoću interpretera ne možemo dobiti program u mašinskom jeziku, nego se program svaki puta kada ga želimo izvršiti mora ponovno prevesti interpreterom. Za razliku od interpretera, kod kompajlera su izvorni program i prevedeni program potpuno odvojeni i pri izvođenju nezavisni. Ako se izmjeni izvorni program, to se neće automatski odraziti na izvedbenom programu, nego ga je potrebno ponovno kompajlirati. Prednosti kompajlera: brži rad od interpretera i zaštićen izvorni program. Nedostaci kompajlera: odvojenost prevedenog i izvornog programa.

SIMULATOR RADA MIKROPROCESORA Arhitektura računara-μP

21

22

23

24

25

26

/* C++ program sabire dva unijeta cijela broja */ #include int main() { int a, b, c; printf("Unesi prvi broj : "); scanf("%d", &a); printf("Unesi drugi broj : "); scanf("%d", &b); c = a + b; printf("%d + %d = %d\n", a, b, c); return 0; } /* sum - najjednostavnija funkcija u C++ koja sabira dva broja */ /* Definicija funkcije */ int sum(int a, int b) { return a+b; } main() { /* Poziv funkcije */ printf("%d\n", sum(3,5)); }

27

28

Startujmo simulator rada PC-a!!!

29

ALGORITMI-Bajka o algoritmima Priču o algoritmima započećemo onako kako počinju sve klasične priče. Nekada davno živio je u Bagdadu pisac, matematičar, astronom i geograf po imenu Muhammed ibn Musa al Khowarizmi. Vjerovatno nije ni sanjao tamo daleke 852. godine, kada je pisao knjigu Kitab al jabr w'al-muqubala, da će od toga nastati čak dva uzroka glavobolje đacima i studentima dvanaest vijekova nakon toga. Njegov al jabr je postala algebra. Isto tako pravila rješavanja iz početka prvenstveno matematičkih problema su iskrivljavanjem imena al Khowarizmi nazivana algoritmi. No, tu greškama nije kraj. Prema korijenu riječi bilo bi pravilno umjesto algoritmi koristiti algorizmi. Ali kako jezik nije nauka nego skup dogovora, izgleda da je dogovoreno da najčešće greške postaju jezična pravila. oko 825. godine napisao knjigu Hidab al-jabr w'al-muqubala (Pravila algebarskog prenosa i potiranja) x - 2 = 12 x+y=y+7

x = 12 + 2 x=7

U latinskom prevodu knjige (12. vijek) ispred svakog pravila stoji Dixit Algorizmi - rekao je Al Kowarzimi algoritam glasi U početku algoritmom se nazivaju samo pravila računanja s brojevima, kasnije i pravila obavljanja ostalih zadataka u matematici, u XX vijeku, pojavom računara, pojam se proširuje na računarstvo, a zatim i na druga područja, Tako mi danas imamo algoritme, a oni su niz preciznih uputa koje nas, korak po korak, vode do rješenja nekog problema. To su zapravo toliko precizne upute da za njihovo izvršavanje nije potrebna inteligencija. Algoritam je u matematiku uveo arapski matematičar Muhamed Al Horezmi. Napisao je knjigu Al Horezmi , o indijskoj vještini računanja gdje u arapsku matematiku uvodi indijske cifre i decimalni brojevni sistem. Ova knjiga biva kasnije prevedena na latinski kao Algoritmi de numero indorum. Od lošeg latinskog prevoda njegovog prezimena i potiče riječ algoritam, i dugo je označavala postupak za račun sa decimalnim brojevnim sistemom (i indijskim odnosno, kako se kasnije pričalo, arapskim ciframa).

30 Algoritam je konačna i precizno definisana procedura, niz dobro definisanih pravila, kojom se ulazne vrijednosti transformišu u izlazne, ili se opisuje izvršavanje nekog postupka. Danas se riječ algoritam često vezuje za pojam računarstva mada uopšteno algoritam možemo smatrati kao uputstvo kako riješiti neki zadatak ili problem. Uputstvo može da sadrži korake koji se ponavljaju više puta ili korake kada treba donijeti neku odluku, na osnovu nekog kriterijuma. Dobro uputstvo predviđa i postupak kada nisu svi uslovi ispunjeni. Korektno izvršavanje svakog koraka ne rješava zadatak ako je algoritam bio pogrešan. Bilo koji problem se može riješiti izvršavanjem serije akcija u određenom redosljedu. Akcije koje će se izvršiti i redosljed u kojem će se to odvijati nazivamo algoritam. Iskustvo pokazuje da je najteži dio rješavanja programerskog problema na računaru upravo razvijanje algoritma za rješenje. Jednom kad je određen ispravan algoritam, razvoj programa za sam alorgitam je prilično jednostavan. Slijedeći primjer pokazuje korektan i nekorektan slijed događaja za algoritam kojim želimo opisati pokretanje automobila:

Koliko je 2 i 2 ?

31 Gornji naslov jedno je od najčešćih pitanja koje se upućuje osnovnoškolskom djetetu kada ga iskušavate u računanju. Isto tako postoji i uzrečica da je nešto "jasno kao dva i dva". Ali, da li je baš sve tako jasno? Maloprije smo rekli da upute u algoritmu moraju biti tako jasne da se mogu izvršavati i do rješenja doći bez imalo inteligencije. Kad već nema nimalo inteligencije moraćemo se poslužiti džepnim računarom (kalkulatorom). Ništa jednostavnije nego otkucati "dva i dva" i dobiti rješenje. Evo nam prvog problema. Na kalkulatoru nema "i". Mi podrazumijevamo da je "dva i dva" zapravo dva više dva, da se radio o matematičkoj operaciji sabiranja. Džepni računar to ne zna. Znači moramo biti precizniji i reći 2+2. Baš smo riješili prvi problem kad se pojavio i drugi. Otkucam 2+2 i ništa se ne događa. I bilo je za očekivati jer je džepni računar isključen. Niko mi nije rekao da prvo provjerim da li je džepni računar uključen. Sada sam već pomalo nervozan što se tako jednostavna stvar toliko komplicira. Uključio sam računar i kucam 2+ upsss... Ovako iznerviran htio sam što prije riješiti zadatak i u žurbi sam prstom zakačio i taster iznad 2 tako da je ispalo 52. Šta ću sad? Jednostavno ću pritisnuti taster CE koji poništava zadnji unos i ponovno upisati 2. Hajdemo ovo sve što smo zapetljali pokušati prepisati u čistopis u obliku natuknica: •

provjerite da li je džepni računar uključen –



upišite 2 –



ako ste pogriješili pritisnite taster CE i ponovite radnju iz prethodne natuknice

upišite 2 –



ako ste pogriješili pritisnite taster CE i ponovite radnju iz prethodne natuknice

upišite + –



ako nije uključite ga

ako ste pogriješili pritisnite taster CE i ponovite radnju iz prethodne natuknice

pritisnite taster = –

ako ste pogriješili ponovite sve radnje počevši od trećeg reda

32 •

pročitajte rezultat



isključite džepni računar

Mislite da je tu kraj? Stvari se mogu još zakomplicirati. Šta ako je to model džepnog računara bez tastera CE koji poništava zadnji unos? Pokušajte doraditi gornje upute za takav model džepnog računara. Je li sada konačno kraj? Možemo li isključiti džepni računar? Ne. Džepni računar koji imam ispred sebe ima sunčanu ćeliju i ne gasi se na dugme. Jednostavno se samo isključi ako se neko vrijeme ne koristi. Možda ovo izgleda kao da vas gnjavim, ali s računarom je tako. Ponekad stvarno izgleda kao da se malo pravi lud. Treba se sjetiti da je računar "idiot velike brzine" i da ništa ne zna sam. Ako nešto "zna" napraviti onda mu je to neko morao "reći" i detaljno objasniti. Isto tako ako nešto krivo radi - samo radi ono što smo mu naredili. Razmislite o ovome prije nego što ponovo za nešto kažete da je jednostavno kao "dva i dva".

Algoritam U matematici i računarskoj nauci algoritam je određeni skup definisanih naredbi za obavljanje nekog zadatka. Algoritmi se koriste u računarskim programima kao način rješavanja nekog zadatka. Algoritam takođe može da znači grafički prikaz toka obrade ili skup instrukcija računarskog programa (tad se preciznije naziva dijagram toka). On predstavlja vodilju za programera koji pomoću algoritama predstavlja viziju programa koji želi napisati u programskom jeziku. Računar zadatak može riješiti samo ako dobije upute kako to da učini. Takve se upute nazivaju algoritmom. Algoritam je popis aktivnosti (operacija, uputstava) koje treba izvršiti u navedenom redoslijedu da bi se dobilo rješenje postavljenog zadatka. Promjena poretka izvršavanja osnovnih radnji algoritma najčešće dovodi do neželjenih rezultata. Većina zadataka može se riješiti na više različitih načina pa je za njihovo rješenje moguće napisati više različitih algoritama. Uvijek valja težiti najbržem, najefikasnijem, najsigurnijem rješenju. Koncept algoritma se obično ilustruje pojednostavljeno, iako je u stvarnosti veoma komplikovan. Algoritmi sadrže korake koji se ponavljaju ili zahtijevaju odluke koje propisuje programer.

33

Primjer1: Ovo je jedan od najjednostavnijih primjera algoritma napisanog u govornom jeziku (ne u programskom kódu). Određuje da li je zadati broj n paran ili neparan: 1 POČNI 2 Pročitaj vrijednost n. 3 Podijeli n sa 2 i zapamti ostatak u ost. 4 Ako je ost 0 idi na stavku 7. 5 Ispiši „n je neparan broj“. 6 Idi na stavku 8. 7 Ispiši „n je paran broj“. 8 KRAJ

Dijagram toka Grafički prikaz algoritma naziva se dijagram toka. Dijagram toka omogućava analizu problema, lakšu provjeru i traženje boljih postupaka rješavanja zadatka. Razlikuju se slijedeći znakovi dijagrama toka:

Osnovne algoritamske structure Osnovne algoritamske strukture mogu se svrstati u tri skupine. To su: - niz komandi (slijed, niz), - grananje, - petlja. Niz komandi

34 Samo u slučaju rješavanja najjednostavnijih zadataka, algoritam je pravolinijski, tj. uvijek se izvršava u istom slijedu naredbi pa se stoga još naziva i slijedni algoritam. Primjer slijednog algoritma Korisnik unosi dva broja, brojevi se sabiraju, pa se ispisuje dobiveni zbir.

Algoritam: početak upiši brojeve A i B C=A+B ispiši zbir C kraj Napomena: Treba uočiti da se bez obzira na ulazne brojeve naredbe uvijek izvršavaju istim redoslijedom.

Dijagram toka:

Grananje Tok programa često zavisi od ulaznih podataka ili od međurezultata obrade. Struktura kod koje se zavisno od stanja podataka odvija jedan od mogućih dijelova (grana) programa, ima naziv grananje. Zapisivanje algoritama Algoritmi kojima smo se bavili u prošlim slajdovima mogu se zapisati na više načina, a dva najčešća su pseudokod i dijagram toka podataka. Pseudokod je algoritam zapisan riječima. Pseudo dolazi od grčkog laž, lažni, nadri, nazovi, tobožnji...

35 Kod je skup dogovorenih znakova kojima možemo oblikovati neku poruku, komunicirati. U programiranju se pod kódom podrazumijeva izvorni program napisan u nekom programskom jeziku. Prema tome, naš pseudokod bi bio program "lažnjak". Zašto pseudo? Jer upute ne pišemo u nekom od programskih jezika već dogovorenim riječima i znakovima iz govornog jezika. Dakle, ako hoćemo da algoritme pišemo riječima moramo se prije dogovoriti koje ćemo riječi koristiti. Logičan slijed aktivnosti u nekom programu je ulaz podataka, obrada i izlaz podataka. Prema tome ćemo i odabrati prikladne riječi koje ćemo opisati u narednoj tabeli:

U tabeli nema riječi za obradu podataka jer za to obično koristimo izraze koji nisu ništa drugo nego prepisane npr. matematske formule. Idemo probati da napišemo pseudokod za naš "dva i dva" iz prethodne lekcije. Ali, više nećemo koristiti džepni računar nego ćemo algoritam napisati kao da pišemo program, odnosno upute pravom računaru:

Ovdje ćemo malo zastati. Ako bismo napisali upiši 2 tada bi naš algoritam bio samo za sabiranje 2 i 2 i cijeli svoj život bi radio samo to. Računarski programi se pišu što općenitije, pa ćemo i mi pokušati napisati algoritam za sabiranje bilo koja dva broja. Kako ne možemo predvidjeti koja će dva broja neko poželjeti da sabere, moraćemo umjesto brojeva koristiti varijable.

36 U matematici varijabla je neka promjenjiva veličina, a u našem programu to će biti mjesto u radnoj memoriji koje je rezervisano za broj koji sabiremo. U našem primjeru će nam trebati tri takva mjesta. Neka to budu varijable a i b za brojeve koje sabiremo i c za rezultat. Pokušajmo sada ponovno da napišemo pseudokod:

U trećem redu našeg pseudokoda izraz za sabiranje varijabli a i b napisali smo malo naopako od onoga kako bismo dva broja sabrali na papiru. Isto tako taj treći red ne bismo pročitali kao u matematici c je jednako a + b. Sjetimo se da radimo s mjestima rezervisanim u glavnoj memoriji. Tako sadržaj mjesta u memoriji za rezultat c postaje jednak zbiru sadržaja mjesta u kojima su memorisani brojevi a i b. Zato to i čitamo c postaje a + b. Dakle, pseudokod je skica programa, napisana u formi na način da se lako može pretvoriti u pravi kod. Na primjer pseudokod za sortiranje elemenata niza može se napisati na slijedeći način: Pseudokod za sortiranje niza while not at end of list compare adjacent elements if second is greater than first switch them get next two elements if elements were switched repeat for entire list Dijagram toka To je drugi način predstavljanja algoritama. Dijagram toka je grafičko predstavljanje algoritma ili jednog njegovog dijela. Crta se korištenjem simbola kao što su krug, pravougaonik, romb i oval (elipsa) koji su međusobno povezani strelicama toka. Način zapisivanja algoritama dijagramom toka ima nekoliko prednosti nad pseudokodom: Zapisivanje se vrši međunarodno dogovorenim simbolima i ne zavisi od govornog jezika onoga koji sastavlja algoritam.

37 Grafički prikaz je jednostavan, pregledan, lako se pronalaze greške. Nadalje, problem se može jednostavno analizirati, usporediti s nekim drugim problemom i skratiti vrijeme pronalaženja rješenja. Evo osnovnih simbola dijagrama toka:

Dijagram toka algoritma započinjemo sa ovalnim simbolom koji sadrži riječ “Start” a završavamo sa istim simbolom koji sadrži riječ “End”.

38 Simboli dijagrama toka se povezuju strelicama koje pokazuju tok podataka. Smjer strelica je odozgo prema dole i/ili na desno i/ili na lijevo.

Da vidimo sada naš dijagram toka za problem “2 i 2”. Drugi dogovoreni simboli za ulaz i izlaz podataka

39

Grananje Na žalost, u stvarnom životu zbivanja ne teku tako jednostavno kao što su to pravolinijski algoritmi. Ponekad treba stati, razmisliti, usporediti neke stvari i donijeti odluku kako dalje. Takvo mjesto u algoritmu zove se grananje. Simbol za grananje je romb. Obično se u gornji vrh upiše upitnik i u sredini se postavi logički uslov.

Petlje Nekada su nastavnici imali običaj nestašne studente kažnjavati tako da bi im zadali da 100 puta napišu u svesku-bilježnicu: "Neću nikada više brbljati na času “Strukture podataka i algoritmi". Zamislite da je nama neko dao takvu kaznu. Mi ćemo se probati izvući tako da to računar odradi umjesto nas. Treba mu samo zadati da 100 puta ispiše jednu te istu poruku. Ništa jednostavnije. Evo rješenja:

40

Neki zlobnici tvrde da napredak možemo zahvaliti samo ljudskoj ljenosti. Naime, ljudi će svašta izmisliti samo da ne moraju raditi. Tako je neko izmislio još jednostavnije rješenje za naš primjer s ispisom 100 poruka.

Izrada algoritama zahtijeva puno vježbe. Algoritmi se ne mogu naštrebati. Potrebno je riješiti puno primjera, od jednostavnijih do sve složenijih.

41 Dijagram toka crtamo običnom olovkom s gumicom pri ruci. Stvari se rješavaju u hodu, mijenjaju, popravljaju i prepravljaju. Uočavaju se stvari koje se mogu pojednostavniti. Prednost dijagrama toka je što je pregledan, lako se test primjerima može "pješice" provjeriti. Zanimljivo je i to da više ljudi može napraviti za isti zadatak više različitih algoritama i da su svi dobri. Složeni algoritmi mogu se rastaviti na manje, tako rastavljeni riješiti do detalja i onda prikazati kao rješenje u blokovima. Problemi se mogu lako analizirati, lako se uočavaju sličnosti i razlike između više rješenja i odabire najbolje. Možda nakon ovih vježbi vidite dijagrame toka i tamo gdje ih do sada niste uočavali - različiti šematski prikazi nekih postupaka, hodogrami nekih aktivnosti... I na kraju šta je bio cilj naše izrade algoritama - pisanje programa. Kada je jednom algoritam gotov pisanje programa u nekom programskom jeziku je prepisivanje simbola iz dijagrama toka u naredbe programskog jezika. Obično svaki simbol u dijagramu toka predstavlja jednu naredbu u programu. Dijagram toka bi trebao biti dio svake dobre programske dokumentacije.

Zapisivanje algoritama Algoritmi kojima smo se bavili u prošlim slajdovima mogu se zapisati na više načina, a dva najčešća su pseudokod i dijagram toka podataka Pseudokod je algoritam zapisan riječima. Pseudo dolazi od grčkog laž, lažni, nadri, nazovi, tobožnji... Kod je skup dogovorenih znakova kojima možemo oblikovati neku poruku, komunicirati. U programiranju se pod kódom podrazumijeva izvorni program napisan u nekom programskom jeziku. Prema tome, naš pseudokod bi bio program "lažnjak". Zašto pseudo? Jer upute ne pišemo u nekom od programskih jezika već dogovorenim riječima i znakovima iz govornog jezika.

42

U tabeli nema riječi za obradu podataka jer za to obično koristimo izraze koji nisu ništa drugo nego prepisane npr. matematske formule. •

Idemo probati da napišemo pseudokod za naš "dva i dva" iz prethodne lekcije.

Ali, više nećemo koristiti džepni računar nego ćemo algoritam napisati kao da pišemo program, odnosno upute pravom računaru:

Ovdje ćemo malo zastati. Ako bismo napisali upiši 2 tada bi naš algoritam bio samo za sabiranje 2 i 2 i cijeli svoj život bi radio samo to. Računarski programi se pišu što općenitije, pa ćemo i mi pokušati napisati algoritam za sabiranje bilo koja dva broja. Kako ne možemo predvidjeti koja će dva broja neko poželjeti da sabere, moraćemo umjesto brojeva koristiti varijable. U matematici varijabla je neka promjenjiva veličina, a u našem programu to će biti mjesto u radnoj memoriji koje je rezervisano za broj koji sabiremo. U našem primjeru će nam trebati tri takva mjesta. Neka to budu varijable a i b za brojeve koje sabiremo i c za rezultat. Pokušajmo sada ponovno da napišemo pseudokod:

43 U trećem redu našeg pseudokoda izraz za sabiranje varijabli a i b napisali smo malo naopako od onoga kako bismo dva broja sabrali na papiru. Isto tako taj treći red ne bismo pročitali kao u matematici c je jednako a + b. Sjetimo se da radimo s mjestima rezervisanim u glavnoj memoriji. Tako sadržaj mjesta u memoriji za rezultat c postaje jednak zbiru sadržaja mjesta u kojima su memorisani brojevi a i b. Zato to i čitamo c postaje a + b. Dakle, pseudokod je skica programa, napisana u formi na način da se lako može pretvoriti u pravi kod. Na primjer pseudokod za sortiranje elemenata niza može se napisati na slijedeći način: Pseudokod za sortiranje niza while not at end of list compare adjacent elements if second is greater than first switch them get next two elements if elements were switched repeat for entire list Dijagram toka To je drugi način predstavljanja algoritama. Dijagram toka je grafičko predstavljanje algoritma ili jednog njegovog dijela. Crta se korištenjem simbola kao što su krug, pravougaonik, romb i oval (elipsa) koji su međusobno povezani strelicama toka. Način zapisivanja algoritama dijagramom toka ima nekoliko prednosti nad pseudokodom: Zapisivanje se vrši međunarodno dogovorenim simbolima i ne zavisi od govornog jezika onoga koji sastavlja algoritam. Grafički prikaz je jednostavan, pregledan, lako se pronalaze greške. Nadalje, problem se može jednostavno analizirati, usporediti s nekim drugim problemom i skratiti vrijeme pronalaženja rješenja. Evo osnovnih simbola dijagrama toka:

44

Dijagram toka algoritma započinjemo sa ovalnim simbolom koji sadrži riječ “Start” a završavamo sa istim simbolom koji sadrži riječ “End”. Simboli dijagrama toka se povezuju strelicama koje pokazuju tok podataka. Smjer strelica je odozgo prema dole i/ili na desno i/ili na lijevo.

45

Da vidimo sada naš dijagram toka za problem “2 i 2”.

46 Drugi dogovoreni simboli za ulaz i izlaz podataka

Grananje Na žalost, u stvarnom životu zbivanja ne teku tako jednostavno kao što su to pravolinijski algoritmi. Ponekad treba stati, razmisliti, usporediti neke stvari i donijeti odluku kako dalje. Takvo mjesto u algoritmu zove se grananje. Simbol za grananje je romb. Obično se u gornji vrh upiše upitnik i u sredini se postavi logički uslov.

47

Petlje Nekada su nastavnici imali običaj nestašne studente kažnjavati tako da bi im zadali da 100 puta napišu u svesku-bilježnicu: "Neću nikada više brbljati na času “Strukture podataka i algoritmi". Zamislite da je nama neko dao takvu kaznu. Mi ćemo se probati izvući tako da to računar odradi umjesto nas. Treba mu samo zadati da 100 puta ispiše jednu te istu poruku. Ništa jednostavnije. Evo rješenja:

48 Neki zlobnici tvrde da napredak možemo zahvaliti samo ljudskoj ljenosti. Naime, ljudi će svašta izmisliti samo da ne moraju raditi. Tako je neko izmislio još jednostavnije rješenje za naš primjer s ispisom 100 poruka.

Izrada algoritama zahtijeva puno vježbe. Algoritmi se ne mogu naštrebati. Potrebno je riješiti puno primjera, od jednostavnijih do sve složenijih. Dijagram toka crtamo običnom olovkom s gumicom pri ruci. Stvari se rješavaju u hodu, mijenjaju, popravljaju i prepravljaju. Uočavaju se stvari koje se mogu pojednostavniti. Prednost dijagrama toka je što je pregledan, lako se test primjerima može "pješice" provjeriti. Zanimljivo je i to da više ljudi može napraviti za isti zadatak više različitih algoritama i da su svi dobri. Složeni algoritmi mogu se rastaviti na manje, tako rastavljeni riješiti do detalja i onda prikazati kao rješenje u blokovima. Problemi se mogu lako analizirati, lako se uočavaju sličnosti i razlike između više rješenja i odabire najbolje. Možda nakon ovih vježbi vidite dijagrame toka i tamo gdje ih do sada niste uočavali - različiti šematski prikazi nekih postupaka, hodogrami nekih aktivnosti... I na kraju šta je bio cilj naše izrade algoritama - pisanje programa. Kada je jednom algoritam gotov pisanje programa u nekom programskom jeziku je prepisivanje simbola iz dijagrama toka u naredbe programskog jezika. Obično svaki simbol u dijagramu toka predstavlja jednu naredbu u programu. Dijagram toka bi trebao biti dio svake dobre programske dokumentacije.

Osnovni algoritamski konstrukti Algoritam je metod postupak za rješavanje problema koji je prihvatljiv za kompijutersku implementaciju. Algoritam je metod postupak koji: –

Ukoliko problem ima rješenje daje rješenje tog problema



Ukoliko problem nema rješenje daje odgovor da problem nema rješenje.

49 Algoritmi i programi program - opis algoritma koji u nekom programskom jeziku jednoznačno određuje što računalo treba napraviti programiranje - naučiti sintaksu nekog proceduralnog jezika i steći osnovna intuitivna znanja iz algoritmizacije problema opisanog riječima algoritmi + strukture podataka = programi (Wirth)      

kako kako kako kako kako kako

osmisliti algoritme? strukturirati podatke? formulirati algoritme? verificirati korektnost algoritama? analizirati algoritme? provjeriti (testirati) program?

Postupci izrade algoritama nisu jednoznačni te zahtijevaju i kreativnost. Inače bi već postojali generatori algoritama. Znači da se (za sada?) gradivo ovog predmeta ne može u potpunosti algoritmizirati. Koristiće se programski jezik C. Za sažeti opis složenijih algoritama može se koristiti pseudokod. Za svaki programski jezik propisana su pravila slaganja ključnih riječi u naredbe. Takva se pravila nazivaju sintaksa. Ako se ne zadovolji propisana sintaksa, program će biti neispravan i neće se moći izvršiti. Najprostiji primjer algoritma iz svakodnevnog života je kuhanje čaja:       

Staviti lonac sa vodom na vatru, Čekaj dok voda ne proključa, Pazi da voda ne pokipi, Kada proključa voda ugasiti vatru, Staviti vrećice čaja u vodu, Ako želiš dodaj šećer, Posluži se.

USLOVI ZA ALGORITAM Tačnost – daje tačno rješenje za sve moguće ulaze i problemske situacije Brzina – mora dati tačan rezultat u određenom vremenskom periodu Razumljivost – mora biti shvatljiv i primjenjiv i u drugim okolnostima. Načini prikaza algoritma     

Govorom Tekstom-pisan riječima Grafički Pseudokodom Kodom

50

OSOBINE ALGORITAMA Konačnost – svaki algoritam treba da se završi nakon razumnog konačnog broja koraka, Definisanost – svaki algoritam mora biti precizno definisan (nedvosmislen), tačno određen svaki korak, Svaki algoritam ima ulaz iz nekog skupa podataka tj.podatke nad kojima radi. Ulaz mora biti precizno definisan, Svaki algoritam mora da ima izlaz (odgovor), problem je rješiv ili nerješiv. Ako je rješiv, onda dobijamo to rješenje, Efektivnost da se algoritam može efektivno izraziti tj.operacije koje se javljaju u algoritmu moraju biti bazične (jasne, razumljiv za čovjeka), tako da bi se mogle obaviti od strane čovjeka, putem papira i olovke. KLASIFIKACIJA ALGORITAMA Klasifikacija prema načinu implementacije: –

Rekurzivni i interativni



Serijski i paralelni



Deterministički i stohastički

Rekurzivni algoritam poziva samoga sebe sve dok ne postigne određeni uslov.

51 Interativni algoritmi ne pozivaju sami sebe već se oslanjaju na konstrukte poput petlji da bi riješili problem. Mnogo današnjih racunara sadrži samo jedan procesor pa prema tome obavlja naredbe jednu po jednu, tj.serijiski. Algoritmi dizajnirani za rad u takvom okruženju nazivaju se serijski algoritmi. Suprotno serijskim algoritmima nalaze se paralelni koji sa sve većom upotrebom višeprocesorskih računara dobijaju veći značaj. Oni rješavaju probleme rascjepkano na više manjih dijelova koje na kraju spajaju u rezultat Deterministički algoritam je algoritam koji će pri svakom izvršavanju u bilo kojim uslovima od istog unosa doći do istog izlaza slijedeći svaki put identičan niz naredbi. Stohastički algoritam je algoritam koji u bar jednom dijelu izvršavanja donese neku odluku slučajnim odabirom. SLIJED (niz)– skup jednog ili više koraka algoritma koje se jedan za drugim izvršavaju GRANANjE - odluka koju od dvije ili više sekvenci treba izvršiti s obzirom na postavljeni uslov PONAVLjANjE – slijed algoritamskih koraka koji se provodi određeni broj puta, sve dok se ne ispuni određeni uslov.(petlje-for, while, repeat) Dijagram toka

52 Implementacija algoritma u VB PRIMJER: POČETAK (svaki algoritam ima samo jedan početak) UPIŠI, ULAZ, UČITAJ, UNESI (ovo bi bile prikladne riječi za unos podataka da li preko tastature, miša ili bar-kod čitača ili neke druge ulazne jedinice) ISPIŠI, IZLAZ (ispis podataka na monitoru) KRAJ (broj instrukcija u algoritmu mora biti konačan, svaki algoritam mora imati kraj i to samo jedan kraj) Poslije ovog prikaza pseudokoda a na osnovu ovih prikladnih riječi prikazaćemo primjer pseudokoda za sabiranje dva broja IMPLEMENTACIJA u Visual Basic-u Public Class Form1 Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox3.Text = Int(TextBox1.Text) + Int(TextBox2.Text) End Sub End Class

Primjer:

53 Algoritam za unos dva broja i prikazivanje manjeg. Početak Ulaz (a, b) Ako a >b onda Izlaz a Inače izlaz b Kraj Zaključak Algoritmi su oblasti računarske nauke koja pretenduje da postane osnovna i jedina naučna oblast u razvoju programa. Danas kada imamo više programskih jezika visokog nivoa razumljivosti za čovjeka, gotovo da je moguće savladati sintaksu bilo kojeg od njih za nekoliko dana ili uz prethodna predznanja čak za nekoliko sati. Globalni trend novih programskih jezika jeste da budu task oriented (orjentisani prema zadatku – problemu) čime se korisnik usmjerava na samo rješavanje problema pravljenjem algoritma za taj problem. Dakle možemo smatrati da je stvaranje dobrog algoritma preduslov za dobar program.

Pravila o algoritmima Algoritam: je postupak ili pravilo (način razmišljanja) kojim se iz datih polaznih podataka, određenim konačnim nizom računskih, odnosno logičkih postupaka, dolazi do traženih rezultata. Algoritmi opisuju sistematske postupke s kojima možemo riješiti skupove problema, a ne jedan problem sam. Nisu samo opisi matematskih postupaka algoritmi, nego i opisi svih drugih postupaka. Na primjer, pravilo: "kada izlaziš iz prostorije ugasi svjetlo" predstavlja algoritam, ali pravilo "za vrijeme kretanja cestom hodajte lijevom stranom" ne, jer ta aktivnost ima neprekidan, a ne diskretan karakter. Algoritmima se ne mogu smatrati pravila kojima se nešto zabranjuje, kao napr. "nezaposlenima ulaz zabranjen", "ne puši na javnom mjestu", "zabranjeno parkiranje", ili pravila kojima se nešto dozvoljava, napr. "ulaz", "mjesto za bicikle" itd. Međutim, pravila: "po izlasku ugasite svjetlo" i "prolazite s lijeva, stojte desno" (na pokretnim stepenicama) predstavljaju algoritme. I kuharski recepti su algoritmi. Međutim, uspjesi kuhanja po istom receptu su vrlo različiti. Razlog tome je što neke naredbe u receptima nisu nedvosmislene. Prije svega zato što većina naredbi nisu elementarne, već pretpostavlja neko "skupno znanje" kuhanja koje je imao pisac recepta i koje kuhar vremenom stiče i zato što naredbe nisu date dovoljno detaljno da bi ih znao pravilno uraditi i potpuni početnik.

54 Da bi izvršilac mogao riješiti zadatak u skladu sa algoritmom, on mora znati izvršiti svaki algoritamski korak. Ako mu je korak nejasan, treba ga razjasniti. Na primjer, ako je izvršiocu teško izvršiti korak: "izračunati površinu trougla", neophodno je u tom koraku navesti i odgovarajuću formulu, tako da on glasi "izračunati površinu trougla po formuli S=ah/2“. Ili u primjeru kuharskog recepta, korak "peći u rerni 5 minuta", koji za mnoge ne mora biti jasan, treba objasniti izvršiocu još i navodom "... pri temperaturi od 180 stepeni Celzijusa". Kako je računar uređaj koji se pri izvršavanju programa ničemu ne uči, algoritmi moraju za njega biti zadati do najsitnijeg detalja. Dakle, svaki opis postupka po kojem možemo riješiti neki zadatak je algoritam, ali algoritam sam po sebi još ne predstavlja program. Samo onaj algoritam koji je zapisan sa naredbama koje računar poznaje i koje zna izvršiti je računarski program. Algoritmi za računarsku upotrebu moraju biti nedvosmisleni, jasni, konačni i zapisani sa elementarnim naredbama - diskretni. OSOBINE ALGORITMA Diskretnost – jedan se završi, počne drugi korak. 2. Rezultativnost – po konačnom broju koraka daje rezultat(e) 3. Determinisanost – za iste ulaze daje uvijek iste rezultate 4. Masovnost – primjenljiv na što više ulaznih riječi. Ali mora biti i efikasan, množenje sabiranjem jeste rezultativno, da li je efikasno? Algoritam je nedvosmislen onda kada svaka naredba u svim primjerima tačno određuje šta mora izvođač algoritma tražiti. Konačnost je nužna osobina svih algoritama koji ispunjavaju neke naredbe ponavljanja. Algoritam mora biti takav da je u svim primjerima broj ponavljanja konačan, tako da se izvršavanje algoritma zaustavi. Algoritme moraju činiti samo elementarne naredbe, tj. naredbe koje izvršilac algoritma razumije i zna ispuniti. Algoritmima možemo opisati jedino procese koji imaju diskretan karakter, tj. koji se odvijaju kroz niz zasebnih događaja. Ovi događaji opisuju se algoritamskim koracima koji se izvršavaju jedan za drugim. Svaki algoritamski korak sastoji se iz dva uputstva: šta treba uraditi i koji je slijedeći algoritamski korak. Često se za realizaciju jedne te iste metode rješavanja nekog problema može predložiti nekoliko algoritama, koji se razlikuju u redosljedu izvršavanja operacija, složenošću, obimom računskih operacija ali daju iste rezultate. Za takve algoritme kažemo da su ekvivalentni. Dakle, dva algoritma su ekvivalentna ako:   

svaki ulazni podatak, dozvoljen za jedan od njih, dozvoljen je i za drugi, primjenljivost jednog algoritma na neki ulazni podataka garantuje da je i drugi algoritam primjenljiv na taj podatak, rezultati dobiveni tim algoritmima međusobno su jednaki.

55

Strukturna teorema nestrukturirano programiranje – špageti kod, strukturirano programiranje – sistematične strukture kao i u realnom okruženju, manja apstraktna barijera, objektno programiranje – objekti i poruke, još bliže realnosti, ali osnova u strukturiranom pristupu, Strukturna teorema, 1966. godine, Corrado Boehm i Giuseppe Jacopini: Rješenje bilo kojeg problema, koji je po svojoj prirodi rješiv pomoću računara, može se izraziti kao superpozicija sljedećih struktura: – – –

sekvence, selekcije, i iteracije.

Sekvenca nakon završetka jedne operacije, izvršava se naredna, poklapa se sa radom CPU, jednostavna implementacija, malo je vjerovatno da bude jedina struktura u algoritmu, programu, najčešće je superponirana unutar drugih struktura, poluselekcija – jedna alternativa toku izvršavanja, if (uslov) operacija1_alter_ili_blok;

puna selekcija – grananje toka u dva podtoka, if (uslov) operacija1_tačno_ili_blok; else operacija2_netačno_ili_blok;

56

višestruka selekcija – grananje u više tokova, switch(vrijednost) { case v1: op1; break; case v2: op2; break; …. default: opN; }

Iteracija sa izlaskom na vrhu, 0,1, 2, … while(uslov) operacija_ili_blok; for(init;uslov;finis) operacija_ili_blok;

sa izlaskom na dnu, 1, 2, … do operacija_ili_blok; while(uslov);

sa izlaskom u sredini, – kombinacija dva prethodna tipa, while(1) {operacija1; // 1, 2, … if(uslov) break; operacija2; // 0, 1, 2, … }

57

Podalgoritmi posljedica modularnosti, • algoritam koji rješava jedan aspekt problema i biva angažovan od strane glavnog algoritma ili drugog podalgoritma, • superordiniran i subordiniran, • minimalne kopulativnosti a maksimalne kohezije,

Notacije za predstavljanje algoritama Nije samo osmisliti, treba zapisati da ga i drugi vide. Notacije za predstavljanje algoritama mogu biti • NEFORMALNE – živi jezik, slike, AV – uputstva, kuvar • FORMALNE – manje dvosmislene, obučenost čitaoca, – GRAFIČKE, skup grafičkih simbola, kognitivni, laki, puno prostora, – blok dijagram algoritma, dijagram strukture programa – TEKSTUALNE, skup službenih riječi, obučenost, manje prostora, • pseudokodovi – “očerupani programski jezik”, ADA, C, Paskal, • programski jezici.

58

STRUKTURE PODATAKA Strukture Struktura (slog) podataka je skup više promenljivih koje su grupisane pod zajedničkim imenom radi lakše manipulacije. Strukture pomažu u organizovanju složenih podataka tako što omogućavaju grupisanje međusobno povezanih promenljivih na takav način da se one posmatraju kao cjelina, a ne kao pojedinačni entiteti. Primer strukture može biti dosije studenta koji sadrži ime, prezime, adresu, broj indeksa itd. Elementi struktura mogu biti takođe strukture. Na primjer, dosije studenta može da sadrži i podatke o položenim ispitima i ostvarenim ocjenama. Drugi primjer može biti tačka u ravni koja sadrži x i y koordinatu ili pravougaonik koji sadrži dvije tačke.

Stack (stek, stak) Još se naziva i LIFO lista (Last In First Out). Funkcioniše po principu “steka”. Stek je naziv za tacne u restoranu, naslagane jedne na druge. Uvijek se prva uzima ona tacna koja je posljednja stavljena na stek (tj. ona koja je na vrhu). Naime, kada treba smjestiti novi element u stek, on se stavlja na njegov kraj (PUSH operacija), pri čemu se i pri uzimanju elemenata sa steka oni takođe uzimaju sa kraja (POP operacija). Stek inače koristi i sam kompajler pri rekurziji, tako da je jedna od primjena steka baš simuliranje rekurzije.

Red Red (queue) je FIFO (First In First Out) lista. U ovu listu elementi se stavljaju na kraj, ali uzimaju sa početka (kao red u prodavnici).

Dek (dvostruki red) Ubacivanje i izbacivanje se vrši sa obe strane, tj. sa oba kraja.

Lista (opšta lista) Ubacivanje i izbacivanje elemenata se može vršiti sa bilo koje pozicije (na početku, na kraju, ili na bilo kojoj poziciji unutar liste).

59

Povezana lista Povezana lista (linked list) je ništa drugo nego niz elemenata, od kojih svaki ima 2 polja. U jednom je vrijednost elementa (ono što bi bilo na tom mjestu u običnom nizu), a u drugom pokazivač na sljedeći element niza. Zadnji element pokazuje na NULL. Prednosti ovakve strukture podataka su ubacivanje i izbacivanje elemenata iz liste u vremenskoj složenosti O(1).

vrijedi za dovoljno veliki n: O(1) < O(log n) < O(n) < O(nlog n) < O(n 2) < O(n3) < ...< O(2n) < O(n!) –

O(1) znači da je vrijeme izvođenja ograničeno konstantom



ostale vrijednosti, do predzadnje, predstavljaju polinomna vremena izvođenja algoritma

svako sljedeće vrijeme izvođenja je veće za red veličine –

predzadnji izraz predstavlja eksponencijalno vrijeme izvođenja

ne postoji polinom koji bi ga mogao ograničiti jer za dovoljno veliki n ova funkcija premašuje bilo koji polinom –

algoritmi koji zahtijevaju eksponencijalno vrijeme mogu biti nerješivi u razumnom vremenu, bez obzira na brzinu slijednog računara



n3+5n2+77n = O(n3)



Koliki je posao prenijeti 1 stolicu iz dvorane A u dvoranu B?



Koliki je posao prenijeti n stolica iz A u B?



Koliki je posao prenijeti n stolica iz A u B, s time da se kod donošenja svake nove stolice sve dotada donesene stolice u B moraju pomaknuti, pri čemu se za pomicanje stolice u dvorani B ulaže isti trud kao i kod prenosa jedne stolice iz A u B?

primjeri:

1 + 2 + 3 + 4 + ...+ n = n(n+1)/2 = n 2/2 + n/2 = O (n2)

Hash tabele - Heš tabela Hash tabele (hash tables) nastaju heshiranjem elemenata. Naime, svaki element koji želimo smjestiti u ovu strukturu podataka heširamo, tj. sračunamo vrijednost koju neka hash funkcija daje za njega, i smjestimo na to mjesto u tabelu.

60 Primjer: Treba zapamtiti imena učenika nekog razreda i još neki podatak o svakom, recimo broj telefona. Primjer hash funkcije je, recimo, zbir ASCII vrijednosti svih slova u imenu po modulu veličine tabele (što je najpoželjnije neki prost broj). Ako je to mjesto već zauzeto, dodajemo još jedan unos u isto polje (možemo hash tabelu dakle pamtiti kao matricu, ili kao niz povezanih listi, što je bolja implementacija). Sada kad trebamo naći Markov broj telefona, sabraćemo ASCII vrijednosti slova u riječi "Marko", uzeti tu vrijednost po modulu veličine tabele, i tražiti na tom mjestu u hash tabeli. Prednost ove strukture podataka je vrijeme pristupa elementu O(1). Dobra heš funkcija treba da transformiše skup ključeva ravnomjerno u skup slučajnih lokacija iz skupa {0, . . .,m− 1}. Drvo (Stablo) Za one koji su upoznati, drvo (tree) predstavlja graf koji nema nijedan krug (ciklus). Koncepcija ove strukture podataka je već i iz samog imena jasna, a naročito uz sliku:

Za neki početni čvor kažemo da je "korijen" (root) drveta, za svaki čvor one koji su "na dole" od njega i direktno povezani sa njim kažemo da su njegova "djeca" (children), a zajedno sa onima na dole sa kojima je povezan preko više od jedne ivice kažemo da su njegovi "potomci" (descendants). Svaki čvor koji je "na gore" od nekog i povezan sa njim je njegov "predak" (ancestor). Neki čvor zajedno sa svim njegovim potomcima čini pod-drvo (subtree) čiji je on korijen (root). Najčešće se koristi binarno drveće, u kome svaki čvor ima najviše dvije grane (dvoje djece). Takođe, ovdje svaki čvor ima svoje lijevo i desno pod-drvo. Binarno drvo pretrage Binarno drvo pretrage (binary search tree) je takvo drvo u kome je za neki čvor njegovo lijevo dijete uvijek manje od njega, a desno uvijek veće. U ovakvom drvetu je za traženje, ubacivanje ili izbacivane nekog elementa potrebno vrijeme O(log n). Međutim, ako su elementi loše raspoređeni, svaka od ovih operacija može odnijeti čak O(n) vremena! AVL drvo

61 AVL drvo je "izbalansirano" binarno drvo pretrage. U njemu je razlika visina lijevog i desnog pod-drveta za svaki čvor najviše 1. Naime, pri svakom dodavanju ili izbacivanju elemenata, obraća se pažnja da drvo ostane izbalansirano kao što je rečeno, pri čemu se za taj korak ne smije potrošiti više od O(log n) vremena. Složenosti svih operacija su kod ovakvog drveta uvijek tačno O(log n). Heap - Hip Heap je još jedna vrsta binarnog stabla, kod koga je zadovoljen uslov da su djeca svakog čvora uvijek veća ili jednaka od samog tog čvora (može se praviti i obrnuto, da su djeca uvijek veća od oca). Hip je binarno stablo koje zadovoljava uslov hipa: ključ svakog čvora veći je ili jednak od ključeva njegovih sinova. Ova struktura podataka ima izuzetno širok spektar upotrebe. Naime, često je potrebno u svakom trenutku znati koji je najmanji element nekog niza. Koristeći heap, ovu informaciju imamo u O(1) (to je ustvari prvi element u heap-u). Update-ovanje heap-a, što će reci izbacivanje ili ubacivane elementa, radi se u O(log n). Primjene hip-a Lista sa prioritetom: dinamički skup čiji elementi se uklanjaju po redosledu veličina, počev od najvećeg. Na primjer, objekat sa najvećim prioritetom se nalazi u korenu heap-a i trivijalno se uzima iz strukture. Ali ako se ukloni korijen, tada ostaju dva podstabla i moraju se efikasno spojiti u jedno stablo koje će ponovo imati heap svojstvo. Korist od upotrebe heap strukture zasniva se na svojstvu da se može izvaditi objekat najvišeg prioriteta i ubaciti za O(logn) vremena. Heap Sort: od kolekcije elemenata kreira se heap za (O(n)) vremena i potom se uklanjaju elementi iz heap-a, a svako uklanjanje ima složenost proporcionalnu visini heap-a, tj. (O(log n)), te ukupna složenost je (O(n log n)).

02.1 Vrste struktura podataka Student će biti sposoban da prepozna i reprodukuje osnovne vrste struktura podataka Strukture podataka su složeni tipovi podataka Nastaju primjenom apstrakcije agregacije, tj. objedinjavanjem više jednostavnijih tipova podataka Svaka konkretna vrijednost strukture podataka je jedna instanca odgovarajućeg tipa Npr. (“Pero Perić”, “143/2009”, 4) je jedna instanca strukture podataka kojom se predstavljaju studenti

Vrste struktura podataka Svaka konkretna vrijednost strukture podataka se sastoji od jednostavnijih dijelova, koji predstavljaju njene elemente

62 Elementi mogu biti prosti ili složeni, tj. strukture podataka za sebe Na taj način se mogu graditi proizvoljno složene strukture Npr. zapis (“Petra Perić”, “143/2009”, 4) se sastoji od tri polja elementa: – – –

Ime - niz znakova (složen tip) Broj indeksa- niz znakova (složen tip) Godina studija – ceo broj (prost tip)

Elementi u strukturi podataka mogu biti u nekom međusobnom odnosu (relaciji) Stoga se struktura podataka može formalno definisati kao uređen par S =(E, r) –

E je skup elemenata



r je binarna relacija definisana nad E kojom je uređen skup E

Pojedine vrste struktura podataka se izvode na osnovu toga kakav je njihov međusobni odnos, tj. kakve su osobine relacije r Najvažnija osobina relacije r je kardinalnost, tj. koliko elemenata odgovara jednom elementu u datoj strukturi i obrnuto Na osnovu kardinalnosti relacije r mogu se definisati sljedeće vrste struktura: – – – –

0:0 (ne postoji uređenje) - kolekcije i skupovi 1:1 (linearno uređenje) - linearne strukture 1:M - stabla M:M - grafovi i mreže

Kolekcije i skupovi Elementi u strukturi nemaju međusobni odnos, tj. kardinalnost relacije r je 0:0

Samo se može znati da li je neki element u strukturi ili ne Bliske su pojmu skupa iz matematike, pa se tako i nazivaju Skup nema duplikate (jedan isti element ne može biti dva puta član skupa) Kolekcija može imati duplikate (jedan isti element može biti dva puta član skupa)

Linearne strukture Elementi u strukturi su linerano uređeni, , tj. kardinalnost relacije r je 1:1

63

Osim jednom posebnom elementu koji se naziva prvi, svakom elementu prethodi tačno jedan element Osim jednom posebnom elementu koji se naziva posljednji, svakom elementu sledi tačno jedan element

Stabla-hijerarhijske strukture Elementi u strukturi su hijerarhijski uređeni, tj. kardinalnost relacije r je 1:M

Osim jednom posebnom elementu koji se naziva korijen, svakom elementu prethodi tačno jedan element Svakom elementu može slijediti više elementa Grafovi ili mreže Elementi u strukturi su uređeni bez ograničenja, tj. kardinalnost relacije r je M:M

Svakom elementu može prethoditi više elemenata Svakom elementu može slijediti više elementa Zaključak

64 Navedene opšte strukture podataka pokrivaju sve moguće slučajeve Svaka konkretna struktura podataka u praksi se svodi na neku od navedenih Zbog toga je za rješavanje problema u programiranju dovoljno poznavati kako se svaka od navedenih opštih struktura implementira a, to je upravo predmet izučavanja ovog kursa! – – – – –

Navedite koja ja najvažnija osobina relacije koja definiše uređenje elemenata u strukturi podataka? U čemu je razlika između skupa i kolekcije? U čemu je razlika između lineranih struktura, stabala i grafova? Po čemu je poseban prvi element u lineranoj strukturi, a po čemu posljednji? Šta je korijen stabla?

Klasifikacija struktura podataka

PREMA NIVOU APSTRAKCIJE 1. LOGIČKE STRUKTURE – matematički objekti, 2. PROGRAMSKE STRUKTURE – ista logička različito na programskom jeziku, 3. FIZIČKE STRUKTURE – organizovane po mjeri hardvera, PREMA TIPU RELACIJE 1. LINEARNA STRUKTURA – 1 prethodi i 1 slijedi, 2. STRUKTURA TIPA STABLA – 1 prethodi i 0, 1… slijede, 3. MREŽNA STRUKTURA – N prethodi i M slijedi, PREMA MJESTU MEMORISANJA 1. OPERATIVNE STRUKTURE – u memoriji koja je u direktnoj sprezi sa CPU, 2. STRUKTURE NA MASOVNOJ MEMORIJI – čuvaju podatke.

65

Operativne strukture podataka podaci organizovani tako da njihova obrada bude efikasnija, klasifikovane u odnosu na osnovne operacije izvršive nad njima: pristup elementu strukture, dodavanje i brisanje elementa iz strukture – SKALARI, – STATIČKE STRUKTURE, • INDEKSIRANE STRUKTURE • SLOGOVI – POLUDINAMIČKE STRUKTURE, • STEK, RED, DEK, SEKVENCA – DINAMIČKE STRUKTURE, • LISTA • STABLO • MREŽA

Skalari.. Skalar predstavlja veličinu koja je potpuno određena vrijednošću do koje se dolazi navođenjem identifikatora Tipovi skalara C jezika – CJELOBROJNI • označeni cjelobrojni, skraćene tačnosti (signed short int ili skraćeno short int), osnovne tačnosti (signed int ili int) i proširene tačnosti (signed long int ili long int), • neoznačeni cjelobrojni, skraćene tačnosti (unsigned short int), osnovne tačnosti (unsigned int) i proširene tačnosti (unsigned long int), • znakovni, označeni (signed char), neoznačeni (unsigned char) i osnovni (char) koji se interpretira i kao standardni znakovni, ASCII kôd

66 • pokazivački tip (*) je podatak za adresnu aritmetiku, • nabrojani tip (enum) definiše 216 korisničkih vrijednosti,

REALNI (razlomljeni) • osnovne tačnosti (float), obično fizički zauzimaju dvostruko više bitova od osnovnog cjelobrojnog tipa (int), • dvostruke tačnosti (double ili nekada zapisivan kao long float), obično fizički zauzimaju dvostruko više bitova od osnovnog realnog tipa (float), • višestruke tačnosti (long double), obično fizički zauzimaju najviše bitova , – LOGIČKI tip, true ili false, uobičajen u ogromnoj većini jezika POKAZIVAČKI Tretira se kao skalar u C jeziku, nosi indirektan podatak – adresu memorijske lokacije gdje je stvarni podatak, Primjer:

Nabrojani tip Je skalarni u C jeziku jer svaku nabrojanu vrijednost kodira 16 bitnim brojem, Na primjer: enum {Ne, Da}; enum temp {min = -15, radna = 30, maks = 50}; enum VojnickiCin {Razvodnik, Desetar, MladjiVodnik};

67 typedef enum VojnickiCin TVojnickiCin; typedef enum mjeseci {Jan=1, Feb, Mart, Apr, Maj, Juni, Juli, Avg, Sept, Okt, Nov, Dec} TMjeseci; enum temp temperatura; //moze uzimati vrijednosti -15, 30 ili 50 enum VojnickiCin Vojnici; // ali sa TVojnickiCin Vojnici; Vojnici = Desetar; // ali i sa Vojnici = 1; Vojnici = Vojnici + 1; //koju vrijednost sada ima Vojnici? nabrojani kao celobrojni omogućio C jeziku ulaz/izlaz ovih vrednosti za razliku od Paskala. STATIČKE STRUKTURE Su operativne strukture u kojima: nije definisana operacija dodavanja novog elementa u strukturu, nije definisana operacija uklanjanja postojećeg elementa iz strukture, pristup elementu strukture je direktan i proizvoljan a može biti sproveden putem: • indeksa, pozicije elementa u strukturi – INDEKSIRANE STRUKTURE, ili • naziva elementa u strukturi – SLOGOVI, ZAPISI ili RIKORDI

Šta je algoritam? precizno opisuje način rješavanja nekog problema jednoznačno određuje šta treba napraviti moraju biti definisani početni objekti koji pripadaju nekoj klasi objekata na kojima se obavljaju operacije – – –

kao ishod algoritma pojave se završni objekti ili rezultati konačni broj koraka; svaki korak opisan naredbom ili instrukcijom obavljanje je algoritamski proces

upotrebljiv, ako se rezultat dobije u konačnom vremenu Primjeri nedopuštenih naredbi: izračunaj 5/0 uvećaj x za 6 ili 7 algoritam mora biti efektivan ili djelotvoran: –

u konačnom vremenu može se dobiti traženi rezultat koristeći olovku i papir.

primjeri: –

sabiranje cijelih brojeva je efektivno

68 –

rad sa realnim brojevima nije, može se pojaviti broj s beskonačno mnogo cifara

uz razumijevanje problema kojeg rješava i sa znanjem programiranja, student može napisati efektivan algoritam –

cilj ovog predmeta je naučiti kako se oblikuje i programira efektivan algoritam.

razlika između značenja riječi efektivan (djelotvoran) i efikasan –

efektivan = ono što smo dobili sadrži sve što smo tražili



efikasan = uspješan s obzirom na utrošene resurse - vrijeme, procesor, disk, memoriju)

množenje se može svesti na ponavljanje sabiranja – efektivno, ali nije efikasno!

Procedura

procedura je postupak koji ima sva svojstva kao i algoritam, ali koji se ne mora završiti u konačnom broju koraka primjer: naći zbir svih prirodnih brojeva primjeri procedura: • •

operativni sistem računara editor teksta

vrijeme izvođenja mora biti "razumno" primjer: •

algoritam koji bi izabirao potez igrača šaha tako što bi ispitao sve moguće posljedice tog poteza, zahtijevao bi milijarde godina rada i na najbržem zamislivom računaru

Algoritmi i programi Niklaus Wirth: Program = Algoritam + Strukture podataka Program - opis algoritma koji u nekom programskom jeziku jednoznačno određuje što računar treba napraviti Programiranje – proces prevođenja opšteg rješenja problema u računarski čitljiv oblik • • •

kako osmisliti algoritam? kako strukturirati podatke? kako formalno specificirati algoritam?

69 • • •

kako verifikovati algoritam? kako analizirati algoritam? kako provjeriti napisani program?

Postupci izrade algoritama nisu jednoznačni. Traže kreativnost! Donald Knuth: Art of Programming Za opis algoritama koristićemo pseudokod Znanje iz ovog predmeta trebalo bi da nam pruži znanje i da nas osposobi da bolje programiramonam. Naime, razvoj programa (metodom postepenog profinjavanja) može se promatrati u skladu sa sljedećim dijagramom.

Slika 1.1 Postupak rješavanja problema kako ga vidi matematičar Opšti postupak rješavanja problema (kako ga vidi informatičar)

Osnovni pojmovi Apstraktna struktura podataka (ASP, eng. ADT-Abstract data type)

70 matematički model, specifikacija, skupa objekata zajedno sa skupom operacija koje su definisane u tom modelu Struktura podataka implementacija apstraktne strukture podataka u nekom programskom jeziku Implementacija obuhvata i pitanja predstavljanja konkretnog podataka u memoriji računara Tip podataka označava pripadnost nekog podataka, kao uređenog skupa vrednosti, određenoj apstraktnoj strukturi podataka, ali u praksi i njenoj implementaciji odnosno programskoj strukturi podataka Specifikacija i implementacija Za isti apstraktni tip podataka obično se može smisliti više različitih implementacija koje se razlikuju po tome što koriste različite strukture podataka za prikaz podataka, odnosno različite algoritme za izvršavanje operacija Specifičnosti implementacije u proceduralno orijentisanim jezicima i objektno orijentisanim jezicima •



u proceduralno orijentisanom jeziku podatak kao objekat je “vidljiv” spolja i programer je odgovoran za pravilnu upotrebu odgovarajućeg kóda operacije, u objektno orijentisanom jeziku podatak je enkapsuliran (“začauren”) i programer samo bira neku od unaprijed dozvoljenih operacija (metoda) za rad sa podatkom

Primitivni tipovi podataka Apstraktne strukture podataka su generalizacija primitivnih struktura podataka, a apstraktne procedure generalizacija primitivnih operacija Primitivni tipovi podataka • • •

prirodni brojevi, cijeli brojevi, realni brojevi

Primitivne operacije • • • •

sabiranje, oduzimanje, množenje ....

Tipovi podataka Tip podataka u proceduralnom jeziku određuje domen definisanosti kao skup mogućih vrijednosti podatka Operandi i rezultati mogućih operacija su podaci određenih tipova primjer: podatak tipa int može uzeti vrijednost samo iz skupa cijelih brojeva.

71 U praksi: Apstraktna struktura podataka je koncept u domenu analize problema, dok je struktura podataka koncept u domenu programiranja Program = Algoritam + Strukture podataka Struktura podataka •

skup varijabli u nekom programu i veza među tim varijablama



konačni niz naredbi, od kojih svaka ima jasno značenje i može biti izvršena u konačnom vremenu iste naredbe mogu se ponavljati bilo eksplicitnim navođenjem ili korišćenjem odgovarajućih naredbi za ponavljanje

Algoritam

• Važan uslov ! •

za bilo koje vrijednosti ulaznih podataka algoritam mora da završi rad nakon konačnog broja koraka

Elementi od kojih se grade strukture podataka Strukture podataka reprezentuju različite tipove podataka u radnoj memoriji računara Strukture podataka mogu biti različite složenosti Strukture podataka se mogu međusobno povezivati, tako što se manje cjeline udružuju u veće Strukture podataka se međusobno povezuju vezama Elementi od kojih se grade strukture podataka: • • • • •

Ćelija, Polje, Slog, Pointer (pokazivač), Kursor.

Strukture podataka se grafički prikazuju dijagramima This section we'll provide an overview, in the form of a table, of the major data storage structures we'll be discussing in this book. This is a bird's-eye view of a landscape that we'll be covering later at ground level, so don't be alarmed if it looks a bit mysterious. Table 1.1 shows the advantages and disadvantages of the various data structures described in this book.

72

Ćelija Struktura podataka koji promatramo kao zasebnu cjelinu, varijabla Podatak, pa time i pripadajuća ćelija podatka, je određenog tipa Zasebna cjelina je relativan pojam, nešto se u jednom trenutku može smatrati ćelijom, a kasnije se može gledati unutrašnja građa te iste cjeline Svaka ćelija ima svoj tip i adresu Grafički prikaz ćelije:

Polje (array u C-u). Vid mehanizma za udruživanje manjih dijelova strukture podataka u veće Polje čini više ćelija podataka istog tipa postavljenih na susjednim memorijskim adresama Broj ćelija je unaprijed zadat i nepromjenljiv Jedna ćelija se zove element polja i jednoznačno je određena pripadnom vrijednošću indeksa

73 Po ugledu na programski jezik C, uzimamo da su indeksi 0, 1, 2, ... , N-1, gdje je N cjelobrojna konstanta. Grafički prikaz polja:

Slog ili zapis (structure u C-u) Mehanizam za objedinjavanje jednostavnijih struktura podataka Slog sadrži više ćelija, istog ili različitog tipa, koje su zapisane na susjednim memorijskim lokacijama Broj, redosljed i tip ćelija je unaprijed zadan i nepromjenljiv Pojedina ćelija se zove komponenta zapisa Polja i zapisi se mogu kombinirati Na primjer: polje zapisa, zapis čije pojedine komponente su polja, polje od polja, zapis čija komponenta je zapis, i slično. Grafički prikaz sloga:

Pointer ili pokazivač Služi za uspostavljanje veze između dijelova strukture Pointer je posebna ćelija koja pokazuje na neku drugu ćeliju

74 Sadržaj pointera je adresa ćelije koju treba pokazati Grafički prikaz pokazivača:

Kursor Takođe služi za uspostavljanje veze između dijelova strukture Kursor je ćelija tipa int, cjelobrojna veličina, koja pokazuje na element nekog polja Sadržaj kursora je indeks elementa kojeg treba pokazati Grafički prikaz kursora:

Dijagramski prikaz strukture podataka koja se sastoji od niza slogova povezanih pomoću pointera, te od jednog polja sloga. Slogovi su još međusobno povezani kursorima. • •

Niz slogova povezanih pomoću pointera sa još jednim poljem slogova Slogovi su međusobno povezani i kursorima

primjer : Apstraktni tip podataka COMPLEX Slijedi primjer za apstraktni tip podataka. Definišemo apstraktni tip podataka koji odgovara matematičkom pojmu kompleksnih brojeva:

75 scalar - bilo koji tip za koji su definisane operacije sabiranja i množenja complex - podaci ovog tipa su uređeni parovi podataka tipa scalar operacija ADD(z1,z2,&z3) za zadate varijable z1,z2 tipa complex računa njihov zbir z3, također tipa complex Dakle, za z1 oblika (x1,y1), z2 oblika (x2,y2), dobiva se z3 oblika (x3,y3), tako da bude x3=x1+x2, y3=y1+y2 primjer : Apstraktni tip podataka COMPLEX operacija MULT(z1,z2,&z3) - za zadate z1,z2 tipa complex računa njihov umnožak z3, također tipa complex Dakle, za z1 oblika (x1,y1), z2 oblika (x2,y2), dobiva se z3 oblika (x3,y3), takav da je x3=x1*x2-y1*y2, y3=x1*y2+y1*x2

primjer : Apstraktni tip podataka COMPLEX Specifikacija: struktura podataka pogodna za prikaz kompleksnog broja bila bi formalno u programskom jeziku C specificirana kao tip complex: typedef struct { scalar re; scalar im; } COMPLEX;

Grafički prikaz strukture podataka:

Kompletna implementacija apstraktnog tipa podataka COMPLEX se sastoji od prethodne definicije tipa podataka COMPLEX typedef struct { scalar re;

76 scalar im; } COMPLEX; kao i od implementacija operacija nad podacima tipa COMPLEX u formi funkcija oblika: void ADD (COMPLEX z1, COMPLEX z2, COMPLEX *z3) {...} void MULT (COMPLEX z1, COMPLEX z2, COMPLEX *z3) {...} Za apstraktni tip podataka COMPLEX je važno da su prisutne operacije ADD( ) i MULT( ). Bez tih operacija radilo bi se o tipu, i tada kompleksne brojeve ne bismo mogli razlikovati od uređenih parova skalara. Dodatna dimenzija “apstraktnosti” sastoji se u tome što nismo do kraja odredili šta je tip scalar. To je naime nebitno za proučavanje struktura podataka i algoritama (važan je odnos među varijablama a ne njihov sadržaj).

APSTRAKCIJE (Kenan Crnkić) Osnovni problem u programiranju je složenost problema. –

Ne može se cio problem posmatrati i rješavati odjednom.

Složenost se rješava apstrakcijama, kontrolisanim uvođenjem detalja. –

Detalji se zanemaruju na nekom nivou apstrakcije kako bi se broj koncepata sa kojima se projektant suočava sveo na razumnu mjeru.

Apstrakcija na jednom nivou se implementira preko one na nižem. – –

Dobija se hijerarhija apstrakcija. Na dnu hijerarhije su apstrakcije (koncepti) podržane od strane implementacionog sredstva (programskog jezika ili računara-hardvera).

Specifikacija je opis apstrakcije Neformalne i formalne specifikacije –

Specifikacije je formalna ako je data na jeziku čija je sintaksa i semantika formalno definisana

Implementacija (apstrakcije) je njena materijalizacija na implementacionom sredstvu Postoje proceduralne apstrakcije i apstrakcije podataka

77

Proceduralne apstrakcije Predstavljaju proširenje skupa operacija implementacionog sredstva (jezika ili računara) –

Realizuju se preko procedura i funkcija u programskom jeziku

Primjer sin(x), izračunajPlatuRadnika(r) Dekompozicijom (top down) svode se na jednostavnije (na nižem nivou apstrakcije) proceduralne apstrakcije sve dok se ne dođe do primitivnih (operacija implementacionog sredstva) –

Top-down stepwise refinement postupak razvoja programa

Šta je primitivni nivo zavisi od imlementacionog sredstva (jezika ili računara) Npr. sin(x) je primitivna operacije u višim programskim jezicima, a složena (apstraktna) u mašinskom jeziku

Primjer: procedure izracunajPlatuRadnika(r) begin bruto = izracunajBrutoPrimanja(r); odbici = izracunajOdbitkeRadnika(r); plata = bruto - odbici; end; procedure izracunajBrutoPrimanja(r) begin bruto = brojBodova * vrednostBoda; end; procedure izracunajOdbitkeRadnika(r) begin odbici = sindikalnaClanarina(r) + rataKredita(r); end;

78

Apstrakcije podataka Podatak je nosilac informacije. Informacija je protumačeni podatak. Konkretna vrijednost podatka se može tretirati kao predstava nekog objekta iz realnog sistema. Npr: 5 -> predstavlja temperaturu (Pera, 143/85, 5) -> predstavlja studenta

Apstrakcije podataka – Načini apstrahovanja Postoji tri načina apstrahovanja: – – –

Klasifikacija, Agregacija i Generalizacija

Apstrakcije podataka – Klasifikacija Svi objekti istih osobina se klasifikuju u jedan tip npr. Cio broj (int), Student Tip podatka se definiše se kao skup objekata (vrijednosti) i operacija nad njima. Int : Z, {+, -, *, } Student: S, {upisiSemstar, poloziIspit, …} Tipovi se mogu posmatrati : – –

Prema načinu implementacije Prema složenosti

Tipovi prema načinu implementacije: 1. Fizički tipovi – –

tipovi podržani od strane računara (hardvera); npr: int, char

2. Jezički (virtuelni) tipovi – –

tipovi podataka koji su podržani od strane implementacionog jezika; npr: zapis, niz

3. Apstraktni tipovi podataka (ATP) – –

proširenje skupa tipova implementacionog sredstva; npr: student, radnik

Tipovi prema složenosti: 1. Prosti (primitivni) tipovi – –

Vrijednost prostog tipa je nedjeljiva npr: int -> 5

79 Složeni (strukturni) tipovi – – – –

Dobijaju se agregiranjem više drugih tipova Vrijednost je složena, sastoji se od drugih vrijednosti; npr: zapis -> (Pera, 143/85, 5) Strukturni tipovi se nazivaju i Strukture podataka

Apstrakcije podataka – Agregacija Dobija se agregiranjem više tipova u jedan apstraktniji složeni tip. Odnos objekata u strukturi može biti: -

ne postoji uređenje -> kolekcija i skup 1:1 (linearno uređenje) -> linearna struktura 1:M -> stablo M:M -> grafovi i mreže

Objekti u strukturi ne moraju biti istog tipa Većina klasičnih programskih jezika podržava agregaciju

Apstrakcije podataka – Generalizacija i specijalizacija Uočavanjem zajedničkih osobina i operacija tipovi se apstrahuju u generički apstraktniji tip Obrnut postupak je specijalizacija Uzastopnom primjenom generalizacije i specijalizacije dobija se hijerarhija tipova Operacije i osobine se nasljeđuju od nadtipa Primjer Osoba -

Ime, Prezime, Datum rođenja

Radnik – podtip od Osoba -

Organizacija, Staž, Plata

Student – podtip od Osoba -

Fakultet, godina studija, prosek

Vanredni student– podtip od Student -

Iznos uplate semestra

Operacije koje se izvršavaju nad različitim tipovima se nazivaju polimorfne (generičke) operacije

80 Npr. UpisiSemestar(s), s: Student ili S: VanredniStudent Pristup u programiranju koji koristi generalizaciju naziva se objektno orijentisano programiranje, a programski jezici koji podržavaju generalizaciju objektno orijentisani jezici Generazlizacija se djelimično može implementirati i u klasičnim jezicima

Apstraktni tipovi podataka (ATP) su korisnički tipovi podataka kod kojih je sakriven način implementacije –

definisani su od strane programera i predstavljaju proširenje skupa tipova datog programskog jezika

Vidljiva je samo specifikacija ATP –

Razdvajanje specifikacije od implementacije

Način realizacije interne strukture podataka za predstavljanje i pamćenje vrijednosti datog ATP i algoritama za specificirane operacije ATP-a je sakriveno Moguće su različite realizacije istog ATP!!! U modernim OO jezicima (npr. Java, C#) specifikacija ATP se daje preko koncepta interfejsa –

Interfejs definiše skup operacija koje se mogu pozivati nad vrijednostima datog tipa



Operacije se mogu odnositi na osobine (atribute) ili predstavljati neko ponašanje objekata iz realnog svijeta

Primjer specifikacije ATP preko Java interfejsa interface BankovniRacun { double Stanje();

81 void UloziNovac(double iznos); void PodigniNovac(double iznos); }

Interfejs Interfejs definiše samo sintaksu tj. način korišćenja (pozivanja) operacija Semantika (značenje) nije obuhvaćena interfejsom Prava potpuna specifikacija obuhvata i sintaksu i semantiku –

Specifikacija semantike je poseban problem

Klase U modernim OO jezicima (Java, C#) ATP se realizuje preko koncepta klase –

Klasa definiše skup metoda kojima se implementiraju operacije datog tipa



Obuhvata i definisanje privatnih članova kojima se pamte vrijednosti datog tipa

Jedna klasa može implementirati više tipova (tj. interfejsa)

Programirajte… u C-u- i Struktura programa u C-u Programski jezik C razvijen je u AT&T Bell laboratories, s ciljem da se stvori programski jezik koji će omogućiti brzo i efikasno programiranje. S obzirom da se ta firma bavila sistemskim programiranjem, novi programski jezik trebao je biti na dovoljno niskom nivou da riješi probleme koji su se do tada uglavnom rješavali u ASSEMBLER-u, ali i na dovoljno visokom nivou da bi se iskoristile sve prednosti viših programskih jezika. Da su u svojoj namjeni uspjeli, pokazuje niz programskih paketa pisanih u programskom jeziku C (OS UNIX). Programski jezik C sadrži sve naredbe neophodne za strukturirano programiranje (if, case, petlju...) Programski paket TURBO C. U programski paket TURBO C (proizvod je programske kuće BORLAND ) uključen je uređivač teksta (EDITOR), prevodilac (COMPILER), program za povezivanje (LINKER) i program za otkrivanje i uklanjanje grešaka (DEBUGGER). Takođe postoji i mogućnost izvršavanja programa korak po korak, pa se u svakom trenutku mogu doznati vrijednosti pojedinih varijabli, što je pogodno u fazi ispitivanja logike programa.

82 Editor turbo C-a Ulaskom u direktorij u kojem je smješten programski jezik C (najčešće BORLANDC), potrebno je ući u direktorij BIN, te sa bc pokrenuti program. Nakon toga se na monitoru pojavljuje tzv. osnovni ekran, koji se sastoji od četiri dijela: • • • •

-osnovni izbor -prozor za uređivanje teksta i status linija -prozor za poruke prevodioca -kratki pregled značenja vrućih tipki

Opcije osnovnog izbora aktiviraju se istovremenim pritiskom na tipku ALT i tipku početnog slova željene opcije, ili tipkom F10 i strelicama. Izborom opcije File otvara se prozor s dodatnim izborom za rad s datotekama i direktorijima (new, open, save, save as, save all, change dir, print, dos shell, quit). Standardne opcije za kopiranje, brisanje, undo, te show clipboard nalaze se u meniju Edit. Traženje i zamjena teksta neke su od opcija menija Search. Opcija prevođenja i izvršavanje programa nalazi se u meniju Run, a samo prevođenje u meniju Compile. U meniju Debug potavljaju se razne opcije programa za pronalaženje i ispravljanje grešaka, a menij Project služi za aktiviranje i deaktiviranje programa čiji se kód nalazi u više datoteka. Options služi za postavljanje različitih opcija prevodioca i Linkera, a Window za uređenje radnog okruženja.

Struktura programa u C-u Najpogodniji način rješavanja programskih problema je rastavljanje problema u niz manjih, međusobno povezanih cjelina (strukturno programiranje). Ovaj pristup rješavanja problema podržan je i u C-u. Programi u C-u sastoje se od niza međusobno povezanih funkcija. Broj funkcija nije ograničen. U programu je obavezna jedna i samo jedna funkcija - funkcija main(). Ona označava mjesto na kojem počinje izvršavanje programa. Za poziv funkcije dovoljno je navesti njezino ime. Sve funkcije koje se koriste u većini programa smještene su u biblioteke funkcija. Funkcije Funkcija je nezavisna sekvenca kóda koji izvodi neko izračunavanje. Sastoji se iz 4 dijela: tipa rezultata, imena funkcije, liste parametara i tijela funkcije.

83 Tip rezultata funkcije obično predstavlja rezultat dobijen izračunavanjem. Tip rezultata funkcije main() je cijeli broj. Vrijednost koju kao rezultat daje funkcija main() pokazuje da li je program uspješan. Uobičajeno je da funkcija main() kao rezultat daje 0, što ukazuje na uspješnost. Vrijednost različita od nule pokazuje da nešto nije u redu. Ime funkcije bira programer i idealno je da ono pokazuje (asocira) šta funkcija radi. Na primjer, imena funkcije main () i sort () su prilično dobra imena. Loša imena su f () i g (), jer ne informišu o tome šta funkcija radi. main nije ključna riječ jezika. Međutim sistem za prevođenje (kompajler) koji izvršava C program očekuje da funkcija main () bude definisana. Ako se ona izostavi, program neće raditit. Lista parametara funkcije se stavlja u zagrade i dolazi iza imena funkcije. Ako u listi parametara nema ničega, kao main (), to pokazuje da funkcija ne prihvata parametre. Lista parametara je obično lista tipova, odvojenih zarezom, koje korisnik predaje funkciji kada se ona izvršava (obično se kaže da je korisnik pozvao ili pokrenuo funkciju). Na primjer, ako pišemo funkciju max () koja u rezultatu treba da vrati veći od dvije vrijednosti , njena lista parametara treba da identifikuje tipove dvije vrijednosti koje želimo da uporedimo. Funkcija max () za poređenje dvije cjelobrojne vrijednosti mogla bi da se definiše ovako: int max ( int val1, int val2 ) { /* ovdje dolazi kod programa ….*/ } Tijelo funkcije se stavlja u vitičaste zagrade ({}). Ono sadrži kod koji obezbjeđuje izračunavanje funkcije. Nakon svake naredbe u C-u mora stajati znak ; “tačka-zarez”, koji označava kraj jedne i početak druge naredbe. Niz naredbi grupisanih u jednu logičku cjelinu predstavlja blok naredbi. Početak bloka označava se sa , a završetak sa . Sve varijable koje se koriste u programu moraju se deklarisati, obično na početku programa ili funkcije, prije prve izvršne naredbe. Tekst napisan između /* */ je komentar i ne utiče na tok izvršavanja programa. Komentar može da bude dugačak nekoliko linija pri čemu svaku od njih ne moramo posebno da uokvirimo sa /* */ . Komentar je namijenjen čitaocu programa i tokom kompajliranja Programski jezik C nije pozicioni (kao npr. FORTRAN), što znači da kód može početi u bilo kojoj koloni, te da se naredbe, izrazi i komentari mogu protezati u više programskih linija.

84 Naš prvi zadatak je da napišemo poruku na korisnikovom terminalu. Ulaz i izlaz nisu unaprijed definisani dijelovi jezika C (i C++). Oni su podržani objektno orijentisanom hijerarhijom klasa, implementiranom na jeziku C (C++) kao dio njegove standardne biblioteke. Klasa je korisnički definisan tip podatka. Mehanizam klasa je metod dodavanja tipova podataka koje naš program prepoznaje. Objektno orijentisana hijerarhija klasa definiše familiju srodnih tipova klasa, kao što su ulaz sa terminala ili iz datoteke, izlaz na terminal ili u datoteku itd. Definicija klase se obično dijeli u dva dijela, od kojih svaki predstavlja drugu datoteku: • •

datoteku zaglavlja koja sadrži deklaraciju operacija koje klasa podržava, i datoteku teksta programa koja sadrži implementaciju tih operacija.

Da bismo koristili klasu, njena datoteku zaglavlja stavljamo u program. Zahvaljujući datoteci zaglavlja, program poznaje klasu. Standardna biblioteka ulaza/izlaza jezika C (C++) zove se iostream biblioteka (ili biblioteka ulazno/izlaznih tokova). Ona se sastoji od kolekcije srodnih klasa koje podržavaju ulaz i izlaz na korisnikov terminal i u datoteku. Da bi se koristila biblioteka klasa iostream, moramo da uključimo njenu datoteku zaglavlja: # include deklariše = opisuje. Deklariše se u procedurama. definiše (niz) = rezerviše se memorijski prostor za njega. Definiše se u glavnom programu.

Primjer 1:

/*ucitati dva broja i ispisati veci (uslovni operator)*/ #include #include void main()

85 { int a,b; clrscr(); printf("\n Upisi dva broja: "); scanf("%d,%d",&a,&b); (a
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF