Vissza az előzőleg látogatott oldalra (nem elérhető funkció)Vissza a modul kezdőlapjáraUgrás a tananyag előző oldaláraUgrás a tananyag következő oldaláraFogalom megjelenítés (nem elérhető funckió)Fogalmak listája (nem elérhető funkció)Oldal nyomtatása (nem elérhető funkció)Oldaltérkép megtekintéseSúgó megtekintése

Tanulási útmutató

Összefoglalás

Ebben a leckében egy újabb, gyakran előforduló összetett típussal, a rekorddal ismerkedünk meg; egyben összefoglaljuk a típusdefiniálás és –deklarálás tudnivalóit is. Ezt követően a programépítés logikáját nagyban befolyásoló alprogramok (C szóhasználata szerint: függvények) fogalmát járjuk körül.

Követelmény

Önállóan megoldható feladatok

Rekordok; függvények; paraméterezés

A lecke részben az adatok, részben pedig az algoritmusok világát bővíti tovább. Az első részben megismerkedünk az ún. rekordokkal. Elérkezettnek látjuk az időt, hogy kicsit rendezzük a típusokkal kapcsolatos tudnivalókat. Elhelyezzük a programban a típusokat, meggondoljuk, milyen szerepekben és miként kerülhetnek szóba a típusok.

A második részben bevezetjük az alprogramok (eljárások és függvények) fogalmát, amelyekkel mintegy követjük az „oszd meg és uralkodj” elvet az algoritmizálás (és majdan a kódolás) során. Az említett elv alkalmazása nagyobb programok készítése során elkerülhetetlen. Nélkülözhetetlen, hiszen az ember egyszerre képtelen áttekinteni egy problémahalmaz minden részletét, így a megoldására szolgáló programot megalkotni sem lenne képes (legalábbis hiba nélkül). Az ember az egyszerre áttekinthetetlen méretű problémákon úgy lesz úrrá, hogy részekre tagolja, és ezek kapcsolódásait tisztázza először. A részeknek csak a „körvonalait” tisztázza, megadva az elvárásokat anélkül, hogy a működés részleteit, azaz a hogyanokat megválaszolni akarná. Majd ezt a hozzáállást követi az imént körvonalazott részproblémákra vonatkozólag, de most már nem törődve a teljes problémavilággal. Ez által lesz mindig kezelhető méretű a megoldandó probléma.

1. További tudnivalók a típusokról

1.1. Rekord-típuskonstrukció

Strukturálás

A Rekord-típuskonstrukciók általános szintaxisa.A Rekord-típuskonstrukciók általános szintaxisa.

Értékhalmaz

A mezők értéktípusai által meghatározott alaphalmazok direktszorzata.

Műveletek

Szelekciós függvény (.mezőszelektor szintaxisú);

konstrukciós függvény (Rekordtípus(mezőértékek) szintaxisú);

elképzelhetők transzformációs függvények, amelyek a teljes rekordstruktúrát érintik.

Relációk

= (mezőnkénti egyezés), .

Példa

Típus Komplex=Rekord(re,im:Valós)

[típus: két azonos típusú „re”, ill. „im” nevű mezővel]

Dátum=Rekord

(év :0..2000,

:1..12,

nap :1..31)

[típus: különböző típusú „év”, „hó”, „nap” nevű mezőkkel]

Változó a,b:Komplex

[változók:azonos, „Komplex” nevű típussal]

Konstans egység1:Komplex(1,0)

[konstans: egység1.re:=1, egység1.im:=0 értékadásokkal azonos értékkel]

egység2:Komplex(0,1)

[konstans: egység2.re:=0, egység2.im:=1 értékadásokkal azonos értékkel]

Jézus:Dátum(év:0, :12, nap:25)

[konstans: Jézus.év:=0, Jézus.hó:=12, Jézus.nap:=25 értékadásokkal
azonos értékkel]

PéterPál:Dátum(:6, nap:29)

[konstans: PéterPál.év:=NemDef, PéterPál.hó:=6, PéterPál.nap:=29
értékadásokkal azonos értékkel]

A tömb és rekord példájára tekintve érdekes „szabályszerűséget” vehetünk észre. Ezt a szabályszerűséget fejezi ki tömören az alábbi ábra. Sőt az is kiderül belőle, hogy eddig nem tárgyalt típusok definiálásánál is „működik” e szabály:

A típuskonstrukciók általános szintaxisa.A típuskonstrukciók általános szintaxisa.

1.2. Adatok leírása a programban

Sok-sok példát láttunk már a tömbnél és a rekordnál típusok definiálására, és felhasználására. Érdemes egy kicsit a részletektől eltávolodni, és madártávlatból megszemlélni ezen programdarabok elhelyezkedését a program egészében.

Típusdefiniáláskor egy típusképzési szabályt írunk le, megadjuk a típus nevét, és hogy milyen módon, milyen típusú részekből tevődik össze ez az általunk megalkotott összetett típus. Amikor egy adathoz (legyen az változó vagy konstans) hozzárendeljük a típusát (legyen az beépített, eleve definiált vagy általunk megalkotott), akkor deklaráljuk az adatot. (Gyakran erre használják a típusdeklaráció kifejezést.) E deklaráció során az adatnak már kijelölhető a számára futáskor szükséges memóriatartomány (elképzelhető, hogy a kezdő címe is), és azon műveletek köre, amellyel egyáltalán a kezelése lehetséges.

1.2.1. Típusdefiníció (típusmegadás)

Cél egy „egész” adatosztály (adatuniverzum) megtervezése: értékhalmazostul (adatállapotok halmaza: mozgástér), operációstul (adatállapot-változást okozó leképezések: mozgástörvények). A definíció csak az osztályt hozza létre, üresen (az univerzum még „kihalt”).

Példa

Típus Dátum =Rekord

(év :0..2000,

:1..12,

nap:1..31)

Index =1..maxN

Dátumok=Tömb[Index:Dátum]

Tömb12 =Tömb[1..12:Egész]

Az animáció bemutatja a rekord típus használatát:

Az animáció bemutatja a rekordok használatát a specifikációtól a kódolásig.

Flash lejátszó letöltése

A rekord adatstruktúra

Az animáció bemutatja azt hogy hogyan kell használni a rekord típust feladat megoldásában:

Az animáció bemutatja a rekordok felhasználását különböző tételekben.

Flash lejátszó letöltése

Tételek rekordokkal
Megjegyzés

Hasznos konvenció, ha a típusok nevét következetesen egy „T” betűvel elölről kiegészítve használjuk. Így a rögvest látszik rajta a „hovatartozás”, másrészt hosszas fejtöréstől is megmenthet minket. Gyakran ugyanis a típus nevével is a lehető legpontosabban ki akarjuk fejezni a majdani tartalmát, de ugyanez a kifejező név illene magához a deklarált adathoz is. Természetesen ez azonosító ütközést okozna. Viszont a konvenció megmenthet ettől. Például ha a Tömb12 valójában a hónapok hosszát rögzítő tömb kedvéért hoznánk létre, akkor szerencsés lenne a nevét HóHosszak-nak választani, de a majdani tömbnek is ez lenne a legjobb, így a THóHosszak az ütközéstől is megóv bennünket, de a kifejezőség is megmarad. Azaz:

Típus THóHosszak=Tömb[1..12:Egész]

Konstans hóHosszak=THóHosszak(31,28,31,30,31,30,31,31,30,31,30,31)

1.2.2. Konstansok megadása

A cél a már meglévő adatosztályba konstans adatokat elhelyezni (az univerzumot „állócsillagokkal benépesíteni”).

Példa

Konstans maxN :Egész(1000)

Jézus :Dátum(év:0,:12,nap:25)

hóHosszak:THóHosszak(31,28,31,30,31,30,31,31,30,31,30,31)

1.2.3. Változók deklarálása

Az előzőhöz hasonlatosan itt is újabb és újabb elemek kerülnek az adatok absztrakt terébe, de ezek kifejezetten „mozgékonyságra”, változékonyságra teremtődnek (ezek lesznek az univerzumunk „bolygói”, melyek mozgását szabályozzák a definiált mozgástörvények).

Példa

Változó N :Egész

maiNap :Dátum

haviSzabadNapok:Tömb12

Megjegyzés

A kezdőérték (kezdőállapot) a konstansoknál megszokott módon adható, de nem kötelező. Ha nem rendelünk kezdőértéket hozzájuk, akkor vagy az ún. nem definiált értékkel töltődnek föl, vagy a típushoz definiált iniciális értékkel.

A típus-, a konstans-, illetve a változómegadások felváltva követhetik egymást. Egy töretlen megadási sorozat előtt elegendő csak egyszer közölni, hogy milyen megadási sorozat jön. Ennek akkor van értelme, ha a programot viszonylagosan független részekből (pszeudomodulokból) építjük föl, s ilyenkor célszerű az önálló részeket elkülönítetten felépíteni. Ez szokott előfordulni, ha egy típus már „majdnem” kész, csak apróbb kiegészítésekre szorul; ebben az esetben nem készítünk teljesen új moduldefiníciót.

Példa

Kódrészlet

Magyarázat

Konstans

Típus …

Változó …

… eljárások, függvények …

1. „pszeudomodul”

Konstans

Típus …

Változó …

… eljárások, függvények …

2. „pszeudomodul”

2. Eljárás, függvény, operátor

Az algoritmuskészítéssel foglalkozó első fejezetben már taglaltuk, hogy feladatainkat célszerű részfeladatokra bontani. Ezek a részfeladatok felelnek meg gondolkodásunk – absztrakciós – szintjeinek. Célszerű, ha ennek is megfelel egy algoritmikus szerkezet.

Az olyan részfeladatokat megoldó részprogramokat, amelyek „valamit csinálnak”, nevezzük eljárásoknak. Az eljárások egyik fontos – de nem egyetlen – szerepe az absztrakció támogatása. Formája:

Eljárás Eljárásnév:

utasítássorok

Eljárás vége.

Az eljárás tehát – első közelítésben – formailag pont úgy néz ki, mint a (fő)program. Használata:

Eljárásnév

Egyszerűen leírjuk a nevét. Az eljáráshívás tehát önálló utasításként szerepelhet.

Az eljárás másik szerepét egy példán keresztül valósítjuk meg: a programunkban nagyon sok helyen fordul elő, hogy lapozni kell (várni kell a felhasználó beavatkozására, majd törölni kell a képernyőt és folytatni a feldolgozást. Erre a célra szolgálhat a következő eljárás:

Eljárás Lapozás:

Ki: "Nyomj le egy billentyűt!" [a kép legalsó sorába]

Billentyűlenyomásra_várakozás

Képtörlés

Eljárás vége.

Ezután ahány helyen kell lapozni, annyiszor kell leírni ennek az eljárásnak a hívását, s nem a teljes eljárás „belsejét”, az ún. eljárástörzset alkotó 3 utasítást. Ezzel megkaptuk az eljárások második szerepét: a kódrövidítést.

Sok olyan eset fordul azonban elő, amelyekben nem azonos kódrészt kellene rövidíteni, hanem csak hasonlóakat.

Példa

Az osztály fiú-, illetve lánytanulói átlaga az egyes tanulók átlageredménye alapján (F(N), L(M)).

Összevont eljárás

Paraméterezéses, egyszerűsített eljárás

Eljárás Átlagszámítás:

FA:=0

Ciklus I=1-től N-ig

FA:=FA+F(I)

Ciklus vége

FA:=FA/N

LA:=0

Ciklus I=1-től M-ig

LA:=LA+L(I)

Ciklus vége

LA:=LA/N

Eljárás vége.

Eljárás Átlagszámítás:

Átlag(N,F,FA)

Átlag(M,L,LA)

Eljárás vége.

Eljárás Átlag(DB,V,ÁT):

ÁT:=0

Ciklus I=1-től DB-ig

ÁT:=ÁT+V(I)

Ciklus vége

ÁT:=ÁT/DB

Eljárás vége.

Nyilvánvaló, hogy itt egy kódrészlet olyan megismétléséről van szó, amelyben három változót ki kell cserélni, és minden más marad változatlan. Vegyük észre, hogy az algoritmus megfogalmazása során számos változót használtunk föl különösebb előzetes jellemzés nélkül (FA, I, N, M, F, LA, L). Némelyek jelentésére a feladatból következtethetünk, másokra a használat módjából lehet következtetni. (Bár érezhető, hogy ez így nem kellően precíz hozzáállás, mégis ebben a fejezetben az adatok pontosításától eltekintünk; a következő fejezetet viszont csak ennek szenteljük.)

Az eljárások tehát paraméterezhetőek lesznek, és így általánosabban adhatók meg. A definiálásnál meg kell adni a paraméterek eljáráson belül használt nevét (ún. formális paraméter), hiszen különböző helyeken különböző paraméterekkel használhatják. Az eljárás hívásánál pedig fel kell sorolni azon konkrét változókat, konstansokat, kifejezéseket (az ún. aktuális paramétereket), amelyekkel az eljárást el kell végezni.

Az előbbi példából azonban az is látszik, hogy a paraméterek legalább kétfélék lehetnek: amiből az eljárás „számol” valamit (bemenő paraméterek), illetve, amit eredményül ad (kimenő paraméterek). Harmadik fajta lehetne a be- és kimenő paraméter, amelynek az értékét az eljárás használja, majd meg is változtatja.

Egy másik csoportosításban a paraméter értéke az eljárásban vagy megváltozik (ún. változó paraméter), vagy pedig nem (ún. konstans paraméter). Mi ez utóbbit követjük az eljárások leírásában:

Eljárás Eljárásnév(formális paraméterek):

utasítássorok

Eljárás vége.

illetve hívásában:

Eljárásnév(aktuális paraméterek)

Ebben a leírásban a formális paraméterek a legegyszerűbb esetben változók felsorolását jelentik. Ha ki akarjuk emelni, hogy mely paraméterek változhatnak meg, akkor írjuk ki eléjük a Változó, illetve a Konstans alapszavakat, és ha még a típusukat is meg akarjuk adni, akkor azt írjuk mögéjük! A formális és az aktuális paramétereket felsorolásuk sorrendjében feleltetjük meg egymásnak.

Példa

Eljárás Lapozás(Konstans CIM:Szöveg):

... eljárástörzs ...

Eljárás vége.

Eljárás Átlag(Konstans DB,V, Változó ÁT):

... eljárástörzs ...

Eljárás vége.

Megjegyzés

Az Átlag eljárás fejsora is korrekt, de kevesebb információt tartalmaz; illetve még ennél is több lehetne az eljárásfejben, ha a Lapozás eljáráshoz hasonlóan a paraméterek típusát is leírnánk.

Ha egy formális paramétert konstansként deklarálunk, akkor az eljárás hívásakor aktuális paraméterként konstans vagy kifejezés is szerepelhet, ha azonban változóként, akkor hívni is csak változóval lehet.

Alaphelyzetben az eljárások csak azokat a változókat használhatják, amelyeket paraméterként megadtunk számukra, a bővebb definíciójuk alapján azonban használhatnak ezen kívül tetszőleges globális változót, amelyet a feladat részekre bontásának egy, az azt tartalmazó szintje definiált.

Példa

Nézzünk erre példaként egy konkrét mátrix (A[N,M]) adott sorának sorösszegét kiszámoló eljárást!

Eljárás Sorösszeg(I,ÖSSZ):

ÖSSZ:=0

Ciklus J=1-től M-ig

ÖSSZ:=ÖSSZ+A[I,J]

Ciklus vége

Eljárás vége.

Az önállóan definiált részfeladatokat azonban néha kényelmesebb lenne másképpen használni. E más módszer ugyanaz, mint a matematika függvényeinek használati módja: a függvényértékek kifejezésekben használhatók. Az eljárás melletti másik absztrakciós eszköz lesz a függvény. Definiálása hasonló az eljáráséhoz, használata formailag ugyanaz, csak nem önálló utasításként, hanem kifejezésben szerepelhet.

Függvény Függvénynév(formális paraméterek): függvényérték típusa

utasítássorok

Függvénynév:=kifejezés

Függvény vége.

Megjegyzés

Elképzelhető lenne egy másik szintaxis is:

típus Függvény Függvénynév(formális paraméterek):

...

Függvény vége.

Lényegében így járnak például a C-szerű nyelvek is.

A függvény hívása ekkor az alábbi módon történhet (de természetesen egy olyan típusú kifejezés részeként, amilyen típusú értéket szolgáltat a függvény):

... Függvénynév(aktuális paraméterek) ...

Megjegyzés

A rövidebb, kevesebb információt tartalmazó felírásban a függvényérték típusa, sőt a definiálás legelején szereplő Függvény alapszó is elhagyható.

A függvény formális paraméterei csak konstansok lehetnek, azokat megváltoztatni nem tudja.

Példa

A fiúk vagy a lányok átlaga a jobb?

Eljárás Átlagszámítás:

Ha Átlag[N,F]>Átlag[M,L] akkor Ki:"Nagyobb a fiúk átlaga"

különben Ki:"Nagyobb a lányok átlaga"

Eljárás vége.

Függvény Átlag(DB,V):Valós

ÁT:=0

Ciklus I=1-től DB-ig

ÁT:=ÁT+V[I]

Ciklus vége

Átlag:=ÁT/DB

Függvény vége.

Vannak speciális függvények, amelyeket a többiektől eltérő módon használunk, jelüket nem az argumentumuk elé, hanem argumentumaik közé írjuk. Ezek az ún. operátorok, másképpen: műveletek. Ilyenek a szokásos aritmetikai, logikai műveletek, relációk. Ha egy adattípushoz ilyen jellegű műveletet kell készíteni, akkor operátordeklarációt írunk.

Művelet Operátornév(formális paraméterek): értékének típusa

utasítássorok

Operátornév:=érték

Művelet vége.

És a felhasználása az alábbi szintaktikus környezetben történhet:

... aktuális paraméter1 Operátornév aktuális paraméter2 ...

Az operátornak kettő vagy egy argumentuma lehet (utóbbi esetben az aktuális paraméter1 elmarad).

Példa

Térbeli helyvektorok összeadása (a THelyvektor típust már definiáltnak föltételezzük).

Művelet +(Konstans A,B:THelyvektor):THelyvektor

Ciklus I=1-től 3-ig

C[I]:=A[I]+B[I]

Ciklus vége

+ := C

Művelet vége.

E példában jól látszik, hogy időnként eléggé suta módon lehet csak hivatkozni az operátor szimbólumára (ami itt a +). Ilyen és egyéb okok miatt (gondoljunk az ún. szabad szintaxisú operátorokra) bevezetjük az operátorok időleges átnevezését lehetővé tevő Másként kulcsszóval bevezetett utasítást a művelet definiálásában:

Művelet Operátornév(formális paraméterek): értékének típusa

Másként operátorszimbólummal összekapcsolt kifejezése a paramétereknek

utasítássorok

Operátornév:=érték

Művelet vége.

Példa

Művelet VektorÖsszeg(Konstans A,B:THelyvektor):THelyvektor

Másként A + B

Ciklus I=1-től 3-ig

C[I]:=A[I]+B[I]

Ciklus vége

VektorÖsszeg:=C
Művelet vége.

Műveletek felhasználása az elvárható módon történik. Például, ha az A, B és C THelyvektor típusú adatok, akkor az A és B összegvektorát kapjuk C-ben:

C:=A+B

Eljárások, függvények paramétere az eddigiekben csak konstans vagy változó lehetett, de mindenképpen adat. A következőkben ezt általánosítjuk.

Ha például egy függvénytabellázó eljárást írunk, akkor abban nemcsak a táblázatban szereplő értékintervallum, illetve lépésköz lehet paraméter, hanem maga a függvény is. Az első általánosítás tehát az eljárás-, illetve a függvényparaméter.

Példa

Eljárás Függvénytabellázás(Függvény f(Valós):Valós,Konstans A,B,C:Valós):

Ciklus X=A-tól B-ig C-esével

Ki:X,f(X)

Ciklus vége

Eljárás vége.

A fejsorbeli első paraméterrész egy ún. paraméterfüggvényt ír le. Ebből derül ki, hogy az eljárásban az f formális névvel hivatkozunk rá, és neki egyetlen Valós paramétere lehet, és eredménye is Valós típusú.

Persze előzetes típusdefiniálással is élhettünk volna. Ekkor a fenti függvénydefiniálás így nézne ki:

Típus TValósbólValósFv=Függvény f(Valós):Valós

Eljárás Függvénytabellázás(Konstans f:TValósbólValósFv, Konstans A,B,C:Valós):

Ciklus X=A-tól B-ig C-esével

Ki:X,f(X)

Ciklus vége

Eljárás vége.

Az újabb általánosítást egy példapáros vezeti be. Két feladatot nézünk mindegyikben, és a közös jellemzőjük alapján találjuk meg az eljárások paraméterfogalmának kiteljesítését.

Példa

egy osztály 5-ös osztályzatú tanulói

egy névsor Pál keresztnevű tagjai

Eljárás: Kiválogatás(N,OSZT,JEGY):

Ciklus I=1-től N-ig

Ha OSZT[I]=JEGY akkor Ki:I

Ciklus vége

Eljárás vége.

Eljárás Kiválogatás(N,SOR,NÉV):

Ciklus I=1-től N-ig

Ha SOR[I]=NÉV akkor Ki:I

Ciklus vége

Eljárás vége.

Ránézésre a két eljárás lényegében azonos, jó lenne csak egyszer megírni. A baj az, hogy az OSZT vektor egész számokat tartalmaz, és a JEGY is egész értékű, míg a SOR szövegeket tartalmaz, és a NÉV is szöveg.

Megoldás az eljárás paraméterezése típussal: legyen paraméter az elemek típusa is!

Eljárás Kiválogatás(Típus Elemtípus,

Konstans N:Egész,

X:Tömb[1..N:Elemtípus],

E:Elemtípus):

Ciklus I=1-től N-ig

Ha X[I]=E akkor Ki:I

Ciklus vége

Eljárás vége.

Ezt az eljárást a fenti két feladatban a következőképpen hívhatjuk:

Kiválogatás(Egész,N,OSZT,JEGY)

Kiválogatás(Szöveg,N,SOR,NÉV)

Összeköthetjük ezt a bővítést az előzővel: tetszőleges tulajdonságú elemeket válogassunk ki tetszőleges típusú elemeket tartalmazó sorozatból!

Eljárás Kiválogatás(Típus Elemtípus,

Konstans N:Egész,

X:Tömb[1..N:Elemtípus],

Függvény t(Elemtípus):Logikai):

Ciklus I=1-től N-ig

Ha t(X[I]) akkor Ki:I

Ciklus vége

Eljárás vége.

Ebben az esetben az első példabeli hívás a következő lehet:

Kiválogatás(Egész,N,OSZT,Ötös)

Ekkor az Ötös függvény így néz ki:

Függvény Ötös(Konstans J:Egész):Logikai

Ötös:=(J=5)

Függvény vége.

Megjegyzés

Megjegyezzük, hogy az egyes programozási nyelvek, amelyek a típusokkal történő paraméterezés lehetőségét egyáltalán felkínálják ettől eltérő szintaxissal teszik.

Vissza a tartalomjegyzékhez

Fel a lap tetejére
Új Széchenyi terv
A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszirozásával valósul meg.