# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال >  كسي  روش يا برنامه چك كردن كد ملي را دارد؟

## ali_abbasi22145

سلام
كد ملي ما از 10 رقم تشكيل شده است و رقم آخر رقم چك كردن است و الگوريتم يا روشي جهت درست بدون آن استفاده مي شود.
 كسي آن روش يا بهتر اينكه برنامه چك كردن كد ملي در دلفي را دارد؟
مثلا اين كد ملي غلط است: 1111111111

----------


## اصغر (پآچ)

سلام دوست من

توی انتخابات الکترونیک که برگذار شد یه برنامه داشتیم که با اینترنت چک میکرد که کد ملی معتبره یا نه اما تابعشو ندارم 

اگه میخوای بگو این برنامه رو بهت بدم اما سورسش همراش نیست.
یه روش دیگه هم مراجعه به سایت ثبت احواله که تست میکنه کد ملی معتبره یا نه میتونی از اون طریق هم توی برنامه ات استفاده کنی

من درخدمتم
موفق و موید باشی

----------


## saied7468

سلام

فرمول تشخیص صحت کد ملی

http://forum.p30world.com/showthread.php?t=295203

----------


## ali_abbasi22145

فرمول تشخیص صحت کد ملی (کارت ملی شناسایی) 
________________________________________
سلام. این مطلب رو در چند سایت مختلف دیدم، اما هیچ کدام منبع یکسانی رو معرفی نکردند البته گفته شده که سازمان ثبت احوال کشور این فرمول رو ارائه داده. و اما اصل مطلب:

همانطور که می دانید همه ارگانها و سازمانهای دولتی جمهوری اسلامی و شرکتهای تابعه موظف شده اند از این پس فیلد جدیدی در کنار مشخصات افراد به نام کد ملی درج نمایند و تقریبا همه هموطنان عزیز در حال حاضر کارت ملی را دارند. ولی ما به عنوان یک برنامه نویس وقتی در فرمی کد ملی را دریافت می کنیم چگونه از صحت کد وارد شده مطمئن شویم.

سازمان ثبت احوال کشور در راستای ارائه کارت ملی روشی را برای تولید کدهای ملی استفاده نموده است که با استفاده از آنها می توانیم کدهایی داشته باشیم که از امنیت بالایی برخوردار باشند و همچنین قابلیت تقلب نداشته باشند.

همه کدهای ملی ۱۰ رقمی هستند.

کدهای ملی که همه ارقام آنها مثل هم باشند معتبر نیستند مثل:

۰۰۰۰۰۰۰۰۰۰
۱۱۱۱۱۱۱۱۱۱
۲۲۲۲۲۲۲۲۲۲
۳۳۳۳۳۳۳۳۳۳
۴۴۴۴۴۴۴۴۴۴
۵۵۵۵۵۵۵۵۵۵
۶۶۶۶۶۶۶۶۶۶
۷۷۷۷۷۷۷۷۷۷
۸۸۸۸۸۸۸۸۸۸
۹۹۹۹۹۹۹۹۹۹

روش اعتبار سنجی کد ملی :

دهمین رقم شماره ملی را ( از سمت چپ ) به عنوان A در نظر می گیریم.

یک مقدار B در نظر می گیریم و آن را برابر با =

(اولین رقم * ۱۰) + ( دومین رقم * ۹ ) + ( سومین رقم * ۸ ) + ( چهارمین رقم * ۷ ) + ( پنجمین رقم * ۶) + ( ششمین رقم * ۵ ) + ( هفتمین رقم * ۴ ) + ( هشتمین رقم * ۳ ) + ( نهمین رقم * ۲ )

قرار می دهیم.


مقدار C را برابر با = B – (B/11)*11 قرار می دهیم.


اگر مقدار C برابر با صفر باشد و مقدار A برابر C باشد کد ملی صحیح است.

اگر مقدار C برابر با ۱ باشد و مقدار A برابر با ۱ باشد کد ملی صحیح است.

اگر مقدار C بزرگتر از ۱ باشد و مقدار A برابر با ۱۱ – C باشد کد ملی صحیح است.


اینها در لینک بالا گفته شده ولی اکتیوایکس آن را نتوانستم دانلود کنم اگرکسی اکتیوایکس اینجا آپلود کند ممنون می شوم.

----------


## اصغر (پآچ)

سلام دوست من

من dll اون رو دارم برات میذارم شاید بدردت بخوره!
موفق و موید باشی

----------


## Batman

> سلام دوست من
> 
> من dll اون رو دارم برات میذارم شاید بدردت بخوره!
> موفق و موید باشی


آقا چجوري ازش استفاده كنيم؟

----------


## MSHService

سلام.
یه اکتیوایکس از طرف خود اداره ثبت ارایه شده که با راهنما و نمونه مثالش براتون الصاقش کردم.
امیدوارم به کارتون بیاد .
در مورد اون DLL دوستمون آقای فرهاد  اونDLL رو نوشته که طریقه استفاده به شکل زیر میباشد.
function chek_Code(code: string): Boolean;
موفق و پیروز باشید.

----------


## vcldeveloper

> آقا چجوري ازش استفاده كنيم؟


دیگه همچین کدی نیاز به DLL و اکتیو ایکس و اینجور چیزها نداره که! یک فرمول ساده هست، آن را بصورت کد دلفی در قالب یک تابع پیاده سازی کنید، و در یک یونیت ذخیره کنید، و هر جا نیاز داشتید، ازش استفاده کنید.

----------


## MOIED_SHA@YAHOO.COM

من از این فرمول در برنامه ام استفاده کردم و برای بعضی از دانشجوهایی که می خواهند کد ملی شون را ثبت کنن  کد ملی تایید نمی شود به خصوص کسانی که اول کد ملی به صفر شروع می شود .

----------


## Felony

همین دیروز یونیت رو قرار دادم ، حداقل یه نگاهی به پست های اخیر مینداختین ...

----------


## MOIED_SHA@YAHOO.COM

من این قسمت از فرمول شک دارم لطفا باز نگری در نحوه تایپ فرمول کنید:

مقدار C را برابر با = B – (B/11)*11 قرار می دهیم.

چون 11 با 11 زده میشود  در نتیجه c=b-b

----------


## Felony

فکر میکنم شما در بحث ریاضیات و تقدم عملگرها ( پرانتز ) ضعیف هستید ، جواب فرمول اولی که قرمز کردید با دومی که خودتون نوشتید زمین تا آسمون فرق میکنه .
شاید هم من درست منظورتون رو متوجه نشدم که در این صورت پیشاپیش معذرت میخوام .

موفق باشید .

----------


## Hamid.Kad

> فکر میکنم شما در بحث ریاضیات و تقدم عملگرها ( پرانتز ) ضعیف هستید ، جواب فرمول اولی که قرمز کردید با دومی که خودتون نوشتید زمین تا آسمون فرق میکنه .


اتفاقاً حرف ایشون کاملاً صحیحه. درست میگن. میشه بفرمائید شما چجوری این فرمول رو حساب می کنید که جوابش از زمین تا آسمون فرق میکنه ؟

دوست عزیز، احتمالاً ایشون از یه برنامه به زبان C کپی کردن و منظورشون از تقسیم، تقسیم صحیح بوده که در این صورت کل این عبارت برابر با باقیمانده 
تقسیم عدد B بر 11 میشه. یعنی: c:=B Mod 11
موفق باشید

----------


## khoshblagh

با سلام خدمت دوستان
من کد اینطور نوشتم.جواب میدهد.متشکرم.

procedure DoCodMeli;

 
var 
Byt10,Byt9,Byt8,Byt7,Byt6,Byt5,Byt4,Byt3,Byt2,byt1  ,bytRemander:Byte;

intJam:Integer;
begin
Byt10:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.T  ext ,1,1))*10;
Byt9:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,2,1))*9;
Byt8:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,3,1))*8;
Byt7:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,4,1))*7;
Byt6:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,5,1))*6;
Byt5:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,6,1))*5;
Byt4:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,7,1))*4;
Byt3:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,8,1))*3;
Byt2:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,9,1))*2;
Byt1:=StrToInt(Copy(frmGharardadEdit.txtCodMeli.Te  xt,10,1));
intJam:=Byt10+byt9+byt8+byt7+byt6+byt5+byt4+byt3+b  yt2;
bytRemander:=intJam mod 11;
if bytRemander>1 then
  bytRemander:=11- bytRemander;
if Byt1<>bytRemander then begin
  Application.Title :='˜Ï ãáí ÛáØ'+'!';
  ShowMessage('˜Ï ËÈÊ ÔÏå ãÚÊÈÑ äíÓÊ'+'!');
  frmGharardadEdit.txtCodMeli.SetFocus ;
  Exit;
end;
 

end;
 
 

با تشکر از جناب SilverSoft به خاطر کمکهای ارزنده در این رابطه .(منظور دادن لینک مناسب در تاپیک قبلی همین موضوع)

----------


## K.Mohammadreza

> با سلام خدمت دوستان
> من کد اینطور نوشتم.جواب میدهد.متشکرم.
> 
> procedure DoCodMeli;
> 
>  
> var 
> Byt10,Byt9,Byt8,Byt7,Byt6,Byt5,Byt4,Byt3,Byt2,byt1  ,bytRemander:Byte;
> 
> ...


کد شما بسیار جالبه ولی زیادی کد نوشتین
کد زیر به نظر من بهتره

function GetNumber(Str: String): String;
var
 I: Integer;
begin
 Result := '';
 for I := 1 to Length(Str) do
  if(Str[I] in ['0'..'9'])then
   Result := Result + Str[I];
end;
 
function CheckCodeMeli(MelliCode: string): Boolean;
var
  i, Sum,
  Mon, Chk: Integer;
begin
  Result := False;
  MelliCode := GetNumber(MelliCode);
  while Length(Trim(MelliCode)) < 10 do
    MelliCode := '0' + MelliCode;
    
  If(MelliCode = '0000000000')or(MelliCode = '1111111111') Or
    (MelliCode = '2222222222')or(MelliCode = '3333333333') Or
    (MelliCode = '4444444444')or(MelliCode = '5555555555') Or
    (MelliCode = '6666666666')or(MelliCode = '7777777777') Or
    (MelliCode = '8888888888')or(MelliCode = '9999999999') Then
        Exit;
  Chk := StrToInt(Copy(MelliCode, 10, 1));
  Sum := 0;
  for i := 1 to 9 do
    Sum := Sum + StrToInt(Copy(MelliCode, i, 1)) * (11 - i);
  Mon := Sum mod 11;
  if((Mon < 2)and(Chk = Mon))or
    ((Mon >= 2)and(Chk = (11 - Mon)))then
      Result := True;
end;

----------


## ali_abbasi22145

سلام
با كمك آقاي K.Mohammadreza  برنامه دلفي تست شده كد ملي الحاق گرديده است.

----------


## user10

function checkMelliCode(Mellicode:String):boolean  ;
var
   meli_code:String;
   C,N,R:Integer;
Begin
  checkMelliCode:=False;
  meli_code:=Mellicode;

  if Length(meli_code) = 10  Then
  Begin
      If (meli_code = '1111111111' ) OR
         (meli_code = '0000000000') Or
         (meli_code = '2222222222') Or
         (meli_code = '3333333333') Or
         (meli_code = '4444444444') Or
         (meli_code = '5555555555') Or
         (meli_code = '6666666666') Or
         (meli_code = '7777777777') Or
         (meli_code = '8888888888') Or
         (meli_code = '9999999999' )  Then
      Begin
      //      ShowMessage('کد ملی صحیح نمی باشد');
            checkMelliCode:=False;
            exit;
      End;
      c :=  StrToInt(meli_code[10]);

      n := (StrToInt(meli_code[1]) *10 )+
           (StrToInt(meli_code[2]) * 9 )+
           (StrToInt(meli_code[3]) * 8 )+
           (StrToInt(meli_code[4]) * 7 )+
           (StrToInt(meli_code[5]) * 6 )+
           (StrToInt(meli_code[6]) * 5 )+
           (StrToInt(meli_code[7]) * 4 )+
           (StrToInt(meli_code[8]) * 3 )+
           (StrToInt(meli_code[9]) * 2 );

      r := n - (n div 11)*11;
      if (((r = 0) and (r = c)) OR ((r = 1) and (c = 1)) OR ((r > 1) and (c = 11 - r))) Then
      Begin
          checkMelliCode:=True;
      End   ;
   //   else        ShowMessage('کد ملی صحیح نمی باشد');

  end;
end;

----------

