algoritmi

19
Dražen Brđanin: Osnove programiranja 1. ALGORITMI 1.1. Pojam Algoritam je tačno određen tok izvođenja nekog postupka koji se primjenjuje na nekom skupu podataka radi dobijanja rezultata, a koji se koristi pri rješavanju problema istog tipa. Alternativno se koriste sljedeći termini: recept, procedura, rutina, metod, proces... Termin algoritam potiče od imena perzijskog matematičara koji je prvi dao pravila za izvođenje algebarskih operacija. 1.2. Struktura algoritma Strukturu algoritma čine: operatori uzastopnom primjenom operatora realizuje se željeni postupak primjena pojedinog operatora predstavlja jedan algoritamski korak u širem smislu, u skup operatora, pored operatora neohodnih za neposrednu realizaciju postupka, ubrajaju se i operacije neohodne za realizaciju algoritma u računaru (učitavanje podataka, ispisivanje rezultata, privremeni prekid obrade ...) diskriminatori diskriminatori su tačke odlučivanja u kojima se na osnovu osobina operanada (podataka) mijenja redoslijed ili vrsta operatora 1.3. Karakteristike algoritma Osnovne karakteristike algoritma su: konačnost algoritam mora da vodi rješenju problema primjenom konačnog broja operatora i diskriminatora (ponekad broj algoritamskih koraka nije unaprijed poznat, pa je potrebno predvidjeti postupak koji ograničava broj koraka) definisanost svaki algoritamski korak mora da bude jednoznačno definisan, pri čemu treba predvidjeti sve slučajeve koji mogu da se pojave za različite skupove početnih podataka ulaz(i) algoritam može da ima jedan ili više ulaznih podataka, ali i ne mora da ih ima ulazni podaci mogu da se navedu na početku algoritma ili se dinamički unose u algoritam izlaz(i) algoritam mora da ima jedan ili više izlaznih podataka ulazni podaci mogu da se navedu na početku algoritma ili se dinamički unose u algoritam efektivnost od algoritma se zahtijeva postizanje traženog rješenja u što kraćem vrmenu i uz primjenu što manjeg broja algoritamskih koraka ostvarljivost (realizibilnost) algoritam mora biti ostvarljiv u računaru, odnosno svi operatori i diskriminatori moraju biti ostvarljivi 1

Transcript of algoritmi

Page 1: algoritmi

Dražen Brđanin: Osnove programiranja

1. ALGORITMI

1.1. Pojam Algoritam je tačno određen tok izvođenja nekog postupka koji se primjenjuje na nekom

skupu podataka radi dobijanja rezultata, a koji se koristi pri rješavanju problema istog tipa. Alternativno se koriste sljedeći termini: recept, procedura, rutina, metod, proces... Termin algoritam potiče od imena perzijskog matematičara koji je prvi dao pravila za

izvođenje algebarskih operacija.

1.2. Struktura algoritma Strukturu algoritma čine:

• operatori • uzastopnom primjenom operatora realizuje se željeni postupak • primjena pojedinog operatora predstavlja jedan algoritamski korak • u širem smislu, u skup operatora, pored operatora neohodnih za neposrednu

realizaciju postupka, ubrajaju se i operacije neohodne za realizaciju algoritma u računaru (učitavanje podataka, ispisivanje rezultata, privremeni prekid obrade ...)

• diskriminatori • diskriminatori su tačke odlučivanja u kojima se na osnovu osobina operanada

(podataka) mijenja redoslijed ili vrsta operatora

1.3. Karakteristike algoritma Osnovne karakteristike algoritma su:

• konačnost • algoritam mora da vodi rješenju problema primjenom konačnog broja operatora i

diskriminatora (ponekad broj algoritamskih koraka nije unaprijed poznat, pa je potrebno predvidjeti postupak koji ograničava broj koraka)

• definisanost • svaki algoritamski korak mora da bude jednoznačno definisan, pri čemu treba

predvidjeti sve slučajeve koji mogu da se pojave za različite skupove početnih podataka

• ulaz(i) • algoritam može da ima jedan ili više ulaznih podataka, ali i ne mora da ih ima • ulazni podaci mogu da se navedu na početku algoritma ili se dinamički unose u

algoritam • izlaz(i)

• algoritam mora da ima jedan ili više izlaznih podataka • ulazni podaci mogu da se navedu na početku algoritma ili se dinamički unose u

algoritam • efektivnost

• od algoritma se zahtijeva postizanje traženog rješenja u što kraćem vrmenu i uz primjenu što manjeg broja algoritamskih koraka

• ostvarljivost (realizibilnost) • algoritam mora biti ostvarljiv u računaru, odnosno svi operatori i diskriminatori

moraju biti ostvarljivi

1

Page 2: algoritmi

Dražen Brđanin: Osnove programiranja

1.4. Predstavljanje algoritma Načini predstavljanja algoritma:

• prirodni jezik • algoritamski koraci se opisuju prirodnim jezikom (jezik koji se koristi u

svakodnevnoj komunikaciji) • nedostaci: nije univerzalan i prepoznatljiv...

Primjer 1.1. Prirodnim jezikom opisati algoritam koji za proizvoljnu vrijednost poluprečnika kruga računa i ispisuje njegov obim i površinu

1. POČETAK 2. UČITAJ POLUPREČNIK (r) 3. IZRAČUNAJ OBIM (O = 2*r*PI) 4. IZRAČUNAJ POVRŠINU (P = r*r*PI) 5. ISPIŠI OBIM (O) 6. ISPIŠI POVRŠINU (P) 7. KRAJ

• metajezik (pseudokod) • pseudokod ili metajezik je vještački jezik nezavisan od računarske platforme i

neopterećen formalizmom (koji je karakterističan za programske jezike) kako bi se razvoj algoritma olakšao (dosta slično programskom jeziku ali nije opterećen sintaksom)

• često se koristi u literaturi za predstavljanje algoritama • univerzalniji je od prirodnog jezika (uglavnom se koristi nekakav derivat

engleskog jezika)

Primjer 1.2. Pseudokodom opisati algoritam koji za proizvoljnu vrijednost poluprečnika kruga računa i ispisuje njegov obim i površinu

1. BEGIN 2. READ r 3. O = 2*r*PI 4. P = r*r*PI 5. WRITE O 6. WRITE P 7. END

• grafički • najčešće se koristi dijagram toka (blok dijagram ili organigram) • algoritamski koraci predstavljaju se odgovarajućim grafičkim simbolima

početak / kraj

obrada (operacija ili blok operacija)

tačka odlučivanja

ulaz podataka

izlaz podataka

prekidne tačke (tačke za povezivanje)

strelice za povezivanje

2

Page 3: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.3. Dijagramom toka predstaviti algoritam koji za proizvoljnu vrijednost poluprečnika kruga računa i ispisuje njegov obim i površinu

POČETAK

PI=3.14159

O=2*R*PI

P=R^2*PI

O

P

KRAJ

R

1.5. Algoritamske strukture Razlikujemo nekoliko algoritamskih struktura:

• linearna (linijska) struktura • razgranata struktura (struktura sa grananjem) • petlja (ciklička struktura)

1.5.1. Linearne algoritamske strukture POČETAK

KRAJ

Linearna algoritamska strtuktura predstavlja niz algoritamskih koraka (operatora) bez diskriminatora.

Ovakva struktura izvršava se sukcesivno korak po korak bez ponavljanja. Od početka do kraja algoritma postoji samo jedan mogući put (nema grananja).

To su algoritmi kod kojih obično imamo ulaz, obradu i izlaz podataka.

Primjer 1.4. Dijagramom toka predstaviti algoritam koji učitava ugao izražen u stepenima, a zatim ispisuje vrijednost ugla izraženu u radijanima.

POČETAK

PI = 3.14159

Y = X * PI/180

Y

KRAJ

X

3

Page 4: algoritmi

Dražen Brđanin: Osnove programiranja

1.5.2. Razgranate algoritamske strukture

Često rješavamo probleme kod kojih algoritmi nisu jednostavni i po svojoj strukturi linearni (ulaz → jednostavna obrada → izlaz), već podaci treba da ispune postavljene uslove (Da li je broj prirodan? Da li je učitani cijeli broj paran? Da li je brojač došao do kraja? itd.). Zavisno od toga da li je uslov ispunjen ili nije, odlučujemo se za jednu ili drugu radnju, biramo jedan od dva ili više mogućih puteva za rješavanje problema. Dakle, imamo tačku odlučivanja, odnosno grananje algoritma (diskriminatori).

Oblik grananja Opis

JEDNOBLOKOVSKO GRANANJE

naredba ili

blok naredbi

uslov ISTINA LAŽ

Ako je uslov ispunjen izvršiće se naredba ili blok naredbi (algoritamskih koraka).

Ako uslov nije ispunjen naredba (blok naredbi) se ignoriše i neće se izvršiti

Primjer 1.5. Dijagramom toka predstaviti algoritam koji provjerava da li je učitani broj pozitivan.

broj>0 ISTINA LAŽ

POČETAK

broj

"pozitivan"

KRAJ

Primjer 1.6. Dijagramom toka predstaviti algoritam za pronalaženje najvećeg među tri učitana broja.

B>MAX ISTINA

LAŽ

POČETAK

A, B, C

MAX

MAX = A

MAX = B

C>MAX ISTINA

MAX = C LAŽ

KRAJ

4

Page 5: algoritmi

Dražen Brđanin: Osnove programiranja

Oblik grananja Opis

DVOBLOKOVSKO GRANANJE

uslov ISTINA LAŽ

naredba 1 ili

blok naredbi 1

naredba 2 ili

blok naredbi 2

Ako je uslov ispunjen izvršiće se naredba 1 (blok naredbi 1),

a ako uslov nije ispunjen izvršiće se naredba2 (blok naredbi 2).

Primjer 1.7. Dijagramom toka predstaviti algoritam koji provjerava da li je učitani prirodni broj paran.

broj<=0 ISTINA LAŽ

ost = 0 ISTINA LAŽ

POČETAK

broj

"GREŠKA"

"Paran" "Neparan"

KRAJ

ost = broj MOD 2

Primjer 1.8. Dijagramom toka predstaviti algoritam za izračunavanje površine trougla čije su stranice A, B, C.

PK ≤ 0 ISTINA LAŽ

POČETAK

A, B, C

"Nije trougao"

P

KRAJ

S = (A+B+C) / 2

PK = S · (S-A) · (S-B) · (S-C)

PKP =

5

Page 6: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.9. Dijagramom toka predstaviti algoritam koji izračunava korijene kvadratne jednačine

02 =++ cbxax

Rješenja kvadratne jednačine određena su sa:

vuaD

ab

aDb

aacbbx ±=±

−=

±−=

−±−=

222242

2,1 .

Sada možemo nacrtati dijagram toka:

a = 0 ISTINA

POČETAK

a, b, c

"Nije kvadratna jednačina"

KRAJ

LAŽ

D = b2 – 4ac

u = -b / (2a)

(2a)/Dv =

D = 0 ISTINA

x1=x2=u

LAŽ

D > 0 ISTINA LAŽ

x1= u+v x2=u-v

x1 , x2

x1= (u , v) x2= (u , -v)

x1 , x2

6

Page 7: algoritmi

Dražen Brđanin: Osnove programiranja

Oblik grananja Opis

VIŠEBLOKOVSKO GRANANJE

Uslov 1 ISTINABlok 1

Uslov 2

LAŽ

ISTINABlok 2

Uslov N ISTINA

Blok N

LAŽ

LAŽ

Blok 0

Ako je ispunjen uslov 1 izvršiće se blok 1, inače, ako je ispunjen uslov 2 -> blok 2, inače, ako je ispunjen uslov 3 -> blok 3,

… inače, ako je ispunjen uslov N -> blok N,

inače (ako nije ispunjen nijedan uslov) izvršiće se neki blok blok 0.

Primjer 1.10. Dijagramom toka predstaviti algoritam koji za učitanu numeričku ocjenu ispisuje opisnu ocjenu (odličan, vrlo dobar, dobar, dovoljan, nedovoljan).

ocjena=5ISTINA

ocjena=1ISTINA LAŽ

POČETAK

ocjena

"Odlican"

"GRESKA"

KRAJ

"Nedovoljan"

ocjena=4ISTINA LAŽ

"Vrlo dobar"

ocjena=3ISTINA LAŽ

"Dobar"

ocjena=2ISTINA LAŽ

"Dovoljan"

LAŽ

7

Page 8: algoritmi

Dražen Brđanin: Osnove programiranja

Oblik grananja Opis

SELEKTIVNO BLOKOVSKO GRANANJE

izraz

v1 v2 vn inače. . .

blok 1 blok 0blok 2 blok n

Prvo se računa vrijednost selektorskog izraza, a zatim se izračunata vrijednost traži u listi

vrijednosti v1, v2, ... , vn. Ako se izračunata vrijednost pronađe, izvršava se pripadajući blok naredbi (blok 1, ... , blok n). Ako se ne pronađe odgovarajuća vrijednost u

listi vrijednosti izvršava se tzv. podrazumijevajući blok naredbi (blok 0).

Primjer 1.11. Dijagramom toka predstaviti algoritam koji za učitanu numeričku ocjenu ispisuje opisnu ocjenu koristeći selektivno grananje.

POČETAK

ocjena

"GRESKA"

KRAJ

"Nedovoljan" "Dovoljan"

ocjena

1 2 inače

"Dobar"

3

"Vrlo dobar"

4

"Odlican"

5

1.5.3. Cikličke algoritamske strukture

Ponekad je potrebno neke algoritamske korake ponoviti. Takvi algoritamski koraci (koji se u nekom algoritmu ponavljaju) predstavljaju ciklus. Algoritamske strukture koje sadrže ciklus nazivaju se cikličke algoritamske strukture ili petlje.

U teoriji je poznato više različitih oblika petlji. U programskim jezicima obično se implementiraju:

• petlja s fiksnim brojem izvršavanja (brojačka petlja ili brojački ciklus), • petlja s izlazom na vrhu (uslovni ciklus s izlazom na vrhu), i • petlja s izlazom na dnu (uslovni ciklus s izlazom na dnu).

izlaznikriterijum

ispunjen

tijelo ciklusa

inicijalizacijaciklusa

ažuriranjekotrolnih

promjenljivih

Svaka petlja, u osnovi, ima strukturu prikazanu na sljedećoj slici. Da bi se obezbijedio potreban broj ponavljanja ciklusa, obično se koristi jedna ili više kontrolnih promjenljivih. Prije nego što se uđe u petlju postavljaju se potrebne početne vrijednosti promjenljivih (inicijalizacija promjenljivih). Petlja mora da ima uslov pod kojim se izlazi iz petlje (prekida s ponavljanjem ciklusa). Ovaj uslov obično se naziva izlazni kriterijum. Sve dok se ne zadovolji izlazni kriterijum, ponavljaju se algoritamski koraci koji čine tijelo petlje (ciklus). Po završetku svakog ciklusa treba izvršiti ažuriranje vrijednosti kontrolnih promjenljivih.

8

Page 9: algoritmi

Dražen Brđanin: Osnove programiranja

BROJAČKA PETLJA

brojac = poc, kraj, kor

tijelopetlje

Brojačka petlja omogućava da se ciklus (tijelo petlje) izvrši tačno određen broj puta. Kontrolna promjenljiva brojac definiše koliko će se puta ciklus izvršiti. Na početku se brojaču dodijeli početna vrijednost poc. To može biti neka konstanta ili izraz čija vrijednost treba da se izračuna. Nakon toga se računaju izraz kraj, koji određuje krajnju vrijednost koju brojač treba da dostigne, te izraz kor, koji određuje s kojim korakom će se mijenjati brojač od početne do krajnje vrijednosti. Korak može biti pozitivan, odnosno negativan. Ako se korak ne navede, podrazumijeva se da je jedinični, tj. da se brojač nakon svakog ciklusa uvećava za 1.

Ako je korak pozitivan, vrijednost brojača će se uvećavati. Dakle, na početku brojač ima neku početnu vrijednost, gleda se da li je to manje ili jednako izračunatoj krajnjoj vrijednosti i ako jeste, izvršava se ciklus. Kad se izvrši posljednji korak u ciklusu, brojač se automatski uvećava za vrijednost koraka. Ponovo se vraćamo na početak i provjeravamo da li je brojač još uvijek manji ili jednak krajnjoj vrijednosti i ako jeste, ponavljamo ciklus. Ako je brojač premašio krajnju vrijednost, izlazi se iz petlje.

Ako je korak negativan, vrijednost brojača će se umanjivati nakon svakog ciklusa. Dakle, na početku brojač ima neku početnu vrijednost, gleda se da li je to veće ili jednako izračunatoj krajnjoj vrijednosti i ako jeste, izvršava se blok naredbi. Kad se izvrši posljednji korak u ciklusu, brojač se automatski umanjuje za vrijednost koraka. Ponovo se vraćamo na početak i provjeravamo da li je brojač još uvijek veći ili jednak krajnjoj vrijednosti i ako jeste, ponavljamo ciklus. Ako je brojač postao manji od krajnje vrijednost, izlazi se iz petlje.

Primjer 1.12. Dijagramom toka predstaviti algoritam koji N puta ispisuje riječ "ALGORITAM".

POČETAK

N

KRAJ

i = 1, N

"ALGORITAM"

Primjer 1.13. Dijagramom toka predstaviti algoritam koji ispisuje cijele brojeve iz intervala <A,B>.

POČETAK

A, B

KRAJ

broj = A+1, B-1

broj

9

Page 10: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.14. Dijagramom toka predstaviti algoritam koji učitava N brojeva, a zatim izračunava i ispisuje njihov zbir.

POČETAK

N

S

KRAJ

i = 1, N

broj

S = 0

S = S + broj

"Nijeprirodan"

N < 1ISTINA LAŽ

Primjer 1.15. Dijagramom toka predstaviti algoritam koji učitava N brojeva, a zatim izračunava i ispisuje njihovu aritmetičku sredinu.

POČETAK

N

S

KRAJ

i = 1, N

broj

S = 0

S = S + broj

"Nijeprirodan"

N < 1ISTINA LAŽ

AS = S / N

Primjer 1.16. Dijagramom toka predstaviti algoritam koji učitava prirodan broj N, a zatim izračunava i ispisuje N!

POČETAK

N

P

KRAJ

b = 2, N

P = 1

P = P*b

"Nijeprirodan"

N < 1ISTINA LAŽ

10

Page 11: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.17. Dijagramom toka predstaviti algoritam koji učitava prirodan broj, a zatim ispisuje sve njegove djelioce.

POČETAK

broj

D = 1 , broj

ost = broj MOD D

ost = 0

ISTINA

LAŽ

KRAJ

"Nijeprirodan"

broj < 1ISTINA LAŽ

D

Primjer 1.18. Dijagramom toka predstaviti algoritam koji provjerava da li je učitani prirodni broj savršen. (Broj je savršen ako je jednak zbiru svojih djelilaca isključujući njega).

POČETAK

broj

D = 1 , broj/2

ost = broj MOD D

ost = 0

ISTINA

LAŽ

KRAJ

"Nijeprirodan"

broj < 1ISTINA LAŽ

"Jeste" "Nije"

broj = SISTINA LAŽ

S = 0

S = S + D

11

Page 12: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.19. Dijagramom toka predstaviti algoritam koji učitava dva prirodna broja, a zatim provjerava da li oni predstavljaju par prijateljskih brojeva. Za dva broja kažemo da su prijateljski ako je prvi jednak zbiru djelioca drugog, a drugi jednak zbiru djelioca prvog broja.

Prvo odredimo sumu djelilaca prvog i sumu djelilaca drugog učitanog broja, a zatim provjerimo da li je prvi broj jednak sumi djelilaca drugog, a drugi jedank sumi djelilaca prvog, pa ispisšemo odgovarajuću poruku.

POČETAK

A, B

D = 1 , A/2

ost = A MOD D

ost = 0

ISTINA

LAŽ

KRAJ

"Nisuprirodni"

ISTINA LAŽ

"Jesu par" "Nisu par"

ISTINA LAŽ

S1 = 0

S1 = S1 + D

A<1 V B<1

D = 1 , B/2

ost = B MOD D

ost = 0

ISTINA

LAŽ

S2 = 0

S2 = S2 + D

A=S2 ∧ B=S1

Primjer 1.20. Dijagramom toka predstaviti algoritam koji ispisuje parove prijateljskih brojeva manjih od 5000.

Prethodni algoritam koji provjerava da li dva broja predstavljaju par prijateljskih brojeva mogao bi se iskoristiti i ovdje tako što bi se pomoću dvije ugnježđene petlje mijenjale vrijednosti brojeva koje provjeravamo (od 1 do 5000). Međutim, ovo je dosta neefikasno.

Problem rješavamo pomoću jedne petlje u kojoj kontrolna promjenljiva A prolazi sve vrijednosti od 1 do 5000. Pri tome A predstavlja prvi broj. Odredimo zbir njegovih djelilaca. Prema uslovu zadatka, to mora biti drugi broj u paru. Označimo ga sa B. Sada potražimo zbir njegovih djelilaca (S). Ako je A=S tada A i B predstavljaju par prijateljskih brojeva. Prilikom ispisa treba se ograničiti na jedan ispis određenog para (npr. A treba da je manje od B).

POČETAK

D = 1 , A/2

ost = A MOD D

ost = 0

ISTINA

LAŽ

KRAJ

A, B

ISTINA LAŽ

B = 0

B = B + D

A = 1 , 5000

S = 0

D = 1 , B/2

ost = B MOD D

ost = 0

ISTINA

LAŽ

S = S + D

A=S ∧ A<B

12

Page 13: algoritmi

Dražen Brđanin: Osnove programiranja

PETLJA S IZLAZOM NA VRHU (USLOVNI CIKLUS S IZLAZOM NA VRHU)

(pozitivna logika)

ISTINA

uslov LAŽ

tijelopetlje

Ciklus će se izvršavati sve dok je uslov ispunjen (ne mora ni jedamput)

Na početku se provjerava da li je ispunjen navedeni uslov (najčešće je to neki logički izraz). Ako je uslov ispunjen izvršava se ciklus (tijelo petlje). Kad se izvrši posljednji korak u ciklusu, vraćamo se na provjeru uslova. Ako je uslov i dalje ispunjen ponavlja se ciklus, a ako uslov više nije ispunjen, izlazi se iz petlje.

(negativna logika)

LAŽ

uslov ISTINA

tijelopetlje

Ciklus će se izvršavati sve dok uslov nije ispunjen (ne mora ni jedamput)

Ako uslov nije ispunjen izvršava se ciklus. Kad se izvrši posljednji korak u ciklusu, vraćamo se na provjeru uslova. Ako uslov i dalje nije ispunjen ponavlja se ciklus, a ako je uslov ispunjen, izlazi se iz petlje.

Primjer 1.21. Dijagramom toka predstaviti algoritam koji N puta ispisuje riječ "ALGORITAM" korišćenjem petlje s izlazom na vrhu u pozitivnoj logici.

POČETAK

N

"ALGORITAM"

KRAJ

b = 1

ISTINA

b <= N LAŽ

b = b + 1

Primjer 1.22. Dijagramom toka predstaviti algoritam koji N puta ispisuje riječ "ALGORITAM" korišćenjem petlje s izlazom na vrhu u negativnoj logici.

POČETAK

N

"ALGORITAM"

KRAJ

b = 1

LAŽ

b > N ISTINA

b = b + 1

13

Page 14: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.23. Dijagramom toka predstaviti algoritam koji učitava prirodan broj, a zatim ispisuje zbir njegovih cifara.

Postavlja se pitanje kako iz nekog broja izdvojiti sve njegove cifre. Uzmimo da je učitan broj 315. Neka operator MOD daje ostatak pri cjelobrojnom dijeljenju. Ako primijenimo operator MOD na učitani broj 315 i 10 dobićemo ostatak 5, odnosno izdvojićemo cifru 5. Riješimo se petice, da bi na isti način mogli dobiti jedinicu. Neka operator DIV daje rezultat cjelobrojnog dijeljenja, pa ako podijelimo 315 i 10 dobićemo 31.

315 MOD 10 → 5 315 DIV 10 → 31

Sada ponovimo primjenu MOD na 31 i 10, čime dobijamo 1. Riješimo se jedinice tako što ćemo, kao i prethodno, cjelobrojno podijeliti 31 i 10. Dobijamo 3.

31 MOD 10 → 1 31 DIV 10 → 3

Ponovimo MOD 10. Time smo izdvojili i najznačajniju cifru 3. Nastavimo postupak, tj. cjelobrojno podijelimo 3 i 10. Dobijamo kao rezultat nulu, pa nema potrebe za daljim dijeljenjem.

3 MOD 10 → 3 3 DIV 10 → 0

Uočimo cikličnost. Prvo tražimo ostatak dijeljenja sa 10. To je potrebna cifra. Nakon toga broj cjelobrojno podijelimo sa 10. Time eliminišemo njegovu zadnju cifru i omogućavamo izdvajanje sljedeće cifre. Postupak ponavljamo sve dok je broj veći od nule. Pri tome, svaki put kad izdvojimo cifru, saberemo je sa prethodno izdvojenim ciframa.

S

ISTINA

B > 0 LAŽ

S = 0

C = B MOD 10

B = B DIV 10

S = S + C

POČETAK

B

KRAJ

"Nijeprirodan"

B < 1ISTINA LAŽ

Primjer 1.24. Dijagramom toka predstaviti algoritam koji provjerava da li je učitani prirodni broj Armstrongov. (Broj je Armstrongov ako je jednak zbiru kubova svojih cifara)

Prethodni algoritam može se pogodno iskoristiti za provjeru da li je prirodni broj Armstrongov. Treba obratiti pažnju da se originalna vrijednost učitanog broja gubi izdvajanjem cifara. Zbog toga se prije izdvajanja cifara mora uvesti pomoćna promjenljiva, kako bi se na kraju moglo izvršiti poređenje učitanog broja i izračunatog zbira kubova njegovih cifara.

ISTINA

X > 0 LAŽ

X = B

C = X MOD 10

X = X DIV 10

S = S + C*C*C

POČETAK

B

KRAJ

"Nijeprirodan"

B < 1ISTINA LAŽ

S = 0

"Jeste" "Nije"

B = SISTINA LAŽ

14

Page 15: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.25. Dijagramom toka predstaviti algoritam koji provjerava da li je učitani prirodni broj prost. (Broj je prost ako je djeljiv samo sa jedinicom i sa samim sobom)

Problem utvrđivanja da li je broj prost može da se riješi na više načina. Najjednostavnije je ako nekom petljom (brojačkom ili s izlazom na vrhu) prođemo brojeve od 2 pa sve do polovine učitanog broja, prebrojimo s kojima od njih je učitani broj djeljiv, pa na kraju, ako je ukupan broj djelilaca jednak nuli broj je prost, inače učitani broj nije prost. Opisani algoritam može se predstaviti dijagramom toka datim na sljedećoj slici.

POČETAK

broj

KRAJ

"Nijeprirodan"

broj < 1ISTINA LAŽ

ISTINA

D < broj/2 LAŽ

D = 2

B = B + 1

B = 0

ISTINA

ost = 0 LAŽ

ost = broj MOD D

B = 0ISTINA LAŽ

"Jeste" "Nije"

D = D + 1

Prethodno opisani način provjere nije i najefikasniji način. Naime, na samom početku trebalo bi provjeriti da li je učitani broj paran. Ako jeste paran, sigurno nije prost, jer je djeljiv sa dva i uopšte nema potrebe za narednim provjerama djeljivosti. Kada utvrdimo da nije paran možemo krenuti sa provjerom djeljivosti. Međutim, ne treba prebrojati sve njegove djelioce, kao u prethodnom primjeru, već treba samo provjeriti ima li djelilaca ili nema. Čim utvdimo da ima djelioca, to znači da nije prost i nema potrebe za daljim dijeljenjima. Nadalje, potencijalni djelioci su neparni brojevi, zato će D krenuti od 3 i uvećavaće se za 2, a provjeravaćemo ne do polovine, već do korijena učitanog broja.

ISTINA

LAŽ

D = 3

prost = (broj=2) ∨ (broj MOD 2 <> 0)

prost = broj MOD D <> 0

prostISTINA LAŽ

"Jeste" "Nije"

D = D + 2

brojDprost <∧

POČETAK

broj

KRAJ

"Nijeprirodan"

broj < 1ISTINA LAŽ

15

Page 16: algoritmi

Dražen Brđanin: Osnove programiranja

PETLJA S IZLAZOM NA DNU (USLOVNI CIKLUS S IZLAZOM NA DNU)

(pozitivna logika)

uslov

LAŽ

tijelopetlje

ISTINA

Ciklus će se izvršavati sve dok je uslov ispunjen (mora bar jedamput)

Prvo se izvršava tijelo petlje (ciklus), a zatim provjerava da li je ispunjen uslov. Ako je uslov ispunjen ponovo se vraća na izvršavanje ciklusa, a ako uslov više nije ispunjen, izlazi se iz petlje.

(negativna logika)

uslov

ISTINA

tijelopetlje

LAŽ

Ciklus će se izvršavati sve dok uslov nije ispunjen (mora bar jedamput)

Prvo se izvršava tijelo petlje (ciklus), a zatim provjerava da li je ispunjen uslov. Ako uslov nije ispunjen ponovo se vraća na izvršavanje ciklusa, a ako je uslov ispunjen, izlazi se iz petlje.

Primjer 1.26. Dijagramom toka predstaviti algoritam koji N puta ispisuje riječ "ALGORITAM" korišćenjem petlje s izlazom na dnu u pozitivnoj logici.

POČETAK

N

"ALGORITAM"

KRAJ

b = 1

b <= N

LAŽ

b = b + 1

N < 1

LAŽ

ISTINA

ISTINA

Primjer 1.27. Dijagramom toka predstaviti algoritam koji N puta ispisuje riječ "ALGORITAM" korišćenjem petlje s izlazom na dnu u negativnoj logici.

POČETAK

N

"ALGORITAM"

KRAJ

b = 1

b > N

ISTINA

b = b + 1

N > 0

ISTINA

LAŽ

LAŽ

16

Page 17: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.28. Dijagramom toka predstaviti algoritam koji učitava ocjene nekog studenta sve dok se ne unese nula, a zatim ispisuje prosjek ocjena.

Promjenljivom N brojaćemo unesene ocjene. Na početku postavimo da je N=0, jer nismo unijeli nijednu ocjenu. Učitavaćemo ocjene sve dok se ne unese nula. Svaki put kad učitamo ocjenu saberemo je sa prethodno učitanim ocjenama, zato na početku treba postaviti početnu vrijednost za sumu (S=0). Kad izađemo iz petlje N će pokazivati ukupan broj unosa, tj. biće već za jedan u odnosu na stvarni broj ocjena jer je prebrojana i unesena nula. Zato prilikom računanja prosjeka treba dijeliti sa (N-1). Mora se obratiti pažnja ako nije unesena nijedna ocjena da ne dođe do dijeljenja s nulom.

S = 0

S = S + ocj

N = 0

pros

POČETAK

ocj

KRAJ

N = N + 1

ocj = 0

ISTINA

pros = S / N

N > 1ISTINA LAŽ

LAŽ

"Nemaocjena"

Primjer 1.29. Euklidovim algoritmom odrediti najveći zajednički djelilac (mjeru) dva prirodna broja.

Euklidov algoritam veoma brzo određuje najveći zajednički djelilac dva broja. Pretpostavimo da tražimo NZD(200,120). Tada imamo

X Y ostatak

200 120 80

120 80 40

80 40 0

40 0

MJERA IZLAZNI KRITERIJUM

KRAJ

POČETAK

X, Y

X

Y = 0

ISTINA

ost = X MOD Y

X<1 ∨ Y<1LAŽ

ISTINA

LAŽ

P = XX = YY = P

X < YISTINA LAŽ

X = Y

Y = ost

17

Page 18: algoritmi

Dražen Brđanin: Osnove programiranja

Primjer 1.30. Dijagramom toka predstaviti algoritam koji sabira sve članove reda

∑∞

=1

1

k k

veće od zadanog ε.

K = 1

S = 0

S

KRAJ

CLAN > ε

LAŽ

ISTINA

POČETAK

ε

ε > 1LAŽ

ISTINA

S = S+CLAN

CLAN = 1/K

K = K + 1

Primjer 1.31. Dijagramom toka predstaviti algoritam koji računa drugi korijen iz pozitivnog realnog broja na četiri decimale koristeći Njutnovu iterativnu formulu

...,,, 2 1 0 2

21

1

0

=+

=

+=

+ nxxx

x

xx

nn

n

x1 = (x+1) / 2

ε = 0.0001

x1

KRAJ

LAŽ

ISTINA

POČETAK

x

LAŽ

ISTINAx < 0

x1 = (x0 + x/x0) / 2

x0 = x1

x1 – x0> ε

18

Page 19: algoritmi

Dražen Brđanin: Osnove programiranja

Zadaci za vježbu

Linearne algoritamske strukture

1. Razviti algoritam koji učitava dužinu stranice kvadrata (a), a zatim računa i ispisuje njegov obim i površinu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

2. Razviti algoritam koji učitava dužinu strane kocke (a), a zatim računa i ispisuje njenu zapreminu i površinu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

3. Razviti algoritam koji učitava dužine stranice pravougaonika (a i b), a zatim računa i ispisuje njegov obim i površinu te dužinu dijagonale. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

4. Razviti algoritam koji učitava dužine strana dužine strana pravougaone prizme (a, b, c), a zatim računa i ispisuje njenu zapreminu i površinu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

5. Razviti algoritam koji učitava temperaturu izraženu u °C, a zatim ispisuje koliko je to K. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

6. Razviti algoritam koji učitava ugao izražen u stepenima, minutama i sekundama, a zatim ispisuje koliko je to ukupno stepeni. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

7. Razviti algoritam koji učitava ugao izražen u stepenima, minutama i sekundama, a zatim ispisuje koliko je to radijana. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

8. Razviti algoritam koji učitava ugao izražen u radijanima, a zatim ispisuje koliko je to stepeni. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

9. Razviti algoritam koji učitava ugao izražen u radijanima, a zatim ispisuje koliko je to stepeni, minuta i sekundi (stepeni, minute i sekunde su cjelobrojni). Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

Razgranate algoritamske strukture

1. Razviti algoritam koji učitava dva broja, a zatim ispisuje manji broj. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

2. Razviti algoritam koji učitava tri broja, a zatim ispisuje najmanjeg. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

3. Razviti algoritam koji učitava broj. Ako učitani broj nije negativan ispisati njegov kvadratni korijen, a ako jeste negativan ispisati njegov treći korijen. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

4. Razviti algoritam koji učitava prirodan broj manji od 100, a zatim ispisuje zbir njegovih cifara. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

5. Razviti algoritam koji učitava prirodan broj manji od 1000, a zatim ispisuje zbir njegovih cifara. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

6. Razviti algoritam koji učitava koeficijente kvadatne jednačine ax2+bx+c=0, a zatim računa i ispisuje rješenja te jednačine. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

7. Razviti algoritam koji za učitani redni broj dana u sedmici ispisuje njegov naziv (ponedjeljak, utorak, ... , nedjelja). Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

8. Razviti algoritam koji za učitani redni broj mjeseca u godini ispisuje naziv mjeseca (januar, februar, ... , decembar). Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

9. Razviti algoritam koji učitava dva broja i odgovarajući operator (+, -, *, / ), a zatim ispisuje rezultat željene operacije. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

Cikličke algoritamske strukture

1. Razviti algoritam koji računa zbir prvih n članova harmonijskog reda

∑∞

=

+++++=1

...1..31

2111

n nn

korištenjem a) brojačke petlje; b) petlje sa izlazom na vrhu; c) petlje sa izlazom na dnu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

2. Razviti algoritam koji učitava prirodan broj, a zatim ispisuje sve parne brojeve manje od njega. Zadatak riješiti korištenjem a) brojačke petlje; b) petlje sa izlazom na vrhu; c) petlje sa izlazom na dnu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

3. Razviti algoritam koji tabelarno ispisuje vrijednosti funkcije f(x)=2x+3, za vrijednosti argumenta x∈[0,1], s korakom ∆x=0.1. Zadatak riješiti korištenjem a) brojačke petlje; b) petlje sa izlazom na vrhu; c) petlje sa izlazom na dnu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

4. Razviti algoritam koji tabelarno ispisuje vrijednosti funkcije f(x)=ex, za vrijednosti argumenta x∈[0,2], s korakom ∆x=0.25. Zadatak riješiti korištenjem a) brojačke petlje; b) petlje sa izlazom na vrhu; c) petlje sa izlazom na dnu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

5. Učitati n brojeva, a zatim ispisati koliko među njima ima pozitivnih. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

6. Učitati n brojeva, a zatim ispisati koliko među njima ima pozitivnih, kao i njihovu aritmetičku sredinu. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

7. Učitati n brojeva, a zatim ispisati najvećeg. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

8. Učitati n brojeva, a zatim ispisati najmanjeg, kao i njegov redni broj. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

9. Ispisati sve savršene brojeve manje od 1000. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

10. Ispisati sve proste brojeve manje od 100. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

11. Ispisati sve dvocifrene proste brojeve. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

12. Učitati broj pa provjeriti da li je Armstrongov. Broj je Armstrongov ako je jednak zbiru kubova svojih cifara. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

13. Ispisati Armstrongove brojeve manje od 1000. Algoritam predstaviti prirodnim jezikom, pseudokodom i dijagramom toka.

19