ورود

View Full Version : آموزش: تشخیص صحت کد ملی



singel
سه شنبه 18 آبان 1389, 12:43 عصر
تشخیص صحت کد ملی
امروزه در اکثر نرم افزارهای تولیدی نیاز به استفاده از کد ملی به عنوان یک مشخصه منحصر به فرد برای اطلاعات فردی می باشد. از طرفی متاسفانه در حال حاضر هیچ الگوریتمی برای تشخیص صحت کد ورودی در اختیار برنامه نویسان وجود ندارد.
اخیرا با توجه به نیاز خودم به کنترل صحت کد ورودی الگوریتم مربوط به کنترل صحت کد ملی را بدست آوردم و چون مطمئن هستم افراد زیادی هم همین نیاز را دارند روال انجام کار را در این مقال توضیح می دهم
کد ملی شماره ای است 10 رقمی که از سمت چپ سه رقم کد شهرستان ، شش رقم بعدی کد منحصر به فرد برای فرد دارنده و رقم آخر آن هم یک رقم کنترل است که از روی 9 رقم سمت چپ بدست می آید. برای بررسی کنترل کد کافی است مجدد از روی 9 رقم سمت چپ رقم کنترل را محاسبه کنیم
از آنجایی که درسیستم کد ملی معمولا قبل از کد تعدادی صفر وجود دارد.(رقم اول و رقم دوم از سمت چپ کد ملی ممکن است صفر باشد) و در بسیاری از موارد ممکن است کاربر این صفرها را وارد نکرده باشد و یا نرم افزار این صفرها را ذخیره نکرده باشد بهتر است قبل از هر کاری در صورتی که طول کد بزرگتر مساوی 8 و کمتر از 10 باشد به تعداد لازم (یک تا دو تا صفر) به سمت چپ عدد اضافه کنید. ساختار کد ملی در زیر نشان داده شده است


ساختار کد ملی



ارقام کدرقم کنترل9 رقم سمت چپ کد ملیموقعیت
1



2345678910
1- برای محاسبه رقم کنترل از روی سایر ارقام ، هر رقم را در موقعیت آن ضرب کرده و حاصل را با هم جمع می کنیم.
2- مجموع بدست آمده از مرحله یک را بر 11 تقسیم می کنیم
3- اگر باقیمانده کمتر از 2 باشد ، رقم کنترل باید برابر باقیمانده باشد در غیر اینصورت رقم کنترل باید برابر یازده منهای باقیمانده باشد
مثال : آیا کد 7731689951 یک کد ملی معتبر است؟
برای این منظور کد


ساختار کد ملیساختار کدرقم کنترل9 رقم سمت چپ کد ملیارقام کد1599861377موقعیت12345678910محاسبه حاصل ضرب10273640367246370
حاصل جمع ضرب ارقام 2 الی 10 را در موقعیت آنها محاسبه می کنیم




7*10+7*9+3*8+1*7+6*6+8*5+9*4+9*3+5*2=313



313÷11=28 و R=3



چون باقیمانده برابر 3 و بزرگتر مساوی 2 است پس باید رقم کنترل این کد برابر 8 ( یازده منهای 3 برابر 8 )باشد.



با دقت در کد متوجه می شویم که رقم کنترل ورودی برابر 1 است پس کد مورد نظر به عنوان یک کد معتبر قابل قبول نیست.





منبع : علي آرش خرداد 1387

lotfi_javad
سه شنبه 18 آبان 1389, 13:42 عصر
سلام تشكر از مطلب شما
فقط به جهت راهنمايي بيشتربنده يك مثال ديگه هم بزنيد

باتشكر

singel
سه شنبه 18 آبان 1389, 14:25 عصر
سلام
به عنوان مثال 4709450552
باید از سمت چپ یکی یکی اعداد را از 10 به پایین ضرب کنیم البته تا 9 تا عدد یعنی 470945055

40=10*4
63=9*7
0=8*0
63=7*9
24=6*4
25=5*5
0=4*0
15=3*5
10=2*5


خوب حالا باید تمام این حاصلضرب ها رو با هم جمع کنیم
که میشه 240
حالا باید این عدد رو تقسیم بر 11 کنیم البته ما با باقیمانده تقسیم کار داریم
اگر باقیمانده از 2 کوچکتر بود همون عدد میشه رقم آخر کد ملی
اما اگر از 2 بیشتر بود 11 رو منهای باقیمانده میکنیم
در این مثال باقیمانده عدد 9 میشه
2=9-11
پس کد اخر میشه عدد 2 حالا به کد ملی ما نگاه کنید 4709450552
شما هم میتونید از همین روش بفهمید که کد ملی درست وارد شده یا نه
امید وارم خوب تونسته باشم توضیح بدم
باز هم در خدمتیم

ravand
یک شنبه 23 آبان 1389, 23:16 عصر
داداش
این چیزی که گفتی من کدش رو دارم و اگه در عمل امتحان کنی برخی کدهای ملی رو شناسایی نمی کنه . پس به درد استفاده هم نمی خوره.
ضمیمه کردم تا همه امتحان کنن.

singel
دوشنبه 24 آبان 1389, 07:13 صبح
دوست عزیز میتونی یه کد ملی که باهاش جواب نگرفتی رو بنویسی من هم امتحانش کنم

NilooooliN
سه شنبه 25 آبان 1389, 09:48 صبح
تشخیص صحت کد ملی

ساختار کد ملی




ارقام کدرقم کنترل9 رقم سمت چپ کد ملیموقعیت
1




2345678910
1- برای محاسبه رقم کنترل از روی سایر ارقام ، هر رقم را در موقعیت آن ضرب کرده و حاصل را با هم جمع می کنیم.
2- مجموع بدست آمده از مرحله یک را بر 11 تقسیم می کنیم
3- اگر باقیمانده کمتر از 2 باشد ، رقم کنترل باید برابر باقیمانده باشد در غیر اینصورت رقم کنترل باید برابر یازده منهای باقیمانده باشد

منبع : علي آرش خرداد 1387


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

singel
سه شنبه 25 آبان 1389, 12:54 عصر
سلام دوست عزیز در جواب سوال شما این متن را دوباره بخونید این رو اقای علی ارش تهیه کرده و داخل سایتش گذاشته بود من هم چندین نمونه کد ملی رو باهاش چک کرد و درست عمل میکرد


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


منبع : علي آرش خرداد 1387

ravand
چهارشنبه 26 آبان 1389, 17:12 عصر
دوست عزیز میتونی یه کد ملی که باهاش جواب نگرفتی رو بنویسی من هم امتحانش کنم

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

singel
یک شنبه 30 آبان 1389, 08:29 صبح
می تونی کد ملی چند نفر از افراد خانواده ات رو امتحان کنی

جوابشو توی چند تا پست قبل داده بودم


من هم چندین نمونه کد ملی رو باهاش چک کرد و درست عمل میکرد




هر کسی هم شک داره می تونه اسکریپتی که دادم رو بره امتحان کنه.:لبخند:

ببخشید !! از کجا معلومه که کد شما درست باشه

باز هم همون جواب تکراری !! نمونه کد ملی که باهاش جواب نگرفتی رو بنویس تا به ما هم ثابت بشه

Touska
دوشنبه 01 آذر 1389, 08:55 صبح
تابعش برای دلفی :


Function IDCheck(NationalID: String): Boolean;
Var
Sum: LongInt;
I, Md, J: Integer;
Rs: Boolean;
Begin
Rs := False;
Sum := 0;
For I := 1 To 9 Do
Begin
Md := Strtoint(NationalID[I]);
Sum := Sum + (Md * (11 - I));
End;
J := Sum Mod 11;
If J < 2 Then
BEGIN
If Strtoint(NationalID[10]) = J Then
Rs := True
Else
Rs := False;
END
Else
Begin
If Strtoint(NationalID[10]) = (11 - J) Then
Rs := True
Else
Rs := False;
End;
Result := Rs;
End;

fazl11
شنبه 20 آذر 1389, 20:56 عصر
دوست عزيز سلام روشي رو که singel گفت درسته چون حدودا از سال 83 من دارم باهاش کار ميکنم و هيچ اشتباهي نديدم از طرفي اين همون روشيه که ثبت احوال داره به مردم کد ملي ميده
براي اينکه شما هم کد ملي توليد کنيد کافيه سه رفم کد شهرها رو داشته باشيد و شش رفم بعدي هم مربوط به افراد يک منطقه هستند که به ترتيب کد ميگيرند

koorosh-soft
یک شنبه 22 اسفند 1389, 23:41 عصر
این هم برای VB.NET

Public Function CheckCode(ByVal Code As String) As Boolean



Dim c As Double, n As Double, r As Double



If Len(Code) < 10 Then Code = (10 - Len(Code) + "0") & Code



If Code = "0000000000" Or Code = "1111111111" Or Code = "2222222222" Or Code = "3333333333" Or Code = "4444444444" Or Code = "5555555555" Or Code = "6666666666" Or Code = "7777777777" Or Code = "8888888888" Or Code = "9999999999" Then
Return (False)
Else
c = Val(Mid$(Code, 10, 1))
Dim j As Integer = 10
For i As Integer = 1 To 9
n = n + Val(Mid$(Code, i, 1)) * j
j = j - 1
Next
r = n - Int(n / 11) * 11
If (r = 0 And r = c) Or (r = 1 And c = 1) Or (r > 1 And c = 11 - r) Then Return (True)
End If

End Function

MMSHFE
چهارشنبه 05 مرداد 1390, 08:22 صبح
با سلام، اين هم كد #C

public bool NationalCodeCheck(string nationalCode)
{
nationalCode = nationalCode.SubString(0, 10);
for(int i = 0; i < (10 - nationalCode.Length); i++)
{
nationalCode = "0" + nationalCode;
}
int sum = 0;
for(int i = 1; i <= 10; i++)
{
int digit;
int.TryParse(nationalCode.SubString(i, 1), out digit);
sum += digit * (i + 1);
}
if(sum > 2)
{
sum = 11 % sum;
}
return (sum.ToString() == nationalCode.SubString(0, 1));
}

موفق باشيد.

MMSHFE
چهارشنبه 05 مرداد 1390, 08:28 صبح
اين هم كد PHP


function NationalCodeCheck($nationalCode)
{
$nationalCode = substr($nationalCode, 0, 10);
for($i = 0; $i < (10 - strlen($nationalCode)); $i++)
{
$nationalCode = '0'.$nationalCode;
}
$sum = 0;
for($i = 1; $i <= 10; $i++)
{
$sum += substr($nationalCode, i, 1) * ($i + 1);
}
if($sum > 2)
{
$sum = 11 % $sum;
}
return ($sum == substr($nationalCode, 0, 1));
}

موفق باشيد.

amir5040
یک شنبه 22 آبان 1390, 00:22 صبح
باسلام
لطفابفرمائیدعددباقیمانده ازکجا آمده؟(عدد9)
چون تقسیم کنی 21.81 میشه

amir5040
یک شنبه 22 آبان 1390, 00:28 صبح
سلام میشه بفرمائیدعدد 9 ازکجاآمده؟
چون تقسیم کنی میشه 21.81

MMSHFE
یک شنبه 22 آبان 1390, 00:38 صبح
با سلام، عزيز دل، جمع اعداد شده 240 كه اگه بر 11 تقسيم كنيم، خارج قسمت ميشه 21 و باقيمانده ميشه 9
بايد تقسيم صحيح كنيد نه تقسيم اعشاري. مثل همون تقسيم دوران دبستان و راهنمايي!
موفق باشيد.

behzadamin12
یک شنبه 25 اسفند 1392, 06:40 صبح
اینم کد #C




char []a;
a=textBox1.Text.ToCharArray();
var meli_code=a.ToArray();
string meli_code1=meli_code.ToString();
int c,n,r;
if (meli_code.Length == 10)
{
if(meli_code1=="1111111111" || meli_code1=="2222222222" || meli_code1=="3333333333" || meli_code1=="4444444444" || meli_code1=="5555555555" || meli_code1=="6666666666" || meli_code1=="7777777777" || meli_code1=="8888888888" || meli_code1=="9999999999" )
{
MessageBox.Show("کد ملی صحیح نیست");
}
else
{
c = int.Parse(a[9].ToString());
n = int.Parse(a[0].ToString())*10 + int.Parse(a[1].ToString())*9 + int.Parse(a[2].ToString())*8 + int.Parse(a[3].ToString())*7 + int.Parse(a[4].ToString())*6 + int.Parse(a[5].ToString())*5 + int.Parse(a[6].ToString())*4 + int.Parse(a[7].ToString())*3 + int.Parse(a[8].ToString())*2;
r = n - (n/11)*11;
if ((r == 0 && r == c) || (r == 1 && c == 1) || (r > 1 && c == 11 - r))
{
MessageBox.Show("کد ملی صحیح می باشد");
}
else
{
MessageBox.Show("کد ملی وارد شده معتبر نمی باشد");
}
}
}
else
{
MessageBox.Show("error");
}
}

mahbibi
شنبه 25 مرداد 1393, 19:18 عصر
با سلام خدمت همگی دوستان
من یک برنامه نوشتم و از این روش استفاده کردم ، با اینکه برنامه یک سال و نیم هست که داره بدون مشکل کار میکنه ولی امروز با یک مورد عجیب مواجه شدم
کد ملی 0922352787 رو سیستم نامعتبر تشخیص میدهد در حالی که دارنده این کد ملی تمام دوران تحصیلی خودشو از این کد ملی استفاده کرده است
به نظرتون مشکل از کجاست ؟
ممنون می شم اگه لطف کنید و من رو راهنمایی کنید .

qartallar
جمعه 27 فروردین 1395, 06:03 صبح
اینم کد #C




char []a;
a=textBox1.Text.ToCharArray();
var meli_code=a.ToArray();
string meli_code1=meli_code.ToString();
int c,n,r;
if (meli_code.Length == 10)
{
if(meli_code1=="1111111111" || meli_code1=="2222222222" || meli_code1=="3333333333" || meli_code1=="4444444444" || meli_code1=="5555555555" || meli_code1=="6666666666" || meli_code1=="7777777777" || meli_code1=="8888888888" || meli_code1=="9999999999" )
{
MessageBox.Show("کد ملی صحیح نیست");
}
else
{
c = int.Parse(a[9].ToString());
n = int.Parse(a[0].ToString())*10 + int.Parse(a[1].ToString())*9 + int.Parse(a[2].ToString())*8 + int.Parse(a[3].ToString())*7 + int.Parse(a[4].ToString())*6 + int.Parse(a[5].ToString())*5 + int.Parse(a[6].ToString())*4 + int.Parse(a[7].ToString())*3 + int.Parse(a[8].ToString())*2;
r = n - (n/11)*11;
if ((r == 0 && r == c) || (r == 1 && c == 1) || (r > 1 && c == 11 - r))
{
MessageBox.Show("کد ملی صحیح می باشد");
}
else
{
MessageBox.Show("کد ملی وارد شده معتبر نمی باشد");
}
}
}
else
{
MessageBox.Show("error");
}
}




با سلام دوست عزیز کد شما مشکل داشت بنده اصلاحش کردم و در خدمت دوستان قرار میدهم
در رویداد leave تکست باکس قرارش دادم

private void txtNationalID_Leave(object sender, EventArgs e)
{
char []a;
a=txtNationalID.Text.ToCharArray();
var meli_code=a.ToArray();
string meli_code1 = txtNationalID.Text;
int c,n,r;
if (meli_code.Length == 10)
{
if (meli_code1 == "0000000000" || meli_code1 == "1111111111" || meli_code1 == "2222222222" || meli_code1 == "3333333333" || meli_code1 == "4444444444" || meli_code1 == "5555555555" || meli_code1 == "6666666666" || meli_code1 == "7777777777" || meli_code1 == "8888888888" || meli_code1 == "9999999999")
{
MessageBox.Show("کد ملی وارد شده معتبر نمی باشد");
}
else
{
c = int.Parse(a[9].ToString());
n = int.Parse(a[0].ToString())*10 + int.Parse(a[1].ToString())*9 + int.Parse(a[2].ToString())*8 + int.Parse(a[3].ToString())*7 + int.Parse(a[4].ToString())*6 + int.Parse(a[5].ToString())*5 + int.Parse(a[6].ToString())*4 + int.Parse(a[7].ToString())*3 + int.Parse(a[8].ToString())*2;
r = n - (n/11)*11;
if ((r == 0 && r == c) || (r == 1 && c == 1) || (r > 1 && c == 11 - r))
{
//MessageBox.Show("کد ملی صحیح می باشد");
}
else
{
MessageBox.Show("کد ملی وارد شده معتبر نمی باشد");
}
}
}
else
{
MessageBox.Show("کدملی وارد شده کمتر از 10 رقم می باشد");
}

}