13
Osnovi programiranja dr Boban Stojanović 1 Funkcije i procedure Kompjuterski programi sadrže nizove instrukcija koje za cilj imaju izvršavanje određenog zadatka, što u opštem slučaju podrazumeva preuzimanje ulaznih veličina i njihovu obradu u cilju dobijanja određenih rezultata. Imajući ovo u vidu, kompjuterske programe možemo uporediti sa preduzećima koja nabavljaju ulazne sirovine i njihovom obradom dolaze do konačnih proizvoda. U slučaju malih zanatskih radionica nabavku materijala, obradu i prodaju proizvoda može obavljati samo jedan čovek. Međutim, u velikim preduzećima je neophodno napraviti organizacione jedinice specijalizovane za obavljanje samo određenih zadataka. Na taj način vrši se podela zaduženja i odgovornosti za izvršavanje određenih zadataka, čime se znatno olakšava organizacija posla u preduzeću. Pored toga, zaposleni su specijalizovani za određene zadatke, što znatno povećava efikasnost. Takođe, u slučaju potrebe za promenama u određenim segmentima proizvodnje, ne narušava se funkcionalnost ostalih celina, već se izmene vrše samo u sektoru koji je odgovoran za izvršenje određenog zadatka. Prilikom rešavanja manjih problema korišćenjem računara, svi zadaci se mogu izvršiti u okviru glavnog programa, baš kao što jedan radnik može obaviti sve zadatke u zanatskoj radionici. Međutim, sa povećanjem složenosti kompjuterskih programa, neophodno je uvesti organizacione koncepte slične onima koji se koriste u velikim preduzećima. Iz tog razloga, potrebno je program podeliti na odgovarajuće logičke i funkcionalne celine, takozvane potprograme. Potprogrami omogućavaju organizovanje određenog broja instrukcija u celine koje obavljaju određene zadatak i na koje se možemo pozivati više puta u toku izvršavanja programa. Korišćenje potprograma donosi niz prednosti od kojih možemo izdvojiti sledeće: Omogućava koncentrisanje na izvršavanje samo određenog zadatka Različiti članovi razvojnog tima mogu razvijati različite potprograme koji se kasnije sklapaju u jednu celinu Omogućava izvršavanje istog zadatka na više mesta u programu jednostavnim pozivanjem odgovarajućeg potprograma Realizacija potprograma u Pascal-u U programskom jeziku Pascal potprograme je moguće realizovati korišćenjem funkcija i procedura. Funkcija je samostalan deo programa koji obavlja određeni zadatak i preko svog naziva i liste parametara, delu programa iz koga je pozvana vraća odgovarajuće rezultate. Svaka funkcija ima jedinstveni naziv preko koga se može pozvati proizvoljan broj puta iz bilo kog dela programa u cilju izvršenja tog zadatka. Procedura je potprogram sličan funkciji sa tom razlikom što procedura preko svog imena ne vraća nikakvu vrednost delu programa iz koga je pozvana. Pored toga što se korišćenjem funkcija i procedura izbegava nepotrebno ponavljanje delova koda, pa samim tim povećava i čitljivost programa, funkcije i procedure omogućavaju realizaciju programiranja "odozgo na dole". Ovaj metod podrazumeva razbijanje problema na manje "potprobleme", a zatim i novodobijenih "potproblema" na još manje celine, sve do trenutka dok se glavni problem ne svede na rešavanje elementarnih problema. Prateći ovaj princip većina programa se može razbiti na određeni broj potproblema kao što je prikazano na slici:

Osnovi Programiranja - 06 Funkcije i Procedure

Embed Size (px)

DESCRIPTION

fsfa

Citation preview

  • Osnovi programiranja dr Boban Stojanovi

    1

    Funkcije i procedure Kompjuterski programi sadre nizove instrukcija koje za cilj imaju izvravanje odreenog zadatka, to u optem sluaju podrazumeva preuzimanje ulaznih veliina i njihovu obradu u cilju dobijanja odreenih rezultata. Imajui ovo u vidu, kompjuterske programe moemo uporediti sa preduzeima koja nabavljaju ulazne sirovine i njihovom obradom dolaze do konanih proizvoda.

    U sluaju malih zanatskih radionica nabavku materijala, obradu i prodaju proizvoda moe obavljati samo jedan ovek. Meutim, u velikim preduzeima je neophodno napraviti organizacione jedinice specijalizovane za obavljanje samo odreenih zadataka. Na taj nain vri se podela zaduenja i odgovornosti za izvravanje odreenih zadataka, ime se znatno olakava organizacija posla u preduzeu. Pored toga, zaposleni su specijalizovani za odreene zadatke, to znatno poveava efikasnost. Takoe, u sluaju potrebe za promenama u odreenim segmentima proizvodnje, ne naruava se funkcionalnost ostalih celina, ve se izmene vre samo u sektoru koji je odgovoran za izvrenje odreenog zadatka.

    Prilikom reavanja manjih problema korienjem raunara, svi zadaci se mogu izvriti u okviru glavnog programa, ba kao to jedan radnik moe obaviti sve zadatke u zanatskoj radionici. Meutim, sa poveanjem sloenosti kompjuterskih programa, neophodno je uvesti organizacione koncepte sline onima koji se koriste u velikim preduzeima. Iz tog razloga, potrebno je program podeliti na odgovarajue logike i funkcionalne celine, takozvane potprograme. Potprogrami omoguavaju organizovanje odreenog broja instrukcija u celine koje obavljaju odreene zadatak i na koje se moemo pozivati vie puta u toku izvravanja programa.

    Korienje potprograma donosi niz prednosti od kojih moemo izdvojiti sledee:

    Omoguava koncentrisanje na izvravanje samo odreenog zadatka Razliiti lanovi razvojnog tima mogu razvijati razliite potprograme koji se kasnije sklapaju u

    jednu celinu

    Omoguava izvravanje istog zadatka na vie mesta u programu jednostavnim pozivanjem odgovarajueg potprograma

    Realizacija potprograma u Pascal-u U programskom jeziku Pascal potprograme je mogue realizovati korienjem funkcija i procedura. Funkcija je samostalan deo programa koji obavlja odreeni zadatak i preko svog naziva i liste parametara, delu programa iz koga je pozvana vraa odgovarajue rezultate. Svaka funkcija ima jedinstveni naziv preko koga se moe pozvati proizvoljan broj puta iz bilo kog dela programa u cilju izvrenja tog zadatka. Procedura je potprogram slian funkciji sa tom razlikom to procedura preko svog imena ne vraa nikakvu vrednost delu programa iz koga je pozvana.

    Pored toga to se korienjem funkcija i procedura izbegava nepotrebno ponavljanje delova koda, pa samim tim poveava i itljivost programa, funkcije i procedure omoguavaju realizaciju programiranja "odozgo na dole". Ovaj metod podrazumeva razbijanje problema na manje "potprobleme", a zatim i novodobijenih "potproblema" na jo manje celine, sve do trenutka dok se glavni problem ne svede na reavanje elementarnih problema. Pratei ovaj princip veina programa se moe razbiti na odreeni broj potproblema kao to je prikazano na slici:

  • Osnovi programiranja dr Boban Stojanovi

    2

    Slika ### ematski prikaz metoda "odozgo na dole"

    Sintaksa

    function[(listaparametara)]:;[deklaracija_lokalnih_promenljivih]procedure[(listaparametara)];[deklaracija_lokalnih_promenljivih]

    Svaka funkcija ili procedura mora imati zaglavlje, koje sadri jedinstveni naziv naveden odmah iza rezervisane rei function, odnosno procedure. Iza naziva potprograma sledi lista parametara unutar oblih zagrada. Za svaki parametar potprograma mora biti naveden i njegov tip, na slian nain kao i kod deklaracija promenljivih naredbom var. Korienje ili izostavljanje naredbe var u okviru liste parametara ima specifinu funkciju, o emu e kasnije biti rei.

    Nakon definisanja zaglavlja potprograma sledi blok za deklarisanje lokalnih promenljivih. Deklaracija lokalnih promenljivih se vri na potpuno isti nain kao i deklarisanje promenljivih unutar glavnog programa, korienjem naredbe var.

    Iza bloka za deklaraciju lokalnih promenljivih sledi blok naredbi, odnosno telo funkcije ili procedure. Kao i svaki drugi blok naredbi, telo potprograma se sastoji od niza komandi ogranienih rezervisanim reima begin i end. Iza rezervisane rei end u ovom sluaju se pie znak ;.

    S obzirom na injenicu da funkcija mora vratiti odgovarajuu vrednost, neophodno je da unutar tela funkcije postoji bar jedna naredba dodele koja izraunatu vrednost dodeljuje nazivu funkcije.

    Svaki potprogram moe biti pozvan iz glavnog programa ili drugog potprograma navoenjem njegovog imena i liste parametara unutar oblih zagrada. Prilikom poziva funkcija potrebno je vrednost koju funkcija vraa dodeliti odgovarajuoj promenljivoj korienjem operatora dodele, ili je direktno iskoristiti unutar nekog izraza ili naredbe.

    Primer 1

    Napisati program koji izraunava i tampa rastojanje izmeu dve take ije su koordinate date na ulazu.

    programRastojanje;var x1,y1,x2,y2,r:real; functionrast(x1,y1,x2,y2:real):real; begin rast:=sqrt(sqr(x2x1)+sqr(y2y1)); end;

  • Osnovi programiranja dr Boban Stojanovi

    3

    procedurestampaj(d:real); begin writeln('Rastojanjeizmedjutacakaje',d:10:4); end;begin writeln('Unesitekoordinateprvetacke:'); read(x1,y1); writeln('Unesitekoordinatedrugetacke:'); read(x2,y2); r:=rast(x1,y1,x2,y2); stampaj(r);end.

    U prethodnom primeru definisana su dva potprograma. Prvi potprogram je funkcija koja na osnovu koordinata dve take izraunava rastojanje izmeu njih. Drugi potprogram je procedura koja vri tampanje rezultata uz odgovarajui komentar.

    Nakon unosa koordinata taaka glavni program poziva funkciju rast i alje joj koordinate taaka. Kada funkcija zavri izraunavanje, ona glavnom programu vraa rastojanje izmeu navedenih taaka. Glavni program, zatim, dobijenu vrednost dodeljuje promenljivoj r. Program dalje poziva proceduru stampaj i prosleuje joj rastojanje r, nakon ega procedura vri tampanje ove vrednosti uz odgovarajui komentar.

    Primer 2

    Napisati program koji za n vrednosti sa ulaza vri izraunavanje polinoma 5 4 23 6 2x x x+ + . programPolinom;var x:real; n,i:integer; functionstepen(x:real;eksp:integer):real; var i:integer; s:real; begin s:=1; fori:=1toekspdo s:=s*x; stepen:=s; end; functionpoli(x:real):real; begin poli:=stepen(x,5)+3.0*stepen(x,4)6.0*sqr(x)+2; end;begin writeln('Unesitekolikobrojevazelite:'); readln(n); fori:=1tondo begin writeln('Unesite',i,'.broj:'); readln(x); writeln('Vrednostpolinomaza',i,'.brojje',poli(x):10:4);

  • Osnovi programiranja dr Boban Stojanovi

    4

    end;end.

    U prethodnom primeru su definisane dve funkcije. Funkcija stepen izraunava vrednost ekspx , a funkcija poli izraunava vrednost polinoma 5 4 23 6 2x x x+ + . Primetimo da funkcija poli vri izraunavanje polinoma korienjem prethodno definisane funkcije stepen.

    U glavnom programu korisnik unosi n realnih brojeva i za svaki od njih se izraunava vrednost polinoma pozivom funkcije poli, a dobijeni rezultat tampa na ekranu.

    Direktiva FORWARD Da bi odreeni potprogram (funkcija ili procedura) mogao da se pozove iz nekog drugog potprograma, neophodno je da potprogram koji se poziva bude definisan pre potprograma koji ga poziva. Ukoliko raspored potprograma nije takav da je ovaj zahtev obezbeen, mogue je koristiti direktivu forward kako bi se naznailo da e definicija potprograma koji se poziva uslediti kasnije u kodu. To se postie tako to se ispred potprograma koji poziva navede samo zaglavlje potprograma koji se poziva praeno direktivom forward, a sam potprogram koji se poziva se navodi kasnije u kodu. Na primer:

    procedurep2(...);forward;procedurep1(...);begin ... p2(...); ...end;procedurep2(...);begin ...end;

    Opseg vaenja i ivotni vek promenljivih Opseg vaenja neke promenljive je deo programa u kome ta promenljiva moe biti koriena. U tom delu programa data promenljiva ima znaenje i za nju kaemo da je "vidljiva" u tom opsegu. Na primer, promenljiva deklarisana unutar funkcije ili procedure ima znaenje i vidljiva je samo unutar tog potprograma. Takvu promenljivu nazivamo lokalna promenljiva. Sa druge strane, globalna promenljiva se deklarie u glavnom programu i vidljiva je iz bilo kog dela programa.

    Na Slici ### su ematski prikazani opsezi vaenja pojedinih promenljivih. U glavnom programu su deklarisane globalne promenljive a, b, c, x i y, koje su vidljive u svim delovima programa pa samim tim i u Potprogramu 1 i Potprogramu 2.

    U potprogramu 1 su deklarisane lokalne promenljive a i d, koje su vidljive samo u ovom potprogramu i ne mogu se koristiti van njega. Pored ove dve promenljive u Potprogramu 1 su vidljive i globalne promenljive b, c, x i y. Svaka promena vrednosti ovih promenljivih u bilo kom delu programa je vidljiva i u Potprogramu 1. Takoe, promena vrednosti ovih promenljivih u Potprogramu 1 izazvala bi promenu njihovih vrednosti i u svim ostalim delovima programa, iz razloga to su to ustvari jedne te iste promenljive. Meutim, globalna promenljiva a nije vidljiva u Potprogramu 1 iz razloga to istoimena lokalna promenljiva ima prioritet. Iako globalna i lokalna promenljiva a imaju isti naziv, to su zapravo dve razliite promenljive. Ukoliko bi u Potprogramu 1 dolo do promene vrednosti lokalne promenljive a, to ne bi imalo nikakvog uticaja na globalnu promenljivu a. Takoe, promena vrednosti globalne promenljive a nema uticaja ne vrednost lokalne promenljive a u Potprogramu 1.

    U Potprogramu 2 su deklarisane lokalne promenljive d, e i x, koje su vidljive samo u ovom potprogramu i ne mogu se koristiti van njega. Pored ovih promenljivih, u Potprogramu 2 su vidljive i globalne promenljive a, b, c i y, ije smo osobine opisali na primeru Potprograma 1.

  • Osnovi programiranja dr Boban Stojanovi

    5

    Primetimo da oba potprograma poseduju lokalnu promenljivu d, ali zahvaljujui tome to su ove dve promenljive deklarisane u razliitim potprogramima, one imaju potpuno odvojen opseg vaenja. To praktino znai da promena promenljive d u jednom potprogramu nema nikakvog uticaja na istoimenu promenljivu u drugom potprogramu. Iako imaju isti naziv, to su zapravo dve razliite promenljive.

    Glavni program

    Potprogram 1

    Potprogram 2

    a b c x y

    a d

    d e

    b c x y

    a b c

    x

    y

    Globalna promenljiva

    Lokalna promenljiva

    Globalna promenljivavidljiva u potprogramu

    Slika ### ematski prikaz opsega vaenja globalnih i lokalnih promenljivih

    S obzirom da promenljiva nema znaenje van svog opsega, besmisleno je njeno korienje van dela programa u kome je deklarisana. U kompajlerskim jezicima se u trenutku prevoenja programa vri analiza korienja promenljivih unutar programa. U sluaju da je pokuano korienje neke promenljive van njenog opsega, kompajler prijavljuje greku.

    ivotni vek promenljive opisuje u kom delu programa odreena promenljiva ima vrednost, odnosno u kojim trenucima izvrenja programa promenljiva zapoinje i zavrava svoje postojanje. Na poetku ivotnog veka promenljive, program obezbeuje deo memorije u kome e biti smetena njena vrednost. ivotni vek promenljive prestaje oslobaanjem prethodno zauzetog dela memorije.

    Opseg vaenja direktno utie na ivotni vek promenljive. ivotni vek promenljive obino poinje ulaskom u njen opseg vaenja, a prestaje izlaskom iz njega, kako bi se izbeglo nepotrebno troenje memorije na promenljive koje nisu vidljive u trenutnom opsegu. Ovakve promenljive se esto nazivaju i automatske. Pored automatskih promenljivih, u nekim jezicima postoje i takozvane statike promenljive, iji ivotni vek traje i nakon izlaska iz opsega, tako da se ove promenljive mogu ponovo koristiti ukoliko se program vrati u pomenuti opseg.

    Dobra programerska praksa podrazumeva pravljenje to manjih opsega vaenja pojedinih promenljivih, kako ne bi dolo do sluajnog meanja promenljivih dva razliita dela programa. Iako su globalne promenljive vidljive u svim potprogramima, treba izbegavati njihovo menjanje u funkcijama i procedurama. Ukoliko potprogrami menjaju globalne promenljive, prilikom itanja glavnog dela programa veoma je teko uoiti ta se zapravo deava sa pojedinim promenljivama, to moe izazvati neeljene efekte. U sluaju da je potrebno da odreeni potprogram promeni neku od globalnih promenljivih, najbolje je tu promenljivu proslediti funkciji ili proceduri kao parametar. Na taj nain i u glavnom programu postaje jasno da su odreene globalne promenljive "poverene" potprogramu i da ih on moe promeniti. O nainima prenoenja parametara iz glavnog programa u potprogram bie vie rei u narednoj sekciji.

    Primer

    programOpseg;var a,b,c:integer; x,y:real; procedurePotprogram1;

  • Osnovi programiranja dr Boban Stojanovi

    6

    var a,d:integer; begin a:=11; d:=c+12; b:=13; x:=3.14; end; functionPotprogram2:integer; var d,e,x:integer; begin x:=5; d:=a+x; a:=d+1; Potprogram2:=1; end;begin a:=1; b:=2; c:=3; x:=4.0; y:=5.0; Potprogram1;{ Nakonizvrsenjaovelinijevrednostipromenljivihsu: a=1,b=13,c=3,dnijevidljivo,enijevidljivo, x=3.14,y=5.0 } Potprogram2;{ Nakonizvrsenjaovelinijevrednostipromenljivihsu: a=7,b=13,c=3,dnijevidljivo,enijevidljivo, x=3.14,y=5.0 }end.

    Prenos parametara Do sada smo videli da glavni program ili neki potprogram mogu pozvati odreenu funkciju ili proceduru u cilju izvrenja odreenog zadatka. Da bi zadatak mogao biti izvren najee je potrebno potprogramu proslediti odreene podatke koje nazivamo parametrima ili argumentima funkcije ili procedure.

    Takoe, videli smo i da funkcije preko svog imena mogu glavnom programu vratiti neku vrednost. Za razliku od funkcija, procedure programu ili potprogramu koji ih je pozvao ne vraaju nikakvu vrednost ve samo izvravaju odreni zadatak. Meutim, u realnim problemima je esto sluaj da je potrebno da potprogram glavnom programu vrati vie od jedne vrednosti. Vraanje vie od jedne vrednosti mogue je izvriti preko liste parametara, o emu e u nastavku biti rei.

    Za pravilno korienje funkcija i procedura veoma je vano potpuno razumevanje funkcionisanja prenosa parametara izmeu glavnog programa i potprograma. Iz tog razloga e u nastavku biti detaljno obraen ovaj proces.

    Svaka funkcija i procedura u svom zaglavlju imaju definisanu listu parametara koje zahtevaju od programa ili potprograma koji ih poziva. Ove parametre nazivamo formalni parametri. U programskom jeziku Pascal postoje dve vrste formalnih parametara:

    vrednosni promenljivi (varijabilni)

  • Osnovi programiranja dr Boban Stojanovi

    7

    Kada glavni program ili neki potprogram pozove neku funkciju ili proceduru, on joj prosleuje potrebne vrednosti koje nazivamo stvarni parametri. Lista stvarnih parametara mora da odgovara listi formalnih parametara po broju, tipu i redosledu. To znai da glavni program mora potprogramu da prosledi tano onoliko parametara koliko potprogram zahteva, pri emu parametri moraju da budu istog tipa i navedeni u potpuno istom redosledu kao to su navedeni u zaglavlju potprograma.

    Prenos vrednosnih parametara Razmotrimo ta se deava prilikom pozivanja potprograma koji zahteva samo vrednosne parametre. U trenutku pozivanja takvog potprograma, vrednosti koje su u pozivu navedene kao stvarni parametri se kopiraju u formalne parametre funkcije i procedure. Vrednosni formalni parametri potprograma se ponaaju potpuno isto kao i lokalne promenljive tog potprograma. Oni su vidljivi samo unutar te funkcije ili procedure i ne moe im se pristupiti iz glavnog programa ili nekog drugog potprograma. Zahvaljujui tome, bilo kakva promena vrednosti tih promenljivih unutar potprograma, nema nikakvog uticaja na ostatak programa, pa samim tim ni na stvarne parametre koji su prosleeni potprogramu.

    Na Slici ### je prikazan postupak prosleivanja vrednosnih parametara potprogramu.

    Glavni program

    Potprogram( z:real; a,k:integer )

    5 8 2 3.14 2.73

    Globalna promenljiva

    Lokalna promenljiva

    Vrednosni parametar

    a b c x y

    i

    z a

    Potprogram(x,a,b+2); ( 3.14, 5, 10 )

    k

    Potprogram( z:real; a,k:integer )

    i

    3.14

    z

    5

    a

    10

    k

    Slika ### ematski prikaz prenosa vrednosnih parametara

    Na Slici ### ematski je prikazan program koji sadri celobrojne promenljive a, b i c i realne promenljive x i y sa vrednostima navedenim u kvadratima. U okviru programa je definisan i Potprogram koji ima tri vrednosna parametra i to realni parametar z i celobrojne parametre a i k. Potprogram, takoe, koristi i lokalnu promenljivu i.

    Glavni program poziva Potprogram korienjem linije

    Potprogram(x,a,b+2);

    U trenutku poziva vrednosti navedenih stvarnih parametara (x, a, b+2) se prosleuju Potprogramu, i upisuju u formalne parametre (z, a, k). Primetimo da stvarni vrednosni parametri mogu biti promenljive, izrazi i konstante iz razloga to se Potprogramu proseuju samo vrednosti ovih parametara.

    Unutar Potprograma promenljive z, a i k se ponaaju kao lokalne promenljive i njihova promena unutar Potprograma nee imati nikakvog uticaja na ostatak programa. Takoe, Glavni program ne moe pristupiti ovim promenljivama, a njihove vrednosti moe zadati samo prilikom poziva Potprograma. S obzirom da se fiktivni parametri ponaaju kao lokalne promenljive potprograma, njihovi nazivi moraju biti jedinstveni samo unutar Potprograma i nisu ni u kakvoj vezi sa nazivima stvarnih parametara. Tako, vrednost stvarnog parametra x se kopira u formalni parametar z, vrednost stvarnog parametra a se kopira u formalni parametar a, a vrednost izraza b+2 se upisuje u formalni parametar k. Iako stvarni parametar a i formalni

  • Osnovi programiranja dr Boban Stojanovi

    8

    parametar a nose isti naziv, oni meusobno nisu povezani. To su zapravo dve razliite promenljive, od kojih je jedna deklarisana unutar Glavnog programa kao globalna promenljiva, a druga kao formalni parametar Potprograma, to znai da su njen opseg vaenja i ivotni vek samo unutar ovog potprograma.

    Primer

    programVrednosni;var a,b,c:integer; x,y:real; procedurePotprogram(z:real;a,k:integer); var i:integer; begin a:=11; fori:=1tokdoz:=z+1; writeln(a,z); end;begin a:=5; b:=8; c:=2; x:=3.14; y:=2.73; Potprogram(x,a,b+2); {Nakonizvrsenjaovelinijevrednostipromenljivihsu: a=5,b=8,c=2,x=3.14,y=2.73} writeln(a,b,c,x,y);end.

    Prenos promenljivih parametara U dosadanjem razmatranju smo imali prilike da vidimo da jedino funkcija moe vratiti glavnom programu neku vrednost preko svog naziva. Meutim, u realnim problemima je esto sluaj da je potrebno da potprogram glavnom programu vrati vie od jedne vrednosti.

    U prethodnom delu smo mogli videti kako se vri prenos vrednosnih parametara iz glavnog programa u potprogram. S obzirom da se vrednosni parametri ponaaju kao lokalne promenljive, ni jedna njihova promena nee biti vidljiva u glavnom programu. Samim tim nije mogue glavnom programu vratiti neku vrednost putem vrednosnih parametara.

    Iz tog razloga postoji i druga vrsta formalnih parametara koje nazivamo promenljivim ili varijabilnim parametrima. Kod ove vrste parametara potprogramu se ne prenose vrednosti stvarnih parametara, ve njihove adrese. Na taj nain i stvarni i formalni parametri ukazuju praktino na istu memorijsku lokaciju, ime se postie da svaka promena formalnog parametra unutar potprograma direktno menja vrednost odgovarajueg stvarnog parametra u glavnom programu. Za razliku od prenosa parametara po vrednosti, ovaj nain prenosa se naziva prenos parametara po referenci.

    Promenljivi parametri se u programskom jeziku Pascal deklariu korienjem rezervisane rei var unutar liste parametara. Tako na primer procedura Test definisana kao

    procedureTest(z:real;vara,b:integer);

    ima jedan realan vrednosni parametar z i dva promenljiva parametra a i b. Promena parametra z unutar procedure nee imati uticaja na promenljive u glavnom programu. Meutim, promena parametara a i b e direktno znaiti i promenu odgovarajuih stvarnih parametara koji su prosleeni proceduri.

    Na Slici ### dat je ematski prikaz prenosa promenljivih parametara:

  • Osnovi programiranja dr Boban Stojanovi

    9

    Glavni program

    Potprogram( z:real; var a,b:integer )

    5 8 2 3.14 2.73

    Globalna promenljiva

    Lokalna promenljiva

    Vrednosni parametar

    a b c x y

    i

    z a

    Potprogram(y+2,a,c); ( 4.73, a, c )

    b

    Potprogram( z:real; var a,b:integer )

    i

    4.73

    z

    Promenljivi parametar

    5 a

    2 b

    a

    c

    Slika ### ematski prikaz prenosa promenljivih parametara

    Na Slici ### ematski je prikazan program koji sadri celobrojne promenljive a, b i c i realne promenljive x i y sa vrednostima navedenim u kvadratima. U okviru programa je definisan i Potprogram koji ima tri formalna parametra i to realni vrednosni parametar z i celobrojne promenljive parametre a i b. Potprogram, takoe, koristi i lokalnu promenljivu i.

    Glavni program poziva Potprogram korienjem linije

    Potprogram(y+2,a,c);

    U trenutku poziva vrednost stvarnog parametara (y+2) se prosleuje Potprogramu, i upisuje u formalni parametar z. Pored toga, Potprogramu se prosleuju i stvarni parametri a i c, koji odogovaraju promenljivim formalnim parametrima a i b. Za razliku od vrednosnog parametra z, u ovom sluaju se ne prosleuju vrednosti promenljivih a i c, ve njihove adrese u memoriji. Umesto konkretnih vrednosti, formalnim parametrima a i b se dodeljuje da ukazuju na istu memorijsku lokaciju prosleenih promenljivih a i c. Od tog trenutka promenljiva a unutar Potprograma deli istu memorijsku lokaciju sa globalnom promenljivom a. Slino i promenljiva b deli istu memorisjku lokaciju sa globalnom promenljivom c. To praktino znai da e svaka promena promenljive a unutar Potprograma istovremeno izazvati promenu i globalne promenljive a. Takoe, svaka promena promenljive b unutar Potprograma izaziva promenu globalne promenljive c. Primetimo da, iako dele isti memorijski prostor, stvarni i formalni parametri potprograma mogu imati iste ili razliite nazive, iz razloga to imaju razliite opsege vaenja.

    Korienjem opisanog mehanizma mogue je u odreenom potprogramu dodeliti vrednosti pojedinim promenljivim parametrima i na taj nain direktno promeniti vrednosti vie promenljivih u glavnom programu. To praktino omoguava da potprogram glavnom programu vrati vie od jedne vrednosti.

    Primer

    programPromenljivi;var a,b,c:integer; x,y:real; procedurePotprogram(z:real;vara,b:integer); var i:integer; begin a:=11; b:=adiv2; fori:=1tobdoz:=z+1;

  • Osnovi programiranja dr Boban Stojanovi

    10

    writeln(a,b,z); end;begin a:=5; b:=8; c:=2; x:=3.14; y:=2.73; Potprogram(y+2,a,c); {Nakonizvrsenjaovelinijevrednostipromenljivihsu: a=11,b=8,c=5,x=3.14,y=2.73} writeln(a,b,c,x,y);end.

    Primer 2

    Napisati program koji za zadati prirodan broj n pozivanjem potprograma izraunava sumu i proizvod svih prirodnih brojeva manjih od n.

    programPrimer2;var n:integer; s,p:real; procedureSumaProizvod(k:integer;varsuma,proizvod:integer); var i:integer; begin suma:=0; proizvod:=1; fori:=1tok1do begin suma:=suma+i; proizvod:=proizvod*i; end; end;begin writeln('Unesiteprirodanbrojn:'); readln(n); SumaProizvod(n,s,p); writeln('Sumaprirodnihbrojevamanjihod',n,'je',s); writeln('Proizvodprirodnihbrojevamanjihod',n,'je',p);end.

    Rekurzivne funkcije i procedure Do sada smo imali prilike da vidimo kako se problem moe razbiti na vie manjih potproblema, koji se mogu dalje poveriti funkcijama i procedurama na reavanje. tavie, svaki od potproblema se moe dalje deliti na jo manje potprobleme koji se reavaju novim potprogramima. Na taj nain veliki problemi se dekomponuju na manje, logiki povezane celine, kako bi se pojednostavilo njihovo reavanje. Potprogrami su specijalizovani za reavanje samo odreenih problema, ime se poboljava itljivost programa, omoguava njegovo lake menjanje i olakava otkrivanje eventualnih greaka.

  • Osnovi programiranja dr Boban Stojanovi

    11

    U prethodnoj sekciji smo mogli videti da glavni program moe pozivati funkcije i procedure, ali i da ti potprogrami mogu dalje pozivati druge potprograme, kako bi im poverili reavanje dela problema. Meutim, neki problemi su takve prirode da se mogu reiti reavanjem jednog ili vie problema slinih poetnom problemu. Posmatrajmo, na primer, izraunavanje faktorijela nekog prirodnog broja. Faktorijel prirodnog broja n je proizvod svih prirodnih brojeva od 1 do n, to se moe napisati kao

    ( )! 1 ... 3 2 1n n n= Ako paljivo pogledamo prethodni izraz, primetiemo da on moe da se napie i kao

    ! ( 1)!n n n= Na ovaj nain smo izraunavanje faktorijela broja n sveli na izraunavanje faktorijela broja n-1, koji zatim mnoimo brojem n.

    Recimo da u Pascal-u elimo da napravimo funkciju za izraunavanje faktorijela koja bi imala jedan celobrojni parametar n i koja bi vraala celobrojnu vrednost:

    functionfakt(n:integer):integer;begin ...end;

    Pored klasinog naina izraunavanja faktorijela mnoenjem brojeva od 1 do n u petlji, ovaj problem se moe reiti i na nain prikazan u prethodnim izrazima. Dakle, funkciju za raunanje faktorijela broja n emo realizovati pozivanjem iste te funkcije za broj n-1, a zatim emo dobijeni rezultat pomnoiti sa n:

    functionfakt(n:integer):integer; /*Ovafunkcijanijedobra*/begin fakt:=n*fakt(n1);end;

    Ovakva situacija kada funkcija, odnosno procedura, poziva samu sebe se naziva rekurzija. Da bi se u potpunosti ovladalo korienjem rekurzivnih potprograma, neophodno je razumeti mehanizam rekurzivnih poziva.

    Podsetimo se da svaki potprogram ima svoje lokalne promenljive, kao i formalne parametre koji se ponaaju potpuno isto kao i lokalne promenljive. Nakon pozivanja potprograma kreiraju se njegove lokalne promenljive i formalni parametri, ime poinje njihov ivotni vek. Na kraju izvravanja potprograma sve ove promenljive se unitavaju, to predstavlja kraj njihovog ivotnog veka. Dakle, kada pozovemo neki potprogram, praktino se stvara jedan njegov primerak (instanca), koji u sebi sadri sve lokalne promenljive i formalne parametre. Svaki poziv funkcije, odnosno procedure, stvara njen novi primerak sa svim potrebnim promenljivama. Svaki primerak funkcije je potpuno nezavistan od svih drugih primeraka iste funkcije ili drugih funkcija. Zahvaljujui ovom mehanizmu mogue je da jedan primerak neke funkcije pozove drugi primerak te iste funkcije, to nazivamo rekurzijom. Imajui u vidu da su ova dva primerka potpuno nezavisna i da svaki od njih ima svoje promenljive, nee doi do njihovog meanja, ve e se poziv odvijati potpuno isto kao da jedna funkcija poziva neku drugu funkciju.

    Posmatrajmo rekurzivni poziv funkcije fakt u prethodnom primeru. Recimo da glavni program poziva funkciju fakt sa parametrom n=5. Prilikom poziva formira se prvi primerak funkcije fakt iji je parametar 5. Da bi izraunao faktorijel broja 5, ovaj primerak funkcije poziva novi primerak te iste funkcije i prosleuje joj parametar n-1, odnosno 4. Kada bude dobio rezultat drugog primerka funkcije fakt, prvi primerak e ga pomnoiti sa n i tako dobiti faktorijel broja 5.

    Meutim, da pogledamo kako e drugi primerak funkcije fakt izraunati faktorijel broja 4. Na slian nain pozvae trei primerak te iste funkcije i proslediti mu parametar 3, a zatim rezultat pomnoiti sa 4. Primeujemo da svaki primerak funkcije rauna faktorijel tako to pozove novi primerak te iste funkcije i prosledi joj parametar za jedan manji od broja za koji rauna faktorijel. Ako bi se tako nastavilo, pozivi novih primeraka funkcije fakt bi ili u nedogled i nijedan primerak ne bi obavio svoj posao, ve bi svaki od njih prenosio deo problema na novi primerak funkcije. Iz tog razloga ovako napisana funkcija fakt nije korektna i nikada nee izraunati faktorijel nekog broja.

  • Osnovi programiranja dr Boban Stojanovi

    12

    Da pozivi novih primeraka ne bi ili u nedogled, neophodno je da postoji uslov za izlazak iz rekurzije, odnosno uslov pri kome funkcija vie nee pozivati samu sebe, ve e se sama pobrinuti za reenje problema. U sluaju funkcije fakt taj uslov bi bio da je n

  • Osnovi programiranja dr Boban Stojanovi

    13

    Meutim, izraz u zagradi moemo napisati i na sledei nain

    ( )2 3 4 1 2 3 2 11 ,..., 1 1 ,..., 1n nn nS q q q q q q q q q q q S = + + + + + + = + + + + + + = + to jasno pokazuje da se suma nS moe izraziti preko sume geometrijskog niza koji ima jedan element manje, kao

    11n nS q S = + i to nas upuuje na korienje rekurzivne funkcije. Pored rekurzivnog izraza koji je dat, neophodno je definisati i uslov za izlazak iz rekurzije, odnosno uslov pri kome nije mogue dalje razbijati problem da slian potproblem. To je svakako sluaj kada se trai izraunavanje sume geometrijskog niza duine 1, za koju sigurno znamo da je jednaka jedinici ( 1 1S = ). programGeom;var n:integer; a,q,s:real; functionsumageo(n:integer;q:real):real; begin ifn=1then sumageo:=1; else sumageo:=1.0+q*sumageo(n1,q); end;begin writeln('Unesiteduzinuniza:'); readln(n); writeln('Unesiteprviclanikoeficijent:'); read(a,q); s:=a*sumageo(n,q); writeln('Sumageometrijskognizaje:',s);end.