PDA

View Full Version : كسي روش يا برنامه چك كردن كد ملي را دارد؟



ali_abbasi22145
پنج شنبه 24 بهمن 1387, 09:22 صبح
سلام
كد ملي ما از 10 رقم تشكيل شده است و رقم آخر رقم چك كردن است و الگوريتم يا روشي جهت درست بدون آن استفاده مي شود.
كسي آن روش يا بهتر اينكه برنامه چك كردن كد ملي در دلفي را دارد؟
مثلا اين كد ملي غلط است: 1111111111

اصغر (پآچ)
پنج شنبه 24 بهمن 1387, 11:14 صبح
سلام دوست من

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

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

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

saied7468
پنج شنبه 24 بهمن 1387, 11:37 صبح
سلام

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

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

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

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

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

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

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

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

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

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

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

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

قرار می دهیم.


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


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

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

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


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

اصغر (پآچ)
دوشنبه 12 اسفند 1387, 12:52 عصر
سلام دوست من

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

Batman
دوشنبه 12 اسفند 1387, 17:13 عصر
سلام دوست من

من dll اون رو دارم برات میذارم شاید بدردت بخوره!
موفق و موید باشی
آقا چجوري ازش استفاده كنيم؟

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

vcldeveloper
دوشنبه 12 اسفند 1387, 21:33 عصر
آقا چجوري ازش استفاده كنيم؟
دیگه همچین کدی نیاز به DLL و اکتیو ایکس و اینجور چیزها نداره که! یک فرمول ساده هست، آن را بصورت کد دلفی در قالب یک تابع پیاده سازی کنید، و در یک یونیت ذخیره کنید، و هر جا نیاز داشتید، ازش استفاده کنید.

MOIED_SHA@YAHOO.COM
یک شنبه 03 آبان 1388, 23:30 عصر
من از این فرمول در برنامه ام استفاده کردم و برای بعضی از دانشجوهایی که می خواهند کد ملی شون را ثبت کنن کد ملی تایید نمی شود به خصوص کسانی که اول کد ملی به صفر شروع می شود .

Felony
یک شنبه 03 آبان 1388, 23:34 عصر
همین دیروز یونیت رو قرار دادم ، حداقل یه نگاهی به پست های اخیر مینداختین ...

MOIED_SHA@YAHOO.COM
یک شنبه 03 آبان 1388, 23:42 عصر
من این قسمت از فرمول شک دارم لطفا باز نگری در نحوه تایپ فرمول کنید:

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

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

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

موفق باشید .

Hamid.Kad
دوشنبه 04 آبان 1388, 21:05 عصر
فکر میکنم شما در بحث ریاضیات و تقدم عملگرها ( پرانتز ) ضعیف هستید ، جواب فرمول اولی که قرمز کردید با دومی که خودتون نوشتید زمین تا آسمون فرق میکنه .

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

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

khoshblagh
سه شنبه 05 آبان 1388, 06:51 صبح
با سلام خدمت دوستان
من کد اینطور نوشتم.جواب میدهد.متشکرم.


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
شنبه 09 آبان 1388, 15:58 عصر
با سلام خدمت دوستان
من کد اینطور نوشتم.جواب میدهد.متشکرم.


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:=1
else
bytRemander:=11- bytRemander;
if Byt1<>bytRemander then begin
Application.Title :='˜Ï ãáí ÛáØ'+'!';
ShowMessage('˜Ï ËÈÊ ÔÏå ãÚÊÈÑ äíÓÊ'+'!');
frmGharardadEdit.txtCodMeli.SetFocus ;
Exit;
end;





end;




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

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



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
پنج شنبه 14 آبان 1388, 08:38 صبح
سلام
با كمك آقاي K.Mohammadreza برنامه دلفي تست شده كد ملي الحاق گرديده است.

user10
پنج شنبه 17 فروردین 1391, 19:44 عصر
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;