Gyakorlati alapok
Digit vagy helyiérték?
Ez a fejezet kivételesen nem programozásról, hanem közben felmerülő értelmezési, ezzel együtt elnevezési problémákról szól.
A Signore Fibonacci feltételes bekérései című fejezetben felmerült egy érdekes kódrészlet, amely egy számnak várt karakterfüzér "számjegyeit" vizsgálja meg külön-külön azért, hogy bemeneti adatként ne kerüljön a programba NEM numerikus adat (például betű).
for(int i = 0; i < elem.length(); i++){
char karakter = elem.charAt(i);
if(karakter != '0'
&& karakter
!= '1'
&& karakter
!= '2'
&& karakter
!= '3'
&& karakter
!= '4'
&& karakter
!= '5'
&& karakter
!= '6'
&& karakter
!= '7'
&& karakter
!= '8'
&& karakter
!= '9'){
rosszAdat = true;
break;
}
}
Ilyesfajta eljárás egyébként gyakori programozási elem, amely során egy tetszőleges bemeneti szám-karakterfüzér "számjegyein" lépkedünk végig, valamely általunk fontosnak minősített tulajdonságát vizsgálva, például:
2-860430-7501
→→→→→→
Sok olyan bemeneti számadat van, amely nem reprezentál semmilyen matematikai összefüggést, ilyen például egy autórendszám számrésze, amely nagy valószínűséggel egyszerű sorszám (például MAG-945), de említhetjük a személyi számot is (például 2-860430-7501), amely utolsó 4 számjegyének ugyan lehet matematikai tartalma, de kiindulópontja lényegében mégis dátum. A mögöttes matematika tehát legtöbbször a kód egy adott pontján nem lényeges, főként ott, ahol a számkaraktereket bekértük és ellenőriztük. De ha igen, ez sem változtatja meg az alapszemléletet: például a személyi számot nem lehet egységesen sem int, sem long, sem double típusként értelmeznünk. Helyette a bemeneti szám-karakterfüzér "számjegyeit" külön-külön vizsgáljuk meg. (A személyi számmal és az általa által hordozott matematikai összefüggésekkel részletesen foglalkozunk egy későbbi, Nyilvános adatok a szupertitkos személyi számból című fejezetben.)
Nos, ezzel nincs is gond, ez a feladatunk, pusztán az eljárás elnevezése okoz némi bonyodalmat. Ugyanis ha a bemeneti szám-karaktereket "számjegyeknek" vagy "helyiértékeknek" nevezzük, akkor valójában téves elnevezést alkalmazunk, hiszen mindkettő matematikai fogalom, főleg a "helyiérték". Az előbbi, a "számjegy" egyébként is elég tág elnevezés, ráadásul meglehet, hogy a névadás pillanatában a bemeneti szám nem is "klasszikus" számformátum, ilyen például egy mobilszám: 06301234567. Sőt továbblépek: egyenesen hiba volna ezt számként értelmeznünk.
Programozás-technikai javaslatom, hogy ilyen esetekben induljunk ki az angol digit szóból. Ilyen jellegű "magyarosítás" korántsem idegen az informatika területén, sőt, igazából a magyar nyelv manapság már hemzseg tőlük, gondoljunk csak a fájl, operációs rendszer, lájkol, stb. szavakra.
Értelmezésem szerint: a digit egy bemeneti számformátumnak adott pontban (indexen) lévő karaktere. A számolás mindig balról jobbra történjen (→) és kövessük a tömbindexelés szabályait, amely mindig 0-tól kezdődik.
Tehát az alábbi mobilszám a következő (szabványos) tulajdonságokkal bír:
06301234567
-
11 db digitből áll,
-
0. és 1. digitén csakis 06 állhat,
-
3. digitén állhat 2 (Telenor), 3 (Telekom), 7 (Vodafone),
-
4. digitén csakis 0 állhat,
-
5-6-7-8-9-10-11. digitén állhat 0-től 9-ig bármely szám (bár nyilvánvaló, hogy a mindegyik mobilszolgáltató a mobilszámok kiosztásánál további szűrőket alkalmaz, ám ezt szimpla mobilszám-bekérésnél nem kell figyelembe vennünk).