algoritmi

15
ALGORITAM Već vam je sigurno poznata činjenica kako namjenu računala određuje program koji se u tom trenutku na njemu izvršava. Zbog toga je razvoj programa jednako važan kao i razvoj računalnih komponenti. Program je, u stvari, niz instrukcija (naredbi), koje (ako su poredane u ispravnom redoslijedu) daju određen rezultat. Pisanjem programa bave se programeri, a pišu ih u odabranim programskim jezicima. Važno je istaknuti da izrada programa nije jednostavna. Za pisanje programa nije potrebno samo znanje programskog jezika, već treba znati primijeniti ispavan ALGORITAM za njegovo rješavanje. Sam pojam algoritma nije usko vezan uz informatiku niti uz programiranje. Odnosi se na razrađen postupak koji nakon konačnog broja koraka dovodi do rješenja (ili spoznaje da ono ne postoji). Svaki algoritam može biti prikazan grafički (dijagramom tijeka) ili u pseudo jeziku. Programer sam odlučuje koji oblik zapisivanja algoritma mu bolje odgovara. Za manje programe dovoljno je u par rečenica zapisati način na koji se dolazi do rješenja. Kod većih programa, možda je razumljiviji slikovni prikaz pojedinih dijelova programa. Algoritam napravljen u ovoj fazi postaje jedan od važnijih dijelova dokumentacije. U slučaju da program nakon nekog vremena treba doraditi, bez prikaza i opisa algoritma to bi bilo gotovo nemoguće. Možemo reći da je pseudo jezik (pseudokod) opis algoritma. To je prijelazni oblik između govornog i programskog jezika, a sadrži samo instrukcije u ispravnom redoslijedu. Lako je razumljiv i vrlo se jednostavno može prevesti u bilo koji programski jezik. Za računanje matematičkih izraza koriste se aritmetički operatori. U pseudo jeziku, kao i u većini programskih jezika ima ih šest. To su: Tako matematički izraz: u pseudo jeziku zapisujemo kao: (2*x+3)/4. Za razliku od matematike, u programiranju koristimo dva dodatna operatora: cjelobrojno dijeljenje i ostatak cjelobrojnog dijeljenja. Radi se o dijeljenju koje ste učili u osnovnoj školi, kada još niste znali da postoje realni brojevi. Podsjetimo se: 22:7=3 i ostatak 1 34:4=28 i ostatak 6 U pseudo jeziku to zapisujemo ovako: 22 div 7 = 3, a 22 mod 7 = 1; 34 div 4 = 28, 34 mod 4 = 6. 1

Upload: ana-udovicic

Post on 07-Nov-2015

217 views

Category:

Documents


4 download

DESCRIPTION

algoritmi

TRANSCRIPT

ALGORITAM

Ve vam je sigurno poznata injenica kako namjenu raunala odreuje program koji se u tom trenutku na njemu izvrava. Zbog toga je razvoj programa jednako vaan kao i razvoj raunalnih komponenti. Program je, u stvari, niz instrukcija (naredbi), koje (ako su poredane u ispravnom redoslijedu) daju odreen rezultat.Pisanjem programa bave se programeri, a piu ih u odabranim programskim jezicima. Vano je istaknuti da izrada programa nije jednostavna. Za pisanje programa nije potrebno samo znanje programskog jezika, ve treba znati primijeniti ispavan ALGORITAM za njegovo rjeavanje.Sam pojam algoritma nije usko vezan uz informatiku niti uz programiranje. Odnosi se na razraen postupak koji nakon konanog broja koraka dovodi do rjeenja (ili spoznaje da ono ne postoji).Svaki algoritam moe biti prikazan grafiki (dijagramom tijeka) ili u pseudo jeziku. Programer sam odluuje koji oblik zapisivanja algoritma mu bolje odgovara. Za manje programe dovoljno je u par reenica zapisati nain na koji se dolazi do rjeenja. Kod veih programa, moda je razumljiviji slikovni prikaz pojedinih dijelova programa. Algoritam napravljen u ovoj fazi postaje jedan od vanijih dijelova dokumentacije. U sluaju da program nakon nekog vremena treba doraditi, bez prikaza i opisa algoritma to bi bilo gotovo nemogue.Moemo rei da je pseudo jezik (pseudokod) opis algoritma. To je prijelazni oblik izmeu govornog i programskog jezika, a sadri samo instrukcije u ispravnom redoslijedu. Lako je razumljiv i vrlo se jednostavno moe prevesti u bilo koji programski jezik. Za raunanje matematikih izraza koriste se aritmetiki operatori. U pseudo jeziku, kao i u veini programskih jezika ima ih est. To su:

Tako matematiki izraz: u pseudo jeziku zapisujemo kao: (2*x+3)/4.Za razliku od matematike, u programiranju koristimo dva dodatna operatora: cjelobrojno dijeljenje i ostatak cjelobrojnog dijeljenja. Radi se o dijeljenju koje ste uili u osnovnoj koli, kada jo niste znali da postoje realni brojevi.Podsjetimo se:22:7=3 i ostatak 134:4=28 i ostatak 6 U pseudo jeziku to zapisujemo ovako: 22 div 7 = 3, a 22 mod 7 = 1; 34 div 4 = 28, 34 mod 4 = 6.Da bi znali pravilno zapisati i izraunati sloeniji aritmetiki izraz koji u sebi sadri nekoliko jednostavnih operacija, osim operatora moramo znati i njihov prioritet (redoslijed izraunavanja).

STANDARDNE MATEMATIKE FUNKCIJEZa raunanje sloenijih izraza potrebne su nam i standardne matematike funkcije. Na primjer, drugi korijen, kvadrat realnog broja i sl. Iako tijekom pisanja algoritma na papiru bez problema moemo napisati potenciju, korijen ili apsolutnu vrijednost, u standardiziranom pseudo jeziku definirane su standardne matematike funkcije:

Matematiki izraz u pseudo jeziku zapisujemo: sqrt(sqr(x)+sqr(y))/abs(x)

NAREDBE ZA UNOS I ISPISSvaki se program sastoji od tri odvojena dijela: unosa podataka, obrade i prikaza rezultata. elimo li napraviti takav program moramo se upoznati sa naredbom koja e omoguiti korisniku da unese potrebne podatke (npr. preko tipkovnice) i naredbom za prikaz rezultata obrade (npr. na zaslonu monitora). Naredbe koje omoguuju korisniku unos podataka nazivamo ulazne, a naredbe koje omoguuju prikaz rezultata su naredbe za ispis. U pseudo jeziku ih definiramo ovako:

elimo li ispisati rezultat nekog od matematikih izraza koji smo izraunali u prethodnim lekcijama pisat emo izlaz(izraz).Na primjer: izlaz (21 div 2 mod 3). U ovom sluaju, izraunat e se vrijednost izraza (1) i tako izraunata ispisati na zaslon.Openitost programima omoguuje naredba za unos podataka koja "prebacuje" odgovornost za ulazne podatke sa programera na korisnika. Ona trai unos podatka i uneseni podatak sprema u memoriju.Podatak koji unese korisnik naziva se varijabla. Varijabla je podatak u programu koji se moe (ali ne mora) mijenjati. Osim promjenljivih, podaci mogu biti i "nepromjenjivi" - konstantni. Takve podatke nazivamo konstante. Da bi se podaci u memoriji mogli razlikovati potrebno im je ime. Svaki programski jezik definira pravila za imena varijabli. Ime moe biti jedno slovo, ili rije koja poblie opisuje podatak (npr. a, b, x, opseg, povrsina...).

Napiimo sada jedan jednostavan algoritam u pseudo jeziku:ulaz (a);izlaz(sqr(a));

Radi lakeg uoavanja kraja jedne i poetka druge naredbe, uvedimo znak za odvajanje naredbi (separator), Neka to bude ; Tako emo znati odvojiti naredbe ak i kada su u jednom redu. Prethodni algoritam je sada openit. Za bilo koju vrijednost varijable a, izraunat e njezin kvadrat. Odnosno, za bilo koju duljinu stranice kvadrata izraunat e i ispisati njegovu povrinu. Tako e za vrijednost varijable a=5, algoritam ispisati 25, dok e za a=7 ispisati 49.

NAREDBA PRIDRUIVANJASvaki programski jezik ima naredbu pridruivanja. Ona varijabli s lijeve strane pridruuje vrijednost izraza s desne strane. U pseudo jeziku naredba pridruivanja oznaava se sa :=Zbog ega ba :=? U sljedeim lekcijama pojavit e se naredbe u kojima emo ispitivati jednakost izraza s lijeve i desne strane (npr. je li a+b jednako c+d). Za ispitivanje jednakosti koristit emo relacijski operator = i pisati a+b=c+d. Da bi program mogao razlikovati pridruivanje od ispitivanja jednakosti, oni moraju biti drugaijeg oblika. Zbog toga u pseudo jeziku za naredbu pridruivanja koristimo znak :=, a za ispitivanje jednakosti znak =. Ovakav zapis preuzet je iz programskog jezika Pascal. U programskom jeziku C za pridruivanje se koristi znak =, dok se jednakost ispituje znakom ==.Naredbom a:=5, broj pet "pridruujemo" varijabli a. U stvari, u memorijsku lokaciju koju smo nazvali a upisujemo broj 5.Naredba x:=a+2, najprije e iz memorijske lokacije imena a "dohvatiti" njezinu vrijednost (neka je to vrijednost iz prethodnog primjera, a:=5). Zatim e tu vrijednost (broj 5) zbrojiti sa brojem 2 i na kraju e dobiveni rezultat spremiti u memoriju, na mjesto imena x.Naredba x:=x+4 najprije e iz memorije dohvatiti vrijednost varijable x (neka je to 7), zatim tom broju dodati broj 4. Dobiveni rezultat (11) spremiti e kao vrijednost varijable x (preko stare vrijednosti 7).

PRIMJERI JEDNOSTAVNIJIH ALGORITAMAPrimjer 1:Sljedei algoritam za zadane duljine stranica pravokutnika (a i b) rauna i ispisuje njegov opseg i povrinu:Ulaz (a,b);O:=2*(a+b);P:=a*b; Izlaz (O,P);PROVJERIMO: Neka je a=5, a b=6. Nakon naredbe O:=2(a+b), vrijednost varijable O jednaka je 2*(5+6)=2*11=22, a nakon naredbe P:=a*b, vrijednost varijable P=5*6=30. Uvrtavanjem brojeva 5 i 6 (vrijednosti varijabli a i b) u formule za povrinu i opseg pravokutnika lako moemo provjeriti da su rezultati jednaki!

Primjer 2:Algoritam koji dvoznamenkasti broj rastavlja na znamenke:Ulaz (a);desetica:=a div 10;jedinica:=a mod 10; Izlaz (desetica, jedinica);OBJANJENJE: Ako dvoznamenkasti broj (npr. 25) podijelimo cjelobrojno sa deset, rezultat e biti znamenka desetice (25 div 10=2). Pogledamo li ostatak dijeljenja zadanog broja s 10, vidjet emo da je to upravo znamenka jedinice (25 mod 10 = 5). I to je upravo gornji algoritam!

Primjer 3:Algoritam za zamjenu vrijednosti dvije varijable.Ima li varijabla a jednu vrijednost, a varijabla b drugu, u nekoliko naredbi moemo tim varijablama zamijeniti vrijednosti! Ne radi se o tome da varijable samo ispiemo na zaslon u obrnutom redoslijedu, ve o tome da stvarno fiziki zamjene vrijednosti: ona vrijednost koja je na poetku programa bila upisana na adresu a, na kraju e biti upisana na adresu b i obrnuto.

Napiemo li ovakav algoritam:Ulaz (a,b);b:=a;a:=b; Izlaz (a,b);to smo dobili?

Ako su na poetku vrijednosti bile: a=3, b=7, uvrtavanjem u dani algoritam dobijemo: b:=a (odnosno b=3). Time smo preko prethodne vrijednost varijable b (7) "prepisali" sadanju vrijednost varijable a (3). I staru vrijednost varijable b smo izgubili! Izlaz iz naeg programa bio bi: 3, 3, a to nije ono to smo trebali!

Ovaj problem u praksi rjeavamo na dva naina:a) pomou tree (pomone) varijable (kao kada elimo sadraje dviju posuda zamijeniti, pa uzmemo treu posudu)Ulaz (a,b);c:=a;a:=b;b:=c; Izlaz (a,b);OBJANJENJE: U treu "posudu", c, privremeno smo spremili sadraj jedne varijable (neka je to sadraj varijable a - koristimo li vrijednosti iz uvodne diskusije, c=3). Sada slobodno moemo "prepisati" preko sadraja varijable a novu vrijednost, jer smo "napravili kopiju" stare vrijednosti. Znai, slobodno napravimo a:=b. Sadraj varijable a sada postaje sadraj varijable b (a=7). I na kraju "dohvatimo" vrijednost iz pomone varijable c (3) i pridruimo je varijabli b (b=3). I imamo ono to smo traili! Na poetku je vrijednost varijable a bila jednaka 3, a vrijednost varijable b bila je 7, a na kraju je vrijednost varijable a jednaka 7, a vrijednost varijable b jednaka je 3!

b) bez pomone varijable - pomou operacija zbrajanja i oduzimanja:Ulaz (a,b);a:=a+b;b:=a-b;a:=a-b; Izlaz (a,b);PROVJERIMO: Neka je na poetku a:=3, b:=7. U prvom koraku zbrojimo ta dva broja i rezultat spremimo kao vrijednost varijable a (a=10). U drugom koraku, od dobivene vrijednosti varijable a (10) oduzmemo vrijednost varijable b (7) i tako dobivenu vrijednost pridruimo varijabli b (b=3). U treem koraku, od vrijednosti varijable a (10) oduzmemo novo dobivenu vrijednost varijable b (3) i dobiveni broj spremimo kao vrijednost varijable a (a=10-3=7). I tako smo, jednostavnim matematikim operacijama, zamijenili vrijednosti varijablama, bez da smo optereivali memoriju dodatnom varijablom!

GRANANJE U PROGRAMUPostoje problemi ije rjeavanje ide u nekoliko razliitih smjerova, ovisno o odreenom uvjetu. Evo nekih jednostavnih primjera: U svim zadacima koji su vezani uz povrine i oploja znamo da moramo voditi rauna da duljine moraju biti brojevi vei od nule. Ukoliko nisu, ne moemo nastaviti sa raunanjem i moramo obavijestiti korisnika da je upisao krive vrijednosti! zapisujemo li ocjene nekog uenika, moramo biti sigurni da korisnik nee moi upisati broj manji od jedan ili vei od pet! Obino ne vrijedi samo napisati uputu i nadati se da e korisnici upisivati ispravne vrijednosti.Zapis naredbe grananja u pseudo jeziku izgleda ovako:ako je uvjet onda naredba1; inae naredba2;to je sa uvjetom? Uvjet je najee relacijski izraz (ali ponekad moe biti i aritmetiki). Relacijski izraz je izraz u kojem se usporeuju vrijednosti s lijeve i desne strane. Izmeu vrijednosti koje se usporeuju stoje relacijski operatori.

Primjeri relacijskih izraza:1. x04. a+b0 onda ispii ('uneseni broj je pozitivan!');inae ispii ('uneseni broj nije pozitivan!');

Primjer 2:Ako je a>0 onda P:=4*a;inae ispis ('Duljina stranice kvadrata mora biti vea od nule!');

Istaknimo jo jednom zapis naredbe grananja:ako je uvjet onda naredba1; inae naredba2;Uoite kako naredbe piu u jednini (naredba1 i naredba2). Trebamo li izvriti vie od jedne naredbe ako je uvjet ispunjen (ili ako nije), moramo ih izdvojiti u BLOK naredbi. Blok naredbi zapisuje se izmeu vitiastih zagrada ({ i }).

Ovdje su dani neki "klasini" primjeri u kojima se koristi grananje.Primjer 1:Ispituje je li uneseni broj paran ili neparan.ulaz(a);ako je a mod 2 = 0 onda ispis('paran');inae ispis ('neparan');OBJANJENJE: Paran broj je djeljiv sa dva. To znai da je ostatak pri dijeljenju tog broja sa dva jednak nuli (a mod 2 = 0).

Primjer 2:Trai najmanji od tri unesena broja. Ovaj problem moemo rijeiti na vie naina. Moemo, na primjer, ispitati sve mogunosti:ulaz(a, b, c);ako je (a znam = 23 mod 10 = 3 => ispis 3 => broj = 23 div 10 =2;Za b=4 => znam = 2 mod 10 = 2 => ispis 2 => broj = 2 div 10 =0;Na isti nain moemo ispisivati znamenke troznamenkastog, peteroznamenkastog ili bilo kojeg broja kojem znamo broj znamenki. Samo mijenjamo zavrnu vrijednost kontrolne varijable. Ali, to kada elimo napraviti openiti program? Za broj kojemu ne znamo unaprijed broj znamenki? U tom sluaju ne moemo koristiti petlju s poznatim brojem ponavljanja, ve jednu od petlji kod kojih ponavljanje ovisi o uvjetu!PETLJA UNUTAR PETLJEPetlje s poznatim brojem ponavljanja mogu se i ugnjeivati - pisati jedna unutar druge. To moemo zapisati ovako:za b1:= p1 do k1 initi za b2:= p2 do k2 initi naredba (blok naredbi);U tom sluaju, kada se jednom promjeni vrijednost kontrolne varijable vanjske petlje (b1), potpuno se izvri unutarnja petlja (vrijednosti njezine kontrolne varijable (b2) promjene se od poetne do zavrne). Tek tada se ponovo promjeni vrijednost kontrolne varijable vanjske petlje. Ako se vanjska petlja izvrava k1 puta, a unutarnja k2, ugnijeene petlje izvrit e se k1*k2 puta.PONAVLJANJE KOJE OVISI O UVJETUPostoje problemi kod kojih ne moemo znati toan broj ponavljanja. Na primjer, elimo li izraunati zbroj znamenki nekog broja, a ne znamo koliko ima znamenki, moramo pronai drugi nain rjeavanja tog problema. Ili, ako elimo da korisnik unosi podatke (npr. o uenicima) sve dok to njemu odgovara. Ne znamo koliko e podataka unositi... Ovakvih primjera ima jo jako puno. Rjeavamo ih naredbama ponavljanja kod kojih ponavljanje ovisi o uvjetu.Ovisno o mjestu ispitivanja uvjeta naredbe ponavljanja dijelimo na: naredbe ponavljanja s ispitivanjem uvjeta na poetku i one kod kojih se uvjet ponavljanja nalazi na kraju niza naredbi koje se ponavljaju.PETLJA DOK JE (UVJET) INITIOvu naredbu koristimo kada nam nije unaprijed poznat broj ponavljanja, a uvjet se provjerava na poetku. Njezin je opi oblik:dok je uvjet initi naredba;Naredba unutar ove petlje ponavlja se sve dok je uvjet istinit. Ukoliko se treba ponavljati vie od jedne naredbe, one se moraju staviti u blok (izmeu znakova { i }).Primjer 1:to e ispisati sljedei dio programa ako je k cjelobrojna varijable?k := 3; dok je k k=6+3=9. Devet je manji od 20 => k se uveava za 3 => k=9+3=1212 k=12+3=1515 k=15+3=1818 k=18+3=2121 nije manji ili jednak 20. Uvjet nije ispunjen i program nastavlja sa izvoenjem s prvom naredbom iza naredbe ponavljanja. To je naredba izlaz (k). Sada se na zaslon ispisuje 21.Primjer 2:to ako prethodni program zapiemo ovako:k := 3; dok je k 0 initi { br:=br+1; broj:=broj div 10; } izlaz (br); Ovo je dio programa koji broji koliko uneseni broj ima znamenaka.Prilikom primjene uvjetnih petlji potrebno je voditi rauna o tome da se izbjegne beskonana petlja. Potrebno je pronai uvjet koji e sigurno postati laan u nekom trenutku.Primjer 4:to e ispisati sljedei dio programa?unos (broj); br:=0; dok je broj0 initi br:=br+1; broj:=broj div 10; izlaz (br);Ovo je klasian primjer beskonane petlje. Izostavljene su vitiaste zagrade i unutar naredbe dok je... nalazi se samo naredba br:=br+1. To znai da e se vrijednost varijable br poveavati, no vrijednost varijable broj e ostajati nepromijenjena (nikada nee postati nula) i uvjet nikada nee postati laan!PETLJA PONAVLJATI DOK JE (UVJET)Ovu naredbu koristimo kada nam nije unaprijed poznat broj ponavljanja, a uvjet se provjerava na kraju. Tipini su primjeri programi kod kojih se naredbe unutar petlje moraju izvriti najmanje jednom, ak i ako uvjet nije ispunjen.Primjer:Koju e vrijednost ispisati sljedei algoritam za n = 1235?ulaz (n);k := 1;ponavljati ako je n MOD 2 = 0 onda k := k + 1; n := n DIV 10; do n = 0; izlaz (k);Rjeenje: Ispisat e se broj 2.OBJANJENJE: Na poetku je vrijednost varijable k jednaka 1. Sada ulazimo u petlju i izvravaju se redom naredbe: ako je n mod 2 = 0 onda k:=k+1; n mod 2 = 1235 mod 2 = 1 => uvjet nije ispunjen, vrijednost varijable k se ne mijenja. Sljedea naredba je n:= n DIV 10 => n:=1235 div 10 = 123; Sada se provjerava uvjet zaustavljanja. Kako je n=123 i nije jednak nuli, program se vraa na poetak naredbe ponavljanja. n mod 2 = 123 mod 2 = 1 => uvjet nije ispunjen, vrijednost varijable k se ne mijenja. n:= n DIV 10 => n:=123 div 10 = 12; => n nije jednak nuli, program se vraa na poetak naredbe ponavljanja. n mod 2 = 12 mod 2 = 0 => uvjet je ispunjen, vrijednost varijable k se poveava za 1 (k=2). n:= n DIV 10 => n:=12 div 10 = 1; => n nije jednak nuli, program se vraa na poetak naredbe ponavljanja. n mod 2 = 1 mod 2 = 1 => uvjet nije ispunjen, vrijednost varijable k se ne mijenja. n:= n DIV 10 => n:=1 div 10 = 0; => n je jednak nuli, program ide na sljedeu naredbu => izlaz (k) i na zaslon se ispisuje broj 2. 11