
A mellékelt példaprogram megnyitása előtt az ISBNValidate.pas-ban levő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Ahhoz, hogy programunkat elkészíthessük, nézzük meg, hogyan is épül fel egy könyv ISBN száma. Ez egy 10 számjegyből álló számsorozat, melyet négy csoportra lehet felosztani. Nézzük meg mindezt a következő példán.
ISBN szám: 963 0056 34 8
Az első csoportban levő 963 Magyarország azonosító kódja, a 0056 egy magyarországi kiadó azonosítószáma, a 34 az adott könyv sorszáma a kiadónál, míg az utolsó számjegy egy ellenőrző érték. Ez utóbbit fogjuk felhasználni arra, hogy a megadott ISBN szám valódiságát leellenőrizzük. Nézzük, mindezt hogy is tehetjük meg. Az alábbi kis táblázat segíti mindennek a megértését.
| ISBN szám |
9 |
6 |
3 |
0 |
0 |
5 |
6 |
3 |
4 |
8 |
| Pozíció |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| Összeg |
9*1+ |
6*2+ |
3*3+ |
0*4+ |
0*5+ |
5*6+ |
6*7+ |
3*8+ |
4*9= |
162 |
A számítás mechanizmusa a következő: az ISBN szám értékeit egyenként megszorozzuk a számban elfoglalt pozíciójukkal, majd a kapott szorzatokat összeadjuk. Esetünkben ez 162 lett. A kapott összeget ezután el kell osztanunk 11-el, és ha a maradékban az ellenőrző összeget kapjuk eredményül, akkor a vizsgált ISBN szám érvényes.
Esetünkben 162 mod 11 = 8, ami megegyezik az ellenőrző értékkel, tehát érvényes a szám.
Előfordulhatnak olyan esetek, mikor az ellenőrző érték helyén egy X betű szerepel. Ennek értéke 10-el egyenlő, tehát a fenti számítási módszert nyugodtan alkalmazhatjuk erre is.
Most lássuk, hogyan oldottuk meg mindezt a programunkban. Készítünk egy függvényt, mely a fenti számítást elvégzi a paraméterben kapott számon, majd egy boolean típusú értéket ad vissza eredményül.
function TISBNValidate.IsISBN(ISBN: String): Boolean;
var
Number,CheckDigit: String;
CheckSum,i: Integer;
Begin
Megvizsgáljuk, hogy 10 számjegyű értéket kaptunk-e a paraméterben.
if Length(ISBN)=10 then
begin
A CheckDigit változóban eltároljuk az ellenőrző összeget, míg a Number változóban az összes többi számjegyet.
CheckDigit := Copy(ISBN, Length(ISBN), 1);
Number := Copy(ISBN, 1, Length(ISBN)-1);
CheckSum:=0;
Az 1. pozíciótól a 9.-ig megszorozzuk a számjegyeket a pozíciójukkal, és összeadjuk a kapott eredményeket. A kapott összeget a CheckSum változóban tároljuk.
for i:=1 to 9 do
CheckSum:=CheckSum+i*StrToInt(Number[i]);
Amennyiben az ellenőrző jegy nem X betű, akkor elosztjuk 11-el a CheckSum értékét, és a kapott maradékot összehasonlítjuk a CheckDigit-ben tárolt ellenőrző összeggel.
if CheckDigit<>'X' then
begin
if (CheckSum mod 11) = StrToInt(CheckDigit) then
Ha a vizsgálat egyenlőséget állapít meg, a függvénynek True visszatérési értéket adunk, ellenkező esetben azt False-ra állítjuk.
Result:=True
else
Result:=False;
end;
Amennyiben az ellenőrző összeg helyén egy X szerepel, akkor annak értéke biztosan 10. Ennek tudatában elvégezzük a fentiekhez hasonló módon a számítást, majd beállítjuk a függvény visszatérési értékét.
if CheckDigit='X' then
begin
if (CheckSum mod 11)=10 then
Result:=True
else
Result:=False;
end;
end;
Ha az ISBN szám hossza nem 10 számjegyű, akkor a függvénynek hamis visszatérési értéket adunk, és hibaüzenetet íratunk ki.
if Length(ISBN)<>10 then
begin
Result:=False;
ShowMessage('Hibás az ISBN szám hosssza!');
end;
end;
A mellékelt példaprogramban már csak annyi dolgunk van, hogy meghívjuk a fenti függvényt, és paraméterként átadjuk a vizsgálandó számot, melyet Edit1-ben kérünk be a felhasználótól.
If ISBNValidate1.IsISBN(Edit1.Text) then
ShowMessage('A megadott ISBN szám érvényes.')
else ShowMessage('A megadott ISBN szám érvénytelen.');