21
14. Funkcije i procedure Kad se gradi jedan složeni sklop kao što je na primer automobil, konstruktori nede početi od najosnovnijih sirovinskih materijala, kao što je ruda gvožđa, ili nafta od koje se prave plastični materijali. Umesto toga, automobil de se sklapati od (jednom) prethodno napravljenih delova, kao što su autogume, akumulatori, motori, automobilski hladnjaci. Svi ti delovi napravljeni su u različitim fabrikama. Funkcije i procedure su strukturni blokovi koji omoguduju da program bude konstruisan od ranije napravljenih delova. Korišdenje takvih strukturnih blokova ima tri prednosti: Kada radimo na bilo kom, ali jednom, strukturnom bloku, možemo usmeriti pažnju na samo jedan deo programa. Različiti ljudi mogu raditi na različitim strukturnim blokovima u isto vreme. Ako je isti strukturni blok potreban na više mesta u programu, možemo ga jedanput napisati i koristiti više puta. Potprogrami se navode izmedju deklaracije promenljivih (var-odeljak) i glavnog dela programa. Tako, Pascal program ima slededu strukturu: 14.1. Funkcije Ved smo videli kako se koriste standardne funkcije, kao što su kvadriranje ( sqr), kvadratni koren (sqrt), odbacivanje članova niza (trunc), zaokruživanje (round), čije su definicije ugrađene u Pascal. Sada demo videti kako se definišu vlastite funkcije koje su nam potrebne kod nekog posla, a nisu ugrađene u Pascal. Funkcija se definiše koristedi funkcijsku deklaraciju. Kao primer definišimo funkciju fdec koja daje deo broja iza decimalne tačke. Evo nekoliko primera za fdec: izraz vrednost fdec (3.14) 0.14 fdec (267.21) 0.21 fdec (5.0) 0.0 Deklaracija funkcije fdec je: FUNCTION fdec (x: real): real; BEGIN fdec := x - trunc (x) END Deklaracija funkcije ima istu strukturu kao i program s dva izuzetka:

WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64

Autor: Velja Milanovid msc. prof.

14. Funkcije i procedure

Kad se gradi jedan složeni sklop kao što je na primer automobil, konstruktori nede početi od najosnovnijih sirovinskih materijala, kao što je ruda gvožđa, ili nafta od koje se prave plastični materijali. Umesto toga, automobil de se sklapati od (jednom) prethodno napravljenih delova, kao što su autogume, akumulatori, motori, automobilski hladnjaci. Svi ti delovi napravljeni su u različitim fabrikama.

Funkcije i procedure su strukturni blokovi koji omoguduju da program bude konstruisan od ranije napravljenih delova. Korišdenje takvih strukturnih blokova ima tri prednosti:

Kada radimo na bilo kom, ali jednom, strukturnom bloku, možemo usmeriti pažnju na samo jedan deo programa.

Različiti ljudi mogu raditi na različitim strukturnim blokovima u isto vreme. Ako je isti strukturni blok potreban na više mesta u programu, možemo ga jedanput

napisati i koristiti više puta. Potprogrami se navode izmedju deklaracije promenljivih (var-odeljak) i glavnog dela programa. Tako, Pascal program ima slededu strukturu:

14.1. Funkcije

Ved smo videli kako se koriste standardne funkcije, kao što su kvadriranje (sqr), kvadratni koren (sqrt), odbacivanje članova niza (trunc), zaokruživanje (round), čije su definicije ugrađene u Pascal. Sada demo videti kako se definišu vlastite funkcije koje su nam potrebne kod nekog posla, a nisu ugrađene u Pascal. Funkcija se definiše koristedi funkcijsku deklaraciju. Kao primer definišimo funkciju fdec koja daje deo broja iza decimalne tačke. Evo nekoliko primera za fdec:

izraz vrednost

fdec (3.14) 0.14

fdec (267.21) 0.21

fdec (5.0) 0.0

Deklaracija funkcije fdec je:

FUNCTION fdec (x: real): real; BEGIN fdec := x - trunc (x) END

Deklaracija funkcije ima istu strukturu kao i program s dva izuzetka:

09.02.2012 64/119

Page 2: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 65

Autor: Velja Milanovid msc. prof.

1) Funkcija počinje s naslovom FUNCTION umesto PROGRAM, 2) Nema tačke posle naredbe

END.

Naslov funkcije za fdec je FUNCTION fdec (x: real): real;

Rezervisana reč FUNCTION predstavlja funkcijski naslov. Zatim dolazi ime funkcije, fdec, slede u zagradama formalni parametri. Formalni parametri moraju se podudarati sa stvarnim parametrima, koji de se pojaviti kad se funkcija bude koristila. Formalni parametar je deklarisan kao: x:real i kaže, da de funkcija uzeti jedan parametar, koji mora biti realni broj. Vrednost stvarnog parametra bide označena sa x. Konačno, ,,:real” na kraju naslova funkcije određuje, da de ova funkcija kao rezultat imati realnu vrednost. Naredba deklaracije funkcije ima samo jednu naredbu fdec = x - trunc (x) koja računa vrednost funkcije i označava je imenom funkcije.

Ime funkcije nije promenljiva koja se može koristiti u procesu računanja! Računanje se mora obaviti sa nekim običnim promenljivim, a na samom kraju se rezultat računanja (u opštem slučaju, neki izraz) "dodeljuje" imenu funkcije kao njena vrednost.

Još jedan primer:

Pogledajmo funkciju koja efikasno računa stepen nekog realnog broja na način sa kojim smo se sreli ranije. Funkcija radi korektno za x > 0 i n>=0. Primetimo da funkcija St ima dva argumenta, x i n, i da su njihove deklaracije unutar liste argumenata razdvojene sa tačka-zarez.

function St(x: real; n: integer): real; var rez: real; begin rez := 1.0; while n > 0 do begin if odd(n) then rez := rez * x; x := sqr(x); n := n div 2 end; St := rez end;

Kada pozivamo funkciju, uvek joj na prvo mesto moramo staviti promenljivu ili izraz čiji tip je realan, a na drugo mesto promenljivu ili izraz čiji tip je ceo broj. Naravno, u pozivu funkcije St su argumenti razdvojeni običnim zarezom, kao u St(1.3, 7). Pogledajmo sada kako se funkcija St može upotrebiti. Napisademo Pascal program koji računa vrednost izraza: x23 - 8x11 + 12x-5

program Izraz; var x, izr : real; function St(x: real; n: integer): real; var rez: real; begin rez := 1.0; while n > 0 do begin if odd(n) then rez := rez * x; n := n div 2; x := sqr(x) end;

09.02.2012 65/119

Page 3: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 66

Autor: Velja Milanovid msc. prof.

St := rez end {St};

begin write('x = '); readln(x); izr := St(x, 23) - 8*St(x, 11) +12/St(x, 5); writeln(izr : 20 : 8) end.

Napomena o argumentima funkcije. Ako neka funkcija F ima dva argumenta, p i q, koji su istog tipa, recimo integer, onda možemo da je deklarišemo ovako:

function F(p : integer; q : integer) : real; ali može i ovako: function F(p, q : integer) : real;

Naravno, funkcija može imati i više od dva argumenta. Važno je zapamtiti sledede: Argumenti funkcije su obične promenljive koje možemo tako i da koristimo! Ime funkcije nije promenljiva, i njega ne možemo koristiti u toj ulozi! Ime funkcije se javlja samo na kraju računanja, kada mu simbolično dodeljujemo vrednost računanja!

Aktivacija funkcije

Pogledajmo na jednom primeru kako se koriste funkcije šta sve računar preživljava kada korisnik pozove funkciju. Niz postupaka koje računar preduzme tim povodom zove se aktivacija funkcije. Evo Pascal programa koji računa vrednost izraza 25 + x10 – 8x13 :

program Izraz; var x, izr : real; function St(x: real; n: integer): real; var rez: real; begin rez := 1.0; while n > 0 do begin if odd(n) then rez := rez * x; n := n div 2; x := sqr(x) end; St := rez end {St};

begin write('x = '); readln(x); izr := 25 + St(x,10) - 0.5*St(x,13); writeln(izr : 20 : 8) end.

Kada startujemo program, u memoriji de biti napravljene dve fijoke: jedna de se zvati x, a druga izr. Potom de program učitati od korisnika neki realan broj i upisati ga u fijoku x. Recimo da je korisnik uneo broj 2.

09.02.2012 66/119

Page 4: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 67

Autor: Velja Milanovid msc. prof.

begin

write('x = '); readln(x);

izr := 25 + St(x,10) - 0.5*St(x,13); writeln(izr : 20 : 8) end.

Slededa naredba je naredba dodele. Njeno izvršavanje je prilično komplikovano zbog dva poziva funkcije St. Sada demo korak po korak objasniti kako se izračunava vrednost izraza na desnoj strani.

begin write('x = '); readln(x);

izr := 25 + St(x,10) - 0.5*St(x,13);

writeln(izr : 20 : 8) end.

Prvo se računa St(x, 10). Nakon poziva, funkcija St otvori svoje tri fijoke u memoriji: dve za argumente x i n, i jednu za svoju lokalnu promenljivu rez. Potom se vrednost promenljive x u pozivu funkcije prepiše u ¯joku x koja pripada funkciji St, a broj 10 se upi·se u fijoku n funkcije St.

Kada je sve ovo odradjeno, izvrši se telo funkcije St. Time se na ranije opisani način izračuna xn, u našem primeru 210, i vrednost upiše u promenljivu rez.

izr := 25 + St(x,10) - 0.5*St(x,13);

function St(x: real; n: integer): real; var rez: real; begin rez := 1.0; while n > 0 do begin if odd(n) then rez := rez * x; n := n div 2; x := sqr(x) end; St := rez

09.02.2012 67/119

Page 5: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 68

Autor: Velja Milanovid msc. prof.

end {St}; Poslednjom naredbom u telu funkcije se imenu funkcije simbolično dodeli vrednost. To je rezultat rada funkcije kojim se zamenjuje poziv funkcije.

Na kraju, funkcija počisti svoje promenljive iz memorije. izr := 25 + 1024 - 0.5 * St(x, 13); Na isti način se izračuna vrednost St(x, 13). Ponovi se ceo proces: funkcija ponovo otvori svoje tri fijoke, prepiše vrednosti odgovarajudih izraza, izračuna traženu vrednost i njome zameni odgovarajudi poziv. izr := 25 + 1024 - 0.5 * 8192; Sada su u izrazu na desnoj strani sve vrednosti poznate, računar izvrši naznačene operacije i dobijenu vrednot upiše u fijoku izr.

Da ponovimo, aktivacija (poziv) funkcije se izvršava u nekoliko koraka:

Funkcija rezerviše memorijski prostor za svoje argumente i lokalne promenljive. Pri tome, neki argument ili lokalna promenljiva smeju da imaju isto ime kao i neka globalna promenljiva. Kažemo da je u tom slučaju lokalna promenljiva sakrila globalnu promenljivu. Funkcija gleda pre svega svoj memorijski prostor, pa tek ako tu ne uspe da nadje promenljivu sa odgovarajudim imenom, gleda dalje po memoriji.

Prenos argumenata: vrednosti izraza koji se javljaju u pozivu funkcije se upišu u fijoke dodeljene argumentima funkcije.

Izvrši se telo funkcije. Poslednja naredba je simbolična dodela rezultata računanja imenu fukcije. Time se funkciji stavlja do znanja šta treba vratiti kao rezultat rada.

09.02.2012 68/119

Page 6: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 69

Autor: Velja Milanovid msc. prof.

Poziv funkcije se zameni rezultatom računanja funkcije. (Još jedom napominjemo da do fizičke zamene poziva vrednošdu zapravo ne dolazi, ali da nam je za sada lakše da ovako razmišljamo!)

14. 2. Procedure

Procedure predstavljaju drugu vrstu potprograma. Deklaracija procedura je veoma slična deklaraciji funkcija. Jedina razlika je u tome što procedura ne vrada nikakvu vrednost pa nema potrebe za tipom rezultata i dodelom vrednosti imenu procedure (kao što smo imali kod funkcija), i što deklaracija, naravno, počinje rezervisanom reči procedure.

Primer. Pogledajmo za početak jedan jednostavan primer. Program koji sledi ispisuje brojeve od 1 do n tim redom, ali svaki unatraške.

program Unatraske; var i, n : integer; procedure IspisiUnatraske(k : integer); begin while k > 0 do begin write(k mod 10); k := k div 10 end; writeln end; begin readln(n); for i := 1 to n do IspisiUnatraske(i) end.

Procedure predstavljaju nove komande kojima obogadujemo programski jezik. Ne mogu se pozivati unutar izraza, ved se pozivaju kao nezavisne komande. Primetimo da se promenljiva k koristi kao obična promenljiva, što ona u stvari i jeste:

Argumenti procedure su obične promenljive koje možemo tako i da koristimo!

Argumenti procedure. Procedure takodje mogu da vrate neke vrednosti. One to rade ne kao funkcije, ved kroz neke od svojih argumenata. Argumenti procedure mogu biti

ulazni, i ulazno-izlazni.

Ulazni argumenti se deklarišu isto kao kod funkcija:

(ime argumenta) : (tip argumenta)

Ulazno-izlazni argumenti se deklarišu navodjenjem reči var pre deklaracije u listi

argumenata: var (ime argumenta) : (tip argumenta)

Na primer, kod sledede procedure

09.02.2012 69/119

Page 7: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 70

Autor: Velja Milanovid msc. prof.

argument n je ulazni, a argumenti min i max su ulazno-izlazni. Smisao je slededi: procedura de kroz ova tri argumenta dobiti neke vrednosti, sa njima de nešto izračunati, i onda de ono što se bude nalazilo u min i max biti vradeno kao " rezultat" rada procedure.

Aktivacija procedure u svemu ostalom podseda na aktivaciju funkcije. Razlike nastaju u tome što procedura ne vrada nikakvu vrednot. No, s druge strane, kada menjamo vrednost argumentu procedure koji je označen sa var tada zapravo menjamo vrednost promenljivoj koja stoji u pozivu procedure. Za razliku od ulazno-izlaznih, izmenom vrednosti ulaznog argumenta ne može promeniti izraz/promenljiva čiju vrednost je argument dobio na početku.

program UI; var c, d : char; procedure P(a: char; var b: char); begin a := 'X'; b := 'Y' end;

begin c := 'S'; d := 'T'; writeln(c, d); P(c, d); writeln(c, d) end.

Pogledajmo to na primeru programa UI. Kada startujemo program, u memoriji de biti napravljene dve fijoke: jedna de se zvati c, a druga d. Prvoj promenljivoj de biti dodeljena vrednost 'S', drugoj 'T' i na monitoru de biti ispisano ST.

09.02.2012 70/119

Page 8: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 71

Autor: Velja Milanovid msc. prof.

Kada računar izvrši sve naredbe procedure P, njene promenljive se uklone iz memorije, i nastavi se sa izvršavanjem glavnog programa. Primetimo da je vrednost promenljive c ostala nepromenjena, dok je promenljiva d dobila novu vrednost. Zato se ovaj put na monitoru pojavljuje SY.

09.02.2012 71/119

Page 9: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 72

Autor: Velja Milanovid msc. prof.

Da ponovimo,

Aktivacija (poziv) procedure se izvršava u nekoliko koraka:

Procedura rezerviše memorijski prostor za svoje argumente i lokalne promenljive. Pri tome, neki argument ili lokalna promenljiva smeju da imaju isto ime kao i neka globalna promenljiva. Kažemo da je u tom slučaju lokalna promenljiva sakrila globalnu promenljivu. Procedura gleda pre svega svoj memorijski prostor, pa tek ako tu ne uspe da nadje promenljivu sa odgovarajudm imenom, gleda dalje po memoriji.

Prenos argumenata:

za ulazne argumente se vrednosti odgovarajudih izraza koji se javljaju u pozivu procedure upišu u fijoke dodeljene tim argumentima procedure;

za ulazno-izlazne argumente se promenljive koje se javljaju u pozivu procedure vežu za fijoke njima odgovarajudih argumenata; time se izmenom vrednosti argumenta zapravo menja promenljiva iz poziva procedure.

Izvrši se telo procedure.

Primer: Sledi Pascal program koji od korisnika učitava n>=5 brojeva i ispisuje najvedi i i najmanji od njih.

program MinMax; var n, min, max : integer; procedure UcitajKolicinu(var k : integer); begin repeat write('Unesite broj >= 5: '); readln(k) until k >= 5; end; procedure NadjiMinMax(n : integer; var mi, ma : integer); var i, k : integer; begin read(k); mi := k; ma := k; for i := 2 to n do begin

09.02.2012 72/119

Page 10: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 73

Autor: Velja Milanovid msc. prof.

read(k); if k > ma then ma := k; if k < mi then mi := k end; readln end;

begin UcitajKolicinu(n); NadjiMinMax(n, min, max); writeln('min = ', min, ' max = ', max) end.

Kada u telu procedure NadjiMinMax baratamo sa promenljivom ma, mi zapravo čeprkamo direktno po promenljivoj max. Isto važi i za mi, odnosno min. Zato proceduri i uspeva da vrati vrednosti kroz ova dva argumenta.

UKRATKO:

U Pascalu postoje dve vrste parametara i to: promenljivi parametri (engl. variable parameters) i parametri vrednosti (engl. value parameters).

Sve vrste definicija i deklaracija što se koriste u glavnom programu (CONST, TYPE i VAR) mogu biti date i u proceduri.

Sve definicije i deklaracije unutar procedure određuju objekte koji su lokalni za tu proceduru. Oni su nedefinisani izvan te procedure i ne mogu se koristiti izvan procedure.

Promenljivi parametri u proceduri nemaju svoju vlastitu vrednost, ali kad procedura bude pozvana ti de parametri biti zamenjeni sa promenljivama u glavnom programu koje su date kao argumenti poziva. Promenljivi parametri se koriste za vradanje rezultata iz procedure u glavni program.

Međutim, za parametre vrednosti prilikom izvršavanja procedure procenjuje se odgovarajudi argument i njegova vrednost se kopira parametru. Procedura dalje operiše sa tom novom vrednošdu. Kad je procedura kompletno izvršena, ta se kopija uništi uz sve ostale tragove procedure.

Bitno je naglasiti, da ta kopija vrednosti nije kopirana nazad u originalnu vrednost argumenta, pre nego što je procedura uništena. To dalje znači, da za parametre vrednosti procedura pribavlja vrednost od argumenta ali je nesposobna da promeni vrednost argumenta. To je razlog zašto se promenljivi parametri koriste za vradanje rezultata iz procedure, a ne parametri vrednosti.

Argumenti za parametre vrednosti mogu biti i izrazi, a za promenljive parametre samo promenljive.

Na primer, PROCEDURA zamena (x : integer; VAR y : integer)

dozvoljava sledede procedurne naredbe: zamena (5, j), zamena (x + t, j), zamena (trunc (x), j) itd.

Pojavljuju se isti identifikatori u više od jednog bloka. To je u Pascalu dozvoljeno, ali nije poželjno. Prvo što treba napomenuti je, da promenljive

09.02.2012 73/119

Page 11: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 74

Autor: Velja Milanovid msc. prof.

deklarisane u različitim blokovima nemaju ništa jedna s drugom, osim što imaju isto ime.

Lokalne i globalne promenljive

Promenljive koje se deklarišu na nivou programa zovu se globalne promenljive. Promenljive deklarisane na nivou procedure/funkcije, kao i argumenti procedure/funkcije zovu se lokalne promenljive. Globalne promenljive postoje sve dok program radi. Lokalne promenljive postoje samo dok procedura/funkcija rade. Mehanizam aktivacije procedura i funkcija izgleda ovako:

1. Neki deo programa pozove proceduru/funkciju. 2. Računar rezerviše memorijski prostor za lokalne promenljive te procedure/funkcije. 3. Preuzme vrednosti parametara. 4. Odradi posao. 5. Ukoliko se radi o funkciji, vrati rezultat. 6. Oslobodi se memorijski prostor koga su okupirale lokalne promenljive.

Odatle se jasno vidi da su vrednosti lokalnih promenljivih na raspolaganju samo unutar potprograma. Kažemo još da se lokalne promenljive ne vide spolja.

Lokalna promenljiva sme imati isto ime kao neka globalna promenljiva. Tada se unutar potprograma odgovarajuda globalna promenljiva " ne vidi" zato što je " prekrivena" istoimenom lokalnom promenljivom. Inače, sve globalne promenljive se vide u potprogramima

program Sakrivanje; var n, k : integer; procedure P; var k : integer; begin

09.02.2012 74/119

Page 12: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 75

Autor: Velja Milanovid msc. prof.

(ukoliko, naravno, nisu "pokrivene" nekom lokalnom promenljivom).

k := 5; writeln(n:3, k:3); { ispis: 20 5 } end; begin n := 20; k := 30; writeln(n:3, k:3); { ispis: 20 30 } P; writeln(n:3, k:3) { ispis: 20 30 } end.

Potprogram može da menja vrednosti globalnih promenljivih. Tada se kaže da on pravi bočne efekte (engl. side effects). Ovu mogudnost treba koristiti umereno i veoma pažljivo zato što njena prekomerna upotreba može da dovede do nejasnih i nečitkih programa, kao i do grešaka koje se veoma teško otkrivaju.

program BocniEfekti; var n, k : integer; procedure P; begin n := 5; writeln(n:3, k:3); { ispis: 5 30 } end;

begin n := 20; k := 30; writeln(n:3, k:3); { ispis: 20 30 } P; writeln(n:3, k:3) { ispis: 5 30 } end.

O for ciklusu u telu procedure ili funkcije. Kod for ciklusa postoji jedan kuriozitet na koga treba obratiti pažnju: kada se javi u telu procedure ili funkcije, kontrolna promenljiva mora biti lokalna promenljiva. Evo primera korektno i nekorektno napisanog for ciklusa telu potprograma:

program DOBRO; var i : integer; procedure P; var j : integer; begin for j := 1 to 10 do writeln('dobro je') end;

begin P end.

program POGRESNO; var i : integer; procedure P; var j : integer; begin

for i := 1 to 10 do

writeln('pogresno') end;

begin P end.

ZADACI: Šta ispisje svaki od slededih programa?

09.02.2012 75/119

Page 13: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 76

Autor: Velja Milanovid msc. prof.

program Kv; var a, b, c, d : integer; procedure P(var b : integer; c : integer); var d : integer; begin a := 5; b := 6; c := 7; d := 8;

writeln(a, b, c, d) end;

begin a := 1; b := 2; c := 3; d := 4; writeln(a, b, c, d); P(a, b); writeln(a, b, c, d) end.

Primeri:

Napisati funkciju pod imenom max koja vrada vedi od dva zadata cela broja.

program FunkcijaMax2; function max2(broj1, broj2 : integer) : integer; begin if broj1 > broj2 then max2 := broj1 else max2 := broj2 end; var a, b, rezultat : integer; begin writeln('Unesite dva cela broja: '); readln(a,b); rezultat := max2(a,b); writeln('Veci broj je: ', rezultat); end.

09.02.2012 76/119

Page 14: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 77

Autor: Velja Milanovid msc. prof.

Napisati funkciju kojom se izračunava suma kubova celih brojeva od m do n.

function sumakub(m, n : integer): integer; var s, i : integer; begin s:=0; for i:=m to n do s:=s+i*i*i; sumakub:=s end;

Napisati proceduru kojom se izracunava minimum i maksimum na osnovu dva zadata cela broja.

procedure minmax(aa, bb:integer; var min, max : integer); begin if aa>bb then begin min:=bb; max:=aa; end else begin min:=aa; max:=bb; end

end;

Napisati program koji tri broja x, y i z uredjuje u neopadajudi poredak (rastudi). U programu koristiti proceduru pod imenom razmeni, kojom se razmenjuju vrednosti dve promenljive.

Rešenje programa se sastoji u tome da se prvo porede x i y, zatim x i z, i na kraju y i z. Ako su dva broja rasporedjena na željeni način ide se na sledede poredjenje, a ukoliko nisu procedurom razmeni menjaju mesta.

program Poredak; var x, y, z : integer; procedure razmeni(var a, b : integer); var tmp : integer; begin tmp:=a; a:=b; b:=tmp end; begin write('Upisati vrednosti za x, y i z: '); readln(x, y, z); if x>y then razmeni(x, y); if x>z then razmeni(x, z); if y>z then razmeni(y, z); writeln('Raspored brojeva u neopadajucem (rastucem) poredku je: ', x:6, y:6, z:6); end.

09.02.2012 77/119

Page 15: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 78

Autor: Velja Milanovid msc. prof.

Zadatak: Neka se sa tastature unosi celi brojevi n1 i n2. Koristedi funkciju vedi nadi vedi broj i prikazati ga.

program prog; var n1, n2, broj : integer; function veci(n1, n2: integer):integer; begin if n1 > n2 then veci := n1 else veci := n2; end;

begin Write('Unesi broj n1 : '); ReadLn(n1); Write('Unesi broj n2 : '); ReadLn(n2); broj := veci(n1, n2); WriteLn('Veci broj je : ',broj:5); ReadLn End.

Zadatak: Neka se sa tastature unose četiri cela broja n1, n2, n3 i n4. Koristedi funkciju veci iz prethodnog zadataka nađi najvedi broj.

program prog; var n1, n2, n3, n4, broj : integer; function veci(n1, n2: integer):integer; begin if n1 > n2 then veci := n1 else veci := n2; end;

begin Write('Unesi broj n1 : '); ReadLn(n1); Write('Unesi broj n2 : '); ReadLn(n2); Write('Unesi broj n3 : '); ReadLn(n3); Write('Unesi broj n4 : '); ReadLn(n4); broj := veci(veci(n1, n2), veci(n3, n4)); WriteLn('Veci broj je : ',broj:5); ReadLn End.

09.02.2012 78/119

Page 16: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 79

Autor: Velja Milanovid msc. prof.

Zadatak: Neka se sa tastature unose stranice a i b pravougaonog trougla. Izračunati hipotenuzu c a za njeno izračunavanje koristi funkciju hipotenuza.

program prog; var a, b, c : real; function hipotenuza(a, b: real):real; begin hipotenuza := sqrt(sqr(a)+sqr(b)); end; begin Write('Unesi stranicu a : '); ReadLn(a); Write('Unesi stranicu b : '); ReadLn(b); c := hipotenuza(a, b); WriteLn('Hipotenuza c je : ',c:8:5); ReadLn End.

Zadatak: Neka je data procedura račun:

procedure racun(x1, x2 : real; var y1:real); begin

y1 := x1+trunc(x2)+round(x1)+x2; end;

i neka se ona iz programa poziva sa: racun(x,y,z); koja de biti vrednost promenljive z, ako se unese:

a) 1 1 b) 1.7 2.8

Rešenje:

a) ako se unese 1, 1 onda se u proceduri račun izračuna:

y1=1+trunc(1)+round(1)+1=1+1+1+1=4 što de biti pridružueno promenljivoj z.

b) Ako se unese 1.7 i 2.8 onda demo imati:

y1=1.7+trunc(2.8)+round(1.7)+2.8=1.7+2+2+2.8=8.5

Zadatak: Neka je data slededi paskalski program:

program prog; var x, y, z, z1 : real; procedure racun(x1, x2 : real; var y1, y2 : real); begin y1 :=x1+sqr(x2)+sqr(x1); y2 :=x1*x2; end;

09.02.2012 79/119

Page 17: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 80

Autor: Velja Milanovid msc. prof.

begin Write('Unesi vrednost x, y : '); ReadLn(x,y); racun(x,y,z,z1); x :=z; y :=z1; racun(x,y,z,z1); WriteLn('Vrednost promenljivih z i z1 je : ',z:8:2,' ',z1:8:2); ReadLn End.

Kolika de biti vrednost promenljivih z i z1 ako se unese: a) 1 1 b) 4 5

Rešenje:

a) ako se unese 1, 1 onda se u proceduri racun sračuna u prvom pozivu:

y1=1+sqr(1)+sqr(1)=3 y2=x1*x2=1*1=1

u drugom pozivu ulazni paramteri procedure su 3 i 1 pa de biti:

y1=3+sqr(1)+sqr(3)=3+1+9=13 y2=3*1=3

c) rešenje je: z=2470, z1=900

Zadatak: Napisati program kojim se u proceduri zbir traži suma brojeva deljivih sa 7 od 100 do 200. Rezultat prikaži u glavnom programu

Rešenje:

program prog; var s : integer; procedure zbir(var s1: integer); var i, ss1 : integer; begin ss1 := 0; for i := 100 to 200 do if (i mod 7 = 0) then ss1 := ss1+i; s1 :=ss1; end; begin zbir(s); WriteLn('Trazeni zbir je: ',s:5); ReadLn End.

Procedura zbir koristi samo izlazne paramtre. U njoj su definisane i lokalne varijable.

09.02.2012 80/119

Page 18: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 81

Autor: Velja Milanovid msc. prof.

E-test petlje i potprogrami

2. Pronadjite šta izračunava program

Var broj,m,n,c:integer; begin readln(broj); m:=1; n:=12; while(broj>0) do begin if (broj mod 100) div 10 <> broj mod 10 then m:=m*broj; readln(broj); end; writeln(m); writeln(n); end.

a) Proizvod brojeva koji se zavrsavaju sa dve razlicite cifre i broj 12 b) Proizvod brojeva sa razlicitim ciframa i 1. c) Broj 1 i proizvod dvocifrenih brojeva d) Proizvod jednocifrenih brojeva i broj 12. e) Proizvod dvocifrenih brojeva i broj 12.

3.

x:=-1; repeat x:=x+2; writeln(x); until x=10;

Koliko puta de se petlja ponoviti:

a) beskonačno puta b) 1 put c) 6 puta d) 11 puta

4.

Br:=0; For a:=1 to 20 do if odd(a) then br:=br+1;

Writeln(br);

Koja vrednost de biti ispisana nakon izvršenja programa?

a) 11 b) 8 c) 9 d) 10 e) 12

5.

a:=0;

09.02.2012 81/119

Page 19: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 82

Autor: Velja Milanovid msc. prof.

while a<6 do begin writeln(a); a:=a-1; end;

Koliko puta de se petlja ponoviti:

a) 7 b) 5 c) beskonačno puta d) 6

7.

x:=10; repeat x:=x-2; write(x); until x=1;

Program de ispisati:

a) 8 6 4... (beskonačna petlja) b) 8 6 4 2 c) 8 6 4 2 0 d) ništa nede ispisati

22. Neka je data procedura račun:

procedure racun(x1, x2 : real; var y1:real); begin y1 := x1+trunc(x2)+round(x1)+x2; end;

i neka se ona iz programa poziva sa: racun(x,y,z);

koja de biti vrednost promenljive z, ako se unese: x:= 1.6 i y:=1.1

a) 9 b) 6.5 c) 5.7 d) 5.4 e) 8.2 f) 8.9 g) 4.7

23. Šta se ispisuje izvršavanjem slededeg programa:

PROGRAM HGJ; var a,b:integer; procedure P( x:integer; var y:integer ); begin x:=x+1; y:=y+1; end; BEGIN

09.02.2012 82/119

Page 20: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 83

Autor: Velja Milanovid msc. prof.

a:=5; b:=5; P(a,b); writeln(‘a=‘, a:3, ‘b=’, b:3) END. a) ništa b) 6, 6 c) 6, 7 d) 5, 6 e) 4, 4

25. Navedi vrste potprograma u PASCAL-u.

a) petlje i uslovi b) imena i prezimena c) procedure i funkcije d) moduli i klase

31. Koje de vrednosti imati promenljive x,y,z kada se procedura:

procedure vrednost ( var a,b: integer; c:integer); begin a:=b+c+a; b:=6; c:=a-b end;

pozove naredbom vrednost (x,y,z); pošto su prethodno izvršene naredbe: x:=2; y:=3; z:=4;

a) 3, 3, 5 b) 2, 3, 6 c) 9, 6, 6 d) 9, 6, 4 e) 9, 6, 7

34. Ako je dat slededi opis procedure:

PROCEDURE P (a:integer; VAR x:integer); BEGIN x:=2*a END;

i pre obradanja proceduri, u osnovnom programu su izvršene dodele: a:=10; b:=15, ispitati koja su od slededih obradanja proceduri nekorektna

a) p (a); b) p (5,a,b); c) p (3*b,b); d) p (a,b); e) p (7,b); f) p (a+1,b); g) p (a,12);

50. Šta se ispisuje izvršavanjem slededeg programa (napiši cifru):

program test: var x:integer; procedure uvecaj(var x:integer); begin

09.02.2012 83/119

Page 21: WordPress.com - 14. Funkcije i procedure · 2014. 2. 14. · Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 64 Autor: Velja Milanovid msc. prof. 14

Algoritmi i programiranje u PASCAL-u sa zbirkom rešenih zadatka - V. Milanovid 84

Autor: Velja Milanovid msc. prof.

x:=(x+1)div 2 mod 3 end; begin x:=4; uvecaj(x); writeln(x); end.

80. Iz procedure vrednoti se iznose pomodu globalne promenljive i ulazno-izlaznih parametara.

a) Tačno b) Netačno

104. Šta de biti ispisano izvršenjem slededeg programa i njegove procedure:

var x,y,z,v:integer; procedure TEST ( a, d: integer; var s, p:integer); begin s:=a-(d div 3); a:=6-a; d:=7+v*3; p:=14-s mod 2; end; begin x:=6; y:=1; z:=1; v:=3; TEST (x,y,z,v); write (x:3,y:3,z:3,v:3); readln end.

a) 6 1 1 3 b) 6 1 6 14 c) 0 1 6 14 d) 0 10 6 14 e) 6 10 6 14

09.02.2012 84/119