Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 19

ALGORITMI

Priu o algoritmima zapoeti emo onako kako poinju sve klasine prie. Nekada davno ivio je u Bagdadu pisac, matematiar, astronom i geograf po imenu Muhammed ibn Musa al Khowarizmi. Vjerojatno nije bio niukakvoj vezi s Ali Babom i 40 hajduka. Isto tako vjerojatno nije niti sanjao tamo daleke 852. godine kada je pisao knjigu Kitab al jabr w'almuqubala da e od toga nastati ak dva uzroka glavobolje acima deset-jedanaest stoljea nakon toga. Njegov al jabr je postala algebra. Isto tako pravila rjeavanja iz poetka prvenstveno matematiki problema su iskrivljavanjem imena al Khowarizmi nazivana algoritmi. No, tu grekama nije kraj. Prema korijenu rijei bilo bi pravilno um jesto algoritmi koristiti algorizmi. Ali kako jezik nije znanost nego skup dogovora, izgleda da je dogovoreno da najee greke postaju jezina pravila. Tako mi danas imamo algoritme, a oni su niz preciznih uputa koje nas korak po korak vode do rjeenja nekog problema. To su zapravo toliko precizne upute da za njihovo izvravanje nije potrebna inteligencija. Zato bi se mi bavili stvarima za koje ne treba nimalo pameti? Zato to izrada algoritma u programiranju prethodi samom pisanju programa. Pri pisanju programa prvo nam mora biti jasno to se zapravo od programa oekuje. Kao i kod rjeavanja zadataka u bilo kom podruju prvo moramo znati postaviti problem. Drugi korak je gruba skica rjeenja. Trei korak je izrada algoritma. Ako smo dobro naprav ili algoritam, tada pisanje programa nije nita drugo doli prepisivanje algoritma u neki programski jezik. Kada smo to uinili dobili smo program, a program "tjera" raunalo da radi ono to mi zapravo elimo. Netko je rekao da je raunalo idiot velike brzine. To je ustvari bit prie o algoritmima. Mi put do rjeenja moramo toliko rascjepkati i detaljno napisati da bi ga mogao razumjeti i taj "idiot velike brzine". Drugim rijeima, upute moraju biti jednostavne i precizne tako da ih moe izvravati i stroj. Autori udbenika vole algoritme objanjavati na receptima za pripravu nekih jela, pa je tako u udbenicima za informatiku toliko recepata da bi se mogla izdati posebna kuharica autora informatikih udbenika. Poto nekako sumnjam da su informatiari dobri kuhari, mi emo probati pronai neke druge primjere. Pokuajte se sjetiti gdje ste zadnji put proitali neko detaljno uputstvo. Moda vam je i bilo u rukama, ali niste itali jer to ve znate napamet, kao npr. obnoviti raun mobitela putem bona. Ili moda da probamo obrnuto. Da li ste se nedavno nali u situaciji da niste neto znali napraviti jer su upute bile toliko loe i nerazumljive ili uope niste imali upute? U svakodnevnom ivotu smo zapravo stalno u doticaju s algoritmima, a e sto i postupamo po algoritmima da toga nismo niti svjesni. Znati "algoritamski" razmiljati dobro je bez obzira bavili se vi poslije programiranjem ili ne.

Gornji naslov jedno je od najeih pitanja koje se upuuje predkolskom djetetu kada ga iskuavate u raunanju. Isto tako postoji uzreica da je neto "jasno kao dva i dva". No, da li je ba sve tako jasno? U prethodnoj lekciji smo rekli da upute u algoritmu moraju biti tako jasne da se mogu izvravati i do rjeenja doi bez imalo inteligencije. Kad ve nema nimalo inteligencije morati emo se posluiti depnim raunalom. Nita jednostavnije nego ot ipkati "dva i dva" i dobiti rjeenje. Evo nam prvog problema. Na depnom raunalu nema "i". Mi podrazumijevamo da je "dva i dva" zapravo dva vie dva, da se radio o matematikoj operaciji zbrajanja. Depno raunalo to ne zna. Znai moramo biti precizniji i rei 2+2. Ba smo rijeili prvi problem kad se pojavio i drugi. Tipkam 2+2 i nita se ne dogaa. I bilo je za oekivati jer je depno raunalo iskljueno. Nitko nije rekao da prvo provjerim da li je depno raunalo ukljueno. Sada sam ve pomalo nervozan to se tako jednostavna stvar toliko komplicira. Ukljuio

sam raunalo i tipkam 2+ upsss... Ovako iznerviran htio sam to prije rijeiti zadatak i u urbi sam prstom zakvaio i tipku iznad 2 tako da je ispalo 52. to u sad? Jednostavno u pritisnuti tipku CE koja ponitava zadnji unos i ponovno upisati 2. Hajdemo ovo sve to smo zapetljali pokuati prepisati u istopis u obliku natuknica: provjerite da li je depno raunalo ukljueno o ako nije ukljuite ga upiite 2 o ako ste pogrijeili pritisnite tipku CE i ponovite radnju iz prethodne natuknice upiite + o ako ste pogrijeili pritisnite tipku CE i ponovite radnju iz prethodne natuknice upiite 2 o ako ste pogrijeili pritisnite tipku CE i ponovite radnju iz prethodne natuknice pritisnite tipku = o ako ste pogrijeili ponovite sve radnje poevi od treeg reda proitajte rezultat iskljuite depno raunalo

Mislite da je tu kraj? Stvari se mogu jo zakomplicirati. to ako je to model depnog raunala bez tipke CE koja ponitava zadnji unos? Pokuajte doraditi gornje upute za takav model depnog raunala. Je li sada konano kraj? Moemo li iskljuiti depno raunalo? Ne. Depno raunalo koje imam ispred sebe ima sunanu eliju i ne gasi se na tipku. Jednostavno se samo iskljui ako se neko vrijeme ne koristi. Moda ovo izgleda kao da vas gnjavim, ali s raunalom je tako. Ponekad stvarno izgleda kao da se malo pravi ludo. Treba se sjetiti da je raunalo "idiot velike brzine" i da nita ne zna samo. Ako neto "zna" napraviti onda mu je to netko morao "rei" i detaljno objasniti. Isto tako ako neto krivo radi - samo radi ono to smo mu naredili. Razmislite o ovome prije nego to ponovo za neto kaete da je jednostavno kao "dva i dva". Algoritmi kojima smo se bavili u prolim lekcijama mogu se zapisati na vie naina, a dva najea su pseudokod i dijagram toka podataka. Pseudokod je algoritam zapisan rijeima. Pseudo nam dolazi od grkog la, lani, nadri, nazovi, tobonji... Kod je skup dogovorenih znakova kojima moemo oblikovati neku poruku, komunicirati. U programiranju se pod kodom razumijeva izvorni program napisan u nekom programskom jeziku. Prema tome, na pseudokod bi bio program "lanjak". Zato pseudo? Jer upute ne piemo u nekom od programskih jezika ve dogovorenim rijeima i znakovima iz govornog jezika. Dakle, ako hoemo pisati algoritme rijeima moramo se prije dogovoriti koje emo rijei koristiti. Logian slijed radnji u nekom programu je ulaz podat aka, obrada i izlaz podataka. Prema tome emo i odabrati prikladne rijei koje emo opisati u tablici: poetak svaki algoritam ima samo jedan poetak upii ili ulaz ili unesi ovo bi bile prikladne rijei za unos podataka preko tipkovnice, mia, ili uitaj bar-kod itaa ili neke druge ulazne jedinice ispii ili izlaz kraj ispis podataka na zaslonu monitora, pisau... broj instrukcija u algoritmu mora biti konaan, svaki algoritam mora imati kraj i to samo jedan kraj

U tablici nema rijei za obradu podataka jer za to obino koristimo izraze koji nisu nita drugo doli prepisane n pr. matematike formule. Idemo probati napisati pseudokod za na

"dva i dva" iz prethodne lekcije. No, vie neemo koristiti depno raunalo nego emo algoritam napisati kao da piemo program, odnosno upute pravom raunalu: poetak upii 2 Ovdje emo malo zastati. Ako bismo napisali upii 2 tada bi na algoritam bio samo za zbrajanje 2 i 2 i cijeli svoj ivot bi radio samo to. Raunalni se programi piu to openitije, pa emo i mi pokuati napisati algoritam za zbrajanje bilo koja dva broja. Kako ne moemo predvidjeti koja e dva broja netko poeljeti zbrojiti, morati emo umjesto brojeva koristiti varijable. U matematici je varijabla neka promjenjiva veliina, a u naem programu to e biti mjesto u radnoj memoriji koje je rezervirano za broj koji zbrajamo (ne bi bilo loe ovdje se malo podsjetiti von Neumannovog modela raunala). U naem primjeru e nam trebati tri takova mjesta. Neka to budu varijable a i b za brojeve koje zbrajamo i c za rezultat. Pokuajmo sada ponovno napisati pseudokod: poetak upii a, b c=a+b ispii c kraj U treem redu naeg pseudokoda izraz za zbrajanje varijabli a i b napisali smo malo naopako od onoga kako bismo dva broja zbrojili na papiru. Isto tako taj trei red ne bismo proitali kao u matematici c je jedn ako a + b. Sjetimo se da radimo s mjestima rezerviranim u radnoj memoriji. Tako sadraj mjesta u memoriji za rezultat c postaje jednak zbroju sadraja mjesta u kojima su spremljeni brojevi a i b. Zato to i itamo c postaje a + b. Za vjebu: Po uzoru na pseudokod za zbrajanje dva broja probajte napisati algoritme za jednostavne probleme kao to su izraun povrine pravokutnika, pravokutnog trokuta, opseg i povrinu kruga, brzinu ako su poznati put i vrijeme, silu ako su poznati masa i akceleracija... Pri razmatranju pseudokoda pokuali smo objasniti to su varijable. Prisjetimo se da se podaci i instrukcije (program) nalaze u radnoj memoriji raunala (RAM). Procesor izvrava instrukcije programa jednu po jednu. Na osnovu instrukcija uzima podatke iz memorije, obrauje ih, te rezultate obrade vraa nazad u memoriju na za to predviena mjesta i odatle ih alje na neku od izlaznih jedinica - monitor, pisa, zvunike... Za programiranje je bitno shvatiti postupanje s varijablama. Ovisno od programskog jezika u kojem emo pisati programe, podatke koji e biti smjeteni u pojedine varijable treba vie ili manje detaljno opisati. Rekli smo ve da se pojedini podaci smjetaju u rezervirana mjesta u memoriji. Ti dijelovi memorije imaju svoju adresu i mi im u postupku programiranja dajemo imena. Radi racionalnog koritenja memorije varijable treba definirati, tj. rei raunalu koji tip podataka e biti smjeten u kojoj varijabli. To mogu biti cjelobrojne

vrijednosti, realni brojevi, logike vrijednosti, jedan znak ili niz znakova... Mi emo se uglavnom baviti problemima s nekim brojanim vrijednostima. Za razliite operacije nad podacima koristimo razliite operatore. Operatori koje emo koristiti malo su drugaiji od onih na koje smo navikli dok "pjeice" radimo npr. matematiku. Operacija zbrajanje oduzimanje mnoenje dijeljenje Operator + * /

U gornjoj tablici su dani operatori za osnovne raunske operacije. U nekim programskim jezicima operatori za operacije nad realnim i nad cijelim brojevima nisu isti. Tako n pr. se za dijeljenje cijelih brojeva moe koristiti operator div koji kao rezultati daje opet cijeli broj. Pogledajmo tablicu s komentarima: 11.9394 / 2.2 = dijeljenje dva broja operatorom za 5.427 realne brojeve daje rezultat realan broj 11 / 2 = 5.5 realan broj e biti i rezultat dijeljenja dva cijela broja ako upotrijebimo operator dijeljenja za realne brojeve, zato rezultat piemo s jednim decimalnim mjestom ako nije drugaije odreeno

10 / 2 = 5.0

10 div 2 ako upotrijebimo operator =5 dijeljenja cijelih brojeva rezultat e biti cijeli broj ak i onda kada 11 div 2 djeljenik nije djeljiv s djeliteljem =5 Kod dijeljenja cijelih brojeva pojavljuje se jo jedan koristan operator. To je mod. Rezultat dijeljenja cijelih brojeva s operatorom mod daje ostatak cjelobrojnog dijeljenja. Pogledajmo primjere: 11 mod 2 = 1 10 mod 3 = 1 11 podijeljeno s 2 je 5 i 1 je ostatak 10 podijeljeno s 3 je 3 i 1 je ostatak

8 mod 3 = 2 8 mod 2 = 0

8 podijeljeno s 3 je 2 i 2 je ostatak 8 podijeljeno s 2 je 4 i 0 je ostatak

Zato je operator mod koristan. Na primjer, pomou njega moemo utvrditi da li je neki broj djeljiv s nekim drugim brojem. Ako je, ostatak takovog dijeljenja mora biti 0. Ili npr. da li je neki broj smjeten u odreenoj varijabli u memoriji paran ili neparan. Paran broj dijeljen s 2 daje ostatak 0, odnosno neparan broj dijeljen s dva daje 1 ostatak. Pokuajte doi do rezultata slijedeih izraza: A = 5; B = 7; C = A MOD 3 + B A = 3; B = 2; R = A DIV B A = 7; B = 4; X = 2 * B / A C= _______ R= _______ X= _______

Isto tako ponekad e trebati usporediti neke veliine. Zato koristimo relacijske operatore: Operator > < = >= <= <> ili # Opis vee manje jednako vee ili jednako manje ili jednako razliito

Rekli smo ve da se algoritmi najee zapisuju kao pseudokod i dijagram toka podataka. Dijagram toka podataka je grafiki prikaz algoritma. Takav nain zapisivanja ima nekoliko prednosti pred pseudokodom. Zapisivanje se vri meunarodno dogovorenim simbolima i ne ovisi o govornom jeziku onoga koji sastavlja algoritam. Grafiki prikaz je jednostavan, pregledan, lako se pronalaze greke. Nadalje, problem se moe jednostavno analizirati, usporediti s nekim drugim problemom, skratiti vrijeme pronalaenja rjeenja. Evo osnovnih simbola dijagrama toka: poetak

ulaz podataka

deklaracija varijabli i konstanti; postavljanje na poetnu vrijednost; obrada podataka izlaz podataka

kraj spojna toka, radi lakeg praenja tijeka podataka obino se u spojnu toku upisuju brojevi koji su veze izmeu razliitih dijelova algoritma Simboli za ulaz i izlaz podataka su istog oblika. Kod jednostavnih algoritama ulaz i izlaz su odmah uoljivi. Meutim, kod vrlo sloenih algoritama dobro je u paralelogram koji simbolizira ulaz pri dnu povui vodoravnu crtu i ispod nje napisati rije ulaz. Isto to je dobro uiniti i za izlaz podataka. Simboli dijagrama toka se povezuju strelicama koje pokazuju tok podataka. Evo ponovno naeg "dva i dva".

Nakon poetka prvo e netko morati preko tipkovnice upisati dva broja koja eli zbrojiti. Zamislimo 3 i 5. Ta dva broja smjetaju se u radnoj memoriji kao varijable a i b. Drugim rijeima broj 3 ui u dijelu memorije koji smo nazvali a, broj 5 se raskomotio u dijelu memorije koji smo nazvali b. Sadraj varijable c postaje zbroj sadraja varijabli a i b. Odnosno u dio memorije koji smo nazvali c smjeta se zbroj brojeva 3 i 5, dakle 8.

Krajnji cilj obrade je dobiti rezultat. Ispisujemo sadraj varijable c. Na zaslonu monitora ili na pisau, ovisno kako jednoga dana budemo to definirali u programu, pojaviti e se broj 8.

Kraj.

Dijagram toka kakav smo razmatrali za zbrajanje dva zbroja esto se naziva slijed jer naredbe slijede pravocrtno jedna iza druge. Stariji programeri znaju rei da program "propada" do kraja. Idemo za vjebu napraviti jo jedna slijed. Iz osnovne kole sjeamo se da je brzina nekog tijela zapravo prijeeni put u jedinici vremena. Matematiki bismo to zapisali kao V = s / t, gdje je V brzina, s prijeeni put i t vrijeme. To je tako jednostavno da nam nije potrebna nikakva priprema i gruba skica rjeenja. Moemo odmah raditi algoritam.

Izmjereni put i vrijeme treba upisati u raunalo.

Nau formulu iz zadataka samo emo prepisati kao uputu to treba uiniti s varijablama s i t. Sadraj varijable V postaje rezultat dijeljenja sadraja varijable s sa sadrajem varijable t.

Ispisujemo rezultat, odnosno nau izraunanu brzinu V.

Kraj.

Za vjebu: Pokuajte prema ovo primjeru nacrtati dijagram toka za izraun povrine pravokutnika, a zatim dijagram za izraun opsega pravokutnika. Evo jo jednog primjera za izraunati opseg i povrinu kruga. Kako na tipkovnici nemamo na raspolaganju grka slova, nau formulu za izraun opsega pisati emo kao O = 2 * r * Pi. Isto tako za sada jo ne znamo funkciju za kvadriranje pa emo formulu za povrinu kruga pisati ovako: P = r * r * Pi gdje je r * r zapravo r2.

Za razliku od primjera koje smo radili do sada ovdje se prvi puta pojavljuje jedna konstanta. Broj Pi emo mi zapisati u programu zato to je on uvijek isti i sasvim suvino bi bilo da ga netko upisuje putem tipkovnice svaki put kada se pokrene program. Isto tako izbjegli smo mogunost da netko krivo upie podatak za broj Pi.

Upisujemo polumjer kruga i on se smjeta u varijablu r.

Izraunavamo opseg i povrinu.

Ispisujemo rezultate.

Kraj.

Za vjebu: Po uzoru na opseg i povrinu kruga, pokuajte algoritme za izraun opsega i povrine pravokutnika spojiti tako da u jednom algoritmu bude i opseg i povrina pravokutnika. Toliko o pravocrtnim algoritmima. Na alost, u stvarnom ivotu zbivanja ne teku tako jednostavno kao to su to pravocrtni algoritmi. Ponekad treba stati, razmisliti, usporediti neke stvari i donijeti odluku kako dalje. Takovo mjesto u algoritmu zove se grananje. Simbol za grananje je romb. Obino se u gornji vrh upie upitnik i u sredini se postavi logiki uvjet. Grananje uvijek ima jedan ulaz i najmanje dva izlaza. Ako su samo dva izlaza tada je rije o jednostrukom grananju, a odgovori na postavljeni logiki uvjet mogu biti DA i NE, odnosno T i F (true i false). Ako je mogue vie odgovora tada je to viestruko grananje kojim se u ovom teaju neemo baviti jer nam dolazi po programu u drugom razredu. Sjetimo se zadataka iz prethodne lekcije s izraunom brzine ako su poznati put i vrijeme: V = s / t. Ako se na raunalu dogodi situacija da dijelimo s nulom program e nam izbaciti pogreku. Da bismo sprijeili "ispadanje" programa, prije izrauna brzine provjeriti emo da li je upisano vrijeme vee od 0.

Kao i u prethodnom zadatku s brzinom, prvo upisujemo neke vrijednosti za prijeeni put s i vrijeme t.

Ako je vrijeme t vee od 0 tada se izvravaju naredbe na grani DA, izraunava se brzina i ispisuje rezultat.

Ako upisano vrijeme t nije vee od 0 tada se ne dogaa nita, program odlazi na kraj i zavrava s radom.

Prepravite dijagram toka iz gornjeg primjera tako da ako upisano vrijeme t nije vee od nula da se na grani NE ispisuje poruka 'Vrijeme mora biti vee od nula' i tek tada odlazi na kraj. Pojedine znakove ili nizove znakova kao to je ova poruka u dijagramu toka piemo unutar navodnika koji ovisno o programskom jeziku koji emo poslije koristiti mogu biti jednostruki ili dvostruki. Idemo rijeiti jo jedan zadatak. Prisjetimo se zadatka s opsegom i povrinom pravokutnika iz prethodnih vjebi koji emo jo malo proiriti. Preko tipkovnice upisuju se stranice pravokutnika a i b. Treba izraunati opseg i povrinu pravokutnika te ispisati poruku o tome da li je upisani lik pravokutnik ili kvadrat.

Nakon to smo upisali stranice a i b, izraunali smo opseg O i povrinu P pravokutnika. Dobivene rezultate moemo odmah ispisati. Kako emo utvrditi da li moda upisane stranice pripadaju kvadratu? Ako su stranice a i b jednake tada je to kvadrat. Ispisujemo poruke i odlazimo na kraj.

Kraj.

Mali odmor, a poslije njega jo vjebi s grananjem... Treba upisati cijeli broj a i ispisati poruku da li je upisani broj paran ili neparan.

Upisali smo broj koji je smjeten u varijablu a.

Kako saznati da li je a paran? Dijeliti emo ga s 2 koristei operator mod koji kao rezultat daje ostatak cjelobrojnog dijeljenja. Ako je ostatak 0 tada je broj paran.

Obratite panju na konstrukciju ispisa. Pogledati emo lijevu granu koja se izvrava ako je odgovor na logiki uvjet NE. Imamo dio poruke u navodnicima 'Broj ' pa zatim odvojeno zarezom varijablu a i nakon toga opet iza zareza drugi dio poruke u navodnicima 'je

10

neparan.' Ako je upisan npr. broj 9 tada e naredba za ispis 'Broj ',a,' je neparan' rezultirati porukom koja izgleda kao reenica u komadu: Broj 9 je neparan. Treba upisati dva broja a i b i ispisati poruku o tome koji je vei.

Ovaj algoritam ima identine simbole i njihov raspored kao i algoritam u prethodnom zadatku. Razlikuje se pak u sadraju.

Koristei relacijski operator > usporedili smo sadraje varijabli a i b.

Stvar je zapravo vrlo jednostavna. Ali pokuajte sada zamisliti da netko upie dva ista broja, npr. 7 i 7. U uvjetu emo imati pitanje da li je 7 vee od 7. Odgovor je NE. Izvriti e se lijeva grana i kao rezultat dobiti emo poruku: Broj 7 je vei od broja 7. Ova poruka ba i nema logike i dokaz je da nae raunalo od milja zvano idiot velike brzine i ne razmilja ba puno. Zato ljudi koji rade na razvoju informacijskih sustava moraju predvidjeti im vie situacija, pa i onih najekstremnijih koje bi se pri radu programa mogle dogoditi. Kau da dobra kontrola podataka pri unosu sprjeava ak 90% greaka koje bi se naknadno u radu programa mogle dogoditi. Zato emo mi rjeenje naeg zadatka malo promijeniti:

11

Naslov ove lekcije govori da sve ovo to smo do sada radili nije dovoljno zapetljano, pa emo stvari jo malo dodatno zakomplicirati. Nekada su nastavnici imali obiaj nestane uenike kanjavati tako da su im zadali 100 puta napisati u biljenicu: "Neu nikada vie brbljati pod satom hrvatskog jezika!". Zamislite da je nama netko dao takvu kaznu. Mi emo se probati izvui tako da to raunalo odradi umjesto nas. Treba mu samo zadati da 100 puta ispie jednu te istu poruku. Nita jednostavnije. Evo rjeenja:

Hm, ve nakon tree upute raunalu da ispie poruku sam odustao jer mi je dosadilo. Morate priznati da ovo rjeenje ba i nije neto s ime bi se mogli pohvaliti.

Pokuajmo to odraditi na drugaiji nain:

12

Varijablu i postavili smo na poetnu vrijednost 1.

Nakon toga slijedi grananje u kojem postavljamo pitanje da li je i vei od 100. Naravno da nije jer smo ga upravo postavili na 1. Nastavljamo dakle granom NE i ispisujemo prvi puta nau poruku. Nakon toga varijablu i poveamo za 1. To smo ve rekli da itamo i postaje i + 1. Iza toga vraamo se na grananje i ponovo pitamo da li je i vei od 100. Jo uvijek nije jer je tek tren prije toga postao 2. Ponovno ispisujemo poruku i poveavamo i za 1 pa je on tako postao 3. I tako do 100 puta.

Nakon to se i 100-ti puta izvre naredba grananja i naredbe ispod grananja i e postati 101. Tada je odgovor na pitanje u grananju da li je i vei od 100 konano DA i tada bi program trebao zavriti s radom. Dio programa, niz istih naredbi koje se ponavljaju dok je neki uvjet zadovoljen ili dok ne postane zadovoljen, naziva se petlja. U naem se primjeru ispis poruke i poveanje varijable i za jedan ponavljaju dok i nije postao vei od 100. Varijabla i je u naem primjeru broja jer svakim prolaskom kroz petlju i postaje i vie 1. Neki zlobnici tvrde da napredak moemo zahvaliti samo ljudskoj lijenosti. Naime, ljudi e svata izmisliti samo da ne moraju raditi. Tako je netko izmislio jo jednostavnije rjeenje za na primjer s ispisom 100 poruka.

13

Pravokutnik ispod simbola za poetak je naredba for koja je sama po sebi petlja. Broja i kao i uvjet ve su sadrani u naredbi pa ne moramo mi voditi brigu oko odbrojavanja. Taj red u algoritmu itali bismo kao: "Za i koji ide od 1 do 100 uini slijedee:". Broj ponavljanja u petlji za rjeenje odreenih problema s e zna unaprijed, prije poetka ponavljanja, a za neke se ne zna unaprijed, ve ovisi o izvravanju niza naredbi koje se ponavljaju. Ove druge petlje emo ostaviti za drugi razred kada emo se malo detaljnije baviti programiranjem. Za sada emo se samo bavi ti petljama u kojima unaprijed znamo broj ponavljanja, dakle petljom for. Koliko vremena vam treba da zbrojite sve brojeve od 1 do 100? Prava sitnica.

Za na zbroj svih brojeva do 100 koristiti emo varijablu zbroj koju na poetku algoritma moramo postaviti na vrijednost 0.

Za i koji ide od 1 do 100 treba uiniti slijedee:

Varijabli zbroj dodati vrijednost varijable i koja je u naem primjeru broja. Svakim prolaskom kroz petlju i se poveava za 1 i njegova vrijednost pridodaje sadraju varijable zbroj. U prvom prolazu kroz petlju zbroj je 0, a i je 1, pa prema tome zbroj postaje 1. U drugom prolazu zbroj je 1, a i je 2. Zbroj postaje 1+2, dakle sada je 3. I tako 100 puta. Idemo jo malo zapetljati neto to znamo raunati jo od petog osnovne, a to je prosjek ocjena. Prosjek je zbroj svih ocjena podijeljen s brojem predmeta.

14

Varijablu zbroj koristiti emo za zbroj svih ocjena i moramo ju na poetku postaviti na vrijednost 0. Neka u prvom razredu imamo 15 predmeta. Varijablu i postavili smo na poetnu vrijednost 1. U prvom prolazu kroz petlju upisujemo prvu ocjenu iz imenika, a to je hrvatski jezik. Ocjena se upisuje u varijablu ocjena. Sadraj varijable ocjena se dodaje u varijablu zbroj.

U drugom prolazu upisujemo ocjenu iz drugog predmeta, u treem iz treeg i tako 15 puta. Po izlazu iz petlje izraunavamo prosjek i ispisujemo ga. Ovo je bilo prejednostavno da bi bilo stvarno. U stvarnom ivotu desiti e se da je netko n pr. osloboen nastave tjelesne i zdravstvene kulture pa ima 14 predmeta. Netko moda ima 16 predmeta jer je izabrao i fakultativnu nastavu. Isto tako u drugom, treem ili etvrtom razredu sigurno neete imati 15 predmeta. Ve smo na pomenuli da se programi piu im openitije tako da bi se mogli primjenjivati za rjeavanje im vie slinih problema. Zato emo na algoritam prepraviti tako to emo umjesto 15 uvesti varijablu brpred koja e predstavljati na broj predmeta.

15

Nakon to smo varijablu zbroj postavili na poetnu vrijednost 0 treba preko tipkovnice unijeti broj predmeta koji se smjeta u varijablu brpred. Broja i u petlji sada broji od 1 do brpred pa je primjenjivo za sve uenike i razrede s razliitim brojem predmeta. Da bismo dobili prosjek treba po izlasku iz petlje zbroj ocjena podijeliti s brojem predmeta brpred.

Za vjebu: Pokuajte po uzoru na prosjek ocjena za jednog uenika napraviti dijagram toka za izraun prosjene ocjene razreda. I tu petljanju nije kraj... Malo emo kombinirati petlje s grananjima. Sjetimo se zadatka u kojem smo morali zbrojiti sve brojeve od 1 do 100. Promijeniti emo taj zadatak tako da sada treba ispisati sv e neparne brojeve od n do m i na kraju ispisati njihov zbroj.

16

Nakon postavljanja varijable zbroj na poetnu vrijednost 0 treba u upisati poetni broj n i zavrni broj m od kojeg do kojeg elimo ispisati i zbrojiti neparne brojeve. Broja u petlji for sada broji od n do m

Da li je i neparan broj znati emo ako ga podijelimo s 2 koristei operator mod i dobijemo rezultat 1. Ako ostatak je 1 tada ispisujemo i i dodajemo njegovu vrijednost varijabli zbroj.

to e se dogoditi ako netko upie za n vei broj nego za m? Prepravite gornji algoritam tako da izraunava i zbroj neparnih i zbroj parnih brojeva od n do m. Uenici su na satu fizike nauili Ohmov zakon po kojem otpor u istosmjernom strujnom krugu moete izraunati tako da podijelite napon sa jakou struje: R=U/I gdje je otpor R, napon U i jakost struje I. Naueno su odmah provjerili mjerei veliine u strujnom krugu, ako su mjerili napon i jakost mogli su po gornjoj formuli izraunati otpor, ako su mjerili otpor i napon mogli su izraunati jakost struje I = U / R, a ako su mjerili otpor i jakost struje mogli su izraunati napon U = I * R. Treba napraviti algoritam po kome je mogue za odreeni broj mjerenja na temelju dvije izmjerene veliine izraunati treu. Za broj mjerenja emo kori stiti varijablu brmjer. Uvesti emo jo jednu varijablu koju emo zvati izbor i dogovoriti emo se da u nju upiemo 1 ako elimo raunati otpor, 2 ako elimo raunati napon i 3 ako elimo raunati jakost struje. Ako upisani broj ne bude 1, 2 ili 3 ne treba poduzimati nita. Poto slovo I koristimo kao varijablu za jakost struje, u petlji for emo ovaj puta kao broja upotrijebiti slovo k.

17

Ovaj primjer moe se daleko elegantnije rijeiti viestrukim grananjem, ali to ostavljamo za slijedei razred. Izrada algoritama zahtjeva puno vjebe. Algoritmi se ne mogu natrebati. Potrebno je rijeiti puno primjera, od jednostavnijih do sve sloenijih. Dijagram toka crtamo obinom olovkom s brisalom pri ruci. Stvari se rjeavaju u hodu, mijenjaju, popravljaju i prepravljaju. Uoavaju se stvari koje se mogu pojednostavniti. Prednost dijagrama toka je to je pregledan, lako se test primjerima moe "pjeice" provjeriti. Zanimljivo je i to da vie ljudi moe napraviti na isti zadatak vie razliitih algoritama i da su svi dobri. Sloeni algoritmi mogu se rastaviti na manje, tako rastavljeni

18

rijeiti do detalja i onda prikazati kao rjeenje u blokovima. Problemi se mogu lako analizirati, lako se uoavaju slinosti i razlike izmeu vie rjeenja i odabire naj bolje. Moda nakon ovih vjebi vidite dijagrame toka i tamo gdje ih do sada niste uoavali razliiti shematski prikazi nekih postupaka, hodogrami nekih aktivnosti... I na kraju to je bio cilj nae 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. Obino svaki simbol u dijagramu toka predstavlja jednu naredbu u programu. Dijagram toka bi trebao biti dio svake dobre programske dokumentacije. Uenicima je crtanje dijagrama toka ponekad nerazumljivo, a sve to je nerazumljivo je i dosadno. Oni bi najradije sjeli za raunalo i odmah pisali program. Kod jednostavnih problema to i moemo napraviti. Ali kod sloenijih... Jednom sam sreo svog biveg uenika koji se u svom poslu intenzivno bavi programiranjem. alio mi se da nekad nekoliko sati provede za raunalom pokuavajui rijeiti neki problem, ali ne ide i gotovo. Pitao sam ga to tada uini. Odgovorio je: "Pa uzmem olovku i papir i nacrtam algoritam..."

19

You might also like