Upload
trinhbao
View
305
Download
6
Embed Size (px)
Citation preview
Uvod u programiranjeUvod u programiranjeProgramiranje 1 (450)Programiranje 1 (450)
Poglavlje 4Poglavlje 4
Procedure i postupciProcedure i postupci
1
Procedure i postupciProcedure i postupci
drdrdrdrdrdrdrdr. . . . . . . . scscscscscscscsc. Josip Musić. Josip Musić. Josip Musić. Josip Musić. Josip Musić. Josip Musić. Josip Musić. Josip Musićjmusicjmusic@@fesb.hrfesb.hr
Originalne Originalne Originalne Originalne Originalne Originalne Originalne Originalne slideoveslideoveslideoveslideoveslideoveslideoveslideoveslideove izradio:izradio:izradio:izradio:izradio:izradio:izradio:izradio:Teo Teo Teo Teo Teo Teo Teo Teo ŽuljevićŽuljevićŽuljevićŽuljevićŽuljevićŽuljevićŽuljevićŽuljević, , , , , , , , dipldipldipldipldipldipldipldipl. ing.. ing.. ing.. ing.. ing.. ing.. ing.. ing.teo.zuljevicteo.zuljevic@@fesb.hrfesb.hr
PregledPregled
Procedure i postupciProcedure i postupciDefiniranje proceduraDefiniranje procedura
Pozivanje proceduraPozivanje procedura
Korištenje naredbe Korištenje naredbe ReturnReturn
Korištenje lokalnih varijabliKorištenje lokalnih varijabli
Vraćanje vrijednostiVraćanje vrijednosti
ParametriParametri
2
ParametriParametri
Deklariranje i pozivanje parametaraDeklariranje i pozivanje parametara
Mehanizmi prosljeñivanja parametaraMehanizmi prosljeñivanja parametara
Prosljeñivanje vrijednošćuProsljeñivanje vrijednošću
Prosljeñivanje upućivanjemProsljeñivanje upućivanjem
Varijabilna dužina parametarske listeVarijabilna dužina parametarske liste
Prekrcavanje proceduraPrekrcavanje procedura
Potpis procedurePotpis procedure
Rekurzivne procedureRekurzivne procedure
Procedure i postupciProcedure i postupci
Program je podijeljen u manje funkcionalne jedinice.Program je podijeljen u manje funkcionalne jedinice.
manji dijelovi koda jednostavniji za razumijevanje, oblikovanje, manji dijelovi koda jednostavniji za razumijevanje, oblikovanje, razvoj, otkrivanje pogrešaka, razdiobu meñu članovima timarazvoj, otkrivanje pogrešaka, razdiobu meñu članovima tima
omogućuje se ponovna iskoristivost kodaomogućuje se ponovna iskoristivost koda
višestruko izvoñenje s različitih mjesta u programuvišestruko izvoñenje s različitih mjesta u programu
jednostavno korištenje u različitim programimajednostavno korištenje u različitim programima
U VB.NETU VB.NET--u, program je sastavljen od:u, program je sastavljen od:
3
U VB.NETU VB.NET--u, program je sastavljen od:u, program je sastavljen od:
modulamodula
sadrže imenovane blokove koda nazvane proceduramasadrže imenovane blokove koda nazvane procedurama
klasaklasa
sadrže imenovane blokove koda nazvane postupcimasadrže imenovane blokove koda nazvane postupcima
Procedure i postupci izvode odreñene akcije ili Procedure i postupci izvode odreñene akcije ili Procedure i postupci izvode odreñene akcije ili Procedure i postupci izvode odreñene akcije ili Procedure i postupci izvode odreñene akcije ili Procedure i postupci izvode odreñene akcije ili Procedure i postupci izvode odreñene akcije ili Procedure i postupci izvode odreñene akcije ili izračunavanja vrijednosti.izračunavanja vrijednosti.izračunavanja vrijednosti.izračunavanja vrijednosti.izračunavanja vrijednosti.izračunavanja vrijednosti.izračunavanja vrijednosti.izračunavanja vrijednosti.
Korištenje proceduraKorištenje procedura
Definiranje proceduraDefiniranje procedura
Pozivanje proceduraPozivanje procedura
Korištenje naredbe Korištenje naredbe ReturnReturn
Korištenje lokalnih varijabliKorištenje lokalnih varijabli
Vraćanje vrijednostiVraćanje vrijednosti
4
Vraćanje vrijednostiVraćanje vrijednosti
Definiranje procedura Definiranje procedura (1)(1)
MainMain je proceduraje procedura
ista sintaksa za definiranje vlastitih proceduraista sintaksa za definiranje vlastitih procedura
Module ProceduresPublic Sub Main()
'....End Sub
5
Public Sub ExampleProcedureConsole.WriteLine("Example procedura")
End SubEnd Module
Kod sadrži dvije procedure i jedan postupakKod sadrži dvije procedure i jedan postupak
MainMain
ExampleProcedureExampleProcedure
WriteLineWriteLine (postupak klase (postupak klase System.ConsoleSystem.Console))
Definiranje procedura Definiranje procedura (2)(2)
Potrebno navesti sljedeće:Potrebno navesti sljedeće:
imeime
može biti bilo koji dozvoljeni VB.NET identifikatormože biti bilo koji dozvoljeni VB.NET identifikator
ista pravila kao i za varijableista pravila kao i za varijable
Pascal označavanjePascal označavanje
DrawWindowDrawWindow, , SendMailSendMail, , MoveRightMoveRight i i DeleteAllDeleteAll
parametarsku listuparametarsku listu
6
parametarsku listuparametarsku listu
tijelotijelo
pristupni modifikatorpristupni modifikator
odreñuje može li se procedura pozvati i izvan modula u kojem je odreñuje može li se procedura pozvati i izvan modula u kojem je definiranadefinirana
PublicPublic, , PrivatePrivate, , FriendFriend ,(,(ProtectedProtected, , Protected FriendProtected Friend))
Sintaksa:Sintaksa:[accessibility] Sub subname[(argumentlist)]
‘statements
End Sub
Pozivanje proceduraPozivanje proceduraNakon definiranje procedure, moguće je:Nakon definiranje procedure, moguće je:
pozvati proceduru unutar istog modulapozvati proceduru unutar istog modula
navoñenjem imena procedure praćenog zagradama omeñenom navoñenjem imena procedure praćenog zagradama omeñenom parametarskom listomparametarskom listom
pozvati proceduru iz drugog modulapozvati proceduru iz drugog modula
potrebno navesti kompajleru koji modul sadrži proceduru koja se pozivapotrebno navesti kompajleru koji modul sadrži proceduru koja se poziva
ProcedureName(...)
7
potrebno navesti kompajleru koji modul sadrži proceduru koja se pozivapotrebno navesti kompajleru koji modul sadrži proceduru koja se poziva
pozvana procedura mora biti deklarirana sa pozvana procedura mora biti deklarirana sa PublicPublic modifikatorom modifikatorom pristupnostipristupnosti
koristiti ugniježñene pozivekoristiti ugniježñene pozive
procedure mogu pozivati procedure, koje mogu pozivati druge procedure i procedure mogu pozivati procedure, koje mogu pozivati druge procedure i tako redomtako redom
ModuleName.ProcedureName(...)
Pozivanje procedure unutar istog Pozivanje procedure unutar istog modulamodula
Module ProceduresPublic Sub Main()
Console.Writeline("Pozivanje procedure")TestProcedure()Console.Writeline("Kraj programa")
8
Console.Writeline("Kraj programa")End Sub
Public Sub TestProcedure()Console.WriteLine("Test procedura")
End SubEnd Module
Pozivanje procedure
Test procedura
Kraj programa
Pozivanje procedure drugog modulaPozivanje procedure drugog modula
Potrebno:Potrebno:
navesti ime modula gdje se nalazi procedura koja se pozivanavesti ime modula gdje se nalazi procedura koja se poziva
deklarirati proceduru deklarirati proceduru PublicPublic pristupnim modifikatorompristupnim modifikatorom
navoñenjem navoñenjem PrivatePrivate procedura postaje privatna unutar modula u procedura postaje privatna unutar modula u kojem je definiranakojem je definirana
izostavljanjem pristupnog modifikatora, podrazumijevano je javna izostavljanjem pristupnog modifikatora, podrazumijevano je javna
9
Module APublic Sub Main()
B.TestProcedure()End Sub
End Module
Module BPublic Sub TestProcedure()
Console.WriteLine("Test procedura")End Sub
End Module
Test procedura
Ugniježñeni pozivi proceduraUgniježñeni pozivi procedura
Pozivanje procedura unutar procedurePozivanje procedura unutar procedureneograničen broj ugniježñenih pozivaneograničen broj ugniježñenih poziva
svaki poziv procedure zahtijeva memoriju za pohranu informacijasvaki poziv procedure zahtijeva memoriju za pohranu informacija
Module NestedCallsPublic Sub Main()
Procedure1()Procedure2()
Procedura 1
Procedura 2
Procedura 2
10
Procedure2()End Sub
Sub Procedure1()Console.WriteLine("Procedura 1")Procedure2()
End Sub
Sub Procedure2()Console.WriteLine("Procedura 2")
End SubEnd Module
Procedura 2
Korištenje naredbe Korištenje naredbe ReturnReturn
Uobičajeno, procedura vraća izvoñenje pozivatelju nakon Uobičajeno, procedura vraća izvoñenje pozivatelju nakon izvoñenja posljednje naredbe procedure.izvoñenja posljednje naredbe procedure.
Za trenutan povrat pozivatelju koristi se naredba Za trenutan povrat pozivatelju koristi se naredba ReturnReturn
Module ReturnExamplePublic Sub Main()
TestProcedure()Pozdrav
11
TestProcedure()End Sub
Sub TestProcedure()Console.WriteLine("Pozdrav")ReturnConsole.WriteLine("Bye, Bye")
End SubEnd Module
U primjeru, posljednje pozivanje U primjeru, posljednje pozivanje Console.WriteLineConsole.WriteLinenikada neće biti izvedeno!nikada neće biti izvedeno!
Korištenje Korištenje ReturnReturn sa uvjetnim sa uvjetnim naredbamanaredbama
Omogućuje proceduri povrat pozivatelju ako je zadani uvjet postignut.Omogućuje proceduri povrat pozivatelju ako je zadani uvjet postignut.
Public Sub Main()TestProcedure()TestProcedure()TestProcedure()
End Sub
Pozdrav
Bye, Bye
12
End SubSub TestProcedure()
Static counter As Integercounter += 1Select Case counter
Case 1Console.WriteLine("Pozdrav")
Case 2Console.WriteLine("Bye, Bye")
Case ElseReturn
End SelectEnd Sub
Bye, Bye
Korištenje lokalnih varijabliKorištenje lokalnih varijabli
Lokalne varijableLokalne varijable
se stvaraju na ulasku u proceduruse stvaraju na ulasku u proceduru
memorija se alocira pri svakom ulasku u proceduru memorija se alocira pri svakom ulasku u proceduru
su privatne unutar proceduresu privatne unutar procedure
varijable moguće koristiti jedino unutar procedure u kojima su varijable moguće koristiti jedino unutar procedure u kojima su deklariranedeklarirane
13
deklariranedeklarirane
se uništavaju na izlaskuse uništavaju na izlasku
memorija se oslobaña na izlasku iz procedurememorija se oslobaña na izlasku iz procedure
vrijednost neće biti sačuvana iz jednog poziva za drugivrijednost neće biti sačuvana iz jednog poziva za drugi
Vraćanje vrijednostiVraćanje vrijednosti
Nužno:Nužno:
Deklarirati proceduru sa Deklarirati proceduru sa FunctionFunctionfunkcije, funkcijske procedurefunkcije, funkcijske procedure
Odrediti tip podatka povratne vrijednostiOdrediti tip podatka povratne vrijednosti
Dodati Dodati ReturnReturn naredbu zajedno sa izrazomnaredbu zajedno sa izrazom
postavlja povratnu vrijednostpostavlja povratnu vrijednost
14
postavlja povratnu vrijednostpostavlja povratnu vrijednost
trenutan povrat pozivateljutrenutan povrat pozivatelju
ili, pridružiti vrijednost imenu procedureili, pridružiti vrijednost imenu procedurepostavlja povratnu vrijednostpostavlja povratnu vrijednost
povrat pozivatelju nakon izvoñenja posljednje naredbe procedurepovrat pozivatelju nakon izvoñenja posljednje naredbe procedure
Definiranje funkcijaDefiniranje funkcija
Potrebno odrediti tip povratne vrijednosti funkcijePotrebno odrediti tip povratne vrijednosti funkcije
[accessibility] Function functionname[(argumentlist)] As datatype
' statements
End Function
15
Korištenje Korištenje ReturnReturn za povratza povrat
ReturnReturn naredba praćena izrazom trenutno prekida naredba praćena izrazom trenutno prekida izvoñenje funkcije i vraća pozivatelju izraz kao povratnu izvoñenje funkcije i vraća pozivatelju izraz kao povratnu vrijednost funkcije.vrijednost funkcije.
ReturnReturn naredba može vratiti samo jednu vrijednost iz naredba može vratiti samo jednu vrijednost iz svakog poziva funkcije.svakog poziva funkcije.
za vraćanje više vrijednosti koriste se za vraćanje više vrijednosti koriste se ByRefByRef parametri koji će biti parametri koji će biti diskutirani kasnijediskutirani kasnije
ili povratna vrijednost strukturnog tipa (ili povratna vrijednost strukturnog tipa (poglavlje 5poglavlje 5))
16
ili povratna vrijednost strukturnog tipa (ili povratna vrijednost strukturnog tipa (poglavlje 5poglavlje 5))
ili vraćanjem upućivanja na neko polje ili klasu koji sadrže višestruke ili vraćanjem upućivanja na neko polje ili klasu koji sadrže višestruke vrijednosti (vrijednosti (poglavljepoglavlje 5)5)
Function functionname[(argumentlist)] As datatype
' ...
Return expression
' ...
End Function
Primjer korištenja Primjer korištenja ReturnReturn za povratza povrat
Module ReturnExamplePublic Sub Main()
Dim x As Integerx = FiveMinusTwo()Console.WriteLine(x)
End Sub
3
17
End SubFunction FiveMinusTwo() As Integer
Dim x, y As Integerx = 5y = 2Return x - y
Console.WriteLine("Kraj funkcije")End Function
End Module
Vraćanje vrijednosti preko imena Vraćanje vrijednosti preko imena funkcijefunkcije
Izvoñenje ostaje unutar funkcijeIzvoñenje ostaje unutar funkcije
vraćanje pozivatelju nakon izvoñenja posljednje vraćanje pozivatelju nakon izvoñenja posljednje naredbe procedurenaredbe procedure
Function functionname[(argumentlist)] As datatype
18
Function functionname[(argumentlist)] As datatype
' ...
functionname = expression
' ...
End Function
Primjer: izračun kvadratnog korijenaPrimjer: izračun kvadratnog korijena
Function CalculateSqRoot(ByVal number As Double) As DoubleIf number < 0 Then
Exit FunctionElse
Return Math.Sqrt(number)End If
End Function
19
Klasa Klasa System.MathSystem.Math sadrži matematičke postupkesadrži matematičke postupke
Sintaksa postupka za izračun kvadratnog korijena:Sintaksa postupka za izračun kvadratnog korijena:
Koja pretvorba se implicitno izvodi u primjeru?Koja pretvorba se implicitno izvodi u primjeru?
Public Function Sqrt( ByVal d As Double) As Double
Primjer korištenja imena funkcije za Primjer korištenja imena funkcije za povrat vrijednostipovrat vrijednosti
Module ReturnExamplePublic Sub Main()
Dim x As Integerx = FiveMinusTwo()Console.WriteLine(x)
End Sub
Kraj funkcije
3
20
End SubFunction FiveMinusTwo() As Integer
Dim x, y As Integerx = 5y = 2FiveMinusTwo = x - yConsole.WriteLine("Kraj funkcije")
End FunctionEnd Module
Korištenje parametaraKorištenje parametara
Deklariranje i pozivanje parametaraDeklariranje i pozivanje parametara
Mehanizmi prosljeñivanja parametaraMehanizmi prosljeñivanja parametara
Prosljeñivanje vrijednošćuProsljeñivanje vrijednošću
Prosljeñivanje upućivanjemProsljeñivanje upućivanjem
Varijabilna dužina parametarske listeVarijabilna dužina parametarske liste
21
Varijabilna dužina parametarske listeVarijabilna dužina parametarske liste
Deklariranje i pozivanje parametaraDeklariranje i pozivanje parametara
Omogućuju informacijama da budu proslijeñene unutar i Omogućuju informacijama da budu proslijeñene unutar i izvan procedure.izvan procedure.
Deklariranje parametaraDeklariranje parametara
smještaju se unutar zagrada nakon imena proceduresmještaju se unutar zagrada nakon imena procedure
višestruki parametri razdvojeni zarezomvišestruki parametri razdvojeni zarezom
parametarska lista može biti praznaparametarska lista može biti prazna
svaki parametar ima ime i tipsvaki parametar ima ime i tip
22
svaki parametar ima ime i tipsvaki parametar ima ime i tip
Pozivanje procedure sa parametrimaPozivanje procedure sa parametrima
potrebno osigurati vrijednost za svaki parametarpotrebno osigurati vrijednost za svaki parametar
Public Sub Main()Dim x As Shortx = Addition(5,2)Console.WriteLine(x)
End Sub
Function Addition(ByVal x As Short, ByRef y As Short) As ShortReturn x + y
End Function
????????????????
Mehanizmi prosljeñivanja parametaraMehanizmi prosljeñivanja parametara
Izbor izmeñu dva različita načinaIzbor izmeñu dva različita načina
pomoću vrijednosti pomoću vrijednosti ((by valueby value))
vrijednosni parametri se nazivaju i ulaznim parametrima jer vrijednosni parametri se nazivaju i ulaznim parametrima jer podaci mogu biti preneseni u proceduru ali ne i iz procedure podaci mogu biti preneseni u proceduru ali ne i iz procedure
pomoću upućivanja pomoću upućivanja ((by referenceby reference))
referencni parametri se ponekad nazivaju ulazno/izlaznim referencni parametri se ponekad nazivaju ulazno/izlaznim
23
referencni parametri se ponekad nazivaju ulazno/izlaznim referencni parametri se ponekad nazivaju ulazno/izlaznim parametrima jer podaci mogu biti preneseni u proceduru ali parametrima jer podaci mogu biti preneseni u proceduru ali i iz procedurei iz procedure
Prosljeñivanje vrijednošćuProsljeñivanje vrijednošću
Podrazumijevani mehanizam prosljeñivanja Podrazumijevani mehanizam prosljeñivanja parametaraparametara
kopira se vrijednost parametrakopira se vrijednost parametra
varijabla može biti promijenjena unutar procedurevarijabla može biti promijenjena unutar procedure
promjena nema utjecaja na vrijednost izvan procedurepromjena nema utjecaja na vrijednost izvan procedure
parametar mora biti istog ili kompatibilnog tipaparametar mora biti istog ili kompatibilnog tipa
implicitna pretvorba tipovaimplicitna pretvorba tipova
24
implicitna pretvorba tipovaimplicitna pretvorba tipova
Public Sub Main()Dim x As Integer = 5Count(x)Console.WriteLine(x)
End Sub
Sub Count(ByVal c As Integer)c += 1
End Function
xxxxxxxx55
cccccccc55
cccccccc66
original ostaje original ostaje original ostaje original ostaje original ostaje original ostaje original ostaje original ostaje
nepromijenjen!nepromijenjen!nepromijenjen!nepromijenjen!nepromijenjen!nepromijenjen!nepromijenjen!nepromijenjen!
xxxxxxxx55
kopija od x !kopija od x !kopija od x !kopija od x !kopija od x !kopija od x !kopija od x !kopija od x !
5
Prosljeñivanje upućivanjemProsljeñivanje upućivanjem
Referencni parametriReferencni parametri
upućivanje na memorijsku lokacijuupućivanje na memorijsku lokaciju
ne stvara se nova memorijska lokacijane stvara se nova memorijska lokacija
ista memorijska lokacija kao i varijabla koja se prosljeñuje u pozivu ista memorijska lokacija kao i varijabla koja se prosljeñuje u pozivu procedureprocedure
koristekoriste ByRefByRef ključnu riječ u definiciji procedureključnu riječ u definiciji procedure
promjena vrijednosti referencnog parametra utječe na vrijednost promjena vrijednosti referencnog parametra utječe na vrijednost proslijeñene varijableproslijeñene varijable
25
proslijeñene varijableproslijeñene varijable
Public Sub Main()Dim x As Integer = 5Count(x)Console.WriteLine(x)
End Sub
Sub Count(ByRef c As Integer)c += 1
End Function
original original original original original original original original
promjenjen!promjenjen!promjenjen!promjenjen!promjenjen!promjenjen!promjenjen!promjenjen!
xxxxxxxx55
6
xxxxxxxx66
Varijabilna dužina parametarske listeVarijabilna dužina parametarske liste
Promjenljivi broj parametaraPromjenljivi broj parametara
Deklarira se kao niz na kraju parametarske listeDeklarira se kao niz na kraju parametarske liste
modifikator modifikator ParamArrayParamArray
Uvijek se prosljeñuju Uvijek se prosljeñuju ByValByVal
Više u sljedećem poglavlju (nizovi)...Više u sljedećem poglavlju (nizovi)...
26
Više u sljedećem poglavlju (nizovi)...Više u sljedećem poglavlju (nizovi)...
Public Sub Main()
Prekrcavanje proceduraPrekrcavanje procedura
Deklariranje prekrcanih proceduraDeklariranje prekrcanih procedura
dijele isto ime u moduludijele isto ime u modulu
Potpis procedurePotpis procedure
Korištenje prekrcanih postupakaKorištenje prekrcanih postupaka
27
Public Sub Main()Console.WriteLine(Average(2, 3) + Average(5, 6, 7))End Sub
Function Average(ByVal x As Short, ByVal y As Short) As SingleReturn (x + y) / 2
End Function
Function Average(ByVal x As Short, ByVal y As Short,_ByVal z As Short) As Single
Return (x + y + z) / 3End Function
8,5
Potpis procedure Potpis procedure (1)(1)
Potpis procedure mora biti jedinstven unutar Potpis procedure mora biti jedinstven unutar modula/klasemodula/klase
Definiciju potpisa procedure čineDefiniciju potpisa procedure čine
ime procedureime procedure
tipovi parametaratipovi parametara
28
tipovi parametaratipovi parametara
broj parametarabroj parametara
Na potpis ne utječeNa potpis ne utječe
ime parametaraime parametara
povratna vrijednost procedurepovratna vrijednost procedure
Potpis procedure Potpis procedure (2)(2)
Različiti potpisi proceduraRazličiti potpisi procedura
Function Signature()'...
End Function
Function Signature(ByVal x As Short)'...
29
Function Signature(ByVal x As Integer)'...
End Function
Function Signature(ByVal x As Short, ByVal y As Short)'...
End Function
'...End Function
Potpis procedure Potpis procedure (3)(3)
Isti potpisi proceduraIsti potpisi procedura
Function Signature(ByVal x As Short) As Integer'...
End Function
Function Signature(ByRef x As Short) As Integer'...
30
'...End Function
Function Signature(ByVal y As Short) As Integer'...
End Function
Function Signature(ByVal x As Short) As Short'...
End Function
Korištenje prekrcavanja proceduraKorištenje prekrcavanja procedura
Prekrcavanja Prekrcavanja (overloading)(overloading) proceduraprocedura
se koristi za slične postupke koji zahtijevaju različite se koristi za slične postupke koji zahtijevaju različite brojeve ili tipove parametarabrojeve ili tipove parametara
za dodavanje nove funkcionalnosti postojećem koduza dodavanje nove funkcionalnosti postojećem kodu
31
Public Sub Main()Greet()Greet("Ivan")
End Sub
Sub Greet()Console.WriteLine("Hi")
End Sub
Sub Greet(ByVal name As String)Console.WriteLine("Hi {0}", name)
End Sub
Hi
Hi Ivan
Rekurzivne procedureRekurzivne procedure
Procedura koja poziva samu sebe.Procedura koja poziva samu sebe.
Znaju rješenje baznog problema.Znaju rješenje baznog problema.
Kod složenijih problema, dijele problem na dva dijelaKod složenijih problema, dijele problem na dva dijela
dio koji znaju riješitidio koji znaju riješiti
dio koji ne znaju riješiti dio koji ne znaju riješiti
mora nalikovati baznom oblikumora nalikovati baznom obliku
32
mora nalikovati baznom oblikumora nalikovati baznom obliku
rekurzivnim pozivom se dolazi do pojednostavljenjarekurzivnim pozivom se dolazi do pojednostavljenja
Procedura može pozvati samu sebeProcedura može pozvati samu sebe
direktnodirektno
indirektnoindirektno
Korisno za rješavanje odreñenih problemaKorisno za rješavanje odreñenih problema
za rukovanje složenim podatkovnim strukturamaza rukovanje složenim podatkovnim strukturama
liste, stablaliste, stabla
Direktni rekurzivni poziviDirektni rekurzivni pozivi
Public Sub Main()A()
End Sub
A
A
A
A
A
A
A
A
33
Sub A()Console.WriteLine("Izvodi se A")A()
End Sub
A
A
A
A
A
A
A
A
A
Indirektni rekurzivni poziviIndirektni rekurzivni pozivi
Public Sub Main()A()
End Sub
Sub A()Console.WriteLine("Izvodi se A")B()
End Sub
A
B
A
B
A
B
A
B
34
End Sub
Sub B()Console.WriteLine("Izvodi se B")A()
End Sub
B
A
B
A
B
A
B
A
B
Primjer: izračun faktorijela broja Primjer: izračun faktorijela broja (1)(1)
Faktorijel je umnožak svih brojeva izmeñu 1 i tog brojaFaktorijel je umnožak svih brojeva izmeñu 1 i tog brojan•(nn•(n--1)•(n1)•(n--2)•…•12)•…•1
F(0)=1 F(0)=1
F(1)=1F(1)=1
F(2)=1*2=2F(2)=1*2=2
Definicija rekurzivne procedure:Definicija rekurzivne procedure:
n! = n • (nn! = n • (n--1)!1)! , uz uvjet, uz uvjet 0! = 10! = 1
35
n! = n • (nn! = n • (n--1)!1)! , uz uvjet, uz uvjet 0! = 10! = 1
Function Factorial(ByVal number As Integer) As IntegerIf number <= 1 Then 'bazni slučaj
Return 1Else
Return number * Factorial(number - 1)End If
End Functionrekurzivni pozivrekurzivni poziv
Primjer: izračun faktorijela broja Primjer: izračun faktorijela broja (2)(2)
Function Factorial(ByVal number As Long) As Long…
Return number * Factorial(number - 1)…
End Function
33
Factorial(2)Factorial(2)
rekurzivni korakrekurzivni korak11
3*2*13*2*1
55
44
36
Function Factorial(ByVal number As Long) As Long…
Return number * Factorial(number - 1)…
End Function
Function Factorial(ByVal number As Long) As Long…
Return 1…
End Function
Factorial(1)Factorial(1)
33
2*12*1
22
11
SažetakSažetak
Tipovi proceduraTipovi procedura
SubSub
procedure dogañajaprocedure dogañaja
FunkcijskeFunkcijske
SvojstvaSvojstva
Prosljeñivanje parametaraProsljeñivanje parametara
upućivanjem upućivanjem (by reference)(by reference)
37
upućivanjem upućivanjem (by reference)(by reference)
prijenos podataka u oba smjeraprijenos podataka u oba smjera
pozvana procedura koristi parametar za vraćanje nove vrijednosti pozvana procedura koristi parametar za vraćanje nove vrijednosti pozivnom kodupozivnom kodu
koristi se za vraćanje više vrijednostikoristi se za vraćanje više vrijednosti
vvrijednošćurijednošću (by value)(by value)
prijenos podataka samo u jednom smjeruprijenos podataka samo u jednom smjeru
zaštićuje proslijeñene varijable od promjena unutar procedurezaštićuje proslijeñene varijable od promjena unutar procedure
efikasnije za jednostavne vrijednosne tipoveefikasnije za jednostavne vrijednosne tipove
Zadatak 1: Brojač procedureZadatak 1: Brojač procedure
Zadatak: Izračunati broj pozivanja neke procedure.Zadatak: Izračunati broj pozivanja neke procedure.
Moguća rješenja, prednosti i nedostaci:Moguća rješenja, prednosti i nedostaci:
Korištenjem referencnog parametra preko kojeg se Korištenjem referencnog parametra preko kojeg se ažurira brojač u pozivnom koduažurira brojač u pozivnom kodu
problem s pozivima s više različitih mjesta u programu problem s pozivima s više različitih mjesta u programu
Upotrebom globalne varijable kojoj se povećava Upotrebom globalne varijable kojoj se povećava
38
Upotrebom globalne varijable kojoj se povećava Upotrebom globalne varijable kojoj se povećava vrijednost naredbom unutar procedure.vrijednost naredbom unutar procedure.
globalne varijable dozvoljavaju pristup programskom kodu iz globalne varijable dozvoljavaju pristup programskom kodu iz bilo kojeg dijela programa i ne predstavljaju najsigurniju zaštitu bilo kojeg dijela programa i ne predstavljaju najsigurniju zaštitu podatkapodatka
Deklariranjem varijable unutar procedure korištenjem Deklariranjem varijable unutar procedure korištenjem modifikatora modifikatora StaticStatic
Zadatak 2: Potenciranje Zadatak 2: Potenciranje
Napisati rekurzivnu proceduru koja računa Napisati rekurzivnu proceduru koja računa potenciranje brojeva.potenciranje brojeva.
39
Pitanja ?Pitanja ?
40
Za više informacijaZa više informacija……
Odgovaram na mailOdgovaram na mail--oveove ((uglavnom uvijekuglavnom uvijek ::--))
jmusicjmusic@@fesb.hrfesb.hr (FESB)(FESB)
Web site Web site za slajdoveza slajdove, , kod, informacijekod, informacije::
www.fesb.hr/www.fesb.hr/elearningelearning
41