سلام
كد ملي ما از 10 رقم تشكيل شده است و رقم آخر رقم چك كردن است و الگوريتم يا روشي جهت درست بدون آن استفاده مي شود.
كسي آن روش يا بهتر اينكه برنامه چك كردن كد ملي در دلفي را دارد؟
مثلا اين كد ملي غلط است: 1111111111
سلام
كد ملي ما از 10 رقم تشكيل شده است و رقم آخر رقم چك كردن است و الگوريتم يا روشي جهت درست بدون آن استفاده مي شود.
كسي آن روش يا بهتر اينكه برنامه چك كردن كد ملي در دلفي را دارد؟
مثلا اين كد ملي غلط است: 1111111111
سلام دوست من
توی انتخابات الکترونیک که برگذار شد یه برنامه داشتیم که با اینترنت چک میکرد که کد ملی معتبره یا نه اما تابعشو ندارم
اگه میخوای بگو این برنامه رو بهت بدم اما سورسش همراش نیست.
یه روش دیگه هم مراجعه به سایت ثبت احواله که تست میکنه کد ملی معتبره یا نه میتونی از اون طریق هم توی برنامه ات استفاده کنی
من درخدمتم
موفق و موید باشی
سلام
فرمول تشخیص صحت کد ملی
http://forum.p30world.com/showthread.php?t=295203
فرمول تشخیص صحت کد ملی (کارت ملی شناسایی)
________________________________________
سلام. این مطلب رو در چند سایت مختلف دیدم، اما هیچ کدام منبع یکسانی رو معرفی نکردند البته گفته شده که سازمان ثبت احوال کشور این فرمول رو ارائه داده. و اما اصل مطلب:
همانطور که می دانید همه ارگانها و سازمانهای دولتی جمهوری اسلامی و شرکتهای تابعه موظف شده اند از این پس فیلد جدیدی در کنار مشخصات افراد به نام کد ملی درج نمایند و تقریبا همه هموطنان عزیز در حال حاضر کارت ملی را دارند. ولی ما به عنوان یک برنامه نویس وقتی در فرمی کد ملی را دریافت می کنیم چگونه از صحت کد وارد شده مطمئن شویم.
سازمان ثبت احوال کشور در راستای ارائه کارت ملی روشی را برای تولید کدهای ملی استفاده نموده است که با استفاده از آنها می توانیم کدهایی داشته باشیم که از امنیت بالایی برخوردار باشند و همچنین قابلیت تقلب نداشته باشند.
همه کدهای ملی ۱۰ رقمی هستند.
کدهای ملی که همه ارقام آنها مثل هم باشند معتبر نیستند مثل:
۰۰۰۰۰۰۰۰۰۰
۱۱۱۱۱۱۱۱۱۱
۲۲۲۲۲۲۲۲۲۲
۳۳۳۳۳۳۳۳۳۳
۴۴۴۴۴۴۴۴۴۴
۵۵۵۵۵۵۵۵۵۵
۶۶۶۶۶۶۶۶۶۶
۷۷۷۷۷۷۷۷۷۷
۸۸۸۸۸۸۸۸۸۸
۹۹۹۹۹۹۹۹۹۹
روش اعتبار سنجی کد ملی :
دهمین رقم شماره ملی را ( از سمت چپ ) به عنوان A در نظر می گیریم.
یک مقدار B در نظر می گیریم و آن را برابر با =
(اولین رقم * ۱۰) + ( دومین رقم * ۹ ) + ( سومین رقم * ۸ ) + ( چهارمین رقم * ۷ ) + ( پنجمین رقم * ۶) + ( ششمین رقم * ۵ ) + ( هفتمین رقم * ۴ ) + ( هشتمین رقم * ۳ ) + ( نهمین رقم * ۲ )
قرار می دهیم.
مقدار C را برابر با = B – (B/11)*11 قرار می دهیم.
اگر مقدار C برابر با صفر باشد و مقدار A برابر C باشد کد ملی صحیح است.
اگر مقدار C برابر با ۱ باشد و مقدار A برابر با ۱ باشد کد ملی صحیح است.
اگر مقدار C بزرگتر از ۱ باشد و مقدار A برابر با ۱۱ – C باشد کد ملی صحیح است.
اینها در لینک بالا گفته شده ولی اکتیوایکس آن را نتوانستم دانلود کنم اگرکسی اکتیوایکس اینجا آپلود کند ممنون می شوم.
سلام دوست من
من dll اون رو دارم برات میذارم شاید بدردت بخوره!
موفق و موید باشی
آخرین ویرایش به وسیله اصغر (پآچ) : دوشنبه 12 اسفند 1387 در 13:12 عصر دلیل: فایل رو اضافه نکرده بود!
سلام.
یه اکتیوایکس از طرف خود اداره ثبت ارایه شده که با راهنما و نمونه مثالش براتون الصاقش کردم.
امیدوارم به کارتون بیاد .
در مورد اون DLL دوستمون آقای فرهاد اونDLL رو نوشته که طریقه استفاده به شکل زیر میباشد.
function chek_Code(code: string): Boolean;
موفق و پیروز باشید.
دیگه همچین کدی نیاز به DLL و اکتیو ایکس و اینجور چیزها نداره که! یک فرمول ساده هست، آن را بصورت کد دلفی در قالب یک تابع پیاده سازی کنید، و در یک یونیت ذخیره کنید، و هر جا نیاز داشتید، ازش استفاده کنید.آقا چجوري ازش استفاده كنيم؟
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
من از این فرمول در برنامه ام استفاده کردم و برای بعضی از دانشجوهایی که می خواهند کد ملی شون را ثبت کنن کد ملی تایید نمی شود به خصوص کسانی که اول کد ملی به صفر شروع می شود .
همین دیروز یونیت رو قرار دادم ، حداقل یه نگاهی به پست های اخیر مینداختین ...
من این قسمت از فرمول شک دارم لطفا باز نگری در نحوه تایپ فرمول کنید:
مقدار C را برابر با = B – (B/11)*11 قرار می دهیم.
چون 11 با 11 زده میشود در نتیجه c=b-b
فکر میکنم شما در بحث ریاضیات و تقدم عملگرها ( پرانتز ) ضعیف هستید ، جواب فرمول اولی که قرمز کردید با دومی که خودتون نوشتید زمین تا آسمون فرق میکنه .
شاید هم من درست منظورتون رو متوجه نشدم که در این صورت پیشاپیش معذرت میخوام .
موفق باشید .
اتفاقاً حرف ایشون کاملاً صحیحه. درست میگن. میشه بفرمائید شما چجوری این فرمول رو حساب می کنید که جوابش از زمین تا آسمون فرق میکنه ؟فکر میکنم شما در بحث ریاضیات و تقدم عملگرها ( پرانتز ) ضعیف هستید ، جواب فرمول اولی که قرمز کردید با دومی که خودتون نوشتید زمین تا آسمون فرق میکنه .
دوست عزیز، احتمالاً ایشون از یه برنامه به زبان C کپی کردن و منظورشون از تقسیم، تقسیم صحیح بوده که در این صورت کل این عبارت برابر با باقیمانده
تقسیم عدد B بر 11 میشه. یعنی: c:=B Mod 11
موفق باشید
آخرین ویرایش به وسیله Hamid.Kad : سه شنبه 05 آبان 1388 در 15:05 عصر
با سلام خدمت دوستان
من کد اینطور نوشتم.جواب میدهد.متشکرم.
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 به خاطر کمکهای ارزنده در این رابطه .(منظور دادن لینک مناسب در تاپیک قبلی همین موضوع)
آخرین ویرایش به وسیله khoshblagh : شنبه 16 آبان 1388 در 09:36 صبح
کد شما بسیار جالبه ولی زیادی کد نوشتین
کد زیر به نظر من بهتره
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;
سلام
با كمك آقاي K.Mohammadreza برنامه دلفي تست شده كد ملي الحاق گرديده است.
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;