30
Ako je vaša strategija mudra i obuhvatna vaši proračuni će vam obezbjediti pobjedu, pa ćete moći da pobjedite prije nego što ste i počeli da se borite. Ako je vaša strategija plitkoumna i kratkovida, vaši proračuni neće vam biti od veće koristi, pa ćete izgubiti prije nego što je borba i započela. Zbog toga se kaže da pobjednici pobjeđuju prije nego što krenu u rat, dok poraženi prvo idu u rat pa tek onda pokušavaju da pobjede. Sun Tzu Umjeće ratovanja

Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Ako je vaša strategija mudra i obuhvatna vaši proračuni će vam obezbjediti pobjedu, pa ćete moći da pobjedite prije nego što ste i počeli da se borite. Ako je vaša strategija plitkoumna i kratkovida, vaši proračuni neće vam biti od veće koristi, pa ćete izgubiti prije nego što je borba i započela. Zbog toga se kaže da pobjednici pobjeđuju prije nego što krenu u rat, dok poraženi prvo idu u rat pa tek onda pokušavaju da pobjede.

Sun Tzu Umjeće ratovanja

Page 2: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

2 Računarski sveznadar, knjiga 4

Algoritam: Uvod u programiranje Sadržaj 1 Uvod ........................................................................................................................................ 4 

1.1 Hakeri i programeri ...................................................................................................................................... 4 

1.2 Postavka problema ................................................................................................................................... 4 

2 Algoritam kao osnova programiranja ................................................................................................................... 5 

2.1 Neformalni algoritmi .................................................................................................................................... 5 

2.2 Formalna definicija algoritma ...................................................................................................................... 6 

2.3 Izuzeci od formalne definicije ....................................................................................................................... 7 

2.4 Apstraktna priroda algoritma ........................................................................................................................ 7 

3 Predstavljanje algoritma ....................................................................................................................................... 8 

3.1 Primitive ....................................................................................................................................................... 8 

3.2 Pseudo kod ................................................................................................................................................... 8 

3.3 Dijagram toka ............................................................................................................................................... 9 

4 Osnovne logičke strukture za izradu algoritma .................................................................................................. 10 

4.1 Početak i kraj .............................................................................................................................................. 10 

4.2 Definisanje ulaza i lista ulaznih promjenljivih ........................................................................................... 11 

4.3 Linijska struktura i definicija sekvence ...................................................................................................... 11 

4.4 Definisanje izlaza ....................................................................................................................................... 12 

4.5 Razgranata struktura ................................................................................................................................... 12 

4.5.1 Višestruko uslovno grananje............................................................................................................... 13 

4.6 Ciklične strukture: Ponavljanje akcija u petlji ............................................................................................ 14 

4.6.1 For/Next petlja .................................................................................................................................... 14 

4.7 Podalgoritam .............................................................................................................................................. 15 

4.8 Lista podataka ............................................................................................................................................ 15 

5 Otkrivanje i definisanje algoritma ...................................................................................................................... 16 

5.1 Logičke igre, pitalice i algoritmi ................................................................................................................ 16 

5.1.1 Example1: Da li se trkate? .................................................................................................................. 16 

5.1.2 Example2: Svirate li klavir? ............................................................................................................... 16 

5.1.3 Example3: Ne okreći se sine ............................................................................................................... 17 

5.1.4 Pisanje programa i lucida intervala ..................................................................................................... 17 

5.1.5 Četiri Aristotelova oblika ................................................................................................................... 18 

5.2 Metode izrade algoritma ............................................................................................................................. 19 

5.2.1 Top-Down postupak ........................................................................................................................... 19 

5.2.2 Bottom-Up postupak........................................................................................................................... 19 

5.3 Primjeri algoritma ...................................................................................................................................... 20 

5.3.1 Quicksort algoritam: Sortiranje djeljenjem ......................................................................................... 20 

5.3.2 Selekcioni sort .................................................................................................................................... 21 

5.3.3 Bubble sort.......................................................................................................................................... 21 

5.3.4 Algoritam za sekvencijalno pretraživanje ........................................................................................... 21 

5.4 Efikasnost i tačnost ..................................................................................................................................... 22 

Page 3: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 3

6 Osnovne strukture kod programiranja ................................................................................................................ 23 

6.1 Tipovi podataka .......................................................................................................................................... 24 

6.1.1 Integer: Cjelobrojni tip podataka ........................................................................................................ 24 

6.1.2 Real: Realni tip ................................................................................................................................... 24 

6.1.3 Logical: Logički tip podataka ............................................................................................................. 24 

6.1.4 Character: Slovni (znakovni) tip podataka ......................................................................................... 25 

6.2 Struktura podataka ...................................................................................................................................... 25 

6.2.1 Rezervisane riječi: Reserved words .................................................................................................... 25 

6.2.2 Promjenljive i konstante ..................................................................................................................... 25 

6.2.3 Imena i identifikatori .......................................................................................................................... 25 

6.2.4 Polje: array.......................................................................................................................................... 25 

6.2.5 Niz znakova: string ............................................................................................................................. 26 

6.2.6 Zapis: record (slog) ............................................................................................................................. 26 

6.2.7 Datoteka (file) ..................................................................................................................................... 26 

6.3 Hijerarhijska struktura programa ................................................................................................................ 26 

6.3.1 Izrazi ................................................................................................................................................... 26 

6.3.2 Naredbe .............................................................................................................................................. 26 

6.3.3 Podprogrami ....................................................................................................................................... 27 

6.3.4 Program .............................................................................................................................................. 27 

6.4 Programski jezik i komunikacija ................................................................................................................ 27 

Dodatna razmišljanja na teme programiranja i algoritma ..................................................................................... 29 

Literatura i izvori .................................................................................................................................................. 30 

Page 4: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

4 Računarski sveznadar, knjiga 4

1 Uvod Pod programiranjem ćemo smatrati umjeće kreiranja programa za računare. Ovdje imamo dvije ključne stvari: prvo umjeće, dakle znanje i drugo mogućnost kreacije novog i razumljivog, dakle kreativno stvaranje. 1.1 Hakeri i programeri Većina autora govori o umjetnosti programiranja, koja omogućava kreiranje novog, a mi ćemo to prizemljiti i govoriti o osnovnim pravilima programerske logike. Program je tvorevina koja na jednoj strani komunicira sa mašinom, a na drugoj sa čovjekom. Pristup programiranju nije moguće univerzalno formalizovati, on umnogome zavisi od problema koji se želi riješiti. Podrazumjevani su matematički temelji, sa naglaskom na algoritme, matematičku logiku, Boolean-ovu algebru, teoriju skupova, vjerovatnoću i statistiku i logiku simbola i teorija informacija. Poželjno je poznavanje tehnologije i realizacije logičkih sklopova. Ovo se čini preglomaznim skupom znanja i većina početnika će se osjetiti nelagodno već od ovog nabrajanja. Mogli bi zato na početku napraviti jednostavnu uporedbu sa slikarstvom i reći da se od slikara ne treba zahtjevati da u potpunosti poznaje odnose perspektive i prostora, pravila zlatnog presjeka, psihološki utjecaj spektra i njegovu analizu, teoriju boja, njen hemijski sastav, način pravljenja, miješanja i slično. Za slikara je dovoljno da ima oko i ruku. Talentovan slikar trebalo bi da ima oko, ruku i ideju, koju želi pretočiti u sliku. Realizacija ideje će od njega tražiti da se upozna s tehnikama, koji to omogućavaju. Neki slikari nikad neće moći da pretoče svoje ideje u slike, zbog nepoznavanja tehnike: najljepše slike su vjerovatno zauvijek ostale samo u glavama. Neki slikari mogu opet, da realizuju fantastične ideje, ali ne mogu da ih objasne riječima i sem njih niko, nikad, više ne može da ih ponovi. Programeri bi ipak trebalo da mogu da ponove rezultat i da omoguće drugom da ponovi rezultat. To je i osnovna razlika između programera i hakera. Ne postoji škola za naivne slikare. Ako pohađaju školu naivni slikari prestaju biti naivni. Slično tome, ne postoji ni škola za hakere, njih možemo shvatiti kao naivne slikare. Hakeri mogu biti talentirani, čak i genijalni, ali po definiciji su samouki. Akademski slikari koji ostaju samo na onom što su naučili, neće stvoriti ništa novo, pa je pitanje da li su oni stvaraoci ili reproduktivci. Za razliku od slikara, koji nisu obavezni da ljepotu učine razumljivom, program to obavezno mora da bude. Tačnost, pouzdanost i jednostavnost daju minimalističku ljepotu programu. 1.2 Postavka problema Postavka problema predstavlja osnov njegovog rješenja. Za problem se smatra da je riješen ako možemo dati eksplicitni algoritam za njegovo uopšteno rješavanje. Programiranje je proces zadavanja skupa naredbi u nekom jeziku za programiranje da bi se izvršila neka aktivnost, odnosno, rješio određeni problem. Proces rješavanja problema upotrebom računara obično se sastoji od više koraka.

Prvi korak je razmatranje problema koji treba da se riješi i analize ulaznih podataka koje računar treba da obradi, kao i izlaznih podataka ili rezultata koje računar treba da proizvede.

Drugi korak je izrada algoritma, tj. definisanje postupka na osnovu kojih će računar proizvesti zahtjevani izlaz iz odgovarajućeg ulaza.

Programiranje, u užem smislu se može opisati kao proces koji se sastoji od shvatanja problema i analize ulaza i izlaza, od izbora i oblikovanja algoritma za njegovo rješavanje i od utvrđivanja programske strukture i logike. Proces programiranja je multidisciplinaran. U prve dvije faze su uključeni eksperti iz oblasti na koje s problem odnosi, a tek u trećoj fazi programer postaje samostalan. Na osnovu ekspertize iz prve dvije faze programer pristupa programiranju u užem smislu.

Page 5: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 5

2 Algoritam kao osnova programiranja Pojam algoritma predstavlja temelj za razumijevanje računarstva . Bilo koja kontrolisana aktivnost ljudskog uma, je u osnovi rezultat izvođenja nekog od algoritama. Ljudi su pod drugim imenom pisali i pravili algoritme hiljadama godina, ali ovaj termin je relativno nov1. U širem smislu algoritam je procedura koja korak po korak rješava problem, ili postiže neki cilj. 2.1 Neformalni algoritmi Algoritmi nisu ograničeni samo na tehničke aktivnosti. Postupak kuhanja jela nije niššta drugo do poštovanje algoritma nazvanog recept. Algoritam predstavlja logički niz radnji koje treba izvršiti da se od početnih postavki dođe do željenog rezultata, a izrađuje se povezivanjem logičkih struktura. Pomoću algoritma možemo opisati mađioničarski trik, napad u fudbalu preko lijevog krila, ili bilo koju drugu svakodnevnu aktivnost. Obično se kao prvi primjer algoritama daje neki kuharski recept. Umjesto da saznate koliko jaja treba da se umuti za pet krofni, daćemo nešto zabavniji algoritam, kako zaplesati tango: 1. Uoči slobodnu partnericu 2. Priđi joj 3. Zamoli je za ples 4. Ako odbije ponovi korake 1-4 dok odgovor ne bude pozitivan 5. Uoči slobodan prostor za ples 6. U slobodnom prostoru zauzmi početni položaj za ples prema slici 1 7. Sačekaj muziku za početak 8. Dva kratka polukoraka naprijed sa početkom prema slici 2 9. Nastavi sa dva duža polukoraka u ritmu muzike 10. Ponavi 8 i 9 tri puta 11. Promjeni pravac kretanja i ponovi korake 8-11 12. Ako osjetiš da partnerica prihvata ritam pokušaj okret figuru prema

slici 3 13. Ako partnerica loše slijedi nastavi jednostavno kretanje prema slici 4 14. Sačekaj kraj muzike ponavljajući korake 8-13 15. Zahvali se partnerici uz naklon muzici

slika1

slika3

slika2

slika 4

Ovakav neformalni algoritam, koji od Vas i traži da činite ispravne plesne korake sadrži mnoštvo elemenata koji upravo čine algoritam: potrebne preduslove (muzika), donošenje odluke (pristanak partnerice), izbor (poziciniranje za ples), ponavljanje (kretanje u ritmu), testiranje (provjeru rekcije partnerice) itd... Za prikaz algoritma koristili smo govorni jezik (opis) i šemu (prikaz okreta) odnosno sliku.

Nadam se da ćete tango ipak učiti na drugom mjestu, a sad nešto primjerenije računarcima (recimo heavy metal).

Razmislite o realnom računarskom problemu: Kako definisati algoritam koji definiše izvođenje algoritma unutar računara/mašine? Ovaj klasičan problem bi mogli razrješiti kao proceduru od četiri koraka: • Sve dok se ne pojavi instrukcija za zaustavljanje, ponavljaj: • Pripremi instrukciju (Fetch) • Dekodiraj instrukciju (Decode) • Izvrši instrukciju (Execute) gdje faza pripreme podrazumjeva smještanje i prihvat ulaznih podataka na odgovarajuća mjesta, faza dekodovanja prepoznavanje naredbe iz instrukcionog seta, a faza izvršenja obradu podataka po ranije definisanim pravilima i smještanje rezultata na zato definisana mjesta. Instrukcija zaustavljanja je izdvojena, jer omogućava kraj procedure, u protivnom procedura se nastavlja dok god se ona ne pojavi. 1 riječ algoritam je nastala nepravilnim izgovorom imena arapskog matematičara Al-Khwarizmi-ija (780-845). Njegovom zaslugom su prihvaćeni decimalni (arapski) brojevi. U prvo vrijeme se pod ’algoritmikom’, smatralo znanje računanja sa decimalnim brojevima, no vremenom se sve više prihvaćalo da je to metoda računanja koja dovodi do rezultata, da bi pred kraj 18 vijeka, algoritam počeo da se upotrebljava u današnjem smislu.

Page 6: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

6 Računarski sveznadar, knjiga 4

2.2 Formalna definicija algoritma Algoritam je uređeni skup jednoznačnih izvedivih koraka. Mada postoje mnogobrojne definicije ova je opšteprihavćena. Razmotrimo i analizirajmo ovu definiciju algoritma primjenljivu u području računarstva: Uređen skup označava i određuje da se koraci algoritma trebaju izvoditi određenim unaprijed definisanim redosljedom. Određen redosljed ne znači da se koraci algoritma OBAVEZNO izvode sekvencijalno, u nizu. Postoje i tzv. paralelni algoritmi koji sadrže tzv. «niti» (thread), pa se određeni koraci mogu izvoditi istovremeno, zavisno kako se niti granaju i zavisno od rezultata. Konkretno pojedini procesori ili sklopovi izvode svoj dio zadatka, tako da svaki od njih izvrši jedan korak u algoritmu. U ovom slučaju su koraci izvođenja zavise od rezultata i interakcije između sklopova, odnosno procesora. 1. Jednoznačno ili nedvosmisleno u okviru definicije deklariše da za vrijeme izvođenja algoritma informacija o stanju procesa mora biti dovoljna da jednoznačno I potpuno definiše akciju koja slijedi. To znači da izvođenje (napredovanje) algoritma mora biti rezultat slijeda uputstva, ne smije se temeljiti na bilo kakvoj proizvoljnosti, ili kreativnosti (a i dalje govorimo o umjetnosti programiranja). 2. Na kraju izvediv naglašava neophodnost da je svaki korak predhodno definisan i konačan. Na osnovu tačke 2. izvedivost se implicitno podrazumjeva (nemoguće je da je nešto jednoznačno, a da nije definisano). Konačnost predviđa konačan broj koraka, potreban da bi se stiglo do željenog rezultata. Da bi definisali algoritam potrebno je da se znaju svi potrebni ulazi na osnovu kojih se može definisati željeni izlaz. Implicitno se podrazumjeva da algoritam treba da bude efikasan: da omogući da se do cilja stigne u razumnom vremenu, sa razumnom tačnošću i razumnim naporom.

S aspekta računara algoritam je upravo idealna forma. Može se čak prihvatiti postavka da algoritam predstavlja program, jer na osnovu njega računar zna kako da korak po korak izvede neki posao. Ostalo je samo da se obezbjedi način kako da računar shvati.

Postoje tzv. CASE alati, koji direktno prevode algoritam u programski kod. U takvim slučajevima elementi algoritma moraju biti strogo formalizovani i u većini slučajeva su prepreka rješavanju problema (otkrivanju algoritma). Zato ta vrsta automatizacije nije predmet našeg razmatranja.

Mogli bi predhodnu definiciju elaborirati i u nešto drugačijoj formi bliži matematici. Čeitri karakteristike koje određuju algoritm su: definisanost, determinisanost, masovnost i efikasnost, gdje je: Definisanost Procedura koju definiše algoritam je deterministički proces, što znači da redosljed izvođenja koraka, kojim se ulaz transformiše u izlaz, precizno određen bez ikakvih dvosmislenosti. Determinisanost Proces pretvaranja ulaza u izlaze mora biti jednoznačno određen u svakom algoritamskom koraku koji opet zahteva određeni diskretni (konačni) vremenski interval za svoje izvođenje. Masovnost U odnosu na veilčinu ulaznog skupa elemenata, odnosno nakon potrebnog broja iteracija, svaki algoritam se mora završiti.To znači da mora biti definisana procedura kraja. Efikasnost Procjena koja se vrši na osnovu broja koraka i vremena koje je potrebno za transformaciju ulaza u izlaze po datom algoritmu.

! Ako Vam se ova analiza čini teoretisanjem skočite na glavu Logičke igre, pitalice i algoritmi (pripazite na beton i potražite poglavlje) koje sadrži primjere za test. Ako Vas zainteresuju možda se vratite i produžite analizu.

Page 7: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 7

2.3 Izuzeci od formalne definicije Ako bi se ograničili na formalnu definiciju bitno bi ograničili mogućnost primjene algoritma. Osnovna postavka koja limitira algoritam, je što je algoritam definisan kao izvođenje konačanog procesa koji ide prema nekom cilju. To je ujedno i bitno ograničenje mašine, ako se nastavite baviti programiranjem sigurno ćete doći do fundamentalnog pitanja teorije računarstva: problema zaustavljanja.

Church-ova teza Sve intuitivno efektivne metode su uopšteno rekurzivne.

Reductio ad absurdum2: Nemoguća mašina koja se zaustavlja ako i samo ako se ne zaustavlja.

Iskustveno i intuitivno je međutim nedvosmisleno jasno da postoje smislene aplikacije (utemeljene na algoritmu) koje uključuju odvijanje beskonačnog procesa.

Umjesto da analiziramo Turingovu mašinu3 i elaboriramo Church-ovu tezu, uzmimo za primjer djeljenje cijelih brojeva. Jednostavan i uspješan algoritam postaje neupotrebljiv u slučaju periodičnih brojeva. Takve slučajeve je najjednostavnije tretirati kao konačni algoritam koji se automatski ponavlja (beskonačno) kad dođe do kraja.

Ovakvi primjeri samo potvrđuju ispravnost upotrebe algoritma, čak i slučajevima kad svi elementi definicije nisu zadovoljeni. 2.4 Apstraktna priroda algoritma Naglasimo razliku između algoritma i načina na koji ga predstavljamo. Već ste zaključili ako niste znali, da algoritmi imaju primjenu u svim oblastima. Ali nije isto ako algoritam pravi matematičar, fizičar, inženjer ili fudbalski trener. Algoritam treba da omogući praktičnu realizaciju neke zamisli.

Algoritam je uvijek apstraktniji od načina na koji ga predstavljamo.

Ovo ćemo razjasniti prostom analogijom sa pričom i knjigom. Priča predstavlja apstraktni pojam, a knjiga je formalna (fizička) manifestacija priče. Ako knjigu prevedemo na drugi jezik, mijenja se njena predstava, ali priča ostaje ista.

Idući primjer je možda univerzalniji. Uzmimo notni zapis neke melodije. On je isti, ali različito će zvučati u zavisnosti od instrumenta na kojem se izvodi. O odnosu forme i sadržine mogli bi potrošiti i stotine strana i opet ostati nedorečeni, zato ćemo biti praktični.

Prezentovaćemo dva algoritma, koja definišu jedan jednostavan problem.

Primjer: Napraviti algoritam koji stepene Celzijusa pretvara u stepene Farenhajta. Algoritam 1 definisan opisom: pomnoži temperaturu u stepenima Celzijusa sa (9/5) i proizvodu dodaj 32 Algoritam 2 definisan formulom: F=(9/5)*C+32

Zavisno od obrazovanja, upućenosti u problem i slično, pojedincima bi više odgovarao algoritam1, od algoritma 2 i obrnuto: neko voli klavir, a neko harmoniku.

2 svođenje na apsurd 3 Turingova mašina je imaginarna mašina, koja može izvesti bilo kakav proračun (promjenu - kompjutaciju) izvediv na bilo kojem računaru. Predstavlja teoretski osnov za izradu bilo kakvog računara.

Page 8: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

8 Računarski sveznadar, knjiga 4

3 Predstavljanje algoritma Na osnovu apstraktne prirode algoritma, jasno je da se algoritam može prezentovati na mnoštvo načina. Kad ljudi jedan drugom nešto objašnjavaju obično će koristiti govor4. Osnovna mana takve prezentacije je mogućnost da pojedine riječi budu pogrešno shvaćene zbog višeznačnosti, koja karakteriše sve govorne jezike. Za predstavljanje algoritma potrebna nam je nekakva forma slična jeziku. Želimo li algoritam pripremiti za izvođenje na računaru, dva5 su standardna načina pomoću kojeg ga predstavljamo: • primitiva i • pseudokoda Konačna forma koja algoritam prilagođava računaru je program. Mogli bi ustvrditi da je u slučaju računara program finalna forma algoritma. 3.1 Primitive Algoritam pripremljen za računar biće definisan ukoliko se koriste specifični oblici za tačno definisanu vrstu funkcije koju odgovarajući oblik predstavlja, tzv. primitive ili osnovni oblik podataka. Primitivu možemo definisati kao osnovnu riječ, odnosno oblik koji može da se prepozna. Mogli bi reći da primitive predstavlja osnovni entitet6, prost tip podataka. Primitiva se sastoji od dva osnovna dijela: sintakse7 i semantike. Sintaksa omogućava simboličku oznaku primitive, a semantika joj daje značenje. Primjer: sintaksa za pojam VODA su četiri slova, a semantika bi bilo hemijska jednačina H2O kao mogući opis. Prosti tipovi su osnovni blokovi za izgradnju struktura podataka. Tako strukture kao što su klase i nizovi zovemo složeni tipovi. Na osnovu ovakve definicije primitive moguća je definicija programskog jezika: Programski jezik čini skup osnovnih oblika zajedno sa skupom pravila koja definišu kako se osnovni oblici mogu koristiti. Ako se vratimo pojmu algoritma jasno je kako se on može predstaviti pomoću primitiva: napišete program. Da bi to uspješno uradili neophodno je da se upoznate sa kompletnim instrukcionim setom, da ovladate tehnikama kreacije složenih tipova.

Predstavljanje uz pomoć primitiva nećemo dalje elaborirati. To ostavljamo kao logičan nastavak razrade algoritma nakon što smo ga definisali pseudo kodom.

Znači prijedlog je algoritam prvo predstavite pseudokodom, potom po potrebi složenim primitivama, izvršite testiranje bar na osnovu liste ulaza i izlaza i tek onda pristupite pisanju programa. 3.2 Pseudo kod Umjesto formalnu, stroge strukture programskog jezika, koristićemo se manje formalnim sistemom notacije za predstavljanje algoritma i njega ćemo nazvati PSEUDO KOD. Osnovna svrha pseudo koda je da omogući da lakše slijedimo put od ideje do konačne realizacije.

Jedan od načina predstavljanja pseudokodom je izostavljanje pravila iz naredbi koja prate svaki formalni programski jezik. Ovaj način se koristi kada znamo koji ćemo programski jezik upotrijebiti, pa je tako struktura kojom opisujemo algoritam velikim dijelom nalik, ali je manje formalna od programskog jezika.

Ako želimo zapis za predstavljanje algoritma nezavisan o programskom jeziku, tada se obično služimo principom kutija i slagalica, gdje na intuitivan način predstavljamo pojedine dijelove algoritma. 4 odnosno govorni jezik 5 predstavljanje pomoću dijagrama toka ćemo tretirati kao grafičku predstavu pseudokoda 6 u smislu elementarne samosvojnosti subjekta, gdje bi se subjekt tumačio u smislu onog što jeste 7 ovdje u smislu definisanja sastava i strukture pravila (gramatike) i načina povezivanja naredbi (primitiva) u složenijih logičkih struktura (blokova). Sintaksna pravila određuju osnovni rječnik jezika i način na koji se programi mogu stvarati. Sintaksno ispravan program je onaj koji je moguće izvršiti. Programi koji imaju sintaksne greške bićei odbačeni uz poruku o grešci.

Page 9: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 9

Cilj pseudokoda je da izrazi algoritam na jednostavan i čitljiv način. Pseudo kod možemo definisati kao intuitivni način predstavljanja algoritma kod kojeg ipak postoje određena pravila zapisa. Poželjno bi bilo da formalizujemo oznake za određene logičke (semantičke) strukture. Da bi bilo još čitljivije pseudokod pišemo sa komentarima koji dodatno opisuju pojedine strukture Bitno je da se ne izgubi osnovna namjena pseudo koda: on treba da posluži kao pomoć za predstavljanje ideja. 3.3 Dijagram toka Algoritam složen od logičkih struktura prikazanih grafičkim oblicima naziva se DIJAGRAM TOKA ili BLOK DIJAGRAM.

Dijagram toka možemo shvatiti kao specijalnu formu pseudokoda. Logičke strukture se prikazuju grafičkim oblicima8. Dijagram toka predstavlja grafičku reprezentaciju algoritma. Slika koju vidite poslužiće kao osnov za definisanje nekih od elemenata algoritma. Dijagrami toka su 50-tih i 60-tih bili vrlo popularni, ali kako se događalo da zbog nepreglednosti ispisa izmakne smisao algoritma, predstavljanje pomoću blok dijagrama je danas gotovo zanemareno.

Neki od elemenata za kreiranje dijagrama toka

(već i to što je naglašena bušena traka govori da dijagram toka nije moderna metoda)

Poželjno je da bar u početnoj fazi algoritam predstavite i korištenjem grafičkih oblika.

8 ovde prikazane forme nisu u potpunosti one propisane ANSI standardom, ali već smo rekli da formalizacija ne bi smjela postati cilj

Page 10: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

10 Računarski sveznadar, knjiga 4

4 Osnovne logičke strukture za izradu algoritma Kao uslov da nastavimo sa analizom izrade algoritma potrebno je da formalizujemo elemente koji čine algoritam. Daćemo pregled osnovnih elemenata strukture algoritma. Algoritam definišemo kao niz naredbi. Da bi olakšali praćenje algoritma podijelićemo nizove na logičke cjeline koje olakšavaju praćenje algoritma. Dobar algoritam može da se zasniva na principu crnih kutija i lego kockica.

Definisaćemo kockice kao elementarne logičke strukture. Svaka kockica odgovaraće nekoj logičkoj cjelini. Potrebno je definisati ulaze i željene izlaze, a unutrašnjost crne kutije shvatiti kao niz naredbi koji vrši transformaciju ulaza u odgovarajući izlaz. Pod elementarnom algoritamskom strukturom smatraćemo niz naredbi koji definiše jedinstven rezultat, koji se koristi kao međurezultat: kao jedan od rezultata između početka i kraja procesa. Pravljenje algoritma možemo shvatiti kao slaganje algoritamske strukture, koja se satoji od niza elementarnih kockica. U slučaju da je problem jednostavan, jedna kockica, može obuhvatati više elementarnih struktura. U slučaju da je problem kompleksan, jedna elementarna struktura se može podjeliti na više cjelina. Ako niste shvatili i sama predstava algoritma (primitive, pseudokod, dijagram toka, opis, ili nešto treće) je određena stepenom složenosti problema. 4.1 Početak i kraj Prva algoritamska struktura je najprostija, označava početak i kraj algoritma (programa). Početak i kraj možemo shvatiti kao specijalni slučaj: niz od jedne naredbe. Na početku i na kraju zapisa svakog algoritma nalaze se naredbe koje označavaju prekide: start i stop. Ovo su polazni i završni koraci svakog algoritma i svi ostali koraci se nalaze između njih.

Pseudokod označavanje ovih naredbi (koji će očigledno odgovarati primitivama) je obično start, odnosno end, a grafički simboli kod dijagrama toka su po ISO notaciji standardno kao na slici lijevo.

Page 11: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 11

4.2 Definisanje ulaza i lista ulaznih promjenljivih Nakon što se definiše početak potrebno je definisati ulazne promjenljive. Definisanje ulaza, na osnovu kojih će se graditi struktura algoritma, umnogome određuje problem.

U zavisnosti od koncepta jezika i predstave (dijagram toka, pseudokod ili nešto treće) zavisiće način deklaracije ulaznih promjenljivih.

U svakom slučaju da bi lakše mogli da slijedimo tok algoritma potrebno je da ulaznim varijablama damo neka imena. Obično se ta imena nazivaju identifikatori. Imena bi trebalo da nas asociraju na sadržaj varijabli. U složenijim slučajevima, kad varijablama pridružujemo uobičajena matematička imena (x,y...) poželjno je da se koriste komentari, kojima bi opisali namjenu promjenljivih. Sem pridruživanja imena po potrebi se definiše i tip varijable. To se obično obavlja u formi: ime = tip (varijable) Npr. Prezime=Character(20) značiće da smo za promjenljivu Prezime predvidjeli znakovni tip maksimalne dužine 20 karaktera. Definisanje ulaznih promjenljivih je jedan od najvažnijih koraka pri izradi algoritma. Ovdje treba naći pravu mjeru. Analiza potrebnih ulaza je praktično analiza problema, ali traženje svih finesa može da uzrokuje zastoj. Pravu mjeru je nemoguće preporučiti. Definisati potrebne ulaze značilo bi definisati listu ulaznih promjenljivih i njihovu strukturu (ime, tip i domen važenja ulaznih i izlaznih varijabli). U procesu programiranja, a izrada algoritma je osnov programiranja, skup akcija definisan je mogućnostima računara, odnosno naredbama programskog jezika koji se koristi. Pomoću algoritamskih struktura se zadaje redosljed izvršavanja akcija. Postoje tri elementarne algoritamske strukture: • linijska, • razgranata i • ciklična. 4.3 Linijska struktura i definicija sekvence Linijska struktura je osnovna logička struktura i odgovara izvršavanju niza naredbi. To je elementarna struktura kod koje se svaki algoritamski korak izvršava tačno jednom.

Ili ilustrovano pseudokodom uopšteno bi bilo: Akcija1 Akcija2 . . . AkcijaN Postoji samo jedna grana izvršavanja. Linijsku strukturu čini niz akcija (naredbi) jedna iza druge, koji čini SEKVENCU i predstavljaja osnovnu strukturu algoritma. Akcija se definiše izrazom iz seta naredbi koje je moguće izvesti.

U poglavlju 1.3 Program, programski jezik i semantika i programeri smo elaborirali način kreiranja naredbi, elementarnih (upotrebom primitiva) i složenih (kombinacijom primitiva).

Page 12: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

12 Računarski sveznadar, knjiga 4

4.4 Definisanje izlaza Pod izlaznom promjenljivom ćemo smatrati izlaz koja nastaje obradom ulaznih promjenljivih.

Izlaz može da se koristi za prikaz rezultata (na ekranu, štampaču) ili kao međurezultat, koji omogućava dalje računanje.

Kombinujući ove strukture u prilici smo da naparavimo algoritam koji se koristi kao početni tzv. Helo World algoritam, kojim se započinje praktičnan rad.

hello World

Mogući algoritam za ispis u pseudo-jeziku: input: /*nema podataka sa ulaza*/ output: poruka /*Zdravo, Svijete*/ { output: " Zdravo, Svijete!" }

Zasad ćemo ostati na intuitivnoj jasnoći ovog primjera. Izraz koji definiše izlaznu promjenljivu može biti primitiva, ili složena funkcija od više primitiva. Standardno izlaz je definisan listom izlaza, koja odgovara listi ulaza.

Npr. za Y=f(X)=2*X ulaz je neka veličina X a funkcija na izlazu daje izračunatu vrijednost za taj X. Za ulaz X=2 izlaz će biti Y=4. za ulaz 3, Y će biti 6 za ulaz 4 izlaz će biti 8 itd..

Ovaj primjer nema praktičnu vrijednost sem, pokazne: možemo vidjeti predstavljanje funkcije, i kreiranje izlaza na osnovu poznatog ulaza. Za razliku od ulaza koji se definiše deklarativno, vrijednost izlaza je izvedena veličina. Vrijednost izlaza (njegova veličina, tip i domen) definisana je ulazima i izrazima koji ga čine. To znači da treba biti pažljiv (ne mješati jabuke i kruške). 4.5 Razgranata struktura: uslovno grananje Razgranate strukture dopuštaju donošenje odluke. To su strukture koje nude mogućnost izbora jedne od dvije (ili više) ponuđenih vrijednosti na temelju zadovoljenog uslova.

Ilustracija za 2R (dvostruku razgranatu) strukturu: If (uslov) Then (akcija1) Else (akcija2) Endif

Koristimo ključne riječi if, then i else da bi naznačili podstrukture u strukturi. U opštem slučaju to je elementarna razgranata struktura sa n grana kod koje će se akcija na jednoj od grana izvršiti jednom, dok se akcije na ostalih n-1 grana neće izvršiti ni jednom. Možemo, (a ne moramo) da koristimo zagrade da bi naznačili granice podstruktura. To zavisi od sintakse i određene semantike pseudokoda.

Tipičan primjer ovakve strukture definiše algoritam rečenicom: Ako promet robom raste, naručuje se uobičajena količina proizvoda, inače, uskladištenu robu ponuditi po nižoj cijeni. ili pseudokodom, već napisana 2R razgranata struktura

If (uslov1) Then (akcija1) Else (akcija2)

Page 13: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 13

gdje uslov1 možemo definisati poređenje vrijednosti prometa u određenom periodu sa referentnim prometom, a akciju1 kao umanjenje cijena u odnosu na deklarisane.

Zbog preglednosti se preporučuje nazubljena struktura notacije pseudokoda, koja omogućava da se lakše pratiti koja akcija, odgovara kojem uslovu. Ilustrujmo i složeniji slučaj pseudokoda za 3R (trostruku razgranatu) strukturu:

If uslov1 Then If uslov2 Then Grupa1 akcija Else Grupa2 akcija Endif Else Grupa3 akcija Endif

Pravilno postavljanje pitanja koje omogućava jednoznačne odgovore je osnov uspješnog algoritma, odnosno programiranja. Ovdje je bitno primjetiti da odgovor ne mora biti jedan.

Uslov može biti artimetički (ispunjenje neke matematičke relacije ili jednačine), ili logički: da li je nešto istina ili ne.

4.5.1 Višestruko uslovno grananje. Uopšteno uslovno grananje naziva se prekidačka/switch naredba grananja, ili višestruko uslovno grananje. Iako se switch izraz koristi znatno rjeđe nego if izraz, vrlo je koristan za grananja u više grana. Switch izraz omogućuje procjenu uslova i na osnovu te vrijednosti skok na neko mjesto unutar switch izraza. Ova je struktura pogodna u slučaju kada je potrebno više puta ispitivati istinitost izraza a na osnovu jednog argumenta.

Pojednostavljena forma ove strukture je:

switch izraz case test_izraz1 naredbe1... case test_izraz2 naredbe2... otherwise naredbe3 end

Ovdje izraz mora biti skalar ili znakovna varijabla. Ukoliko je test_izraz1 isinit izvršavaju se naredbe1, a ukoliko taj izraz nije istinit prelazi se na testiranje izraza test_izraz2 i ako je on isinit izvršavaju se naredbe2, a ako ne (dakle nije istinit ni test_izraz1 ni test_izraz2) izvršavaju se naredbe3.

Page 14: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

14 Računarski sveznadar, knjiga 4

4.6 Ciklične strukture: Ponavljanje akcija u petlji Da bi olakšali kreiranje algoritma, da ne bi pisali linijske stukture koje se neprekidno ponavljaju kreiramo jednu složenu strukturu, koja odgovara matematičkom pojmu rekurzivne funkcije. Programske petlje se koriste u slučajevima kad ne želimo ponavljati iste naredbe više puta. Ciklične strukture su predstavljene skupom instrukcija koje se ponavljaju u petlji, a među njima se nalazi i instrukcija koja označava sve instrukcije iz petlje.

Grafička predstava ove strukture omogućava da je lakše shvatimo. Izraz F predstavlja niz naredbi (akciju) koja se interaktivno mijenja, a U uslov koji treba da se zadovolji. Vidimo da uslov može da se ispituje na početku ili na kraju ciklusa.

Forma petlje ima tri komponente: • inicijalizacija početnog stanja • testiranje trenutnog stanja sa traženim stanjem • modificiranje trenutnog stanja prema traženom Postoje dva tipa cikličnih struktura koje predstavljamo petljama (tzv. pretest loop i posttest loop), a u pseudokodu ih predstavljamo sljedećim formama: • REPEAT (aktivnost) UNTIL (uslov) • WHILE (uslov) DO (aktivnost) Za razliku od uslova If koji definiše da se akcija provede, ako je uslov tačan, while/repeat se izvršava dok (sve dok je) uslov ispunjen.

Tipičan primjer: Broj = 1 While (Broj!=6) Broj = Broj+1

• inicijalizacija • testiranje • modifikacija

4.6.1 For/Next petlja Specijalni slučaj ciklične strukture. FOR petlje omogućavaju da se grupa naredbi ponavlja unaprijed određeni broj puta. Opšti oblik for petlje je:

for (inicijalizacija; uslov nastavljanja; promjena vrijednosti ) izraz end Naredbe između for i end izvršavaju se jednom za svaki prolaz. Uslov nastavljanja mora biti logički izraz, dok inicijalizacija i promjena vrijednosti mogu biti bilo kakvi izrazi.

Primjer za ispis parnih brojeva izmedu 2 i 20:

for (N = 2; N <= 20; N = N + 2){ System.out.println( N ); }

Page 15: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 15

4.7 Podalgoritam Zbog jednostavnosti se algoritam često razbija na niz podalgoritama. Svaki od podalgoritama odgovara složenoj proceduri ili podprogramu, i može se tretirati kao jedna cjelina, kao algoritam čiji početni uslovi su definisani u drugom (glavnom) algoritmu. Struktura glavnog algoritma i podalgoritma treba da bude takva da je moguće jednostavno i jednoznačno uspostaviti vezu između matematičkih i logičkih modela koji im odgovaraju. Između algoritma i podalgoritma postoji veza koja se ogleda u listi ulazno izlaznih parametara. Lista izlaznih parametara podalgoritma mora da zadovoljava ulaznu listu algoritma i obrnuto. Podalgoritam se može smatrati formom algoritma, a nastaje kombinovanjem tri osnovne algoritamske strukture (linijske, razgranate i cikličke). Razlog korištenja podalgoritma je razlaganje problema na manje cjeline koje su lakše, vidi Botom_Up strukturu. 4.8 Lista podataka Daćemo i formaliizaciju liste podataka kao osnovne strukture ulaznih i izlaznih podataka.

Lista je konačan skup od n (n>0) elemenata, koje možemo označiti sa a1, a2, ..., an, čija je osnovna strukturna osobina da su linearno9 uređeni.

Ako je n>0 onda je element a1 prvi element u listi, an je posljednji element u listi, a za ak , gdje je kažemo da je k-ti element, pri čemu se ispred njega nalazi ak-1 a iza njega aK+1 element, pri čemu je 1<k<n.

U opštem slučaju svi elementi liste su istog tipa. Tako možemo definisati listu čiji su elementi slova, brojevi, slogovi, liste itd. Postoje različiti načini predstavljanja liste. Najčešće se koristi prikaz liste sa zagradama, gdje se elementi liste odvajaju zarezima. Npr.: - lista brojeva B=(1, 7, 13, 2, 7, 65, 35), - lista slova S=(’A,F,G,L,B,M,Q,S’) - lista imena I=(’Pero, Violeta, Jovo, Simo, Tomo’) - lista listi L=((’A, B, D, F’), (’G, H, J’)) Ako znate nešto više od elementarne matematike prepoznali bi ove strukture kao vektore: jednodimenzionalne, višedimenzionalne... Prvi element liste se često naziva glava liste (head). Obično se smatra da je to prvi element na lijevom kraju liste. Kada se iz zadate liste odstrani glava liste, dobijamo listu koja se zove rep (tail) liste. Primjer: Neka je data lista S=(’C’, ’A’, ’T’, ’S’), glava liste S je element ’C’, a rep liste je lista (’A’, ’T’, ’S’). Osnovne operacije za rad na listama mogu se podjeliti u tri grupe: - operacije kreiranja liste (konstruktorske operacije), - operacije postavljanja upita nad listom (predikatske operacije), - operacije selekcije dijelova liste (selektorske operacije).

============================================================================================= U ovom poglavlju dati su svi osnovni elementi koji omogućavaju da se kreira algoritam. Rekapitulirajmo! Ulazni elementi algoritma su ulazne promjenljive na osnovu kojih se definiše struktura podataka: struktura liste, odnosno definiše problem. Upotrebom sekvencijalnih nizova naredbi, te donošenjem odluka u sklopu razgranatih struktura i ponavljanjem nizova naredbi u sklopu cikličnih struktura moguće je definisati bilo koji rješiv algoritam.

=============================================================================================

9 bilo bi preambiciozno da pokušamo da se i formalno uvedemo u linearno programiranje, mada smo neformalno baš to učinili

Page 16: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

16 Računarski sveznadar, knjiga 4

5 Otkrivanje i definisanje algoritma Najzanimljiviji posao je otkriti algoritam. Teorija rješavanja problema nije vezana samo za računare. Stručnjaci iz svih područja su zainteresovani za pronalaženje tehnika kojima bi se moglo doći do uopštenog rješenja problema. Cilj je pronaći algoritam za pravljenje algoritama. Takav algoritam (za sad) nije pronađen. Obično se nudi opšta procedura, koju je 1945. definisao mađarski matematičar Polya, koja glasi: 1. Shvati problem 2. Napravi plan za rješavanje 3. Provedi plan 4. Provjeri tačnost plana i procjeni njegovu univerzalnost (primjenjivost na druge probleme) Polya-in koncept primjenjen na razvijanja programa glasio bi: 1. Shvati problem 2. Smisli kako problem predstaviti algoritamski 3. Formuliši algoritam 4. Provjeri tačnost i univerzalnost Ako poželite da ovaj algoritam primjenite doslovno, vrlo teško ćete realizovati bilo kakav program/algoritam. Ovo je više strategija i preporuka za početne aktivnosti, nešto slično Sun Tzu iz posvete. 5.1 Logičke igre, pitalice i algoritmi Ukoliko algoritam shvatite kao neku strogu formu i u njegovom rješavanju ne pronađete ni malo užitka, Vi ćete možda da se bavite programiranjem, ali teško da ćete biti programer. Logika i invencija, mogu da se uvježbaju (TEŠKO I DONEKLE) pa primjeri koji slijede, mogu da posluže kao test da li imate “štofa” za programera. Rješenja ne morate pronaći, ali ih trebate shvatiti. U protivnom razmislite o dizajnu, ili e-poslovanju, možda je to Vaš fah u informatičkoj branši. 5.1.1 Example1: Da li se trkate? Problem Prije trke A, B, C i D dali su svoje prognoze o rezultatu trke: • A je predvidio da će pobjediti B • B je predvidio da će D biti posljednji • C je predvidio da će A biti treći • D je predvidio da je A dobro procijenio. Samo je jedna prognoza bila tačna i nju je predvidio pobjednik. Kako je završila trka? Rješenje A nije pobijedio jer je prognozirao da će pobjediti B B nije pobjednik jer bi A imao tačnu prognozu C je mogući pobjednik; A je u tom slučaju treći, B je posljednji (da bi prognoza B bila pogrešna), a D drugi, dakle rješenje je dobijeno metodom eliminacije: CDAB. Komentar Rješenje je relativno jednostavno no ako od njega pokušate napraviti metodu i prevesti ga u univerzalni algoritam sigurno će Vam trebati vremena. U principu bi to mogli primjenom Top-Down metode, koju ćemo komentarisati nešto kasnije. 5.1.2 Example2: Svirate li klavir? Problem Osoba A treba pogoditi koliko imaju godina djeca osobe B. Da bi joj olakšala posao, osoba B kaže osobi A da ima troje djece i da je proizvod njihovih godina 36.

Nakon razmišljanja, osoba A, inače jako dobar programer, kaže da joj je potrebna bar još jedna dodatna informacija.

Nakon toga joj osoba B uzvrati da može pretpostaviti da joj je poznat i zbir godina njene djece.

Page 17: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 17

Kako je A rekla da joj na temelju dobijenih informacija niko ne može dati tačan odgovor, čak ni kad bi se tačno znalo koliko iznosi zbir njihovih godina.

Osoba B je tada rekla neka onda vodi računa o tome da joj najstariji sin svira klavir. Rješenje Zadovoljna dobijenim informacijama, A izvijesti osobu B da zna kako ima dvogodišnje blizance i devetogodišnjeg sina koji svira klavir!? Analiza Kako je osoba A pronašla tačno rješenje, ako je druga informacija bila nepotpuna (nije rekla koliki je tačno zbir godina), a treća se čini besmislenom.

U trenutku kada je B rekla da je proizvod godina njene djece 36, A je napravila listu svih mogućih kombinacija: LISTA 1 (1 1 36) (1 2 18) (1 3 12) (1 4 9) (1 6 6) (2 2 9) (2 3 6) (3 3 4)

Nakon pravljenja LISTE 1 uz pretpostavku da je poznata i suma njihovih godina lista bi poprimila slijedeći oblik: LISTA 2 (1 1 36 38) (1 2 18 21) (1 3 12 16) (1 4 9 14) (1 6 6 13) (2 2 9 13) (2 3 6 11) (3 3 4 10)

Iz oblika liste, jasan je i smisao odgovora osobe A, jer dvije liste imaju isti iznos za sumu godina. Iako treća informacija zvuči sasvim besmisleno posmatramo li zadatak kao problem rješavanja tri jednačine sa tri nepoznate, informacija osobe B, rješenju konkretnog problema daje smisao, jer razdvaja liste sa istim odgovorima. 5.1.3 Example3: Ne okreći se sine Problem Ako nam u trenutku kada pokrenemo brod koji stoji na rijeci i krenemo uzvodno, padne kapa u rijeku i počne se kretati nizvodno nošena strujom rijeke čija je brzina 3 km/h, koliko će nam trebati vremena da je ponovno ugledamo, vozimo li uzvodno 10 minuta brzinom od 4 km/h relativno u odnosu na rijeku? Rješenje U ovom slučaju, umjesto da sabiranja i oduzimanja brzina, jasno je da ako brod okrenemo trebamo isto vrijeme da ugledamo kapu, jer se oba objekta kreću u istom mediju. Komentar: Razvoj algoritma podrazumjeva fokusiranje na problem i odbacivanje nepotrebnih činjenica. Ovdje su prisutne tzv. razgovorna podrazumjevanja (implikature). Izraz Neke A su B će se najčešće shvatiti da neke A jesu, a neke nisu B. Međutim taj izraz uopšte nema to značenje. Nigdje nije rečeno da B postoji, drugo šta ako je B veće od A, ili ako su sve A sadržane u B: analizirajte kvadrat suprotnosti. 5.1.4 Pisanje programa i lucida intervala Ovi primjeri možda nisu karakteristični problemi koje ćete sretati pri programiranju. Oni potenciraju neke karakteristike sličnih problema koje je teško do kraja razumijeti i analizirati. Univerzalan i sistematičan put do rješenja je rijedak. Česta je priča da se do rješenja dolazi kad se najmanje očekuje, u šetnji, u snu i slično. U tim pričama je uvijek prisutan naporan i dugotrajan rad, gdje je bljesak ideje samo vrh ledenog brijega. Većina programera prolazi kroz iskustvo koje se često opisuje kao trenutni blijesak u kome kome se pojavljuje rješenje nekog problema, koji se dugo činio nerješivim. Psiholozi tumače pojavu kao djelovanje nesvjesnog, koje je tokom vremena savladalo problem i prebacilo rješenje u područje svjesnog. Naglasimo da ovo tokom vremena obično znači dugotrajno. Na temelju ovoga jasno je da put do rješenja zavisi o talentu i ambicijama onoga, koji ga traži i da mu treba pristupati i kao filozofskom pitanju, što ćemo demonstrirati idućim primjerom.

Page 18: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

18 Računarski sveznadar, knjiga 4

5.1.5 Četiri Aristotelova oblika Analizirajte kvadrat suprotnosti: • univerzalno afirmativni • partikulativno afirmativni • univerzalno negativan • partikulativno negativan Bez potrebe za filozofijom, ili matematikom10, zadovoljite se čistom logikom11 ovi pojmovi su prikazani na slici.

Logički kvadrat

Prema slici proslijedite čuveni logički kvadrat i provjerite pitanje istinitosti rečenica koje se nalaze u uglovima uparenim međusobno po svim smjerovima.

10 a to je u staro vrijeme bilo isto 11 a to je i u staro i u ovo vrijeme bilo isto: filozofije i matematike nema bez logike

Page 19: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 19

5.2 Metode izrade algoritma Postoji mnoštvo metoda koje se koriste za izradu algoritama, kao i stotine gotovih algoritama. No njihovo navođenje i učenje ne bi bitno unaprijedilo Vašu mogućnosti kreiranja algoritama.

Ipak, dobro je ovladati alatima koji se često koriste. Zato ćemo se djelomično upoznati sa dva najčešća postupka (Bottom-Up i Top-Down) i nekoliko tipičnih primjera izrade algoritma. Ponovićemo, rješenje ne morate sami pronaći, ali ih trebate shvatiti. 5.2.1 Top-Down postupak Projektovanje odozgo prema dolje je proces korak po korak koji počinje najopštijom funkcijom, razlaže tu funkciju u podfunkcije i ponavlja taj proces za svaku podfunkciju sve dok one ne budu dovoljno male i jednostavne da se mogu kodirati u stvarne programske instrukcije.

Blok dijagram sa tipičnom Top-Down stukturom

To je neformalna strategija projektovanja za dekompoziciju (rasčlanjivanje) kompleksnog problema na manje, i time jasnije, djelove. Ovaj pristup je pogodan za projektovanje manjih aplikativnih programa, jer je za velike projekte suviše neformalan. Rješenju se približavamo postepeno, rješavanjem niza potproblema; zadatak rastavljamo na manje cjeline, od kojih je svaka lakše rješava od samog problema. Top-Down je postupak, kod kojeg primijenjena metodologija ide od opšteg ka specifičnom: analiza odozgo-naniže. Ponekad se ovakvi postupci mogu sresti i pod nazivom TDD (Top-Down-Design), ili čak reverzni inžinjering. 5.2.2 Bottom-Up postupak Predstavlja metodu suprotnu Top-Down postupku. Metod dolaska do rješenja od dna do vrha. Kreće se od rješavanja najjednostavnijih problema ka sve složenijim, koji se posle "oslanjaju" na rješenja onih jednostavnijih. Zadani problem se rješava po analogiji sa sličnim, čije rješenje nam je poznato. Jadan od standardnih postupaka bi bio da na osnovu poznatih rješenja tražimo ulaze koji odgovaraju rješenjima. Znamo rezultat nečega, pa tražimo konkretne ulazne parametre koji zadovoljavaju (tražimo ulaze koji će zadovoljiti rezultat: pravimo liste ulaza na osnovu izlaza), i na osnovu tih parova tražimo opšte rješenje. Ovakav postupak se ponekad naziva unazadna metoda. Primjer bi bile slagalice (pazle), znamo finalnu formu i na osnovu komadića gradimo strukturu. Kod programiranja bi tako algoritam za sortiranje mogli početi praviti tako da izvršimo sortiranje konkretne liste, a potom da tražimo opšte rješenje. Analiza i projektovanje kod Bottom-Up postupaka kreću od specifičnog ka opštem.

U praksi, problem se obično rješava kombinovanjem oba postupka, jer programeri najčešće raščlanjuju problem na manje cjeline (Top-Down) za koje intuitivno vjeruju (Bottom-Up) da će doprinijeti konačnom i opštem rezultatu.

Page 20: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

20 Računarski sveznadar, knjiga 4

5.3 Primjeri algoritma Izrada algoritma je multidisciplinarna vještina, prije svega u domenu matematike i logike. Postoje stotine i hiljade algoritama verifikovanih i prihvaćenih u različitim domenima. Ovaj priručnik nije mjesto gdje bi analizirali efikasnost pojedinih metoda. Za početak ćemo se upoznati sa nekoliko najčešće korištenih, algoritmom za sortiranje i pretragu liste. 5.3.1 Quicksort algoritam: Sortiranje djeljenjem Sortiranje predstavlja jedan od čestih zahtjeva i problema. Cilj sortiranja podataka je da preuredi redosljed podataka tako da budu poredani po ključu, po pravilu uređenja. Podaci se sortiraju u rastućem ili opadajućem redosljedu. Ne postoji najbolji algoritam za sortiranje. Koji i kakav algoritam će se primjeniti zavisi od vrste podataka koji želimo sortirati i od uređenosti skupa (liste) koju želimo sortirati.

Quicksort algoritam se koristi za brzo sortiranje niza brojeva. Često se kaže da je on za veliko N12, najbrži priznati algoritam. Pored quicksort koristi i termin partition-exchange (zamjena particija). Kod nas se koristi često termin sortiranje djeljenjem niza, koji u potpunosti opisuje način na koji radi ovaj algoritam.

Zadatak: Izvršiti sortiranje niza slučajnih brojeva. U algoritmu sortiranja djeljenjem niza postupak sortiranja se sastoji iz dva dijela. U prvom dijelu se niz dijeli na dva dijela u odnosu na izabrani referentni element ili tzv. pivot element (središnja tačka), obično je to prvi, srednji ili posljednji element niza. Mi ćemo pretpostaviti da je to prvi element.

Nakon podjele, jedan dio niza čine svi elementi koji su manji ili jednaki pivotu i oni su na lijevoj strani niza, a drugi dio niza čine elementi veći od pivota koji su na desnoj strani niza. Djeljenje ćemo obaviti tako što ćemo uzimati jedan po jedan elemenat niza i dodavati ga odgovarajućem djelu. Tako u proizvoljnom trenutku možemo izdvojiti tri dijela niza: • elemente koje još nismo obradili (od i+1-og do posljednjeg) • elemente koji su obrađeni i čine grupu manjih ili jednakih elemenata niza (od nultog do j-tog) i • elemente koji su obrađeni i čine grupu većih elemenata niza (od j+1-og do i-tog člana niza).

Ako sljedeći element (i+1-vi) pripada grupi manjih ili jednakih, prvi element iz grupe većih (j+1) zamjenjuje mjesto sa analiziranim (i+1). Tako je i+1-vi element dodan grupi manjih, ili jednakih i ta je grupa uvećana za jedan, povećava se vrijednost promjenljive j. Ako sljedeći element pripada grupi većih, tada se samo grupa većih uvećava za jedan element, dok grupa manjih ostaje ista, ne mjenja se vrijednost promjenljive j. Nakon obrade svih elemenata, niz se sastoji iz dva dijela, grupa manjih ili jednakih i grupa većih, grupa elemenata koji nisu obrađeni je postala prazna. Da bi jasnije shvatili ovaj algoritam razmotrite konkretan primjer dat na slici desno.

12 Veliko N označava skup prirodnih brojeva

Page 21: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 21

5.3.2 Selekcioni sort Selekcioni sort je najjednostavniji i sastoji se iz sljedećih koraka: 1. Pronađi najmanji element u listi i zamijeni ga sa prvim, 2. Pronađi drugi najmanji element u listi i zamijeni ga sa drugim, 3. Nastavi dok se lista ne sortira. 5.3.3 Bubble sort Bubble (mjehur) sort se sastoji iz sljedećih koraka: 1. Tokom prolaza kroz listu sortiraj dva susjedna elementa, 2. Ponavljaj prolaze sve dok se ne dođe do prolaza u kome nema sortiranja 5.3.4 Algoritam za sekvencijalno pretraživanje Tipičan algoritmi koji koriste iterativnu strukturu je algoritam za sekvencijalno pretraživanje.

Cilj nam je pretražiti listu (pojmova, imena) u potrazi za određenim ciljem (target). Algoritam nam treba dati odgovor da li je traženi cilj na listi ili ne. Pri tom, pretpostavljamo da je lista složena nekim redom (npr. abecednim). Logično je zadatak riješiti tako da članove liste, redom, poredimo sa vrijednosti cilja sve dok član sa liste ne postane jednak traženoj vrijednosti ili po abecednoj vrijednosti veći od ciljnog člana. U tom slučaju zaustavljamo pretraživanje i objavljujemo rezultat pretraživanja.

Za najednostavnji slučaj algoritam bi mogli predstaviti kodom:

Procedure Trazi(Lista, CiljnaVrijednost) If (Lista prazna) Then javi gresku (Rezultat pretrazivanje neispravno jer nema elemenata u listi) Else (Odaberi prvu vrijednost u Listi kao TestVrijednost;

While (CiljnaVrijednost>TestVrijednost pa ima elemenata u Listi koje treba ispitati) Do (Odaberi slijedeću vrijednost sa Liste kao TestVrijednost.); If (CiljnaVrijednost=TestVrijednost) Then (Rezultat pretrazivanja pozitivan) Else (Rezultat pretrazivanja negativan) ) end if

Zbog jednostavnosti ovakav algoritam je primjeren pretraživanju malih listi. U ovom algoritmu iterativna struktura predstavljena je formom petlje kod koje se skup instrukcija (tijelo petlje) ponavlja u skladu sa postavljenim uslovima. Razmotrimo utjecaj brzine pretrage na veću listu. U takvim slučajevima bi koristili nešto drukčiji algoritam poznat kao binarna pretraga, metod koji koristi djeljenje liste u cilju ubrzanja rezultata. I ovdje bi koristili djeljenje liste i pivot metod. Evo mogućeg pseudokoda za jedan takav algoritam:

Procedure Trazi (lista, CiljnaVrijednost) If (Lista prazna) Then javi gresku (Rezultat pretrazivanje neispravno jer nema elemenata u listi) Else

Odaberi srednju vrijednost iz liste kao TestUlaz; Uporedi TestUlaz i CiljnuVrijednost, izvedi odgovarajuci skup instrukcija, zavisno o rezultatu poredjenja (case); Case 1: CiljnaVrijednost=TestUlaz Javi rezultat da je ime na listi Case 2: CiljnaVrijednost<TestUlaz Ponovi za imena koja iznad TestUlaza Case 3: CiljnaVrijednost>TestUlaz Ponovi za imena koja ispod TestUlaza ) end if

Page 22: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

22 Računarski sveznadar, knjiga 4

5.4 Efikasnost i tačnost Osnovna mjera kvaliteta algoritma je njegova tačnost (klasa tačnosti ukoliko se radi o brojevima), njegova efikasnost, brzina i mogućnost izmjena (prilagodljivost novim uslovima).

Prvi i osnovni uslov dobrog algoritma je da on ima mogućnost da riješi postavljeni problem. Prema dobivenim rješenjima treba biti kritičan i obavezno pokušati izvršiti provjeru da li je dobiveni rezultat tačan kao izuzetek ili pravilo. Čak i kada smo sigurni da su rješenja zadovoljavajuća, treba provjeriti je li riječ i o najboljem mogućem rješenju.

Kao osnovni kriterij za ocjenu efikasnosti algoritma uzima se vrijeme potrebno za transformaciju ulaza u izlaze po datom algoritmu. Efikasniji je onaj algoritam koji ulazni skup transformiše u rezultat brže. Efikasnost podrazumjeva i optimalno koršćenje drugih resursa, npr. najmanji broj manipulacija korisnik/mašina ili manju potrebnu količinu memorije.

Uporedi ponuđene algoritme sortiranja. Koliko se poveća vrijeme pretraživanja kod jednog, a koliko kod drugog algoritma ako se broj imena na listi udvostruči? Ukoliko pretražujemo listu sa 30000 imena, tada algoritam sekvencijalnog pretraživanja u prosjeku pretraži 15000 imena dok ne dođe do cilja. Ako pretpostavimo da svako pretraživanje traje 10 ms, onda će nam za pronalazak imena u listi trebati (u prosjeku) 150 000 ms = 2.5 minuta. Kod binarnog pretraživanja broj koraka koji nas dovodi do ciljne vrijednosti iznosi ln (30000)=8, što znači da je ukupno vrijeme pretraživanja cca 80ms., s tim da treba voditi računa o tome da slogovi moraju biti složeni po nekom redu kako bismo algoritam mogli primijeniti. Mada je svrsishodnost osnov dobrog programa/algoritma, ona se teško mjeri pa se zato ponekad (naročito od strane autora programa) precjenjuje efikasnost (koja se relativno lako mjeri: izražena u vremenu).

Page 23: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 23

6 Osnovne strukture kod programiranja Prije nego što pristupimo analizi strukture programa, podsjetimo se elementarnih struktura algoritma. To su: • linijska • razgranata i • ciklička. Kombinacijom ove tri strukture formiraju se složene algoritamske strukture. Algoritam možemo shvatiti kao vezu između univerzalnog matematičkog modela i računara. Skup akcija je definisan računarom odnosno programskim jezikom, a redosljed izvršavanja akcija se definiše algoritmom. Sada ćemo definisati elemente koje čine struktru programa. Jezik za programiranje13 možemo definisati kao tehniku kojom se na nedvosmislen, kompaktan i konačan način navode operacije koje treba da se izvedu nad nekim objektima: podacima. Dva elementa definišu program: operatori i podaci. U većini jezika za programiranje operacije i podaci se grupišu hijerahijski. Programski jezici su u pravilu jednostavniji od prirodnih, a sistematizacija olakšava njihovo učenje i rad sa njima. Obično se kod povezuje u hijerarhiju funkcija, gde je svaka funkcija skup instrukcija. Na slici se vidi standardna hierarhijsku sistematizacija programa.

Hijerarhijska struktura jezika

Zabunu može da izazove to što je program (programski kod), takođe podatak, pa naizgled upadate u mrtvu petlju. Razlog je što je organizacija programa ustanovljena za funkcionisanje u računaru, a ne u stvarnom životu. Život teče bez formalizacije, a da bi bilo šta uradili na računaru neophodno je da se to formalizuje. Operatori, funkcije i podaci čine programski kod. Sav sadržaj računarske memorije sastoji se od podataka, ali zbog lakšeg praćenja ga razdvajamo na podatke i programski kod. Kod šalje instrukcije procesoru: saberi dva broja, skoči na novu adresu itd. Podaci i program su razdvojeni u memoriji računara jer on, ima samo jedan centralni procesor, a taj procesor radi različito s podacima i kodom.

13 uporedi sa definicijom algoritma

Page 24: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

24 Računarski sveznadar, knjiga 4

6.1 Tipovi podataka Računar koristi mašinski jezik kao samosvojni, da ne kažemo prirodni. Mašinski jezik koristi binarno predstavljanje, odnosno binarni zapis: jedinice i nule.

Najednostavnije je da tu razliku pokažemo na primjeru definisanja boja. Kako izgleda i šta znači kad kažemo da je neki predmet žute boje, intuitivno je jasno, no da bi to predočili računaru, mi moramo definisati spektar boja, broj boja u spektru u konkretnom sistemu i kod žute boje iz spektra koji smo definisali. Tako i dječije jasna predstava žute boje prelazi u domen fizike i matematike koji računar prihvata. Da bi uspostavili korelaciju između čovjeka i računara uvedeni su jezici visokog nivoa. Da bi lakše pratili (i shvatali) program, umjesto jedinica i nula koriste se različiti tipovi podataka. Tip podataka predstavlja skup vrijednosti, koji ima neke zajedničke osobine. 6.1.1 Integer: Cjelobrojni tip podataka Cjelobrojni tip podataka je podskup skupa cijelih brojeva. Postoji u gotovo svim jezicima, a kakav je to tačno podskup, zavisi od realizacije jezika za programiranje. Nad ovim tipom, su definisane standardne operacije cjelobrojne aritmetike: • sabiranje, • oduzimanje, • množenje, • cjelobrojno djeljenje i • stepenovanje. Pri izvršavanju tih operacija važe svi zakoni aritmetike. Moguća komplikacija nastupa zbog fizičkog ograničenja računara, pa treba voditi računa o mogućem prekoračenju, treba definisati najveću moguću vrijednost cijelog broja, koju određuje dužina mašinske riječi računara. 6.1.2 Real: Realni tip Realni tip podataka je podskup skupa realnih brojeva. Predstavljen je kao skup brojeva oblika ±0.m x 2±e, gdje je m mantisa, a e eksponent. Nad ovim tipom, su definisane su standardne operacije realne aritmetike: • sabiranje, • oduzimanje, • množenje, • djeljenje i • stepenovanje. Već ranije smo potencirali probleme, koje računar može da ima pri radu sa realnim brijevima: problem konačnosti. Svaki beskonačno mali interval na realnoj osi sadrži beskonačno mnogo realnih brojeva. Zato se kod računara operacije ne obavljaju sa tačnim, već sa približnim vrijednostima realnih brojeva. Rezultati operacija su aproksimacija tačnih rezultata. Najčešće je to dovoljno tačna aproksimacija, ali trebamo je uzeti u obzir. 6.1.3 Logical: Logički tip podataka

Logički tip podataka predstavlja podatke nad kojim se mogu obavljati Boolove operacije Vrijednost logičke promjenljive je 1 ili 0, true/false, a u tabeli možete vidjeti osnovne logičke operacije i njihove rezultate: • negacija (NOT), • konjukcija (AND) i • disjunkcija (OR)

U nekim jezicima su podržane i neke kompleksnije naredbe, izvedene od ovih osnovnih.

Page 25: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 25

6.1.4 Character: Slovni (znakovni) tip podataka Slovne podatke čini skup slova. koji je to skup zavisi od računara i jezika za programiranje. Obično se tim skupom obuhvataju i specijalni znakovi i simboli, pa se često naziva i znakovni. Ovakav tip podataka omogućava samo operacija nastavljanja (concatenation). 6.2 Struktura podataka Da bi uspješno koristili neki jezik neophodno je poznavati sintaksnu strukturu. Sintaksa definiše pravila koja određuju da li niz simbola može biti prepoznat i prihvaćen u okviru nekog jezika.

Alfabet kod programskih jezika ima isto značenje kao i kod govornih. To je skup svih znakova koji se koriste u pisanju na tom jeziku. To su slova, brojevi, operacije i specijalni znaci.

Rječnik predstavlja skup riječi (simbola) definisanih nad alfabetom. Riječ (ili simbol) je niz znakova iz alfabeta koji se može posmatrati kao jedinstvena, nedjeljiva cjelina. Ta cjelina se naziva primitive.

Kod programiranja, umjesto vrsta riječi, (glagola, imenica...) se zbog lakšeg sagledavanja leksičke strukture dijeli na klase riječi, ili simbole, koji imaju neka zajednička svojstva. Standardno se te klase dijele na: • rezervisane riječi, • identifikatori, • imena funkcija, • varijable, • konstante, • specijalne simbole itd.

6.2.1 Rezervisane riječi: Reserved words Rezervisana riječ predstavlja niz znakova koji se u sklopu određenog jezika koristi u specijalne namjene. Pomoću nje se deklariše tip promjenljive ili se definišu određene programske strukture (npr. skokovi ili petlje). Niz znakova koji predstavlja rezervisanu riječ ne smije da se koristi kao identifikator, tj. ne možemo promjenljivim davati imena, koja odgovaraju rezervisanim riječima (odatle im i ime). 6.2.2 Promjenljive i konstante Bitno je naglasiti razliku između tradicionalnog-matematičkog pojma promjenljive (varijable) i promjenljive u programerskom smislu. U programiranju se pojam "promjenljiva" koristi za nešto što ima vremensko trajanje i čija je vrijednost u određenom trenutku konstantna. Ako je definisan tip promjenljive na osnovu njega je definisano i iz kog skupa podataka se dodjeljuje vrijednosti promjenljivoj. U svim jezicima je potrebno definisati tip promjenljive, a to se čIni različito: kod nekih jezika deklaracijom tipa, a kod nekih tačno određenim sufiksom ili početnim slovom.

Konstanta predstavlja podatak koji se ne mijenja tokom izvršavanja programa. Zadaju se eksplicitno, pisanjem konkretne vrijednosti iz skupa vrijednosti nekog tipa. 6.2.3 Imena i identifikatori Promjenljiva je određena vrijednošću i imenom. Ako se služimo imenima u prilici smo da radimo uopšteno, tj. da realizujemo program čiji rezultati neće važiti samo za jednu vrijednost promjenljive, već za sve pormjenljive koje pripadaju određenom tipu. 6.2.4 Polje: array Polje je kolekcija elemenata istog tipa (na primer, realnog) objedinjenih u n-dimenzionalnoj strukturi. Elementi polja imaju isto ime, ali n različitih indeksa: A (i1, i2, ... , in) A je ime polja, dok su i1, i2, ... , in indeksi elemenata polja.

Page 26: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

26 Računarski sveznadar, knjiga 4

Većina poznatih jezika za programiranje podržava rad sa poljima. Jednodimenzionalno polje naziva se vektor, a dvodimenzionalno matrica. 6.2.5 Niz znakova: string Niz znakova je struktura koja se može smatrati specijalnim slučajem jednodimenzionalnog polja čiji su elementi znakovi. Ponekad se naziva i niska znakova. Ovakva struktura se može posmatrati kao cjelina, pa su definisane i određene operacije nad njom (ili se mogu izvršavati operacije nad djelovima niza). 6.2.6 Zapis: record (slog) Zapis je struktura podataka koju čini kolekcija tipova podataka. Zapis mogu da čine isti ili različiti tipovi podataka. Najjednostavniji primjer zapisa bio bi zapis unutar telefonskog imenika, koji sadržava ime i prezime, adresu, poštanski broj i broj telefona. Znači svi podaci koji su pridruženi jednom korisniku: više tipova podataka udruženi u cjelovit podatak. Ovakvo objedinjavanje olakšava programeru da lakše slijedi problem. 6.2.7 Datoteka (file) Vrlo je teško dati konzistentnu definiciju datoteke. Možemo reći da datoteka predstavlja organizovanu kolekcija zapisa. Upotreba datoteke obično je povezana sa sekundarnom memorijom (diskom). Datoteka predstavlja osnovnu logičku cjelinu koja se može smjestiti na disk. To znači da je to samostalna cjelina koja može da komunicira sa drugim jedinicama. Šta bi ova komunikacija značila zavisilo bi od okruženja i pozicije datoteke u odnosu na to okruženje. Analizirajući predhodne strukture unazad, mogli bi zaključiti da datoteka može sadržavati i samo jedan podatak i niz podataka. Zasad neka datoteka bude niz podataka sa definisanim početkom i krajem, koji omogućava pristup podacima. Pod pristupom se podrazumjeva mogućnost čitanja i izmjene podataka. 6.3 Hijerarhijska struktura programa Mada smo rekli da je programski kod takođe podatak, izdvojićemo složene strukture koje čine programski kod. Sad ćemo klasirati složenije strukture koje čine programski kod. 6.3.1 Izrazi U opštem slučaju izrazi nisu naredbe. Izraze možemo definisati kao složene sintaktičke strukture koje sadrže podatke (promjenljive i konstante), operacije i funkcije. Prema tipu podataka i operacija definisanim nad njima u većini jezika za programiranje razlikujemo sljedeće izraze: • Aritmetički izrazi sadrže cjelobrojne, realne (a u nekim jezicima i kompleksne) tipove podataka i

odgovarajuće operatore. • Znakovni izrazi sadrže nizove znakova kao operande i odgovarajuće operatore. • Logički izrazi sadrže relacijske podizraze, logičke konstante i promjenljive te logičke operacije i

odgovarajuće operatore. 6.3.2 Naredbe Naredbe ili komande predstavljaju osnovne (elementarne) operacije računanja, dodjeljivanja i kontrole redosljeda izvršavanja. Naredbe imaju različite oblike i značenja. Obično se dijele na jednostavne (primitivne) i strukturirane (složene) naredbe. Ovakva podjela je posljedica sintakse naredbi. Osim prema sintaksi naredbe se mogu podjeliti i na osnovu svog značenja na: · naredbe za izračunavanja, · naredbe za kontrolu toka izvršavanja, · naredbe za deklarisanje, · ulazno/izlazne naredbe itd.

Page 27: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 27

6.3.3 Podprogrami U slučajevima složenih struktura javlja se potreba da definišemo manje cjeline koje sadrže grupu naredbi, koja predstavljaju određenu logičku cjelinu. Odgovara pojmu podalgoritma. Struktura podprograma treba da je takva da omogućava da se jednostavno i jednoznačno uspostaviti veza između njega i glavnog programa. 6.3.4 Program Stigli smo do vrha hijerarhije, tj. do programa. Program možemo definisati kao niz naredbi-instrukcija, primitivnih i složenih, kojim se opisuje postupak unosa, izračunavanja i bilježenja podataka i rezultata izračunavanja, koje upućuju računar kako da izvrši određene operacije radi rješenja postavljenog problema. Program se sastoji od kolekcije varijabli, skupa instrukcija (rečenica) koje djeluju nad tim varijablama, i pravila koja definišu redosljed primjene (izvršavanja) instrukcija. Pojednostavljeno govoreći program predstavlja zapis, koji računar može da prevede u odgovarajuće instrukcije koje računar može da izvrši. Instrukcija predstavlja način na koji se manipuliše varijablama. 6.4 Programski jezik i komunikacija Nikolas Wirth14 je definisao programe formulom:

Algoritmi + Strukture podataka = Programi

Programski jezik je formalni jezik za prezentaciju (notaciju) kompjuterskih programa. Programski jezik može se definisati kao notaciona tehnika (pismo) kojom se na kompaktan, nedvosmislen i konačan način navodi niz operacija koje će biti izvršene nad nekim objektima - podacima. Unutar jezika definisan je skup znakova koji se koriste za povezivanje i razmjenu informacija, uključujući i pravila korišćenja ovih znakova. Pomoću programskog jezika se kompjuterskom sistemu, čovjeku prihvatljivim i razumljivim zapisom, daju instrukcije i komande za izvršenje internih zadataka, opis ulaznih i izlaznih podataka kao i njihovu strukturu u zavisnosti od internih-sistemskih i eksternih-vanjskih događaja. Komunikacija čovjek-računar podrazumjeva poštovanje pravila. Zbog analogije sa čovjekom uobičajeno je da se ta pravila nazivaju jezikom i upotrebljavaju se termini ekvivalentni onim kod govornih jezika. Pod programiranjem se često smatra pisanje programskog koda. To nije pogrešno, ali je suštinski pogrešno. Programski kod treba biti krajnja posljedica procesa, koji podrazumjeva rješenje problema, odnosno izradu algoritma i pseudo koda. Da bi se napisao (kreirao) programski kod neophodno je poznavati programski jezik na kome želimo da program bude napisan. To značI da programer ima podrazumjevano znanje kompletnog seta instrukcija, da poznaje sve vrste varijabli i način njihovog definisanja u jeziku u kom želi da programira. Na osnovu tog znanja on piše programski kod. Svaki jezik posjeduje stroga pravila i svako odstupanje od njih uzrokovaće grešku i nemogućnost rada. Međutim to što se poznaju i poštuju pravila ne znači da ste programer. To znači da ste u prilici da generišete kod koji će da se izvršava. Postoji (velika) mogućnost da se izvršava bez smisla. Ovo je slično govoru po gramatičkim pravilima, bez smisla. Rečenici: Ribe su bezbrižno plele i lijepo pjevale, gramatički ne može ništa da se zamjeri, ali teško da se može pronaći smisao. Različiti programski jezici podržavaju različite stilove i pristupe programiranju. Ti stilovi se nazivaju programske paradigme. Programske paradigme, odnosno jezici su prilagođene problemima koji žele da se riješe i izbor jezika, odrediće i način rješavanja problema. Problem i jezik stoje u čvrstoj korelaciji i jedan određuje drugog.

14 N. Wirth jedan od pionira programiranja, tvorac Pascal-a

Page 28: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

28 Računarski sveznadar, knjiga 4

Kod većine problema rješenje nije uslovljeno jezikom, ali rješenje će biti manje ili više komlikovano (ono što je jednostavno u jednom jeziku može da se iskomplikuje u drugom). Ako želite biti programer trebalo bi da definišete koji su to problemi, koje možete i želite rješavati. Programer po svojoj definiciji je čovjek koji rješava probleme15. Najveći dio vremena kod programiranja je potreban za definisanje i logičko razrješenje problema. Programiranje zahtjeva logiku, pa je čest je naziv wiseguy16 za programera. Od hardvera preko mašinca do viših programskih jezika Jezik razumljiv računaru, u kome on može da radi je jezik elektronskih kola računara. Taj jezik se naziva mašinski jezik i predstavlja najniži nivo programiranja, prilagođen mašini. Mašinski jezik se sastoji od instrukcija napisanih u binarnom kodu, koje računar može neposredno da izvrši, instrukcije mašinskog jezika pišu se kao nizovi 0 i 1, i vrlo je blizak i razumljiv računaru, ali ne i čovjeku. Zato su razvijeni viši programski jezici prilagođeni čovjeku – programeru. Izvršavanje programa predstavlja sekvencu promjena stanja skupa varijabli. Kada program starta, izvrši se prva instrukcija i modifikuje jedna ili više varijabli. Varijabli koja označava instrukciju koja treba da se izvrši, dodjeljuje se labela sljedeće instrukcije za izvršenje. Ovaj se proces nastavlja sve dok računar ne dobije instrukciju koja mu kaže da se zaustavi.

Odnos hardver i jezici različitog nivoa

Program napisan na jeziku višeg nivoa se prevodi (kompajlira) iz izvornog u mašinski kod prilagođen konkretnom (ciljnom) računaru na kome može da se izvrši. Program uključuje izvršni (mašinski) kod, kreiran od strane kompajlera (kreiran od računara, automatski), izvorni (source) kod, kreiran od strane programera i prateću dokumentaciju (koja sadrži komentare, opis rada i kontrolne sekvence obično job control scripts), kreiranu od programera, koja omogućuje kasnija unapređenja programa.

15 trikovi i sila rijetko kad pomažu, pa svaka asocijacija sa konspirativnim udruženjima može biti samo humoristička 16 i ovi pametnjakovići nemaju veze sa mafijom

Page 29: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

Algoritam -Uvod u programiranje- 29

Dodatna razmišljanja na teme programiranja i algoritma Postoje (bar) dvije metode koje bi omogućile praktičnu razradu i upotrebu algoritma u cilju programiranja.

Prva bi bila da nastavimo sa matematičkom formalizacijom i da analiziramo kanoničke, kvazikanoničke i kombinovane strukture, nastale kombinovanjem osnovnih struktura algoritma. To bi značilo ulazak u matematičku analizu koja bi pratila način definisanja i preslikavanja skupa ulaza, na izlaz.

Drugi metod bi bio da izaberemo neki od jezika i kroz nekoliko primjera demonstriramo elementarne principe i odnos algoritma i programa. Mada i ovaj metod zahtjeva predznanja on je daleko primjereniji, cilj je da pokušate da se uvjerite da možete biti programer17. Na kraju ćemo dati i istorijsko podsjećanje ko je započeo i ko se smatra prvim programerom. To je Ada Lovelace (kćerka lorda Bajrona), koja je pradavne 1842 radila na izradi prvog programa za analitičku mašinu Čarlsa Bebidža (Charles Babbage's analytical engine). Njoj dugujemo uvođenje pojam algoritma u suvremenom smislu i njegovo korišćenje za programiranje.

Ada Lovelace Thompson i Ritchie

pišu UnixKevin Mitnik potjernica

za hakeromCyborg: Šta je to, ili ko je to?

A kraja nema i Cyborg-a zasad ima samo u SF filmovima.

Ako Vas ovaj priručnik potakne na razmišljanje o programiranju preporučujemo strpljenje jer... Prema podacima američkog zavoda za rad, U.S. Department of Labor, iz 2002-e, tek svaki peti student koji se odlučio da studira programiranje stekne akademsku titulu, a preostali se zadovolje diplomom više škole. To indirektno pokazuje bar dvije stvari: • sticanje programerskog znanja omogućava bržu financijsku slobodu. Pošto su traženi, studenti programiranja su u

prilici da svoje znanje plasiraju na tržištu bez njegove formalne verifikacije. • programeri su nestrpljivi. GOTOVO KAO I NARUČIOCI PROGRAMA. Rezultati programiranja treba da budu brzi,

efikasni, jednostavni i izmjenljivi. Za postizanje takvih rezultata, zahtjeva se brzo prilagođenje tehnološkim izmjenama, pa kad se to prihvati, akademska strogost postaje frustrirajuća.

Ovaj priručnik će ispuniti cilj ukoliko statistiku shvatite onako kako treba, kao osnov da pogrešan odgovor pravilno protumačite. Ovdje bi trebali zaključiti da strpljivost nije neophodna da bi postali programer, ali ako budete strpljivi bićete bolji programer. Matematika i logika su osnov koji omogućava dugoročno bavljenje programiranjem, za bavljenje programiranjem koje nije ograničeno tehnološkim vijekom jednog programskog okruženja i alata (ma kako dobrim).

Praktično mi smo otvorili nekoliko pogleda na rješavanje problema: • uopštena razmišljanja o analizi problema (logika i matematika) • izrada algoritma • opšte programerske metode • konkretan program

17 prvi pristup bi omogućio da provjerite da li ste dovoljno dobar matematičar da možete biti programer

Page 30: Umjeć - sveznadarrazno.sveznadar.info/02-2razred/ALg_Sveznadar.pdf · Pojam algoritma predstavlja temelj za razumijevanje ra čunarstva . Bilo koja kontrolisana aktivnost ljudskog

30 Računarski sveznadar, knjiga 4

Literatura i izvori

Teach Yurself C, Herbert Schildt, Osborne McGraw, Barkeley, 1999 Informacione tehnologije, Ratko Dejanović, Ljubiša Preradović, BeL@Espero, Banja Luka, 2003. Software, umjetnost, estetika - Andreas Broeckmann, www.aec.at/en/festival/programm/codedoc.aspBerlin

Simbolička logika, -priručnik-, dr Berislav Žaranić, ww.vusst./hrčlogika Strukturirane tehnike programiranja, seminarski rad, Igor Anić, www.zpm.fer.hr/courses How C Programming Works, by Marshall Brain, web edition of HowStuffWorks Uvod u teorijske osnove programiranja, web CET čitalište