poglavlje09_algoritmi

58
9. Algoritamski prikaz postupaka obrade podataka U okviru ovog poglavlja, dat je formalizovani prikaz nekih postupaka za pro- gramsko rešavanje izabranih problema iz oblasti matematike i struktura podata- ka. Postupci su prikazani u formi algoritama, korišćenjem formalnog jezika, pod nazivom pseudokod. Pseudokod predstavlja formalni proceduralno orijentisani jezik, konstruisan tako da bude u što manjoj meri zavisan od bilo kog realnog programskog jezika, a u što većoj meri prilagođen potrebama algoritamskog načina iskazivanja pos- tupaka za obradu podataka. Saglasno ovim činjenicama i iskazanom edukativ- nom karakteru samog priručnika, za službene reči pseudokoda su izabrane odgovarajuće reči srpskog jezika. Detaljniji opis sintakse pseudokoda izlazi izvan okvira ovog priručnika. U tom smislu, čitalac se upućuje na literaturu u kojoj takav opis postoji [Mo]. Izborom pseduokoda, kao sredstva za prikaz algoritama, stvaraju se osnove za njihovu relativno laku implementaciju u izabranom programskom okruženju i putem izabranog proceduralno orijentisanog programskog jezika. Izabrani problemi i postupci za njihovo rešavanje, za koje je u ovom priručniku dat algoritamski prikaz, podeljeni su u pet grupa. Prvu grupu čine elementarni i logički vrlo jednostavni problemi, namenjeni da bi se na njima uvežbalo korišćenje osnovnih proceduralnih konstrukcija (selekcija, sekvenca i iteracija) i

Upload: marko-markovic

Post on 22-Oct-2014

29 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Poglavlje09_Algoritmi

9.

Algoritamski prikaz postupaka obrade podataka

U okviru ovog poglavlja, dat je formalizovani prikaz nekih postupaka za pro-gramsko rešavanje izabranih problema iz oblasti matematike i struktura podata-ka. Postupci su prikazani u formi algoritama, korišćenjem formalnog jezika, pod nazivom pseudokod.

Pseudokod predstavlja formalni proceduralno orijentisani jezik, konstruisan tako da bude u što manjoj meri zavisan od bilo kog realnog programskog jezika, a u što većoj meri prilagođen potrebama algoritamskog načina iskazivanja pos-tupaka za obradu podataka. Saglasno ovim činjenicama i iskazanom edukativ-nom karakteru samog priručnika, za službene reči pseudokoda su izabrane odgovarajuće reči srpskog jezika. Detaljniji opis sintakse pseudokoda izlazi izvan okvira ovog priručnika. U tom smislu, čitalac se upućuje na literaturu u kojoj takav opis postoji [Mo].

Izborom pseduokoda, kao sredstva za prikaz algoritama, stvaraju se osnove za njihovu relativno laku implementaciju u izabranom programskom okruženju i putem izabranog proceduralno orijentisanog programskog jezika.

Izabrani problemi i postupci za njihovo rešavanje, za koje je u ovom priručniku dat algoritamski prikaz, podeljeni su u pet grupa. Prvu grupu čine elementarni i logički vrlo jednostavni problemi, namenjeni da bi se na njima uvežbalo korišćenje osnovnih proceduralnih konstrukcija (selekcija, sekvenca i iteracija) i

Page 2: Poglavlje09_Algoritmi

236. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

osnovnih tipova podataka. Drugu grupu čine problemi iz oblasti izgradnje i upotrebe struktura podataka. Obrađeni su neki postupci nad linearnim struktu-rama podataka sa sekvencijalnom i spregnutom reprezentacijom (rad sa struk-turama tipa jednodimenzionalnog niza, matrica, spregnutih lista i stekova). Treća grupa problema je posvećena rekurzivnom načinu iskazivanja postupaka obrade podataka. U četvrtoj grupi problema obrađeni su postupci za obavljanje nekih aritmetičkih i skupovnih operacija, kao i postupci za transformisanje zapisa broja iz jednog u drugi brojni sistem. Peta grupa je posvećena nekim nu-meričkim problemima i tehnici koričćenja iterativnih konstrukcija s uslovom koji se svodi na zadovoljenje zadate tačnosti izračunavanja.

9.1. Rad s operatorima i funkcijama

Algoritam 9.1.1. Određivanje idealne težine, na osnovu zadate visine

/* Zadatak: • Izračunati "idealnu" težinu osobe, na osnovu zadate visine. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Poznavanje formule za izračunavanje idealne težine, na osnovu zadate visine

osobe. */

TIP Visina_Tip = {d ∈ ℕ | d ≥ 110 ∧ ≤ 250}

TIP Težina_Tip = {d ∈ ℚ | d ≥ 10 ∧ ≤ 150.0} FUNKCIJA Idealna_težina ( UL Visina ∈ Visina_Tip ) VRAĆA Težina_tip POČETAK FUNKCIJE Idealna_težina Idealna_težina ← Visina - 100 KRAJ FUNKCIJE Idealna_težina

Page 3: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 237.

Algoritam 9.1.2. Zamena vrednosti argumenata procedure (swap)

/* Zadatak: • Zameniti vrednosti ulaznih argumenata procedure. */ PROCEDURA Zameni_argumente ( UI Arg1 ∈ Def_Tip, UI Arg2 ∈ Def_Tip ) Argp ∈ Def_Tip // Pomoćna promenljiva za zamenu vrednosti POČETAK PROCEDURE Zameni_argumente Argp ← Arg1 Arg1 ← Arg2 Arg2 ← Arg1 KRAJ PROCEDURE Zameni_argumente

Algoritam 9.1.3. Indikacija pranosti broja

/* Zadatak: • Indikovati da li je zadati ceo broj paran ili ne. Polazne pretpostavke: • Izvršilac algoritma poznaje operaciju celobrojnog deljenja (oznaka /). • Izvršilac algoritma poznaje operaciju poređenja =. • Izvršilac algoritma ne poznaje operaciju dobijanja ostatka pri celobrojnom

deljenju. */

FUNKCIJA Paran_broj ( UL Broj ∈ ℤ ) VRAĆA Boolean POČETAK FUNKCIJE Paran_broj Paran_broj ← (Broj - (Broj / 2) ∗ 2) = 0 KRAJ FUNKCIJE Paran_broj

Page 4: Poglavlje09_Algoritmi

238. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.1.4. Indikacija znaka broja (sign)

/* Zadatak: • Indikovati da li je zadati realan broj pozitivan ili ne. Polazne pretpostavke: • Izvršilac algoritma poznaje operacije poređenja {<, >, =, ≤, ≥, ≠}. */

FUNKCIJA Pozitivan ( UL Broj ∈ ℝ ) VRAĆA Boolean POČETAK FUNKCIJE Pozitivan Pozitivan ← Broj > 0 KRAJ FUNKCIJE Pozitivan

Algoritam 9.1.5. Izbor veće vrednosti argumenta (max)

/* Zadatak: • Izabrati veću, od zadatih vrednosti dva argumenta. Polazne pretpostavke: • Izvršilac algoritma poznaje operacije poređenja {<, >, =, ≤, ≥, ≠} nad datim

tipom podatka. */ FUNKCIJA Maksimum ( UL Arg1 ∈ Def_Tip, UL Arg2 ∈ Def_Tip ) VRAĆA Def_Tip POČETAK FUNKCIJE Maksimum AKO JE Arg1 > Arg2 TADA Maksimum ← Arg1 INAČE Maksimum ← Arg2 KRAJ AKO KRAJ FUNKCIJE Maksimum

Page 5: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 239.

Algoritam 9.1.6. Određivanje znaka broja (sign)

/* Zadatak: • Izračunati vrednost funkcije f(x) = sgn(x), za realni argument x. */ TIP Znak_Tip = {-1, 0, 1}

FUNKCIJA Znak ( UL Arg ∈ ℝ ) VRAĆA Znak_Tip POČETAK FUNKCIJE Znak AKO JE Arg > 0 TADA Znak ← 1 INAČE AKO JE Arg = 0 TADA Znak ← 0 INAČE Znak ← -1 KRAJ AKO KRAJ FUNKCIJE Znak

Algoritam 9.1.7. Izračunavanje ostatka pri celobrojnom deljenju (mod)

/* Zadatak: • Izračunati ostatak pri celobrojnom deljenju dva cela broja. Polazne pretpostavke: • Izvršilac algoritma poznaje operaciju celobrojnog deljenja. • Izvršilac algoritma ne poznaje operaciju dobijanja ostatka pri celobrojnom

deljenju. */

FUNKCIJA Moduo ( UL Deljenik ∈ ℤ, UL Delilac ∈ ℤ ) VRAĆA ℤ POČETAK FUNKCIJE Moduo Moduo ← Deljenik - (Deljenik / Delilac) ∗ Delilac KRAJ FUNKCIJE Moduo

Page 6: Poglavlje09_Algoritmi

240. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.1.8. Izračunavanje stepena broja u skupu celih brojeva (power)

/* Zadatak:

• Izračunati funkciju stepena broja f(x, n) = xn, za x ∈ ℤ i n ∈ ℕ0. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma ne poznaje operaciju stepenovanja. */

FUNKCIJA CStepen ( UL x ∈ ℤ, UL n ∈ ℕ0 ) VRAĆA ℤ

z ∈ ℤ // Promenljiva za memorisanje međurezultata POČETAK FUNKCIJE CStepen z ← 1 RADI Množenje DOK JE n ≠ 0 z ← z ∗ x n ← n − 1 KRAJ RADI Množenje CStepen ← z KRAJ FUNKCIJE CStepen

Algoritam 9.1.9. Izračunavanje stepena broja u skupu realnih brojeva (power)

/* Zadatak:

• Izračunati funkciju stepena broja f(x, y) = xy, za x, y ∈ ℝ i x > 0. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma poznaje funkcije f(x) = ln(x) i f(x) = ex (oznake funkcija

su: ln i exp). • Poznavanje načina prikaza funkcije f(x, y) = xy putem funkcija f(x) = ln(x) i

f(x) = ex. */

TIP ℝ+ = {d ∈ ℝ | d > 0}

FUNKCIJA RStepen ( UL x ∈ ℝ+, UL y ∈ ℝ ) VRAĆA ℝ POČETAK FUNKCIJE RStepen RStepen ← exp(y ∗ ln(x)) KRAJ FUNKCIJE RStepen

Page 7: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 241.

Algoritam 9.1.10. Odsecanje razlomljenog broja na zadatoj poziciji (trunc)

/* Zadatak:

• Odseći broj x ∈ ℝ na zadatoj decimalnoj, ili celobrojnoj poziciji n ∈ ℤ. • Vrednost n ≥ 1, znači da se broj odseca na zadatoj decimalnoj poziciji. • Vrednost n < 1, znači da se broj odseca na zadatoj celobrojnoj poziciji. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije i funkciju f(x) =

abs(x). • Izvršilac algoritma poznaje automatsku konverziju podatka iz realnog u

celobrojni tip i obratno, prilikom dodele vrednosti.

• Izvršilac algoritma poznaje funkciju stepenovanja CStepen(x, n), za x ∈ ℤ i n ∈ ℕ0.

• Izvršilac algoritma ne poznaje funkciju odsecanja, ili zaokruživanja vrednosti broja.

*/

FUNKCIJA Odsecanje ( UL x ∈ ℝ,

UL n ∈ ℤ ) VRAĆA ℝ

p ∈ ℕ0 // Stepen 10n

z ∈ ℤ // Pomoćna promenljiva za konverziju tipa broja POČETAK FUNKCIJE Odsecanje p ← Cstepen(10, abs(n)) AKO JE n ≥ 1 TADA z ← x ∗ p x ← z Odsecanje ← x / p INAČE z ← x / p x ← z Odsecanje ← x ∗ p KRAJ AKO KRAJ FUNKCIJE Odsecanje

Page 8: Poglavlje09_Algoritmi

242. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.1.11. Zaokruživanje razlomljenog broja na zadatoj poziciji (round)

/* Zadatak:

• Zaokružiti broj x ∈ ℝ na zadatoj decimalnoj, ili celobrojnoj poziciji n ∈ ℤ. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije i funkciju f(x) =

abs(x). • Izvršilac algoritma poznaje automatsku konverziju podatka iz realnog u

celobrojni tip i obratno, prilikom dodele vrednosti.

• Izvršilac algoritma poznaje funkciju stepenovanja CStepen(x, n), za x ∈ ℤ i n ∈ ℕ0.

• Izvršilac algoritma ne poznaje funkciju odsecanja, ili zaokruživanja vrednosti broja.

*/

FUNKCIJA Zaokruživanje ( UL x ∈ ℝ,

UL n ∈ ℤ ) VRAĆA ℝ p ∈ ℕ0 // Stepen 10n

z ∈ ℤ // Pomoćna promenljiva za konverziju tipa broja POČETAK FUNKCIJE Zaokruživanje p ← Cstepen(10, abs(n)) AKO JE n ≥ 1 TADA z ← x ∗ p + 0.5 x ← z Zaokruživanje ← x / p INAČE z ← x / p + 0.5 x ← z Zaokruživanje ← x ∗ p KRAJ AKO KRAJ FUNKCIJE Zaokruživanje

Page 9: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 243.

Algoritam 9.1.12. Kosi hitac

/* Zadatak: • Prema formuli za parabolu kosog hica, algoritam simulira gađanje cilja na

zadatom odstojanju, lansiranjem projektila. • Odstojanje cilja (m) se zadaje u odnosu na mesto lansera projektila. Cilj se

smatra pogođenim, ako je projektil pao u tolerantno područje cilja, pri čemu se tolerancija - tačnost pogotka (m) zadaje na početku postupka.

• Svaki projektil se lansira pod zadatim uglom (0) u odnosu na zemljinu površinu i sa zadatom početnom brzinom (m/s).

• Postupak započinje lansiranjem prvog projektila. Ukoliko je cilj pogođen, postupak se završava. U protivnom, postupak se ponavlja lansiranjem sledećeg projektila.

Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma poznaje funkcije f(ϕ) = sin(ϕ) (ϕ - radijani) i f(x) = abs(x). • Poznavanje formule za izračunavanje mesta pada projektila na zemljinu

površinu, prema modelu kosog hica: D = v02 ⋅ sin2ϕ / g.

*/

TIP RealPozit_Tip = {d ∈ ℝ | d ≥ 0}

TIP Ugao_Tip = {d ∈ ℕ0 | d < 90} PROCEDURA Kosi_hitac ( UL Odstojanje ∈ RealPozit_Tip, // Odstojanje cilja od lansera UL Tolerancija ∈ RealPozit_Tip // Dozvoljena tolerancija pogotka ) FUNKCIJA Provera_pogotka ( UL Odstojanje ∈ RealPozit_Tip, UL Tolerancija ∈ RealPozit_Tip, UL PočBrzina ∈ RealPozit_Tip, UL Ugao ∈ Ugao_Tip ) VRAĆA Boolean // Funkcija proverava da li je lansirani projektil pogodio cilj ili ne. KONSTANTA π ∈ RealPozit_Tip ← 3.14 // Pi KONSTANTA g ∈ RealPozit_Tip ← 9.81 // Ubrzanje zemljine teže Mesto_pada ∈ RealPozit_Tip // Odstojanje mesta pada projektila od lansera

Page 10: Poglavlje09_Algoritmi

244. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

POČETAK FUNKCIJE Provera_pogotka Mesto_pada ← PočBrzina ∗ PočBrzina ∗ sin(Ugao ∗ 2 ∗ π / 180) / g Provera_pogotka ← abs(Mesto_pada - Odstojanje) ≤ Tolerancija KRAJ FUNKCIJE Provera_pogotka PočBrzina ∈ RealPozit_Tip // Početna brzina projektila Ugao ∈ Ugao_Tip // Ugao lansiranja projektila POČETAK PROCEDURE Kosi_hitac RADI Lansiranje_projektila UČITAJ "Zadajte početnu brzinu projektila (m/s): " PočBrzina UČITAJ "Zadajte ugao lansiranja projektila (0): " Ugao KRAJ RADI Lansiranje_projektila

KAD BUDE Provera_pogotka (Odstojanje, Tolerancija, PočBrzina, Ugao) KRAJ PROCEDURE Kosi_hitac

Page 11: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 245.

Algoritam 9.1.13. Izdvajanje podstringa iz stringa (substr)

/* Zadatak: • Izdvojiti podstring stringa str od zadate pozicije m ∈ ℤ, zadate dužine n ∈ ℕ0, ili

kraćeg, ukoliko podstring dužine n nije moguće izdvojiti zbog ukupne dužine samog stringa.

• Ako je m ≥ 1, pozicija podstringa se izračunava od početka stringa. • Ako je m = 0, tada se uzima da je m = 1. • Ako je m < 0, pozicija podstringa se izračunava od kraja stringa. • Ako je n = 0, algoritam vraća prazan podstring. • Inicijalne vrednosti za m i n su: m = 1 i n = 1.

Polazne pretpostavke: • Izvršilac algoritma poznaje tip podatka String i ima mogućnost da pristupa

svakom elementu (znaku) stringa. • Izvršilac algoritma poznaje binarnu operaciju spajanja (konkatenacije) stringova

||. • Izvršilac algoritma poznaje funkciju izračunavanja dužine stringa Length(str). • Izvršilac algoritma poznaje funkcije nalaženja maksimalne i minimalne vrednosti:

Max(x, y) i Min(x, y). */ FUNKCIJA Podstring ( UL Str ∈ String ← '',

UL m ∈ ℤ ← 1

UL n ∈ ℕ0 ← 1 ) VRAĆA String

D_gran ∈ ℕ // Donja granica za izdvajanje podstringa

G_gran ∈ ℕ // Gornja granica za izdvajanje podstringa Podst ∈ String ← '' // Podstring koji se izdvaja

i ∈ ℕ // Brojač pozicija u ulaznom stringu POČETAK FUNKCIJE Podstring AKO JE m = 0 TADA m ← 1 KRAJ AKO AKO JE m > 0 TADA D_gran ← m INAČE D_gran ← Max(Length(str) + m + 1, 1) KRAJ AKO G_gran ← Min(D_gran + n - 1, Length(str)) i ← D_gran RADI izdvoj_podstring DOK JE i ≤ G_gran Podst ← Podst || Str[i] i ← i + 1 KRAJ RADI izdvoj_podstring Podstring ← Podst KRAJ FUNKCIJE Podstring

Page 12: Poglavlje09_Algoritmi

246. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.1.14. Zamena podstringa drugim podstringom u stringu (replace)

/* Zadatak: • Zameniti svaku pojavu podstringa ukloni iz stringa str podstringom upiši. • Ukoliko se vrednost stringa za zamenu upiši ne navede, podrazumeva se da

je to prazan string ''. • Ukoliko je vrednost podstringa ukloni prazan string, ili nije sadržana u stringu

str, tada str treba da ostane nepromenjen. • Algoritam, kao izlazni podatak, vraća logičku vrednost true, ili false, u

zavisnosti od toga da li je polazni string str modifikovan, ili ne. Polazne pretpostavke: • Izvršilac algoritma poznaje tip podatka String i operaciju spajanja stringova

||. • Izvršilac algoritma poznaje funkciju izdvajanja podstringa Podstring(str, m,

n) i funkciju izračunavanja dužine stringa Length(str). */ PROCEDURA Zameni_podstr ( UI Str ∈ String ← '', // Polazni string UL Ukloni ∈ String, // Podstring koji se menja UL Upiši ∈ String ← '', // Podstring koji zamenjuje IZ Indikator ∈ Boolean // Indikator modifikacije stringa Str )

i ∈ ℕ // Brojač pozicija u ulaznom stringu

Duzstr ∈ ℕ // Dužina ulaznog stringa

Duzpods ∈ ℕ // Dužina podstringa za zamenu

Pomstr ∈ String ← '' // Pomoćni (novoformirani) string POČETAK PROCEDURE Zameni_podstr Indikator ← false // Polazni string, inicijalno, nije modifikovan AKO JE Ukloni != '' TADA Duzstr ← Length(Str) Duzpods ← Length(Ukoloni) i ← 1 RADI prolaz_stringa DOK JE i ≤ Duzstr AKO JE Ukloni = Podstring(Str, i, Duzpods) TADA Pomstr ← Pomstr || Upiši Indikator ← true // Polazni string se modifikuje i ← i + Duzpods INAČE Pomstr ← Pomstr || Str[i] i ← i + 1 KRAJ AKO

Page 13: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 247.

KRAJ RADI prolaz_stringa KRAJ AKO AKO JE Indikator TADA Str ← Pomstr KRAJ AKO KRAJ PROCEDURE Zameni_podstr

Algoritam 9.1.15. Datum poslednjeg dana u mesecu

/* Zadatak: • Za zadati datum, odrediti datum poslednjeg dana u mesecu kojem pripada

navedeni datum. Polazne pretpostavke: • Izvršilac algoritma poznaje datumski tip podatka Date, aritmetiku s

datumima, funkcije Day(Datum), Month(Datum), Year(Datum), koje vraćaju, redom, u obliku stringa, redni broj dana (DD), meseca (MM) i godine (GGGG), za zadati datum i funkciju To_Date(Str), koja datum, zadat u obliku stringa, konvertuje u datum, zadat putem datumskog tipa podatka.

• Pretpostaviti da se datum zapisuje u obliku 'DD.MM.GGGG'. • Izvršilac algoritma poznaje funkciju To_Number(str), koja broj, zadat u obliku

stringa, konvertuje u broj, zadat putem numeričkog tipa podatka. */ FUNKCIJA Poslednji_dan ( UL Datum ∈ Date ) VRAĆA Date POČETAK FUNKCIJE Poslednji_dan AKO JE Month(Datum) ∈ {'01', '03', '05', '07', '08', '10', '12'} TADA Poslednji_dan ← To_Date('31.' || Month(Datum) || '.' || Year(Datum)) INAČE AKO JE Month(Datum) ∈ {'04', '06', '09', '11'} TADA Poslednji_dan ← To_Date('30.' || Month(Datum) || '.' || Year(Datum)) INAČE AKO JE Moduo(To_Number(Year(Datum)), 4) = 0 TADA Poslednji_dan ← To_Date('29.02.' || Year(Datum)) INAČE Poslednji_dan ← To_Date('28.02.' || Year(Datum)) KRAJ AKO KRAJ FUNKCIJE Poslednji_dan

Page 14: Poglavlje09_Algoritmi

248. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

9.2. Linearne strukture podataka

Algoritam 9.2.1. Linearno traženje u nizu

/* Zadatak: • Realizovati metodu linearnog traženja elementa u uređenom nizu od N

elemenata, na osnovu zadatog argumenta traženja. • Algoritam, kao izlazne podatke, vraća: indikator uspešnosti traženja (logičku

vrednost true, ili false) i indeks elementa (poziciju u nizu), na kojem je traženje završeno. Za neuspešno traženje, indeks ukazuje na poziciju prvog većeg elementa niza od traženog.

Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza elemenata

Array i obezbeđuje pristup i-tom elementu niza navođenjem njegovog indeksa, npr. Niz[i].

*/

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza

TIP Niz_celobElem = Array[1..Q] of ℤ // Tip niza celobrojnih elemenata PROCEDURA Lin_traženje ( UI Niz ∈ Niz_celobElem, // Niz u kojem se vrši traženje UL N ∈ {0,..., Q}, // Aktuelna dužina niza

UL Arg ∈ ℤ, // Argument traženja IZ Ind ∈ Boolean ← false, // Indikator uspešnosti traženja IZ Indeks ∈ {1,..., N+1} ← 1 // Indeks traženog elementa ) POČETAK PROCEDURE Lin_traženje RADI traži_element DOK JE Indeks ≤ N ∧ Arg > Niz[Indeks] Indeks ← Indeks + 1 // Traženje se nastavlja na sledećem elementu KRAJ RADI traži_element AKO JE Indeks ≤ N ∧ Arg = Niz[Indeks] TADA Ind ← true // Traženje se uspešno završava KRAJ AKO KRAJ PROCEDURE Lin_traženje

Page 15: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 249.

Algoritam9.2.2. Binarno traženje u nizu

/* Zadatak: • Realizovati metodu binarnog traženja elementa u uređenom nizu od N

elemenata, na osnovu zadatog argumenta traženja. • Algoritam, kao izlazne podatke, vraća: indikator uspešnosti traženja (logičku

vrednost true, ili false) i indeks elementa (poziciju u nizu), na kojem je traženje završeno. Za neuspešno traženje, indeks ukazuje na poziciju prvog većeg elementa niza od traženog.

Polazne pretpostavke: • Iste kao u prethodnom zadatku. • Izvršilac algoritma poznaje funkcije prvog ne manjeg celog broja od x: f(x) =

x i prvog ne većeg celog broja od x: f(x) = x, za x ∈ ℝ. */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza

TIP Niz_celobElem = Array[1..Q] of ℤ // Tip niza celobrojnih elemenata PROCEDURA Bin_traženje ( UI Niz ∈ Niz_celobElem, // Niz u kojem se vrši traženje UL N ∈ {0,..., Q}, // Aktuelna dužina niza

UL Arg ∈ ℤ, // Argument traženja IZ Ind ∈ Boolean ← false, // Indikator uspešnosti traženja IZ Indeks ∈ {1,..., N+1} ← 1 // Indeks traženog elementa )

D_g ∈ {0,..., N} ← 0 // Donja granica podniza G_g ∈ {1,..., N+1} ← N+1 // Gornja granica podniza

POČETAK PROCEDURE Bin_traženje RADI traži_element DOK JE (G_g - D_g) ≥ 2 ∧ ¬Ind Indeks ← (G_g + D_g) / 2 // Nastavak traženja na "srednjem" elementu AKO JE Arg = Niz[Indeks] TADA Ind ← true // Traženje se uspešno završava INAČE AKO JE Arg < Niz[Indeks] TADA G_g ← Indeks // Traženje se nastavlja u "donjoj" polovini niza INAČE D_g ← Indeks // Traženje se nastavlja u "gornjoj" polovini niza KRAJ AKO KRAJ RADI traži_element AKO JE ¬Ind ∧ N ≠ 0 ∧ Arg > Niz[Indeks] TADA Indeks ← Indeks + 1 KRAJ AKO KRAJ PROCEDURE Bin_traženje

Page 16: Poglavlje09_Algoritmi

250. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.2.3. Upis novog elementa u uređeni niz

/* Zadatak: • Realizovati upis novozadatog elementa u uređeni niz, ukoliko element sa

zadatom vrednošću ne postoji u nizu. • Algoritam, kao izlazne podatke, vraća: indikator uspešnosti upisa

ind ∈ {0, 1, 2}, 0 - uspešan upis, 1 - element već postoji u nizu i 2 - niz prelazi maksimalnu deklarisanu dužinu) i indeks elementa (poziciju u nizu), na kojem je pokušaj upisa završio.

Polazne pretpostavke: • Izvršilac algoritma poznaje proceduru binarnog traženja Bin_traženje(Niz, N,

Arg, Ind, Indeks). */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza

TIP Niz_celobElem = Array[1..Q] of ℤ // Tip niza celobrojnih elemenata PROCEDURA Upis_u_niz ( UI Niz ∈ Niz_celobElem, // Niz u koji se upisuje element UI N ∈ {0,..., Q}, // Aktuelna dužina niza

UL Arg ∈ ℤ, // Vrednost elementa IZ Ind ∈ {0, 1, 2} ← 0, // Indikator uspešnosti upisa IZ Indeks ∈ {1,..., N+1} // Indeks mesta za pokušaj upisa )

IndTR ∈ Boolean // Indikator uspešnosti traženja Idx ∈ {1,..., N} ← N // Indeks za pomeranje elemenata

POČETAK PROCEDURE Upis_u_niz AKO JE N < Q TADA Bin_traženje(Niz, N, Arg, IndTR, Indeks) AKO JE ¬IndTR TADA RADI pomeranje_elemenata DOK JE Idx ≥ Indeks Niz[Idx+1] ← Niz[Idx] Idx ← Idx - 1 KRAJ RADI pomeranje_elemenata Niz[Indeks] ← Arg N ← N + 1 INAČE Ind ← 1 // Element, koji se želi upisati, već postoji u nizu KRAJ AKO INAČE Ind ← 2 // Niz prelazi maksimalnu deklarisanu dužinu KRAJ AKO KRAJ PROCEDURE Upis_u_niz

Page 17: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 251.

Algoritam 9.2.4. Fizičko brisanje elementa iz uređenog niza

/* Zadatak: • Realizovati fizičko brisanje elementa iz uređenog niza, ukoliko element sa

zadatom vrednošću već postoji u nizu. • Algoritam, kao izlazne podatke, vraća: indikator uspešnosti brisanja

ind ∈ {true, false} i indeks (poziciju u nizu) elementa, na kojem je pokušaj brisanja završio.

Polazne pretpostavke: • Izvršilac algoritma poznaje proceduru binarnog traženja Bin_traženje(Niz, N,

Arg, Ind, Indeks). */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza

TIP Niz_celobElem = Array[1..Q] of ℤ // Tip niza celobrojnih elemenata PROCEDURA Brisanje_niz ( UI Niz ∈ Niz_celobElem, // Niz iz kojeg se briše UI N ∈ {0,..., Q}, // Aktuelna dužina niza

UL Arg ∈ ℤ, // Vrednost elementa IZ Ind ∈ Boolean ← true, // Indikator uspešnosti IZ Indeks ∈ {1,..., N+1} // Indeks mesta za brisanje ) IndTR ∈ Boolean // Indikator uspešnosti traženja Idx ∈ {1,..., N} // Indeks za pomeranje elemenata POČETAK PROCEDURE Brisanje_niz Bin_traženje(Niz, N, Arg, IndTR, Indeks) AKO JE IndTR TADA Idx ← Indeks RADI pomeranje_elemenata DOK JE Idx < N Niz[Idx] ← Niz[Idx+1] Idx ← Idx + 1 KRAJ RADI pomeranje_elemenata N ← N - 1 INAČE Ind ← false // Element, koji se želi brisati, ne postoji u nizu KRAJ AKO KRAJ PROCEDURE Brisanje_niz

Page 18: Poglavlje09_Algoritmi

252. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.2.5. Uređivanje niza metodom direktnog izbora

/* Zadatak: • Realizovati uređivanje elemenata niza u neopadajući redosled, metodom

direktnog izbora.

Polazne pretpostavke: • Izvršilac algoritma poznaje proceduru Zameni_argumente(arg1, arg2). */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza

TIP Niz_celobElem = Array[1..Q] of ℤ // Tip niza celobrojnih elemenata PROCEDURA Sort_niz_dz ( UI Niz ∈ Niz_celobElem, // Niz koji se uređuje UL N ∈ {0,..., Q} // Aktuelna dužina niza )

/* Zadatak funkcije je da pronađe indeks elementa koji ima najmanju vrednost u

podnizu čije su granice određene indeksima D_g i G_g. */ FUNKCIJA Najmanji_član ( UL Niz ∈ Niz_celobElem, // Niz u kojem se traži UL D_g ∈ {1,..., Q}, // Donja granica UL G_g ∈ {1,..., Q} // Gornja granica ) VRAĆA {1,..., Q} // Indeks najmanjeg elementa niza

Idx ∈ {1,..., Q} ← D_g // Indeks najmanjeg člana podniza

POČETAK FUNKCIJE Najmanji_član D_g ← D_g + 1 RADI traži_najmanji_element DOK JE D_g ≤ G_g AKO JE Niz[D_g] < Niz[Idx] TADA Idx ← D_g KRAJ AKO D_g ← D_g + 1 KRAJ RADI traži_najmanji_element Najmanji_član ← Idx KRAJ FUNKCIJE Najmanji_član

Idx ∈ {1,..., Q} // Indeks najmanjeg člana podniza

POČETAK PROCEDURE Sort_niz_dz RADI prolaz_kroz_niz ZA i ← 1 DO N - 1 Idx ← Najmanji_član(Niz, i, N) AKO JE Idx ≠ i TADA Zameni_argumente(Niz[i], Niz[Idx]) KRAJ AKO KRAJ RADI prolaz_kroz_niz KRAJ PROCEDURE Sort_niz_dz

Page 19: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 253.

Algoritam 9.2.6. Formiranje jednostruko spregnute liste slogova

/* Zadatak: • Realizovati formiranje jednostruko spregnute, uređene liste slogova, na

osnovu uređenog niza elemenata. Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju sloga Record.

Pristup elementu (promenljivoj) sloga je moguć navođenjem naziva promenljive slogovskog tipa, tačke i naziva promenljive, npr. Naziv_sloga.Naziv_prom.

• Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza elemenata varijabilne dužine Varrying Array. Pristup i-tom elementu niza je moguć kao i elementu niza fiksne dužine, npr Niz[i].

*/

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza

TIP Niz_celobElem = Array[1..Q] of ℤ // Tip niza celobrojnih elemenata

TIP Slog = Record ( Ključ ∈ ℤ, // Vrednost elementa strukture

Pok_Sledeći ∈ ℕ // Pokazivač na sledeći element u listi ) // Deklaracija tipa sloga TIP Niz_slog = Varrying Array of Slog // Tip niza slogova, varijabilne dužine PROCEDURA Formiraj_listu ( UL Niz ∈ Niz_celobElem, // Niz od kojeg se formira lista UL N ∈ {0,..., Q}, // Aktuelna dužina niza IZ SprLst ∈ Niz_slog, // Spregnuta lista slogova

IZ Pok_Početak ∈ ℕ ← Null // Pokazivač na početak liste ) POČETAK PROCEDURE Formiraj_listu AKO JE N ≠ 0 TADA Pok_Početak ← 1 SprLst[1].Ključ ← Niz[1] SprLst[1].Pok_Sledeći ← Null RADI prolaz_kroz_niz ZA i ← 2 DO N SprLst[i].Ključ ← Niz[i] SprLst[i].Pok_Sledeći ← Null SprLst[i-1].Pok_Sledeći ← i KRAJ RADI prolaz_kroz_niz KRAJ AKO KRAJ PROCEDURE Formiraj_listu

Page 20: Poglavlje09_Algoritmi

254. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.2.7. Traženje u jednostruko spregnutoj listi, praćenjem pokazivača

/* Zadatak: • Realizovati traženje elementa u jednostruko spregnutoj, uređenoj listi

slogova, metodom praćenja pokazivača, na osnovu zadatog argumenta traženja.

• Algoritam, kao izlazne podatke, vraća: indikator uspešnosti traženja (logičku vrednost true, ili false) i dva indeksa elementa (pozicije u listi slogova), na kojem je traženje završeno.

• Za neuspešno traženje, prvi indeks ukazuje na poziciju neposredno prethodnog elementa liste od traženog, a drugi na poziciju neposredno narednog elementa u listi.

• Za uspešno traženje, prvi indeks ukazuje na poziciju neposredno prethodnog elementa liste od traženog, a drugi na poziciju nađenog elementa u listi.

Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju sloga Record. • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza elemenata

varijabilne dužine Varrying Array. */

TIP Slog = Record ( Ključ ∈ ℤ,

Pok_Sledeći ∈ ℕ ) // Deklaracija tipa sloga TIP Niz_slog = Varrying Array of Slog // Tip niza slogova, varijabilne dužine

PROCEDURA Lista_Traženje ( UL SprLst ∈ Niz_slog, // Spregnuta lista slogova

UL Pok_Početak ∈ ℕ, // Pokazivač na početak liste

UL Arg ∈ ℤ, // Argument traženja IZ Ind ∈ Boolean ← false, // Indikator uspešnosti traženja

IZ Indeks_P ∈ ℕ ← Null // Indeks prethodnog elementa

IZ Indeks_N ∈ ℕ // Indeks traženog elementa )

POČETAK PROCEDURE Lista_Traženje Indeks_N ← Pok_Početak // Tekući element je, inicijalno, prvi element RADI traži_element DOK JE Indeks_N ≠ Null ∧ Arg > SprLst[Indeks_N].Ključ Indeks_P ← Indeks_ // Tekući element postaje prethodni element Indeks_N ← SprLst[Indeks_N].Pok_Sledeći // Prelazak na sledeći element KRAJ RADI traži_element AKO JE Indeks_N ≠ Null ∧ Arg = SprLst[Indeks_N].Ključ TADA Ind ← true // Traženje se uspešno završava KRAJ AKO KRAJ PROCEDURE Lista_Traženje

Page 21: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 255.

Algoritam 9.2.8. Upis elementa u jednostruko spregnutu listu

/* Zadatak: • Realizovati upis novog elementa u jednostruko spregnutu, uređenu listu

slogova, ukoliko takav element već ne postoji u listi. • Algoritam, kao izlazne podatke, vraća: indikator uspešnosti upisa (logičku

vrednost true, ili false) i indeks elementa (poziciju u listi slogova), na kojem je pokušaj upisa završio.

Polazne pretpostavke: • Izvršilac algoritma poznaje proceduru traženja Lista_Traženje(SprLst,

Pok_Početak, Arg, Ind, Indeks_P, Indeks_N). */

TIP Slog = Record ( Ključ ∈ ℤ,

Pok_Sledeći ∈ ℕ ) // Deklaracija tipa sloga TIP Niz_slog = Varrying Array of Slog // Tip niza slogova varijabilne dužine

PROCEDURA Lista_Upis ( UI SprLst ∈ Niz_slog, // Spregnuta lista slogova

UI Pok_Početak ∈ ℕ, // Pokazivač na početak liste

UI N ∈ ℕ0, // Aktuelna dužina liste slogova

UL Arg ∈ ℤ, // Vrednost elementa za upis IZ Ind ∈ Boolean ← false, // Indikator uspešnosti upisa

IZ Indeks_N ∈ ℕ ← Null // Indeks na kojem upis završava )

IndTR ∈ Boolean // Indikator uspešnosti traženja u listi

Indeks_P ∈ ℕ // Indeks prethodnog elementa nakon traženja

POČETAK PROCEDURE Lista_Upis Lista_Traženje(SprLst, Pok_Početak, Arg, IndTR, Indeks_P, Indeks_N) AKO JE ¬IndTR TADA // Element nije pronađen u listi N ← N + 1 SprLst[N].Ključ ← Arg AKO JE Indeks_P = Null TADA // Element se dodaje na početak liste SprLst[N].Pok_Sledeći ← Pok_Početak Pok_Početak ← N INAČE // Element se dodaje u sredinu ili na kraj liste SprLst[N].Pok_Sledeći ← SprLst[Indeks_P].Pok_Sledeći SprLst[Indeks_P].Pok_Sledeći ← N KRAJ AKO Ind ← true // Upis se uspešno završava Indeks_N ← N // Indeks (pozicija) novoupisanog elementa KRAJ AKO KRAJ PROCEDURE Lista_Upis

Page 22: Poglavlje09_Algoritmi

256. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.2.9. Brisanje elementa iz jednostruko spregnute liste

/* Zadatak: • Realizovati brisanje postojećeg elementa iz jednostruko spregnute, uređene

liste slogova, ukoliko takav element postoji u listi. • Algoritam, kao izlazne podatke, vraća: indikator uspešnosti brisanja (logičku

vrednost true, ili false) i indeks elementa (poziciju u listi slogova), na kojem je pokušaj brisanja završio.

Polazne pretpostavke: • Izvršilac algoritma poznaje proceduru traženja Lista_Traženje(SprLst,

Pok_Početak, Arg, Ind, Indeks_P, Indeks_N). */

TIP Slog = Record ( Ključ ∈ ℤ,

Pok_Sledeći ∈ ℕ ) // Deklaracija tipa sloga TIP Niz_slog = Varrying Array of Slog // Tipa niza slogova, varijabilne dužine PROCEDURA Lista_Brisanje ( UI SprLst ∈ Niz_slog, // Spregnuta lista slogova

UI Pok_Početak ∈ ℕ, // Pokazivač na početak liste

UI N ∈ ℕ0, // Aktuelna dužina liste slogova

UL Arg ∈ ℤ, // Vrednost elementa za brisanje IZ Ind ∈ Boolean ← false, // Indikator uspešnosti brisanja

IZ Indeks_N ∈ ℕ ← Null // Indeks na završetku brisanja ) IndTR ∈ Boolean // Indikator uspešnosti traženja u listi Indeks_P ∈ // Indeks prethodnog elementa nakon traženja POČETAK PROCEDURE Lista_Brisanje Lista_Traženje(SprLst, Pok_Početak, Arg, IndTR, Indeks_P, Indeks_N) AKO JE IndTR TADA // Element je pronađen u listi AKO JE Indeks_N = Pok_Početak TADA // Element se briše s početka liste Pok_Početak ← SprLst[Pok_Početak].Pok_Sledeći INAČE // Element se briše iz sredine ili s kraja liste SprLst[Indeks_P].Pok_Sledeći ← SprLst[Indeks_N].Pok_Sledeći AKO JE Indeks_N = N TADA // Briše se poslednji element liste N ← N - 1 KRAJ AKO KRAJ AKO Ind ← true // Brisanje se uspešno završava KRAJ AKO KRAJ PROCEDURE Lista_Brisanje

Page 23: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 257.

Algoritam 9.2.10. Inicijalizacija steka

/* Zadatak: • Realizovati postupak inicijalizacije strukture steka, koja se organizuje putem

niza elemenata (stringova) varijabilne dužine. • Algoritam, pri inicijalizaciji, postavlja vrednost pokazivača (indeksa) na vrh

steka na 0. Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza elemenata

varijabilne dužine Varrying Array. */ TIP Niz_slog = Varrying Array of String // Tip niza slogova, varijabilne dužine FUNKCIJA Stek_Init ( UI Stek ∈ Niz_slog, // Niz varijabilne dužine - stek

) VRAĆA ℕ0 // Pokazivač na vrh (početak) steka POČETAK FUNKCIJE Stek_Init Dealociranje_var_niza(Stek) // Oslobađanje zauzetog memorijskog prostora Stek_Init ← 0 // Vrh (početak) steka se postavlja na 0 KRAJ FUNKCIJE Stek_Init

Algoritam 9.2.11. Upis elementa u stek

/* Zadatak: • Realizovati upis novog elementa u strukturu steka, koja se organizuje putem

niza elemenata (stringova) varijabilne dužine. • Algoritam, pri upisu, preuzima i modifikuje vrednost pokazivača (indeksa) na

vrh steka. Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza elemenata

varijabilne dužine Varrying Array. */ TIP Niz_slog = Varrying Array of String // Tip niza slogova, varijabilne dužine PROCEDURA Stek_Put ( UI Stek ∈ Niz_slog, // Niz varijabilne dužine - stek UL Arg ∈ String, // Vrednost elementa za upis

UI Vrh ∈ ℕ0 // Pokazivač na vrh (početak) ) POČETAK PROCEDURE Stek_Put Vrh ← Vrh + 1 Stek[Vrh] ← Arg KRAJ PROCEDURE Stek_Put

Page 24: Poglavlje09_Algoritmi

258. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.2.12. Preuzimanje i brisanje elementa iz steka

/* Zadatak: • Realizovati preuzimanje i brisanje elementa iz strukture steka, koja se

organizuje putem niza elemenata (stringova) varijabilne dužine. • Algoritam, pri brisanju, preuzima i modifikuje vrednost pokazivača (indeksa)

na vrh steka. Kao izlazni podatak, algoritam vraća vrednost preuzetog i izbrisanog elementa. Ako je stek prazan, vrednost preuzetog elementa treba da bude Null.

Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza elemenata

varijabilne dužine Varrying Array. */ TIP Niz_slog = Varrying Array of String // Tip niza slogova, varijabilne dužine PROCEDURA Stek_Get ( UI Stek ∈ Niz_slog, // Niz varijabilne dužine – stek IZ Arg ∈ String ← Null, // Vrednost izbrisanog elementa iz steka

UI Vrh ∈ ℕ0 // Pokazivač na vrh (početak) steka ) POČETAK PROCEDURE Stek_Get AKO JE Vrh ≠ 0 TADA Arg ← Stek[Vrh] Vrh ← Vrh - 1 KRAJ AKO KRAJ PROCEDURE Stek_Get

Page 25: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 259.

Algoritam 9.2.13. Sabiranje dvodimenzionalnih matrica

/* Zadatak: • Realizovati postupak sabiranja dvodimenzionalnih matrica. Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju

višedimenzionalnog niza elemenata Array. */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina jedne dimenzije niza

TIP 2DMatrica = Array[1..Q, 1..Q] of ℤ // Tip dvodimenzionalne matrice FUNKCIJA Mat_sabiranje ( UL A ∈ 2DMatrica, // 1. matrica - sabirak UL B ∈ 2DMatrica, // 2. matrica - sabirak UL N ∈ {0,..., Q}, // Aktuelni broj vrsta matrica UL M ∈ {0,..., Q} // Aktuelni broj kolona matrica ) VRAĆA 2DMatrica C ∈ 2DMatrica // matrica - rezultat sabiranja POČETAK FUNKCIJE Mat_sabiranje RADI prolaz_kroz_vrste ZA i ← 1 DO N RADI prolaz_kroz_kolone ZA j ← 1 DO M C[i, j] ← A[i, j] + B[i, j] KRAJ RADI prolaz_kroz_kolone KRAJ RADI prolaz_kroz_vrste Mat_sabiranje ← C KRAJ FUNKCIJE Mat_sabiranje

Page 26: Poglavlje09_Algoritmi

260. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.2.14. Množenje dvodimenzionalnih matrica

/* Zadatak: • Realizovati postupak množenja kompatibilnih dvodimenzionalnih matrica. • Algoritam vraća, kao izlazni rezultat, proizvod dve matrice i indikator

uspešnosti sprovođenja množenja Ind ∈ {true, false}. Indikator uspešnosti vraća true ako i samo ako su matrice kompatibilne za množenje.

Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju

višedimenzionalnog niza elemenata Array. */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina jedne dimenzije niza

TIP 2DMatrica = Array[1..Q, 1..Q] of ℤ // Tip dvodimenzionalne matrice */ FUNKCIJA Mat_množenje ( UL A ∈ 2DMatrica, // 1. matrica UL N ∈ {0,..., Q}, // Aktuelni broj vrsta matrice A UL M ∈ {0,..., Q}, // Aktuelni broj kolona matrice A UL B ∈ 2DMatrica, // 2. matrica UL P ∈ {0,..., Q}, // Aktuelni broj vrsta matrice B UL S ∈ {0,..., Q}, // Aktuelni broj kolona matrice B IZ Ind ∈ Boolean ← false // Inidkator uspešnosti množenja ) VRAĆA 2DMatrica C ∈ 2DMatrica // matrica - rezultat množenja POČETAK FUNKCIJE Mat_množenje AKO JE M = P TADA RADI prolaz_kroz_vrste_A ZA i ← 1 DO N RADI prolaz_kroz_kolone_B ZA k ← 1 DO S C[i, k] ← 0 RADI množenje_vektora ZA j ← 1 DO M C[i, k] ← C[i, k] + A[i, j] ∗ B[j, k] KRAJ RADI množenje_vektora KRAJ RADI prolaz_kroz_kolone_B KRAJ RADI prolaz_kroz_vrste_A Ind ← true Mat_množenje ← C KRAJ AKO KRAJ FUNKCIJE Mat_množenje

Page 27: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 261.

Algoritam 9.2.15. Transponovanje dvodimenzionalnih matrica

/* Zadatak: • Realizovati postupak transponovanja dvodimenzionalne matrice. Algoritam

vraća, kao izlazni rezultat, transponovanu matricu. Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju

višedimenzionalnog niza elemenata Array. */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina jedne dimenzije niza

TIP 2DMatrica = Array[1..Q, 1..Q] of ℤ // Tip dvodimenzionalne matrice FUNKCIJA Mat_transpon ( UL A ∈ 2DMatrica, // Matrica koja se transponuje UL N ∈ {0,..., Q}, // Aktuelni broj vrsta matrice A UL M ∈ {0,..., Q} // Aktuelni broj kolona matrice A ) VRAĆA 2DMatrica C ∈ 2DMatrica // matrica - rezultat transponovanja POČETAK FUNKCIJE Mat_transpon RADI prolaz_kroz_vrste ZA i ← 1 DO N RADI prolaz_kroz_kolone ZA j ← 1 DO M C[j, i] ← A[i, j] KRAJ RADI prolaz_kroz_kolone KRAJ RADI prolaz_kroz_vrste Mat_transpon ← C KRAJ FUNKCIJE Mat_transpon

Page 28: Poglavlje09_Algoritmi

262. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.2.16. Selekcija prostih brojeva iz zadatog skupa - Erastotenovo sito

/* Zadatak: • Realizovati postupak generisanja (selekcije) prostih brojeva iz zadatog skupa

prirodnih brojeva, od 1 do zadatog prirodnog broja N, prema algoritmu "Erastotenovo sito". Početni skup brojeva, kao i rezultujući skup prostih brojeva, treba da budu predstavljeni putem nizova. Niz prostih brojeva treba da bude uređen u rastućem redosledu.

Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza elemenata

Array. */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza TIP Niz_Boolean = Array[1..Q] of Boolean // Tip niza logičkih konstanti

TIP Niz_PrirBroj = Array[1..Q] of ℕ // Tip niza od N prirodnih brojeva PROCEDURA Prosti_brojevi ( UL N ∈ {0,..., Q}, // Maksimalni prirodni broj IZ NizPrsB ∈ Niz_PrirBroj, // Niz prostih brojeva IZ M ∈ {0,..., Q} ← 0 // Aktuelna dužina izlaznog niza ) Sito ∈ Niz_Boolean // Niz u kojem element ukazuje da li je broj (indeks) prost Idx ∈ {0,..., Q} ← 2 // Indeks prolaska kroz sito Umn ∈ {0,..., Q} // Umnožak indeksa prostog broja POČETAK PROCEDURE Prosti_brojevi AKO JE N ≠ 0 TADA M ← 1 NizPrsB[1] ← 1 RADI inicijalizacija_sita ZA i ← 2 DO N Sito[i] ← true // Inicijalno, svi prirodni brojevi do N su prosti KRAJ RADI inicijalizacija_sita RADI prolazak_kroz_sito DOK JE Idx ≤ N RADI pronađi_sledeći_prost_broj DOK JE Idx ≤ N ∧ ¬Sito[Idx] Idx ← Idx + 1 KRAJ RADI pronađi_sledeći_prost_broj AKO JE Idx ≤ N TADA // Nađen je prost broj i važi Sito[Idx] = true M ← M + 1 NizPrsB[M] ← Idx // Prost broj se dodaje na kraj izlaznog niza Umn ← 2 ∗ Idx RADI elminacija_umnožaka DOK JE Umn ≤ N

Page 29: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 263.

Sito[Umn] ← false Umn ← Umn + Idx // Umnošci prostog broja se eliminišu iz sita KRAJ RADI elminacija_umnožaka Idx ← Idx + 1 KRAJ AKO KRAJ RADI prolazak_kroz_sito KRAJ AKO KRAJ PROCEDURE Prosti_brojevi

Page 30: Poglavlje09_Algoritmi

264. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

9.3. Rekurzivni problemi

Algoritam 9.3.1. Izračunavanje faktorijela metodom rekurzije

/* Zadatak: • Realizovati postupak izračunavanja faktorijela prirodnog broja (funkcije

f(n) = n!) u rekurzivnom obliku. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma poznaje koncept rekurzivnog poziva funkcije i procedure. */ FUNKCIJA Faktorijel (

UL n ∈ ℕ0 // Prirodni broj, za koji se izračunava faktorijel ) VRAĆA ℕ POČETAK FUNKCIJE Faktorijel AKO JE n ∈ {0, 1} TADA Faktorijel ← 1 INAČE Faktorijel ← n ∗ Faktorijel(n-1) KRAJ AKO KRAJ FUNKCIJE Faktorijel

Page 31: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 265.

Algoritam 9.3.2. Izračunavanje faktorijela nerekurzivno, pomoću steka

/* Zadatak: • Realizovati postupak izračunavanja faktorijela prirodnog broja (funkcije

f(n) = n!) u nerekurzivnom obliku, simulacijom rekurzije pomoću steka. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma ne poznaje koncept rekurzivnog poziva funkcije i

procedure. */ FUNKCIJA Faktorijel (

UL n ∈ ℕ0 // Prirodni broj, za koji se izračunava faktorijel ) VRAĆA ℕ

TIP Niz_slog = Varrying Array of ℕ // Tip niza slogova, varijabilne dužine Stek ∈ Niz_slog // Pomoćni stek za smeštanje međurezultata

Vrh ∈ ℕ0 // Pokazivač na vrh (početak) steka

Arg1 ∈ ℕ // Argument za preuzimanje elementa sa steka Arg2 ∈ ℕ // Argument za preuzimanje elementa sa steka POČETAK FUNKCIJE Faktorijel Vrh ← Stek_Init(Stek) RADI prolaz_u_dubinu ZA i ← n DO 1 Stek_put(Stek, i, Vrh) KRAJ RADI prolaz_u_dubinu Stek_put(Stek, 1, Vrh) RADI povratak_iz_dubine DOK JE Vrh ≠ 1 Stek_get(Stek, Arg1, Vrh) Stek_get(Stek, Arg2, Vrh) Stek_put(Stek, Arg1 ∗ Arg2, Vrh) KRAJ RADI povratak_iz_dubine Stek_get(Stek, Arg1, Vrh) Faktorijel ← Arg1 KRAJ FUNKCIJE Faktorijel

Page 32: Poglavlje09_Algoritmi

266. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.3.3. Rešavanje problema "Hanoiske kule" metodom rekurzije

/* Zadatak: • Realizovati postupak rešavanja problema hanoiskih kula u rekurzivnom

obliku. Potrebno je paket diskova prebaciti s osovine A na osovinu B, pri čemu se, pri prenošenju jednog diska, samo disk manjeg poluprečnika sme postavljati na disk većeg poluprečnika.

3

1 2

A B C

4

3

1 2

A B C

4

1.

2. 3.

Polazne pretpostavke: • Izvršilac algoritma poznaje koncept rekurzivnog poziva funkcije i procedure. */ TIP Slog = Record (

Rbr_diska ∈ ℕ, // Redni broj diska koji treba prebaciti Sa_osovine ∈ String, // Oznaka osovine, s koje se disk prebacuje Na_osovinu ∈ String // Oznaka osovine, na koju se disk prebacuje ) // Tip za prikaz prebacivanja diska TIP Šema_Tip = Varrying Array of Slog // Deklaracija tipa za šemu prebacivanja diskova PROCEDURA Hanoi (

UL n ∈ ℕ, // Ukupan broj diskova na osovini IZ Šema_prebac ∈ Šema_Tip, // Deklaracija šeme prebacivanja

IZ Broj_prebac ∈ ℕ0 ← 0 // Broj elemenata niza Šema_prebac ) PROCEDURA Prebacivanje (

UL n ∈ ℕ, // Trenutni broj diskova UL Sa_osovine ∈ String, // Sa koje osovine UL Na_osovinu ∈ String, // Na koju osovinu UL Pom_osovina ∈ String, // Pomoćna osovina UI Šema_prebac ∈ Šema_Tip, // Šema prebacivanja

UI Broj_prebac∈ ℕ0 // Broj prebacivanja )

Page 33: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 267.

POČETAK PROCEDURE Prebacivanje AKO JE n ≠ 1 TADA Prebacivanje(n-1, Sa_osovine, Pom_osovina, Na_osovinu,

Šema_prebac, Broj_prebac) Broj_prebac ← Broj_prebac + 1 Šema_prebac[Broj_prebac].Rbr_diska ← n // Uputstvo za prebacivanje Šema_prebac[Broj_prebac].Sa_osovine ← Sa_osovine Šema_prebac[Broj_prebac].Na_osovinu ← Na_osovinu Prebacivanje(n-1, Pom_osovina, Na_osovinu, Sa_osovine,

Šema_prebac, Broj_prebac) INAČE Broj_prebac ← Broj_prebac + 1 // Uputstvo za prebacivanje Šema_prebac[Broj_prebac].Rbr_diska ← n Šema_prebac[Broj_prebac].Sa_osovine ← Sa_osovine Šema_prebac[Broj_prebac].Na_osovinu ← Na_osovinu KRAJ AKO KRAJ PROCEDURE Prebacivanje POČETAK PROCEDURE Hanoi Prebacivanje(n, 'A', 'B', 'C', Šema_prebac, Broj_prebac) KRAJ PROCEDURE Hanoi

Page 34: Poglavlje09_Algoritmi

268. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.3.4. Rešavanje problema "Hanoiske kule" u nerekurzivnoj formi

/* Zadatak: • Realizovati postupak rešavanja problema hanoiskih kula u nerekurzivnom

obliku. Potrebno je rekurzivnu strukturu implementirati putem strukture steka.

3

1 2

A B C

4

3

1 2

A B C

4

1.

2. 3.

Polazne pretpostavke: • Izvršilac algoritma ne poznaje koncept rekurzivnog poziva funkcije i

procedure. */ TIP Slog = Record (

Rbr_diska ∈ ℕ, // Redni broj diska koji treba prebaciti Sa_osovine ∈ String, // Oznaka osovine, s koje se disk prebacuje Na_osovinu ∈ String // Oznaka osovine, na koju se disk prebacuje ) // Tip za prikaz prebacivanja diska TIP Šema_Tip = Varrying Array of Slog // Deklaracija tipa za šemu prebacivanja diskova PROCEDURA Hanoi (

UL n ∈ ℕ, // Ukupan broj diskova na osovini IZ Šema_prebac ∈ Šema_Tip, // Deklaracija šeme prebacivanja

IZ Broj_prebac ∈ ℕ0 // Broj elemenata niza Šema_prebac ) PROCEDURA Prebacivanje (

UL n ∈ ℕ, // Trenutni broj diskova UL Sa_osovine ∈ String, // Sa koje osovine UL Na_osovinu ∈ String, // Na koju osovinu UL Pom_osovina ∈ String, // Pomoćna osovina IZ Šema_prebac ∈ Šema_Tip, // Šema prebacivanja

IZ Broj_prebac∈ ℕ0 ← 0 // Broj prebacivanja )

Page 35: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 269.

TIP Stek_slog = Record ( n ∈ ℕ, Sa_osovine ∈ String, Na_osovinu ∈ String, Pom_osovina ∈ String ) // Deklaracija jednog elementa steka

TIP Stek_Tip = Varrying Array of Stek_slog // Deklaracija tipa steka Stek ∈ Stek_Tip // Deklaracija steka za međurezultate

Vrh ∈ ℕ0 // Pokazivač na vrh (početak) steka Stel ∈ Stek_slog // Pomoćna promenljiva – element steka PROCEDURA Punjenje_steka_do_1 ( UI Stek ∈ Stek_Tip, UL Stel ∈ Stek_slog,

UI Vrh ∈ ℕ0 ) // Punjenje steka, prolazom u dubinu steka, od diska n, do diska 1

POČETAK PROCEDURE Punjenje_steka_do_1 Stek_put(Stek, Stel, Vrh) // Početni uslovi – punjenje za tekući disk RADI prolaz_u_dubinu ZA i ← n-1 DO 1 Stek_get(Stek, Stel, Vrh) Stek_put(Stek, Stel, Vrh) Stek_put(Stek, (i, Stel.Sa_osovine, Stel.Pom_osovina,

Stel.Na_osovinu), Vrh) KRAJ RADI prolaz_u_dubinu KRAJ PROCEDURE Punjenje_steka_do_1 POČETAK PROCEDURE Prebacivanje Vrh ← Stek_Init(Stek) // Inicijalizacija Punjenje_steka_do_1 (Stek,

(n, Sa_osovine, Na_osovinu, Pom_osovina), Vrh) RADI povratak_iz_dubine DOK JE Vrh ≠ 0 Stek_get(Stek, Stel, Vrh) // Obrada diska Broj_prebac ← Broj_prebac + 1 Šema_prebac[Broj_prebac].Rbr_diska ← Stel.n // Uputstvo Šema_prebac[Broj_prebac].Sa_osovine ← Stel.Sa_osovine Šema_prebac[Broj_prebac].Na_osovinu ← Stel.Na_osovinu AKO JE Stel.n ≠ 1 TADA Punjenje_steka_do_1 (Stek, (Stel.n - 1, Stel.Pom_osovina,

Stel.Na_osovinu, Stel.Sa_osovine), Vrh) KRAJ AKO KRAJ RADI povratak_iz_dubine KRAJ PROCEDURE Prebacivanje POČETAK PROCEDURE Hanoi Prebacivanje(n, 'A', 'B', 'C', Šema_prebac, Broj_prebac) KRAJ PROCEDURE Hanoi

Page 36: Poglavlje09_Algoritmi

270. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.3.5. Formiranje binarnog stabla od uređenog niza, metodom rekurzije

/* Zadatak: • Realizovati postupak formiranja binarnog stabla traženja, prikazanog putem

spregnute liste slogova, na osnovu uređenog niza elemenata. Polazne pretpostavke: • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju sloga Record. • Izvršilac algoritma poznaje složeni tip podatka za deklaraciju niza Varrying

Array. */

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza

TIP Niz_celobElem = Array[1..Q] of ℤ // Tip niza celobrojnih elemenata

TIP Slog = Record ( Ključ ∈ ℤ, // Vrednost elementa (čvora) stabla

Levi ∈ ℕ, // Pokazivač na levo podstablo Desni ∈ ℕ // Pokazivač na desno podstablo ) // Deklaracija tipa sloga TIP Stablo_tip = Varrying Array of Slog // Deklaracija tipa binarnog stabla PROCEDURA Formiraj_stablo ( UL Niz ∈ Niz_celobElem, // Niz od kojeg se formira stablo UL N ∈ {0,..., Q}, // Aktuelna dužina niza IZ BinStb ∈ Niz_slog, // Binarno stablo traženja

IZ Koren ∈ ℕ ← Null // Pokazivač na koren stabla )

Idx_Sr ∈ ℕ // Indeks srednjeg elementa niza

Idx_max ∈ ℕ // Indeks poslednjeg sloga u varijabilnom nizu PROCEDURA Poveži_podstablo ( UL Niz ∈ Niz_celobElem, // Niz UI BinStb ∈ Niz_slog, // Binarno stablo traženja

UI Idx_max ∈ ℕ, // Indeks poslednjeg sloga UL D_g ∈ {0,..., Q}, // Donja granica podniza UL G_g ∈ {0,..., Q}, // Gornja granica podniza IZ Indeks ← Null // Indeks korena podstabla )

Idx_Sr ∈ ℕ // Indeks srednjeg elementa niza

Page 37: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 271.

POČETAK PROCEDURE Poveži_podstablo AKO JE (G_g - D_g) > 1 TADA Idx_sr ← (D_g + G_g) / 2 Idx_max ← Idx_max + 1 BinStb[Idx_max].Ključ ← Niz[Idx_sr] Indeks ← Idx_max Poveži_podstablo(Niz, BinStb, Idx_max, D_g, Idx_sr,

BinStb[Idx_max].Levi) Poveži_podstablo(Niz, BinStb, Idx_max, Idx_sr, G_g,

BinStb[Idx_max].Desni) KRAJ AKO KRAJ PROCEDURE Poveži_podstablo POČETAK PROCEDURE Formiraj_stablo AKO JE N ≠ 0 TADA Idx_sr ← (N + 1) / 2 Idx_max ← 1 Koren ← 1 BinStb[1].Ključ ← Niz[Idx_sr] Poveži_podstablo(Niz, BinStb, Idx_max, 0, Idx_sr, BinStb[1].Levi) Poveži_podstablo(Niz, BinStb, Idx_max, Idx_sr, N + 1, BinStb[1].Desni) KRAJ AKO KRAJ PROCEDURE Formiraj_stablo

Page 38: Poglavlje09_Algoritmi

272. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

9.4. Matematičke operacije

Algoritam 9.4.1. Određivanje sledećeg prirodnog broja

/* Zadatak: • Generisati sledeći prirodan broj, na osnovu zadatog prirodnog broja u obliku

stringa. • Pretpostavka je da tip podatka string može imati maksimalnu dužinu od 255

znakova. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne operatore i funkcije za manipulaciju

stringovima. */ FUNKCIJA inkrement ( UL broj ∈ String ) VRAĆA String

maxZnakova ∈ ℕ ← 255 // Pretpostavljeni maksimalni broj znakova tipa String

i ∈ ℕ // Indeks iteracije cifra ∈ String[1] // Jedna cifra broja inkCifra ∈ String[1] // Inkrementirana cifra broja inkBroj ∈ String ← '' // Broj nakon inkrementacije POČETAK FUNKCIJE inkrement AKO JE length(broj) < maxZnakova TADA broj ← '0' || broj // Na maksimalnom broju znakova algoritam "resetuje" broj na 0 KRAJ AKO i ← 1 RADI inkrementiranje cifra ← podstring(broj, length(broj) + 1 – i, 1) AKO JE cifra = ‘0’ TADA inkCifra = ‘1’ INAČE AKO JE cifra = ‘1’ TADA inkCifra = ‘2’ INAČE AKO JE cifra = ‘2’ TADA inkCifra = ‘3’ INAČE AKO JE cifra = ‘3’ TADA inkCifra = ‘4’

INAČE AKO JE cifra = ‘4’ TADA inkCifra = ‘5’ INAČE AKO JE cifra = ‘5’ TADA

Page 39: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 273.

inkCifra = ‘6’ INAČE AKO JE cifra = ‘6’ TADA inkCifra = ‘7’ INAČE AKO JE cifra = ‘7’ TADA inkCifra = ‘8’ INAČE AKO JE cifra = ‘8’ TADA inkCifra = ‘9’ INAČE inkCifra ← ‘0’ i ← i + 1 KRAJ AKO inkBroj ← inkCifra || inkBroj KRAJ RADI inkrementiranje KAD BUDE (inkCifra ≠ '0' ILI i > length(broj)) inkBroj ← podstring(broj, 1, length(broj) - i) || inkBroj AKO JE podstring(inkBroj, 1, 1) = 0 TADA inkBroj ← podstring(inkBroj, 2, length(inkBroj) – 1) KRAJ AKO inkrement ← inkBroj KRAJ FUNKCIJE inkrement

Page 40: Poglavlje09_Algoritmi

274. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.4.2. Sabiranje dva prirodna broja

/* Zadatak: • Sabrati dva prirodna broja sa n cifara u binarnom brojnom sistemu. Brojevi

se zadaju u obliku stringova.

Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne operatore i funkcije za manipulaciju

stringovima. • Izvršilac algoritma poznaje funkciju dopunjavanja stringa str znakom z, do dužine

n: lpad(str, z, n) i funkciju izdvajanja podstringa podstring(str, pos, duž). */

PROCEDURA binSumN (

UL n ∈ ℕ, // Broj cifara sabiraka UL binString1 ∈ String, // Prvi sabirak UL binString2 ∈ String, // Drugi sabirak IZ sumString ∈ String, // Zbir IZ overflow ∈ Boolean ← false // Indikacija prekoračenja )

i ∈ ℕ // Indeks iteracije p ∈ String // Prenosi pri sabiranju

POČETAK PROCEDURE binSumN p ← lpad('', '0', n + 1) // Inicijalno, prenosi ne postoje // Dopunjavanje nevažećim nulama binString1 ← lpad(podstring(binString1, 1, n), '0', n) binString2 ← lpad(podstring(binString2, 1, n), '0', n) sumString ← lpad('', '0', n) // Inicijalizovanje zbira RADI sabiranje ZA i ← n DO 1 KORAK -1 AKO JE ( (binString1[i] = '0' ∧ binString2[i] = '0') ∧ p[i+1] = '1') ∨ ( (binString1[i] = '1' ∨ binString2[i] = '1') ∧ p[i+1] = '0') ∨ ( (binString1[i] = '1' ∧ binString2[i] = '1') ∧ p[i+1] = '1')

TADA sumString[i] ← '1' KRAJ AKO AKO JE ( binString1[i] = '1' ∧ binString2[i] = '1') ∨ ( (binString1[i] = '1' ∨ binString2[i] = '1') ∧ p[i+1] = '1')

TADA p[i] ← '1' KRAJ AKO KRAJ RADI sabiranje AKO JE p[1] = '1' TADA // Indikacija prekoračenja pri sabiranju overflow ← true KRAJ AKO KRAJ PROCEDURE binSumN

Page 41: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 275.

Algoritam 9.4.3. Sabiranje dva cela broja

/* Zadatak: • Sabrati dva cela broja sa n cifara u binarnom brojnom sistemu. Brojevi se

zadaju u obliku stringova.

Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne operatore i funkcije za manipulaciju

stringovima. • Izvršilac algoritma poznaje funkciju dopunjavanja stringa str znakom z, do dužine

n: lpad(str, z, n) i funkciju izdvajanja podstringa podstring(str, pos, duž). • Negativni brojevi su predstavljeni pomoću potpunog komplementa. */

PROCEDURA binSumZ (

UL n ∈ ℕ, // Broj cifara sabiraka UL binString1 ∈ String, // Prvi sabirak UL binString2 ∈ String, // Drugi sabirak IZ sumString ∈ String, // Zbir IZ overflow ∈ Boolean ← false // Indikacija prekoračenja )

i ∈ ℕ // Indeks iteracije p ∈ String // Prenosi pri sabiranju

POČETAK PROCEDURE binSumZ p ← lpad('', '0', n + 1) // Inicijalno, prenosi ne postoje // Dopunjavanje nevažećim nulama binString1 ← lpad(podstring(binString1, 1, n), '0', n) binString2 ← lpad(podstring(binString2, 1, n), '0', n) sumString ← lpad('', '0', n) // Inicijalizovanje zbira RADI sabiranje ZA i ← n DO 1 KORAK -1 AKO JE ( (binString1[i] = '0' ∧ binString2[i] = '0') ∧ p[i+1] = '1') ∨ ( (binString1[i] = '1' ∨ binString2[i] = '1') ∧ p[i+1] = '0') ∨ ( (binString1[i] = '1' ∧ binString2[i] = '1') ∧ p[i+1] = '1')

TADA sumString[i] ← '1' KRAJ AKO AKO JE ( binString1[i] = '1' ∧ binString2[i] = '1') ∨ ( (binString1[i] = '1' ∨ binString2[i] = '1') ∧ p[i+1] = '1')

TADA p[i] ← '1' KRAJ AKO KRAJ RADI sabiranje AKO JE p[1] = '1' ∨ p[2] = '1' TADA // Indikacija prekoračenja za PK brojeve overflow ← true KRAJ AKO KRAJ PROCEDURE binSumZ

Page 42: Poglavlje09_Algoritmi

276. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.4.4. Transformisanje zapisa prirodnog broja iz dekadskog u brojni sistem sa zadatom osnovom

/* Zadatak: • Transformisati zapis prirodnog broja iz dekadskog u brojni sistem sa

osnovom b. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne operatore i funkcije za manipulaciju

stringovima. • Izvršilac algoritma poznaje operator celobrojnog deljenja / i funkciju

određivanja ostatka pri deljenju moduo(x, y). • Izvršilac algoritma poznaje funkciju konverzije stringa str u numeričku

vrednost number(str, ind), pri čemu ind ∈ Boolean predstavlja indikator uspešnosti konverzije.

• Na ulazu, zadaje se tabela koja za svaku dekadsku vrednost iz skupa {0,..., b-1}, sadrži oznaku odgovarajuće cifre sistema s osnovom b.

*/ FUNKCIJA dek2b ( UL dekString ∈ String, // Polazni string

UL b ∈ ℕ, // Brojna osnova UL TabCif ∈ String, // Tabela oznaka cifara u ciljnom sistemu IZ Ind ∈ Boolean // Indikator uspešnosti konverzije ) VRAĆA String

dekNum ∈ ℕ0 // Numerička vrednost zadatog stringa cifara bString ∈ String ← '' // Ekvivalent dekadskog zapisa broja POČETAK FUNKCIJE dek2b dekNum ← number(dekString, ind) AKO JE ind TADA RADI konverzija bString ← TabCif[Moduo(dekNum, b) + 1] || bString dekNum ← dekNum / b KRAJ RADI konverzija KAD BUDE dekNum = 0 KRAJ AKO dek2b ← bString KRAJ FUNKCIJE dek2b

Page 43: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 277.

Algoritam 9.4.5. Transformisanje zapisa prirodnog broja iz brojnog sistema sa zadatom osnovom u dekadski brojni sistem

/* Zadatak: • Transformisati zapis prirodnog broja iz brojnog sistema sa osnovom b u

dekadski brojni sistem. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne operatore i funkcije za manipulaciju

stringovima. • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma poznaje implicitnu konverziju numeričke vrednosti u

string. • Na ulazu, zadaje se tabela koja za svaku dekadsku vrednost iz skupa {0,...,

b-1}, sadrži oznaku odgovarajuće cifre sistema s osnovom b. */ FUNKCIJA b2dek ( UL bString ∈ String, // Polazni string

UL b ∈ ℕ, // Brojna osnova UL TabCif ∈ String, // Tabela oznaka cifara u ciljnom sistemu IZ Ind ∈ Boolean ← true // Indikator uspešnosti konverzije ) VRAĆA String

dekNum ∈ ℕ0 ← 0 // Numerička vrednost zadatog stringa cifara

idx ∈ ℕ // Brojač cifara polaznog stringa

dCifra ∈ ℕ0 // Dekadska vrednost cifre polaznog sistema IndC ∈ Boolean // Indikator uspešnosti konverzije cifre FUNKCIJA dvrednostCifre (

UL b ∈ ℕ, // Osnova brojnog sistema UL TabCif ∈ String, // Tabela oznaka cifara UL OznCifre ∈ String[1], // Simbol cifre IZ Ind ∈ Boolean ← false, // Indikator uspešnosti traženja

) VRAĆA ℕ0

idx ∈ ℕ0 ← 1

Page 44: Poglavlje09_Algoritmi

278. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

POČETAK FUNKCIJE dvrednostCifre // Pronalaženje dekadskog ekvivalenta cifre RADI traži_dekadski_ekvivalent_cifre DOK JE idx ≤ b ∧ ¬Ind AKO JE OznCifre = TabCif[idx] TADA Ind ← true INAČE idx ← idx + 1 KRAJ AKO KRAJ RADI traži_dekadski_ekvivalent_cifre dvrednostCifre ← idx - 1 KRAJ FUNKCIJE dvrednostCifre POČETAK FUNKCIJE b2dek idx ← 1 RADI konverzija DOK JE idx ≤ length(bString) AND Ind dCifra ← dvrednostCifre(b, TabCif, bString[idx], IndC) AKO JE IndC TADA // Kumuliranje dekadske vrednosti broja dekNum ← dekNum ∗ b + dCifra idx ← idx + 1 INAČE Ind ← false // Neuspešna konverzija cifre u dekadski ekvivalent KRAJ AKO KRAJ RADI konverzija b2dek ← dekNum KRAJ FUNKCIJE b2dek

Page 45: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 279.

Algoritam 9.4.6. Transformisanje zapisa prirodnog broja iz brojnog sistema sa osnovom 2 u brojni sistem sa osnovom 16

/* Zadatak: • Transformisati zapis prirodnog broja iz brojnog sistema sa osnovom 2 u

brojni sistem sa osnovom 16. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne operatore i funkcije za manipulaciju

stringovima. • Pretpostavlja se da je ulazni string (binarni zapis) zadat korektno, na skupu

cifara {0, 1}. */ FUNKCIJA bin2hex ( UL binString ∈ String // Binarni zapis prirodnog broja ) VRAĆA String bin2hexString ∈ String ← '' // Heksadekadski ekvivalent binarne cifre POČETAK FUNKCIJE bin2hex AKO JE Moduo(length(binString), 4) = 1 TADA binString ← '000' || binString INAČE AKO JE Moduo(length(binString), 4) = 2 TADA binString ← '00' || binString INAČE AKO JE Moduo(length(binString), 4) = 3 TADA binString ← '0' || binString KRAJ AKO RADI konverzija ZA i ← 1 DO length(binString) KORAK 4 AKO JE Podstring(binString, i, 4) = '0000' TADA bin2hexString ← bin2hexString || '0' INAČE AKO JE Podstring(binString, i, 4) = '0001' TADA bin2hexString ← bin2hexString || '1' INAČE AKO JE Podstring(binString, i, 4) = '0010' TADA bin2hexString ← bin2hexString || '2' INAČE AKO JE Podstring(binString, i, 4) = '0011' TADA bin2hexString ← bin2hexString || '3' INAČE AKO JE Podstring(binString, i, 4) = '0100' TADA bin2hexString ← bin2hexString || '4' INAČE AKO JE Podstring(binString, i, 4) = '0101' TADA bin2hexString ← bin2hexString || '5' INAČE AKO JE Podstring(binString, i, 4) = '0110' TADA bin2hexString ← bin2hexString || '6' INAČE AKO JE Podstring(binString, i, 4) = '0111' TADA bin2hexString ← bin2hexString || '7' INAČE AKO JE Podstring(binString, i, 4) = '1000' TADA

Page 46: Poglavlje09_Algoritmi

280. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

bin2hexString ← bin2hexString || '8' INAČE AKO JE Podstring(binString, i, 4) = '1001' TADA bin2hexString ← bin2hexString || '9' INAČE AKO JE Podstring(binString, i, 4) = '1010' TADA bin2hexString ← bin2hexString || 'A' INAČE AKO JE Podstring(binString, i, 4) = '1011' TADA bin2hexString ← bin2hexString || 'B' INAČE AKO JE Podstring(binString, i, 4) = '1100' TADA bin2hexString ← bin2hexString || 'C' INAČE AKO JE Podstring(binString, i, 4) = '1101' TADA bin2hexString ← bin2hexString || 'D' INAČE AKO JE Podstring(binString, i, 4) = '1110' TADA bin2hexString ← bin2hexString || 'E' INAČE bin2hexString ← bin2hexString || 'F' KRAJ AKO KRAJ RADI konverzija bin2hex ← bin2hexString KRAJ FUNKCIJE bin2hex

Page 47: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 281.

Algoritam 9.4.7. Transformisanje zapisa prirodnog broja iz brojnog sistema sa osnovom 16 u brojni sistem sa osnovom 2

/* Zadatak: • Transformisati zapis prirodnog broja iz brojnog sistema sa osnovom 16 u

brojni sistem sa osnovom 2. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne operatore i funkcije za manipulaciju

stringovima. • Pretpostavlja se da je ulazni string (heksadecimalni zapis broja) zadat

korektno, na skupu cifara {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}. */ FUNKCIJA hex2bin ( UL hexString ∈ String // Heksadecimalni zapis broja ) VRAĆA String hex2binString ∈ String ← '' // Binarni ekvivalent heksadekadse cifre POČETAK FUNKCIJE hex2bin RADI konverzija ZA i ← 1 DO length(hexString) AKO JE Podstring(hexString, i, 1) = '0' TADA hex2binString ← hex2binString || '0000' INAČE AKO JE Podstring(hexString, i, 1) = '1' TADA hex2binString ← hex2binString || '0001' INAČE AKO JE Podstring(hexString, i, 1) = '2' TADA hex2binString ← hex2binString || '0010' INAČE AKO JE Podstring(hexString, i, 1) = '3' TADA hex2binString ← hex2binString || '0011' INAČE AKO JE Podstring(hexString, i, 1) = '4' TADA hex2binString ← hex2binString || '0100' INAČE AKO JE Podstring(hexString, i, 1) = '5' TADA hex2binString ← hex2binString || '0101' INAČE AKO JE Podstring(hexString, i, 1) = '6' TADA hex2binString ← hex2binString || '0110' INAČE AKO JE Podstring(hexString, i, 1) = '7' TADA hex2binString ← hex2binString || '0111' INAČE AKO JE Podstring(hexString, i, 1) = '8' TADA hex2binString ← hex2binString || '1000' INAČE AKO JE Podstring(hexString, i, 1) = '9' TADA hex2binString ← hex2binString || '1001' INAČE AKO JE Podstring(hexString, i, 1) = 'A' TADA hex2binString ← hex2binString || '1010' INAČE AKO JE Podstring(hexString, i, 1) = 'B' TADA hex2binString ← hex2binString || '1011'

Page 48: Poglavlje09_Algoritmi

282. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

INAČE AKO JE Podstring(hexString, i, 1) = 'C' TADA hex2binString ← hex2binString || '1100' INAČE AKO JE Podstring(hexString, i, 1) = 'D' TADA hex2binString ← hex2binString || '1101' INAČE AKO JE Podstring(hexString, i, 1) = 'E' TADA hex2binString ← hex2binString || '1110' INAČE hex2binString ← hex2binString || '1111' KRAJ AKO KRAJ RADI konverzija hex2bin ← hex2binString KRAJ FUNKCIJE hex2bin

Page 49: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 283.

Algoritam 9.4.8. Izračunavanje unije skupova

/* Zadatak: • Izračunati uniju dva skupa. Polazne pretpostavke: • Skupovi su zadati u formi stringova. • Pretpostavlja se da u skupovima nema ponavljanja istih elemenata. */ FUNKCIJA unija ( UL skup1 ∈ String, // Skup 1. UL skup2 ∈ String // Skup 2. ) VRAĆA String postoji ∈ Boolean // Indikator postojanja elementa iz prvog skupa u drugom

j ∈ ℕ // Brojač iteracija pomUnija ∈ String ← '' // Pomoćni string za memorisanje međurezultata POČETAK FUNKCIJE unija RADI prebacivanjePrvog ZA i ← 1 DO length(skup1) pomUnija[i] ← skup1[i] KRAJ RADI prebacivanjePrvog RADI dodavanjeRazlike ZA i ← 1 DO length(skup2) postoji ← false j ← 1 RADI proveraPostojanja DOK JE ¬postoji ∧ j ≤ length(skup1) AKO JE skup2[i] =pomUnija[j] TADA postoji ← true INAČE j ← j + 1 KRAJ AKO KRAJ RADI proveraPostojanja AKO JE ¬postoji TADA pomUnija ← pomUnija || skup2[i] KRAJ AKO KRAJ RADI dodavanjeRazlike unija ← pomUnija KRAJ FUNKCIJE unija

Page 50: Poglavlje09_Algoritmi

284. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.4.9. Izračunavanje preseka skupova

/* Zadatak: • Izračunati presek dva skupa. Polazne pretpostavke: • Skupovi su zadati u formi stringova. • Pretpostavlja se da u skupovima nema ponavljanja istih elemenata. */ FUNKCIJA presek ( UL skup1 ∈ String, // Skup 1. UL skup2 ∈ String // Skup 2. ) VRAĆA String postoji ∈ Boolean // Indikator postojanja elementa iz prvog skupa u drugom

j ∈ ℕ // Brojač iteracije pomPresek ∈ String ← '' // Pomoćni string za memorisanje međurezultata POČETAK FUNKCIJE presek RADI dodavanje ZA i ← 1 DO length(skup1) postoji ← false j ← 1 RADI proveraPostojanja DOK JE ¬postoji ∧ j ≤ length(skup2) AKO JE skup2[j] = skup1[i] TADA postoji ← true INAČE j ← j + 1 KRAJ AKO KRAJ RADI proveraPostojanja AKO JE postoji TADA pomPresek ← pomPresek || skup1[i] KRAJ AKO KRAJ RADI dodavanje presek ← pomPresek KRAJ FUNKCIJE presek

Page 51: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 285.

Algoritam 9.4.10. Izračunavanje razlike skupova

/* Zadatak: • Izračunati razliku dva skupa. Polazne pretpostavke: • Skupovi su zadati u formi stringova. • Pretpostavlja se da u skupovima nema ponavljanja istih elemenata. */ FUNKCIJA razlika ( UL skup1 ∈ String, // Skup 1. UL skup2 ∈ String // Skup 2. ) VRAĆA String

j ∈ ℕ // Indeks iteracije postoji ∈ Boolean // Indikator postojanja elementa iz prvog skupa u drugom pomRazlika ∈ String ←'' // Pomoćni string za memorisanje međurezultata POČETAK FUNKCIJE razlika RADI dodavanjeRazlike ZA i ← 1 DO length(skup1) postoji ← false j ← 1 RADI proveraPostojanja DOK JE ¬postoji ∧ j ≤ length(skup2) AKO JE skup2[j] = skup1[i] TADA postoji ← true INAČE j ← j + 1 KRAJ AKO KRAJ RADI proveraPostojanja AKO JE ¬postoji TADA pomRazlika ← pomRazlika || skup1[i] KRAJ AKO KRAJ RADI dodavanjeRazlike razlika ← pomRazlika KRAJ FUNKCIJE razlika

Page 52: Poglavlje09_Algoritmi

286. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

9.5. Numerički problemi

Algoritam 9.5.1. Izračunavanje vrednosti eksponencijalne fukcije (exp)

/* Zadatak: • Izračunati vrednost eksponencijalne funkcije f(x) = ex, do zadate tačnosti,

izračunavanjem parcijalne sume odgovarajućeg reda. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Poznavanje formule za izračunavanje parcijalne sume reda funkcije

∑∝

=

=0 !k

kx

kxe , za -∞ < x < ∞.

*/

TIP RealPozit_Tip = {d ∈ ℝ | d ≥ 0} FUNKCIJA exp (

UL x ∈ ℝ, // Eksponent (argument) funkcije UL eps ∈ RealPozit_Tip // Maksimalna greška (tačnost) izračunavanja ) VRAĆA RealPozit_Tip

df ∈ ℝ ← 1 // Doprinos vrednosti funkcije u jednoj iteraciji

f ∈ ℝ ← 1 // Trenutna vrednost funkcije

k ∈ ℝ ← 0 // Indeks (redni broj) iteracije POČETAK FUNKCIJE exp RADI računajVrednostFunkcije k ← k + 1 df ← df ∗ x / k f ← f + df KRAJ RADI računajVrednostFunkcije KAD BUDE abs(df) ≤ eps exp ← f KRAJ FUNKCIJE exp

Page 53: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 287.

Algoritam 9.5.2. Izračunavanje vrednosti funkcije prirodnog logaritma (ln)

/* Zadatak: • Izračunati vrednost funkcije prirodnog logaritma f(x) = ln(x), za 0 < x ≤ 2, do

zadate tačnosti, izračunavanjem parcijalne sume odgovarajućeg reda. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Poznavanje formule za izračunavanje parcijalne sume reda funkcije

∑∝

=

+−=+1

1)1()1(k

kk

kxxln , za -1 < x ≤ 1.

*/

TIP RealPozit_Tip = {d ∈ ℝ | d ≥ 0}

TIP ArgLn_Tip = {d ∈ ℝ | 0 < d ≤ 2} FUNKCIJA ln (

UL x ∈ ArgLn_Tip, // Argument funkcije UL eps ∈ RealPozit_Tip // Maksimalna greška (tačnost) izračunavanja

) VRAĆA ℝ

arg ∈ ℝ // Pomoćni argument za izračunavanje vrednosti

k ∈ ℝ ← 0 // Indeks (redni broj) iteracije

f ∈ ℝ ← 0 // Trenutna vrednost funkcije

df ∈ ℝ ← 0 // Doprinos vrednosti funkcije u jednoj iteraciji

brojilac ∈ ℝ ← 1 // Vrednost brojioca doprinosa funkcije - xk

znak ∈ {-1, 1} ← -1 // Znak doprinosa funkcije POČETAK FUNKCIJE ln arg ← x – 1 // Svođenje argumenta na oblik koji odgovara izrazu ln(x+1) RADI računajVrednostFunkcije k ← k + 1 znak ← -znak brojilac ← brojilac ∗ arg df ← brojilac / k f ← f + znak ∗ df KRAJ RADI računajVrednostFunkcije KAD BUDE abs(df) ≤ eps ln ← f KRAJ FUNKCIJE ln

Page 54: Poglavlje09_Algoritmi

288. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.5.3. Izračunavanje vrednosti sinusne funkcije (sin)

/* Zadatak: • Izračunati vrednost sinusne funkcije f(x) = sin(x), za x zadat u radijanima,

do zadate tačnosti, izračunavanjem parcijalne sume odgovarajućeg reda. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Poznavanje formule za izračunavanje parcijalne sume reda funkcije

∑∝

=

++

+−=

0

121

)!12()1()(

k

kk

kxxins , za -∞ < x < ∞.

*/

TIP RealPozit_Tip = {d ∈ ℝ | d ≥ 0}

TIP TrigonFun_Tip = {d ∈ ℝ | -1 ≤ d ≤ 1} FUNKCIJA sin (

UL x ∈ ℝ, // Argument funkcije, zadat u radijanima UL eps ∈ RealPozit_Tip // Maksimalna greška (tačnost) izračunavanja ) VRAĆA TrigonFun_Tip

k ∈ ℝ ← 0 // Indeks (redni broj) iteracije

f ∈ ℝ ← -x // Trenutna vrednost funkcije

df ∈ ℝ ← x // Doprinos vrednosti funkcije u jednoj iteraciji znak ∈ {-1, 1} ← -1 // Znak doprinosa funkcije POČETAK FUNKCIJE sin RADI računajVrednostFje k ← k + 2 znak ← -znak df ← df ∗ x ∗ x / (k ∗ (k+1)) f ← f + znak ∗ df KRAJ RADI računajVrednostFje KAD BUDE abs(df) ≤ eps ∧ abs(f) ≤ 1 sin ← f KRAJ FUNKCIJE sin

Page 55: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 289.

Algoritam 9.5.4. Izračunavanje nule funkcije metodom sečice

/* Zadatak: • Izračunati nulu funkcije f(x) na zadatom intervalu [x1, x2], do zadate

tačnosti, metodom sečice. Prethodno, proveriti da li su granice intervala [x1, x2] korektno zadate u smislu zadovoljenja uslova sgn(f(x1)) ≠ sgn(f(x2)).

Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma poznaje funkciju određivanja znaka broja znak(arg) i

funkciju abs(x). • Izvršilac algoritma poznaje deklaraciju tipa funkcije. • Pretpostavlja se da je definisana funkcija za koju se računa nula. • Poznata je formula za definisanje prave kroz dve tačke sa zadatim

koordinatama, odnosno formula za izračunavanje vrednosti argumenta u tački u kojoj prava preseca x-osu.

*/

TIP RealPozit_Tip = {d ∈ ℝ | d ≥ 0}

TIP Fun1Arg_Tip = FUNKCIJA ( UL x ∈ ℝ ) VRAĆA ℝ FUNKCIJA nulaSečica (

UL x1 ∈ ℝ, // Donja granica zadatog intervala UL x2 ∈ ℝ, // Gornja granica zadatog intervala UL f ∈ Fun1Arg_Tip, // Funkcija čija se nula izračunava UL eps ∈ RealPozit_Tip // Maksimalna greška (tačnost)

) VRAĆA ℝ

y1 ∈ ℝ // Vrednost funkcije u tački donje granice: f(x1)

y2 ∈ ℝ // Vrednost funkcije u tački gornje granice: f(x2)

x ∈ ℝ // Vrednost argumenta u kojem sečica preseca x-osu

y ∈ ℝ // Vrednost funkcije u tački u kojoj sečica preseca x-osu POČETAK FUNKCIJE nulaSečica y1 ← f(x1) y2 ← f(x2)

Page 56: Poglavlje09_Algoritmi

290. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

AKO JE znak(y1) ≠ znak(y2) TADA // Provera korektnosti intervala RADI traženjeNule // Koordinata u kojoj sečica preseca x osu x ← x1 – y1 ∗ (x2 – x1) / (y2 – y1) y ← f(x) AKO JE (znak(y) = znak(y2)) TADA // Interval se sužava s gornje strane x2 ← x y2 ← y INAČE // interval se sužava s donje strane x1 ← x y1 ← y KRAJ AKO KRAJ RADI traženjeNule KAD BUDE abs(f(x)) ≤ eps nulaSečica ← x INAČE // Interval za izolovanje nule funkcije nije korektno zadat nulaSečica ← Null KRAJ AKO KRAJ FUNKCIJE nulaSečica

Page 57: Poglavlje09_Algoritmi

9. Algoritamski prikaz postupaka obrade podataka 291.

Algoritam 9.5.5. Izračunavanje vrednosti funkcije metodom linearne interpolacije

/* Zadatak: • Izračunati vrednost funkcije f(x) za zadatu vrednost argumenta x, metodom

linearne interpolacije, na osnovu prethodno zadatog skupa vrednosti funkcije, koji je uređen u rastućem redosledu argumenata.

Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Poznata je formula za definisanje prave kroz dve tačke sa zadatim

koordinatama. */

TIP Slog = Record ( x ∈ ℝ, // Vrednost argumenta funkcije

f ∈ ℝ // Vrednost funkcije za argument x ) // Deklaracija tipa sloga za jednu vrednost f-je

KONSTANTA Q ∈ ℕ ← 100 // Maksimalna dužina niza TIP NizVredFun_Tip = Array[1..Q] of Slog // Tip niza vrednosti funkcije FUNKCIJA interpolacija ( UL nizVredf ∈ NizVredFun_Tip, // Niz vrednosti funkcije UL N ∈ {0,..., Q}, // Aktuelna dužina niza

UL x ∈ ℝ // Argument za koji se interpolira

) VRAĆA ℝ

x1 ∈ ℝ ← Null // Donja granica intervala interpolacije x2 ∈ ℝ ← Null // Gornja granica intervala interpolacije y1 ∈ ℝ ← Null // Vrednost funkcije u donjoj granici y2 ∈ ℝ ← Null // Vrednost funkcije u gornjoj granici Indeks ∈ {1,..., N+1} ← 1 // Indeks traženog intervala interpolacije

POČETAK FUNKCIJE interpolacija RADI tražiInterval DOK JE Indeks ≤ N ∧ x > nizVredf[Indeks].x Indeks ← Indeks + 1 // Traženje se nastavlja na sledećem elementu KRAJ RADI tražiInterval // Linearno traženje intervala za interpolaciju AKO JE Indeks > 1 ∧ Indeks ≤ N TADA x1 ← nizVredf[Indeks-1].x x2 ← nizVredf[Indeks].x y1 ← nizVredf[Indeks-1].f y2 ← nizVredf[Indeks].f interpolacija ← y1 + (x – x1) ∗ (y2 – y1) / (x2 – x1) INAČE // Argument izlazi izvan opsega intervala za interpolaciju interpolacija ← Null KRAJ AKO KRAJ FUNKCIJE interpolacija

Page 58: Poglavlje09_Algoritmi

292. Osnove računarskih tehnologija i programiranja - priručnik za vežbe

Algoritam 9.5.6. Izračunavanje integrala funkcije metodom pravougaonika

/* Zadatak: • Izračunati vrednost integrala funkcije na zadatom intervalu, metodom

pravougaonika. Polazne pretpostavke: • Izvršilac algoritma poznaje osnovne aritmetičke operacije. • Izvršilac algoritma poznaje deklaraciju tipa funkcije. • Pretpostavlja se da je definisana funkcija za koju se računa nula. */

TIP RealPozit_Tip = {d ∈ ℝ | d ≥ 0}

TIP Fun1Arg_Tip = FUNKCIJA ( UL x ∈ ℝ ) VRAĆA ℝ FUNKCIJA integral ( UL f ∈ Fun1Arg_Tip, // Zadata funkcija

UL x0 ∈ ℝ, // Donja granica intervala UL x1 ∈ ℝ // Gornja granica intervala ) VRAĆA ℝ // Korak izračunavanja - implicira tačnost KONSTANTA dx ∈ RealPozit_Tip ← 0.01

integ ∈ ℝ ← 0 // Tekuća vrednost integrala POČETAK FUNKCIJE integral RADI računajIntegral DOK JE x0 < x1 integ ← integ + dx ∗ f(x0) // Dodaje se površina tekućeg pravougaonika x0 ← x0 + dx KRAJ RADI računajIntegral integral ← integ KRAJ FUNKCIJE integral