9.5. Felhasználó által definiált függvények

iDevice ikon

Mivel gyakran van szükségünk olyan függvényre, amely nem szerepel belső függvényként a fejlesztőeszköz készletében, ezért annak a szoftvernek a felhasználójaként mi magunk vagy a csapattársunk kénytelen azt megírni. Erősen ajánlott, hogy az ilyen saját függvénynek az elnevezése legyen a funkciójára utaló, másrészt a paraméter helyén beszédes neveket tartsunk, ami legalább az oda beírandó adat típusára utal.

Tipikus eset

Két határ közé eső véletlenszám generálása egy formás saját függvény megírásával történne, ha mégsem lenne a rendszerfüggvények között ilyen. Abban biztosan felhasználnánk az általában RANDOM() vagy RND() néven létező belső függvényt, ami 0 és 1 közötti valós számot generál véletlenszerűen a processzor kvalitásai alapján. Ha lottószámokra vágyunk, akkor 5 különböző, 1 és 90 közötti egészet kell véletlenszerűen generáltatnunk. Egy 90 elemű tömbben tartva a sorszámokat 5 alkalommal generáltatunk k és 90 közötti véletlenszámot, ahol k-1 az elkészült véletlenszámok darabszáma. A csupa különböző elem generálása ugyanis azzal biztosítható, hogy a k. alkalommal legenerált számmal sorszámozott tömbelem tartalmát felcseréljük a k. helyen lévővel. Tehát világos, hogy 2 paraméterezhető határ közötti véletlenszám előállításához hasznos ötlet függvényt írni. Nevezzük mostantól magyar ráutaló nevén a (0,1) közötti véletlenszámot előállító függvényt: VÉLETLEN(). Láthatóan függvény, van neve és argumentuma, de most üres a zárójel, tehát nem vár bemenő adatot. Közismert, hogy a számítógép az órajelből indítja el a generálást, tehát nem kell a hívásnál bemenő értéket megadni, akárcsak a MA() vagy a MOST() nevű 2 függvénynél, melyek az aktuális rendszerdátumot vagy rendszeridőt szolgáltatják.

A VÉLETLEN()*90 egészrésze 0,1,...89 lehet, tehát azt 1-gyel megnövelve 1 és 90 közötti számot kapunk. A VÉLETLENSZÁM(alsó,felső) függvény tehát formálisan egyenlő az EGÉSZRÉSZ(VÉLETLEN()*(felső-alsó+1))+alsó kifejezés értékével. Ezzel már a függvények összeágyazását is elkövettük: a (0,1) közti véletlenszámot adó függvényértéket megszorozva a tartomány hosszával átadtuk az egészrész függvénynek, és az a paraméterébe kapott számnak vette a matematikai egész részét. Végül a visszaadott egészrészt megnövelve az alsó határral tényleg csak alsó és felső közti végső értéket kapunk a VÉLETLENSZÁM függvény 2 számértékkel történő meghívása alkalmával. Az ilyen függvény meghívását illik egy vizsgálattal megelőzni; alsó < felső.

 

Ismeretlen függvényérték

Előfordul, hogy a függvény nem tud valódi adatot szolgáltatni, mert a funkcióban lévő művelet egyike sikertelen a bemenő adatra. A DIÁK_CÍME (kódszám) függvényérték előállítása alkalmával arra is számítani kell, hogy a nyilvántartott diákok között esetleg nem fordul elő a bemenő kódszám. Ha a keresés sikertelen lenne, akkor a visszaadott érték határozatlan, vagyis ismeretlen érték lesz. Ilyenkor vagy a függvényhívás előtt ellenőrizzük a diák létezését, vagy a függvényhívás után ellenőrizzük az érték határozatlanságát. Adatbáziskezelés esetén a függvényhívást általában megelőzi a nyilvántartott diákok közül történő választás, hogy a kódszám csak egy létező diáké lehessen. Viszont nem minden diáknak van kitöltve a cím adata (mert nem tették kötelezően kitöltendővé), tehát a visszaadott cím lehet ismeretlen érték, pedig a keresés sikeres volt: a megadott diáknak meglett a címe. Az ismeretlen értékű cím megjelenítése a konkrét diák egyéb adatai mellett legalább nem okoz gondot. Amikor egy létező diák matematikajegyét akarjuk kikerestetni egy függvénnyel, akkor azzal valószínűleg számolnánk a továbbiakban, tehát aritmetikai kifejezésben hívnánk meg. A MATEK_JEGY(kódszám) függvényben tehát gondoskodnunk kell egy számszerű érték -, például egy igazi 0 - visszaadásáról az ismeretlen, NULL-érték helyett abban az esetben, amikor a diáknak nincs matek-jegye. Így kerülhető el, hogy az egész kifejezés értékét ismeretlenné tegye az abban szereplő függvény valamely értéke.

 

Adatszerkezettől függően

Ne feledjük, hogy csak az adatszerkezet pontos ismeretében tudnánk létrehozni azokat a szükséges függvényeket, amelyek tárolt adatokból és műveletek egész sorának a végrehajtása útján dolgoznak. A TERMÉK_ÁRA (tkód, mikor) adott termék adott napi árát adja vissza valamely adatfájlból, amelyben az összes termék egyre változó árait tároljuk. Egyáltalán nem biztos, hogy a függvényhíváskor kívánt napon is volt árváltozás az adott terméknél. Ekkor elengedhetetlen tisztában lenni a termékárak tárolásának szerkezetével, hiszen az adatszerkezettől függően teljesen különböző műveletsorral végeztethető el a függvényre bízott keresés.

  • a. Egyszerű szerkezetű adattábla esetén egyetlen kereséssel kiválasztható a megfelelő sor, miután a kívánt mikor csak egy sorban fog a mettől és a meddig közé esni az adott termékről szóló több sor esetén. A mettől<=mikor és meddig>=mikor és tkód=keresett tkód feltétel hatására tehát a jó sorban szereplő ár a válasz.

Tkód

Mettől

Meddig

Ár

 

 

 

 



  • b. Ha viszont a termékenkénti árak érvényességét máshogy (sávosan) tároljuk, nem egyszerű a keresés: ki kell keresni a mettől<=mikor és tkód=keresett tkód feltétel szerinti sorok közül azt, amelyben a mettől a legnagyobb, hiszen a mellette álló új_ár lesz a helyes válasz.

Tkód

Mettől

Új_ár

 

 

 


  • c. Előfordulhat, hogy esetleg csak a tényleges árVáltozásokat tároljuk el, és a termékek aktuális árát a termék törzsadatai között tartjuk. Ebben az esetben a legnehezebb az adott termék valamikori árát megkeresni: ki kell keresni a meddig>mikor és tkód=keresett tkód feltétel szerinti sorok közül azt - feltéve, hogy van legalább egy ilyen sor -, amelyben a meddig a legkisebb. A mellette álló régi_ár lesz a helyes válasz, de sikertelen esetben (ekkor a régi_ár ismeretlen értékű) a termék-tábla akt_ára kell legyen a válasz.

Tkód

Meddig

Régi_ár

 

 

Tkód

...

Akt_ár

 

 

 

 

 

 

 

Itt nem beszélünk az adattároláshoz elengedhetetlen megszorítások biztosításáról, amely a tárolt adatok ellentmondás-mentességét nem engedi megsérteni. Jelen esetben szintén függvények segítségével írnánk meg a tárolandó adatok legfontosabb ellenőrzését: az egyes termékekhez tartozó sávoknak nem lehet metszetük. Másik figyelmeztetésre is szükség van: naponta legyen minden terméknek érvényes ára.