home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_01_04 / 1n04032a < prev    next >
Text File  |  1990-05-02  |  5KB  |  163 lines

  1. Joe Celko & Michael Smith
  2. Sunset Blvd #304
  3. Los Angeles, CA  90069
  4.   service: (213) 288-9690
  5.  
  6. 325 words
  7.  
  8.  
  9.  
  10.  
  11.  
  12. CHECK DIGIT PROGRAMS 
  13.  
  14. The following Pascal functions will compute the different check 
  15. digits given in the article.  They assume that the program has 
  16. the following declarations global to them.  N can be replaced by 
  17. a literal value in all of the programs for a particular 
  18. application, so these are more templates than programs.  The 
  19. InfoDigits data type assumes that the number to be given a check 
  20. digit is stored in an array of integers, with the leftmost digit 
  21. in position one.
  22.  
  23. CONST 
  24.    N = 10; { size of information digits string }
  25. TYPE
  26.   InfoDigits = ARRAY [1..N] OF INTEGER;
  27.  
  28. FUNCTION MakeCheck(a : InfoDigits; n : INTEGER) : INTEGER;
  29. { This will generate Verhoeff's Dihedral Five check digit }
  30. CONST
  31. MultTable : ARRAY [0..9, 0..9] OF INTEGER =
  32.     (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  33.      ( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
  34.      ( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
  35.      ( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
  36.      ( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
  37.      ( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
  38.      ( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
  39.      ( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
  40.      ( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
  41.      ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
  42.  
  43. PermTable : ARRAY [0..9, 0..9] OF INTEGER =
  44.        (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  45.         ( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
  46.         ( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
  47.         ( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
  48.         ( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
  49.         ( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
  50.         ( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
  51.         ( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
  52.         ( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  53.         ( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
  54.   
  55. InverseTable : ARRAY [0..9] OF INTEGER =
  56.      ( 0, 4, 3, 2, 1, 5, 6, 7, 8, 9);
  57. VAR
  58.  Check, i : INTEGER;
  59. BEGIN
  60. Check := 0;
  61. FOR i := 1 TO n
  62. DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
  63. MakeCheck := InverseTable[Check];
  64. END;
  65.  
  66. FUNCTION VerifyCheck(a : InfoDigits; n : INTEGER) : BOOLEAN;
  67. { This will verify Verhoeff's Diheral Five check digit.  Note 
  68. that it is different from the generator }
  69. CONST
  70. MultTable : ARRAY [0..9, 0..9] OF INTEGER =
  71.     (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  72.      ( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
  73.      ( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
  74.      ( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
  75.      ( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
  76.      ( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
  77.      ( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
  78.      ( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
  79.      ( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
  80.      ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
  81.  
  82. PermTable : ARRAY [0..9, 0..9] OF INTEGER =
  83.        (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  84.         ( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
  85.         ( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
  86.         ( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
  87.         ( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
  88.         ( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
  89.         ( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
  90.         ( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
  91.         ( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  92.         ( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
  93. VAR
  94.   Check, i : INTEGER;BEGIN
  95. Check := 0;
  96. FOR i := 1 TO n
  97. DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
  98. VerifyCheck := (Check = 0);
  99. END;
  100.  
  101. .PAGE
  102. Bull Function : 
  103.  
  104. FUNCTION BullCheck(a : InfoDigits; n, x, y : INTEGER) : INTEGER;
  105. {  The most popular pairs (x, y), in order of  increasing error 
  106. detection ability, are (4,5), (4,7), (3,7), (3,5), (5,6) and 
  107. (3,8).  }
  108. VAR
  109.  CheckX, CheckY, i : INTEGER;
  110. BEGIN
  111. CheckX := 0;
  112. CheckY := 0;
  113. FOR i := 1 TO n
  114. DO IF (Odd(i))
  115.    THEN CheckX := CheckX + a[i]
  116.    ELSE CheckY := CheckY + a[i];
  117. BullCheck := (CheckX MOD X)+ (CheckY MOD Y)
  118. END;
  119.  
  120. .PAGE
  121. Power Function : 
  122.  
  123. FUNCTION PowerCheck(a : InfoDigits; base, x : INTEGER) : INTEGER;
  124. { base is usually 2 or 3.  x is usually 7, 10 or 11. }
  125. VAR
  126.  Check, i, Term : INTEGER;
  127. BEGIN
  128. Check := 0;
  129. Term := 1;
  130. FOR i := 1 TO n
  131. DO BEGIN
  132.    Check := Check + (Term * a[i]);
  133.    Term := Term * base;
  134.    END;
  135. PowerCheck := (Check MOD x)
  136. END;
  137.  
  138. .PAGE
  139. ISBN Function : 
  140.  
  141. FUNCTION ISBNCheck(a : InfoDigits) : INTEGER;
  142. VAR
  143.  Check, i : INTEGER;
  144. BEGIN
  145. Check := 0;
  146. FOR i := 1 TO n
  147. DO Check := Check + (i * a[i]);
  148. ISBNCheck := (Check MOD 11)
  149. { Let calling program handle a value of 10
  150.   as it wishes. }
  151. END;
  152.  
  153.                           --END--
  154.  
  155.   Title:  CHECK DIGIT PROGRAMS 
  156.   Words:  325
  157.    Date:  1990 May 02
  158. Sent to:
  159. C Users Journal
  160. R&D Publications
  161. 2601 Iowa Street
  162. Lawrence, KS 66047
  163.