Tanulj Pascalt:Függvények
A SzechenyiWikiBÓL
A függvények sokban hasonlítanak az eljárásokhoz. Ugyanúgy egy-egy olyan résztevékenységet írnak le, amelyeket a program különböző részein többször is el akarunk végezni, vagy más programokban is újra fel akarjuk használni. A lényeges különbség, hogy míg az eljárások az algoritmus egy független lépését írják le (azaz egy tevékenységet), addig a függvények egy-egy 'érték' kiszámítására használjuk.
A függvények szerkezete szinte megegyezik az eljárásoknál leírtakkal. A különbség mindössze annyi, hogy a függvényeket a function kulcsszó vezeti be, illetve hogy a függvényfejben a paraméterlistát követően a függvény eredményének típusát is meg kell adni:
function FüggvényNeve ( paraméterlista ) : eredmény_típusa; const (* Konstansok *) var (* Változók *) begin (* Utasítások *) end;
A függvényeket úgy használhatjuk a főprogramból, hogy a nevüket egy kifejezésben szerepeltetjük:
a := fuggveny(5) + 3;
A függvény törzsében - a begin-end blokkban - legalább egyszer szerepelnie kell egy értékadó utasításnak, amelynek bal oldalán a függvény neve áll. Ez az utasítás definiálja, mit tekintünk a függvény értékének. Például:
function negyzet(x:real) :real; begin negyzet := x*x; end
Ügyeljünk rá, hogy a függvény azonosítója nem változó. Ha a függvénynév egy kifejezésben szerepel, akkor ott a függvény által kiszámított értéket jelenti (azaz meghívja a függvényt) még akkor is, ha ez a kifejezés magában a függvény törzsében fordul elő. Például:
function hibas : integer; begin
hibas := 2; hibas := hibas + 1
end.
A fenti példa teljességgel hibás! Ahelyett, hogy az elvárt 3 értéket számítaná ki, végtelen rekurzív ciklusba kerül. A hibas függvény az eredménye kiszámításához a hibas függvént veszi igénybe, ami a hibas függvényt hívja, és így tovább. Maga a rekurzió -- azaz amikor egy eljárás vagy függvény saját magára hivatkozik -- nem hiba, sőt egy igen népszerű programozási technika (lásd a Rekurzió c. fejezetet). A hibát a függvény nevének helytelen használata okozza.
Bár nem hiba, mégis legtöbbször helytelen programozási technika, ha a függvény paraméterei között VAR paramétereket használunk. Egy függvény egyetlen értéket számít ki. Több érték párhuzamos kiszámítása már inkább tevékenységnek tekinthető, tehát ilyenkor használjunk eljárásokat.
[szerkesztés] Példa: Euklideszi algoritmus
A matematika egyik legrégebben ismert módszere két szám legnagyobb közös osztójának meghatározására szolgál anélkül, hogy a ismernünk kellene a számok törzstényezős felbontását. Az algoritmust Euklidesz publikálta Elemek c. munkájában az i.e 3. században, de feltehetőleg akkoriban már jó kétszáz éve ismerték.
Az algoritmus alapötlete az, hogy két szám (a és b) minden közös osztója egyúttal a két szám r = a mod b osztási maradékának is osztója. Az a és b számok legnagyobb közös osztója tehát ugyanaz lesz, mint a b és r számok legnagyobb közös osztója, azaz a problémát egyre kisebb számok legnagyobb közös osztójának megoldására vezethetjük vissza. Ha az osztási maradék 0, azaz b osztója a-nak, akkor nyilván maga b lesz a legnagyobb közös osztó.
A fenti gondolatmenetben hallgatólagosan feltételeztük, hogy a két szám közül az első nem kisebb a másodiknál -- azaz a maradék meghatározásakor a nagyobbat osztjuk a kisebbel. Ha nem így lenne, meg kell cserélnünk a két számot. A feladatot megoldó Pascal program:
program Euclid;
var
n1, n2 : Integer;
d : Integer;
function gcd( a, b : Integer ): Integer;
var r;
begin
if a < b then begin (* Csere *)
r:=a; a:=b; b:=r;
end;
r := a mod b;
while r > 0 do begin
(* gcd(a,b) helyett gcd(b,r) számolása *)
a := b;
b := r;
r := a mod b;
end;
gcd := b;
end;
begin
write( 'Adjon meg ket szamot: ' );
readln( n1, n2 );
d := gcd( n1, n2 );
write( 'A legnagyobb kozos oszto: ', d );
end.
A fenti program egy lehetséges kódja az Euklideszi algoritmusnak. Ugyanezt az algoritmust másképp -- az eredeti megfogalmazáshoz jobban hasonlító módon -- is leírhatjuk. Ezt az utóbbi változatot a Rekurzió c. fejezetben fogjuk majd tárgyalni.
