eljárások és függvények

42
Eljárások és függvények Eljárások és függvények Az eddig elkészített programokban az utasítások a főprogram részben szerepeltek. A Pascalban lehetőség van arra, hogy ha a program futása során, több helyen is ugyanazt az utasítássorozatot kell végrehajtani, akkor ezt az utasításcsoportot egy alprogramba foglalhassuk. Kétféle alprogramot hozhatunk létre: eljárást eljárást vagy függvényt függvényt.

Upload: nita-barron

Post on 02-Jan-2016

33 views

Category:

Documents


1 download

DESCRIPTION

Eljárások és függvények. - PowerPoint PPT Presentation

TRANSCRIPT

Eljárások és függvényekEljárások és függvények

Az eddig elkészített programokban az utasítások a főprogram részben szerepeltek. A Pascalban lehetőség van arra, hogy ha a program futása során, több helyen is ugyanazt az utasítássorozatot kell végrehajtani, akkor ezt az utasításcsoportot egy alprogramba foglalhassuk.

Kétféle alprogramot hozhatunk létre: eljárásteljárást vagy függvénytfüggvényt.

A programban deklarált eljárások és függvények arra adnak lehetőséget, hogy a programunkat logikailag és funkcionálisan meghatározott különálló egységekre bontsuk.

Az eljárásokat és függvényeket a Az eljárásokat és függvényeket a főprogram vagy egy másik eljárás vezérli.főprogram vagy egy másik eljárás vezérli.

Miről lesz szó?Miről lesz szó?

Hogyan kell saját eljárásokat és függvényeket (rutinokatrutinokat) írni

Hogyan lehet ezekkel a rutinokkal paramétereken keresztül kommunikálni

A rutinok saját (lokális) deklarációi és közös (globális) deklarációi

MeghívásukMeghívásuk::

Az eljárás (alprogram) tevékenységek összessége (utasítások), melyet az eljárás

nevére való hivatkozással és az eljárás paramétereinek megadásával hívunk meg a

főprogram bármely pontján:

 procedureprocedure eljarasnev(parameterek);

functionfunction fuggvenynev(parameterek):típus;

Helyük a Pascal programban:Helyük a Pascal programban:Az alprogramokat a program deklarációs részében kell elhelyezni.

{globális deklarációk}Label … {címke}Const … {konstans} {Program deklarációs része}{Program deklarációs része} Type … {típus}Var … {változó}

ProcedureProcedure eljárásnév(paraméterek);{lokális deklarációk}begin

    {Eljárástörzs, végrehajtó rész} …end;

FunctionFunction függvénynév(paraméterek)):típus:típus;{lokális deklarációk}begin

    {Függvénytörzs, végrehajtó rész} függvénynév:=utasításfüggvénynév:=utasítás; {a függvény értéke}

end;

EljárásokEljárások MiértMiért? ?

Eljárást akkor előnyös alkalmazni, ha: egy- egy hasonló feladatot többször akarunk a

programban elvégezni, ekkor az ismételt művelet elvégzéséhez elegendő az alprogramot újra meghívni. Ez a programrészlet csak egy példányban szerepel a programban, így

a program olvashatósága és karbantarthatósága javul. Ugyancsak egyszerűvé és biztonságossá válik a

programrészlet módosítása és javítása, hiszen csak egyetlen helyt kell azt elvégezni

Minden alprogram rendelkezik egy saját belső (lokális) világgal és egy jól definiált kapcsolódási felületet (interfészt) mutat a külvilág fele.

Szerkezete:Hasonlít a programéhoz.

procedure eljarasnev (parameterek); {Eljárás feje}

Const …Type … {Deklarációs rész} Var … begin

    {Eljárástörzs,

végrehajtó rész} …end;

A program szintjén deklarált konstansokat, változókat globális deklarációknakglobális deklarációknak nevezzük, valamint az eljárásban, helyileg deklarált dolgokat lokális lokális deklarációknakdeklarációknak nevezzük.

Globális deklarációkGlobális deklarációk:-at az egész program látja, tehát a program összes eljárása használhatja, ami azt jelenti, hogy mindegyik eljárás azokat össze vissza módosítgathatja.

Lokális deklarációkLokális deklarációk:-at csak az illető eljárás látja, tehát ez sok esetben rendkívüli programvédelmet jelent, hiszen biztosak lehetünk, hogy más eljárás nem nyúl a változókhoz.

Amikor a program vezérlése az eljáráshívó utasításhoz ér, akkor a processzor megjegyzi azt a helyet ahová a végrehajtás után vissza kell térnie, majd ugrik a megadott azonosítójú eljárás BeginBegin- jére. Végrehajtja az utasításokat egészen az EndEnd;-ig, majd visszaugrik a megjegyzett utasításra.

A visszatérési cím azért fontos, mert az eljárást a program bármely részéről hívhatnánk. Egyetlen megkötés van, hogy az eljárást még a hívás előtt kell deklarálni.

……

ProcedureProcedure eljárásnév(paraméterek);{lokális deklarációk}begin

    {Eljárástörzs, végrehajtó rész} …

end;…

HÍVÓ PROGRAM (főprogram)

Eljárásnév(paraméterek); Utasítás;

Eljárásnév(paraméterek); Utasítás;

Típusai:

1. paraméter nélküli eljárás2. érték szerinti paraméterátadás3. cím szerinti paraméterátadás

Az eljárás paramétereiAz eljárás paraméterei

A paramétereket az eljárás fejlécében a A paramétereket az eljárás fejlécében a név után, kerek zárójelek között kell név után, kerek zárójelek között kell felsorolnunk, melyek lehetővé teszik felsorolnunk, melyek lehetővé teszik hogy ugyanazt a programrészt kicsit hogy ugyanazt a programrészt kicsit

másképpen, más adatokkal futtassunk.másképpen, más adatokkal futtassunk.

1.1.Paraméter nélküli eljárásParaméter nélküli eljárás- - általában mindig ugyanazt a műveletet végzikáltalában mindig ugyanazt a műveletet végzik

11.példa: .példa: ez az eljárás minden híváskor egy 50 egységnyi hosszúságú szaggatott vonalat húz a képernyőre

Ha egy paraméter nélküli eljárás működését mégis kívülről kívánjuk vezérelni, akkor globális változókat használhatunk az alprogrammal való kommunikációra.

2.példa:2.példa:ez az eljárás minden híváskor különböző hosszúságú szaggatott vonalat húz a képernyőre

3.példa: Töltsetek fel egy tömböt, majd írassátok ki a tömb elemeit a megadás sorrendjében, majd rendezetten is és keressétek ki a tömbből a legnagyobb elemet.

Az előző programrészlet jó példa arra, hogy:

hogy nem szabad programot készítenihogy nem szabad programot készíteni.

A paraméter nélküli eljárások és a globális változók együttes használata rossz programozási technikát takar, ilyenkor elmondható hogy ennek az oka az,

hogy a programozó nem igazán érti a paraméterátadási módokat és nem érti a

paraméterezésben rejlő előnyöket.

2. Érték szerinti paraméterátadás2. Érték szerinti paraméterátadás(érték paraméterek)(érték paraméterek)

- az eljárás fejlécében szereplő paramétereket formális paramétereknek nevezzük. Ezek meghatározzák, hogy az eljárás hívásakor hány és milyen típusú adatot (hívási paramétert) kell megadnunk.

-az eljárás törzsében a formális paraméterekre mint helyi (lokális) változókra hivatkozhatunk.

Az érték szerinti paraméterátadás csak egyirányú kommunikációt tesz lehetővé a hívó program és a hívott eljárás között.

Eljáráshíváskor minden egyes aktuális (hívási) paraméter értéke a paraméterlista azonos helyén álló formális paraméterbe másolódik. Az eljárásokon belül az átadott értékeket a formális paraméteren keresztül érhetjük el és használhatjuk fel

A fordítóprogram az eljárás hívásakor ellenőrzi, hogy az aktuális és a formális paraméterek száma és típusa

megegyezik-e. ha a paraméterek száma különböző, vagy ha a két típus nem értékadás kompatibilis, akkor hibajelzést

kapunk.……ProcedureProcedure eljárásnév(paraméter: típus);{lokális deklarációk}

begin     {Eljárástörzs, végrehajtó rész}

end;

Var változó: típus;Begin

…eljárásnév(változó);…

End.

Formális paraméter (értékparaméter):Formális paraméter (értékparaméter): csak addig van, amíg az eljárást meg nem hívják egy

aktuális paraméterrel

Aktuális paraméter : Aktuális paraméter :

Érték szerinti paraméterátadásÉrték szerinti paraméterátadás

A paraméterlista megadásánál az alábbi szabályokat kell figyelembe venni:

az azonos típusú paramétereket vesszővel elválasztva lehet felsorolni,

az utolsó azonos típusú paraméter után kettőspontot téve kell megadni a paraméter típusát,

ha különböző paraméterek szerepelnek a listán, akkor azok közé pontosvesszőt kell tenni, pl.(x,y:integer; s:string)

1.példa:1.példa:ez az eljárás minden híváskor különböző hosszúságú szaggatott vonalat húz a képernyőre míg nullát vagy nullánál kisebb értéket adunk.

2.példa:2.példa:ez az eljárás minden híváskor különböző hosszúságú, a felhasználó által megadott karakterből kialakított vonalat húz a képernyőre.

3.példa:3.példa: írjatok egy olyan eljárást amely eldönti két valós számról hogy milyen matematikai reláció van közöttük.

Az értékparaméter összetett típusú is lehet. Ekkor a paraméterdeklarációban használt típusnévvel deklaráljuk a hívási paraméterlistában megadott változókat is

4.példa:4.példa: írjatok egy olyan eljárást amely feltölt és kiírat egy egydimenziós tömböt

3. Cím szerinti paraméterátadás3. Cím szerinti paraméterátadás(változó paraméterek)(változó paraméterek)

Gyakran találkozunk olyan feladattal, amikor egy eljárás paraméterein fejti ki hatását (csökkenti, növeli, felcseréli).

Ekkor a bemenő (egyirányú) értékparaméterek használatával nem érjük el célunkat, hiszen ilyen paramétereken elvégzett műveletek hatása csak az eljáráson belül érzékelhető. Megoldást az ún. változó-változó-paraméterekparaméterek bevezetése jelenti számunkra, amely kétirányú adatcserét biztosít a hívó program és a hívott eljárás között.

Ebben az esetben az eljárásnak nem akarunk értéket küldeni, hanem azt akarjuk, hogy az eljárás új értéket az eljárás új értéket szolgáltasson. szolgáltasson.

Ez csakis úgy lehetséges, ha a kifejezés értéke egy változó, ilyenkor nem értéket adunk neki, hanem címét adjuk meg.

ProcedureProcedure eljárásnév ( varvar paraméter: típus);{lokális deklarációk}

begin     {Eljárástörzs, végrehajtó rész} …

end;

Var változó: típus;Begin

…eljárásnév(változó);…

End.

Cím szerinti paraméterátadás során a bevitt adatok Cím szerinti paraméterátadás során a bevitt adatok megváltoznak és a megváltozott érétket az megváltoznak és a megváltozott érétket az

eljáráson kívül is feltudjuk használni, eljáráson kívül is feltudjuk használni, ezért is a név, ezért is a név, változó paraméterek.változó paraméterek.

Var, mindig a legközelebbi pontosvesszőig érvényes

1.példa:1.példa: írjatok egy olyan eljárást amely feltölt és kiírat egy egydimenziós tömböt, majd rendezi annak elemeit

Paraméter átadás

Az érték szerinti paraméterátadás során az átadott paraméterek értékének megváltozása nincs hatással a főprogramra (csak bemenő paraméterek).

A cím szerinti paraméterátadás során az átadott paraméterek értékének megváltozása hatással van a főprogramra (kimenő paraméterek).

Az eljárásoknak is van saját deklarációs részük, ahol olyan változókat deklarálhatunk,melyek csak az eljárásban ismertek. Ezek a lokális változók, ezek érvényessége csak az eljárásra korlátozódik.

Míg a főprogramban deklarált globális változók az egész program futása alatt élnek, addig az alprogramokban deklarált változók csak az alprogram hívásakor keletkeznek és annak végrehajtása után meg is szűnnek.

Függvények Függvények Programjainkban használtunk már függvényeket,

mint például a négyzetre emelés (Sqr), gyökvonás (Sqrt), stb. A függvények olyan alprogramok, melyek a főprogram bármely pontján meghívhatók a következõképpen:

    valtozo:=fuggvenynev(parameterek);valtozo:=fuggvenynev(parameterek);

A függvényhívás az értékadó utasítás jobb oldalán történik, míg a bal oldalon az a változó szerepel, melybe majd a függvény értéke kerül.

Saját függvényeket a következőképpen írhatunk:

functionfunction fuggvenynev (parameterek):fuggvenynev (parameterek): fuggvény_típusa fuggvény_típusa;;

{deklarációk}{deklarációk}

beginbegin

{függvénytörzs}{függvénytörzs}       fuggvenynev:= utasitas;fuggvenynev:= utasitas; {függvény {függvény eredménye}eredménye}

endend;;

1.példa:1.példa: írjatok egy olyan eljárást amely feltölt és kiírat egy egydimenziós tömböt, majd egy függvényt, amely összegzi a tömb elemeit.

2.példa:2.példa: Írj egy függvényt, amely kiszámítja egy tetszőleges szám Írj egy függvényt, amely kiszámítja egy tetszőleges szám faktoriális értékét.faktoriális értékét.n!= 1*2*3* … *nn!= 1*2*3* … *n

pl. 5!= 1*2*3*4*5=120pl. 5!= 1*2*3*4*5=120

Feladatok:1. Írj eljárást, amely kiszámolja egy kör kerületét és területét.

Készítsd el a programot függvény segítségével is és kérdezze meg a felhasználótól hogy mit szeretne kiszámoltatni a programmal.

2. Írj egy függvényt, amely elvégzi a hatványozás matematikai műveletét.

3. Írjatok egy olyan programot, amely tartalmazza a következőket:- egy függvényt, melynek értéke egy logikai érték, eldönti három értékről

hogy alkothatják-e egy háromszög három oldalát? - Ha igen akkor írjatok egy eljárást amely eldönti hogy milyen típusú

háromszögről van szó (szabályos, egyenlő szárú vagy általános) és- egy-egy másik függvényt melynek segítségével kiszámoljátok a

háromszög kerületét és területét.

- Procedure hszog(var a,b,c:real);- Var f: boolean;- Begin- repeat- writeln(‘A 3szog oldalai:’);- writeln(‘Az a oldal hossza:’); readln(a);

writeln(‘Az b oldal hossza:’); readln(b); writeln(‘Az c oldal hossza:’); readln(c); if (a+b>c) and (a+c>b) and (b+c>a) then f:=true

elsebegin f:=false; writeln(‘HIBÁS adatok’!);end;

writeln;until f;

End;

4. Írjatok egy függvényt, melynek értéke egy logikai érték, eldönti egy háromszögről hogy derékszögű-e!

5. Írj eljárást amely három nevet rendez abc sorrendbe.6. Írj programot amely eljárások és függvények segítségével

megoldja a következőket:- feltölt egy tömböt- kiíratja a tömb elemeit- rendezi a tömb elemeit- kiválogatja a páros elemeket- megkeresi a pozitív elemeket és a negatívakat

külön- külön és meghatározza hány van belőlük- meghatározza elemeinek összegét, átlagát.

Készíts a feladathoz egy menüt, melynek segítségével a felhasználó meghívhatja rendre mindenik eljárást és függvényt anélkül hogy újra futtatná a programot.

7. Írj programot, amely mértani formák kerületét és területét számolja ki. Készíts menüt a feladathoz.

Procedure menu; Var ch:char; Begin repeat repeat clrscr; writeln(‘Egyszerű menü készítése: ’); … writeln(‘_______________________’); … writeln(‘a. Beolvasás’:15); … writeln(‘b. Kiíratás’:15); … writeln(‘c. Rendezés’:15); … writeln(‘d. Átlag:’:15); … writeln(‘e. Keresés’:15); writeln; writeln(‘x. Kilépés’:15); … repeat ch:=readkey; until ch in [‘A’..’a’, ‘B’..’b’, ‘C’..’c’, ‘D’..’d’, ‘E’..’e’,’X’..’x’]; case ch of ‘A’, ’a’: Beolvasas; ‘B’, ’b’: Kiiratas; ‘C’, ’c’: Rendezes; ‘D’, ’d’: Atlag; ‘E’, ’e’: Kereses; ‘X’, ’x’: halt; end; until false; until ch=X or ch=x; End;

8. Egy meteorológiai állomásnál mindennap jelzik a naponta mért hőmérsékleteket. Ilyenkor feljegyzik a szolgálatban lévő meteorológus nevét és az általa °C mért hőmérsékletet.N napig vezetik a naponta mért hőmérsékletet.Írassátok ki a következőket:

- mi a legmagasabb hőmérséklet?- mikor mérték?- ki volt szolgálatban?

9. Töltsétek fel két halmaz elemeit 0 és 255 közötti értékekkel.írassátok ki mindkét halmaz elemeit egy sorba egymás után szóközzel elválasztva egymástól. A program írassa ki hogy „igen” ha a halmazok egyenlők, ellenkező esetben pedig hogy „nem”, majd jelenítse meg a két halmaz egyesítését, metszetét és különbségét.

10. Olvassatok be a billentyűzetről karaktereket, egy személy nevét.Ellenőrizzük le hogy a név helyesen lett-e beírva, ha igen, akkor írassuk ki az eltérő karakterek halmazát ebből a névből.