Ma futottam bele egy invalid GIRO számlaszámba - ennek az eredménye a lenti forrás, ami egy bankszámlaszám checksumjait ellenőrzi.
A checksum a nyolcas blokkok 8. digitje, ezt kell kiszámolni. Verbózul ez úgy van, hogy a három nyolcas számblokk 1.-7. karaktereit szépen karakterenként összeszorozzuk sorrendben 9, 7, 3, 1, 9, 7, 3 számokkal (azaz az 1. digitet 9-cel, a 2.-at 7-tel, etc.), majd a szorzatok összegét 10-zel osztva, s az így kapott maradékot 10-ből kivonva áll elő a checksum digit.
Egyszerűbben leírva meg így néz ki:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define INPUTLEN 27 int main() { char szlaszam[INPUTLEN]; int o, i, digit, sum, cs, cc; int mul[] = {9, 7, 3, 1, 9, 7, 3}; printf("GIRO számlaszám 00000000-00000000-00000000 alakban: "); fgets(szlaszam, INPUTLEN, stdin); for (o = 0; o < 19; o += 9) { sum = 0; for (i = 0; i < 7; i++) { digit = szlaszam[o + i] - '0'; sum += digit * mul[i]; } cs = szlaszam[o + 7] - '0'; cc = 10 - (sum % 10); printf("checksum: stored = %d vs calculated = %d -- %sVALID\n", cs, cc, ((cs == cc) ? "" : "IN")); } return 0; }




