Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
IMEI Checksum (Luhn) Algoritması
#1
IMEI Checksum (Luhn) Algoritması 

Wikipedia Luhn Algoritması :  http://www.wikizero.info/index.php?q=aHR...Gdvcml0aG0

Delphi Fonksiyonu  : 

function Luhn_Hesapla(S:String):Char;
Var
i,F,V,Sum:integer;
begin
F:=2;
Sum:=0;
for i:=Length(S) downto 1 do
 begin
  if Not (S[i] In ['0'..'9']) Then Exit;
  V:=F*(Ord(S[i])-Ord('0'));
  if V>9 Then V:=(V Mod 10)+1;
  Sum:=Sum+V;
  F:=3-F;
 end;
Sum:=Sum Mod 10;
if Sum<>0 Then Sum:=10-Sum;
Result:=Chr(Sum+$30);
end;
Cevapla
#2
(06-02-2018, Saat: 16:43)dicle_gsm Adlı Kullanıcıdan Alıntı: IMEI Checksum (Luhn) Algoritması 

Wikipedia Luhn Algoritması :  http://www.wikizero.info/index.php?q=aHR...Gdvcml0aG0

Delphi Fonksiyonu  : 

function Luhn_Hesapla(S:String):Char;
Var
i,F,V,Sum:integer;
begin
F:=2;
Sum:=0;
for i:=Length(S) downto 1 do
 begin
  if Not (S[i] In ['0'..'9']) Then Exit;
  V:=F*(Ord(S[i])-Ord('0'));
  if V>9 Then V:=(V Mod 10)+1;
  Sum:=Sum+V;
  F:=3-F;
 end;
Sum:=Sum Mod 10;
if Sum<>0 Then Sum:=10-Sum;
Result:=Chr(Sum+$30);
end;

Ellerinize sağlık. Ancak bazı düzenlemeler ile daha da efektif bir kod haline getirebilirsiniz rahatlıkla.

Örneğin:
1- Result'a bir başlangıç değeri atamanız yerinde olabilir.
2- Fonksiyona geçilen parametre'yi const olarak geçmeniz hız ve memory tasarrufu sağlar.
3- Gördüğüm kadarı ile fonksiyona geçilen parametre'nin bir sayı olması bekleniyor. Bu durumda "A0123456789" gibi bir değer geçildiğinde fonksiyona bu geçilen değerin sayı olmadığını anlamak için 10 defa döngü içinde dönmeniz gerekiyor. Bu koşulu döngüye girmeden önce kontrol etmek yerinde olabilir.
4- Sürekli string parametre'nin ilgili indis'deki karakterlerinin ordinal değerlerini alacağınıza ilgili parametre'yi bir TBytes değişkenine aktarmanız daha yerinde ve şık olabilir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi