algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm Verhoeff'a - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 11 kwietnia 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

Verhoeff - Delphi/Verhoeff.dpr:
//algorytm Verhoeff'a
//www.algorytm.org
//(c)2007 by Tomasz Lubinski

program Verhoeff;
{$APPTYPE CONSOLE}
uses
  SysUtils;

var

d: array[0..9] of array [0..9] of byte =
               ((0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
		(1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
		(2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
		(3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
		(4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
		(5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
		(6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
		(7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
		(8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
		(9, 8, 7, 6, 5, 4, 3, 2, 1, 0));

p: array[0..7] of array [0..9] of byte =
		((0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
		 (1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
		 (5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
		 (8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
		 (9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
		 (4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
		 (2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
		 (7, 0, 4, 6, 9, 1, 3, 2, 5, 8));

inv: array[0..9] of byte =
		(0, 4, 3, 2, 1, 5, 6, 7, 8, 9);

number: String;

// Check number
// return true if check digit in number is correct, false otherwise
function verhoeffCheck(number: String): boolean;
var
	c, digit, i, len: Integer;
begin

   c := 0;
   len := length(number);
   result := false;

	for i:=1 to len do
	  begin
 		 digit := StrToInt(number[len - i + 1]);
                c := d[c][p[(i - 1) mod 8][digit]];
          end;

	if c = 0 then
		result := true;
end;

// Calculate check digit for a given number
function verhoeffCheckDigit(number: String): integer;
var
	c, digit, i, len: Integer;
begin

   c := 0;
   len := length(number);

	for i:=2 to len do
	  begin
 		 digit := StrToInt(number[len - i + 1]);
                 c := d[c][p[(i - 1) mod 8][digit]];
          end;

	result := inv[c];
end;

// Get number and check it
begin


	writeln('Podaj numer do sprawdzenia');
	readln(number);

	if verhoeffCheck(number) = true then
	   writeln('Numer jest prawidlowy')
	else
	   begin
		   writeln('Numer jest nieprawidlowy');
		   writeln('Dla tego numeru prawidlowa cyfra kontrolna to ' + IntToStr(verhoeffCheckDigit(number)));
	   end;

	readln;

end.

Dodaj komentarz