92 lines
2.5 KiB
Plaintext
92 lines
2.5 KiB
Plaintext
program RoboCarder;
|
||
|
||
{ MOD-10 algorithm
|
||
|
||
first digit: kind of credit card ( 3-AMEX, 4-VISA, 5-MC )
|
||
|
||
length
|
||
------
|
||
AMEX - 15 digits
|
||
VISA - 16 digits, sometimes 13
|
||
all other - 16 digits
|
||
|
||
validation
|
||
----------
|
||
begin at the rightmost digit and go to the left.
|
||
the odd digits are all sum'd up. the even (every 2nd) digits are
|
||
multiplied by 2. if the result is greater than 9, 9 is substracted.
|
||
this resulting value is added to the sum.
|
||
|
||
sum MOD 10 must be 0.
|
||
|
||
}
|
||
|
||
|
||
uses Crt;
|
||
|
||
const bigdigit: array[0..9,1..3] of string[5] = ( ('23332','10001','03330'),
|
||
{ 1 } ('02100','00100','00300'),
|
||
{ 2 } ('33332','23330','33333'),
|
||
{ 3 } ('33332','03332','33330'),
|
||
{ 4 } ('10010','33313','00030'),
|
||
{ 5 } ('13333','33332','33330'),
|
||
{ 6 } ('23333','13332','03330'),
|
||
{ 7 } ('33313','02300','30000'),
|
||
{ 8 } ('23332','23332','03330'),
|
||
{ 9 } ('23332','03331','33330'));
|
||
|
||
var inp: string[16];
|
||
|
||
procedure CheckValidity(x: string);
|
||
var i,sum,tmp,ec: integer;
|
||
begin
|
||
WriteLn('Number length: ',Length(x));
|
||
Val(x[1],tmp,ec);
|
||
case tmp of
|
||
3: WriteLn('Type: American Express');
|
||
4: WriteLn('Type: VISA');
|
||
5: WriteLn('Type: MasterCard');
|
||
end;
|
||
sum := 0;
|
||
for i:=1 to Length(x) do begin
|
||
Val(x[Length(x)-i+1],tmp,ec);
|
||
if i MOD 2=0 then tmp := tmp*2;
|
||
if tmp>9 then tmp := tmp-9;
|
||
sum := sum + tmp;
|
||
end;
|
||
WriteLn('Quersumme: ',sum);
|
||
if sum MOD 10=0 then WriteLn('VALID') else WriteLn('INVALID!!!');
|
||
end;
|
||
|
||
procedure BigWrite(w: string;x,y: word);
|
||
var i,j,k,ec: integer;
|
||
tmp: byte;
|
||
begin
|
||
for k:=1 to Length(w) do begin
|
||
for j:=1 to 3 do begin
|
||
GotoXY(x+(k-1)*6,y+j-1);
|
||
for i:=1 to 5 do begin
|
||
Val(w[k],tmp,ec);
|
||
case bigdigit[tmp,j][i] of
|
||
'0': Write(' ');
|
||
'1': Write('<27>');
|
||
'2': Write('<27>');
|
||
'3': Write('<27>');
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
begin
|
||
ClrScr;
|
||
GotoXY(1,7);
|
||
Write('Enter Credit Card number: ');
|
||
ReadLn(inp);
|
||
BigWrite(Copy(inp,1,8),1,1);
|
||
BigWrite(Copy(inp,9,8),1,4);
|
||
GotoXY(1,8);
|
||
CheckValidity(inp);
|
||
ReadKey;
|
||
end.
|