?? sfzidentify.doc
字號:
居民身份證驗證實驗
一、 實驗?zāi)康?通過上級編寫和運行關(guān)于字符的程序來加深對String類和StringBuffer類等的了解,要求學(xué)生在上機(jī)實驗前一定要非常清楚并靈活運用該章所講過的內(nèi)容,并且在上機(jī)實驗前編寫好實驗內(nèi)容要求的程序,便以上機(jī)調(diào)試,修改。
二、實驗步驟。
1、編寫一個與居民身份證有關(guān)的程序。
2、檢驗居民身份證的真?zhèn)巍?3、獲取真實居民身份證的信息。
4、將15位的舊身份證轉(zhuǎn)換成18位的新身份證。
三、調(diào)試過程。
import java.lang.*;
import java.io.*;
public class IDCard
{
public static void idcheckup(String s )
{
StringBuffer sad=new StringBuffer(s);
int[] idcd = new int[18];
for(int i=1;i<18;i++)
{ int j = 17 - i;
idcd[i-1]=Integer.parseInt(sad.substring(j,j+1));
}
int []w={ 2,4,8, 5,10,9,7, 3,6,1,2, 4,8,5,10, 9,7};
char []as={'1','0','x','9','8','7','6','5','4','3','2'};
int sum = 0;
for (int i=0; i<17; i++)
{
sum = sum + idcd[i] * w[i];
}
sum = sum%11;
int y =Integer.parseInt(sad.substring(6,10));
int m = Integer.parseInt(sad.substring(10,12));
int d = Integer.parseInt(sad.substring(12,14));
if (y<1900 || m<1 || m>12 || d<1 || d>31 ||
((m==4 || m==6 || m==9 || m==11) && d>30) ||
(m==2 && ((y % 4>0 && d>28) || d>29)))
{System.out.println("該居民身份證出生年月日有錯誤!");
}
else
{
System.out.println("該居民身份證是舊的身份證!");
System.out.println("該居民出生地:"+sad.substring(0,4));
System.out.println("該居民出生時間為:"+y+"年"+m+"月"+d+"日");
int sex=Integer.parseInt(sad.substring(16,17));
if(sex%2==0)
System.out.println("該居民為:女性");
else
System.out.println("該居民為:男性");
sad=sad.insert(17,as[sum]);
System.out.println("該居民的新身份證為:"+sad.toString());
}
}
public static void checkdate(String s )
{
String sad=new String(s);
int y =Integer.parseInt(sad.substring(6,10));
int m = Integer.parseInt(sad.substring(10,12));
int d = Integer.parseInt(sad.substring(12,14));
if (y<1900 || m<1 || m>12 || d<1 || d>31 || ((m==4 || m==6 || m==9 || m==11)
&& d>30) ||
(m==2 && ((y % 4>0 && d>28) || d>29)))
System.out.println("該居民身份證出生年月日有錯誤!");
else
{
System.out.println("該居民出生地:"+sad.substring(0,4));
System.out.println("該居民出生時間為:"+y+"年"+m+"月"+d+"日");
int sex=Integer.parseInt(sad.substring(16,17));
if(sex%2==0)
System.out.println("該居民為:女性");
else
System.out.println("該居民為:男性");
}
}
public static void checkdigit(String s )
{
StringBuffer sad=new StringBuffer(s);
int[] idcd = new int[18];
for(int i=1;i<18;i++)
{ int j = 17 - i;
idcd[i-1]=Integer.parseInt(sad.substring(j,j+1));
}
int []w={ 2,4,8, 5,10,9,7, 3,6,1,2, 4,8,5,10, 9,7};
char []as={'1','0','x','9','8','7','6','5','4','3','2'};
int sum = 0;
for (int i=0; i<17; i++)
{
sum = sum + idcd[i] * w[i];
}
sum = sum%11;
char c=sad.charAt(17); /*返回第17個字符對象內(nèi)容*/
if(c==as[sum])
{
System.out.println("該居民身份證是新的身份證!");
checkdate(s);
System.out.println("該居民身份證是真的");
}
else
System.out.println("該居民身份證是假的(校驗碼有誤)");
}
public static void main(String []args)
{
IDCard IC=new IDCard();
InputStreamReader d=new InputStreamReader(System.in);
char in_char[]=new char[20];
int i=0,sum;
String s=null;
System.out.println("請輸入一個身份證號碼:");
System.out.flush();
try
{
i=d.read(in_char,0,20);
}
catch(IOException e){} ;
String sid=String.valueOf(in_char,0,i-2);
sid.trim(); /* 返回原字符串去除前后空白字符后的新字符串*/
if(sid.length()==15)
{
String sid0 = sid.substring(0,6) + "19" + sid.substring(6,15);
idcheckup(sid0);
}
else if(sid.length()==18)
{
checkdigit(sid);
}
else
System.out.println("該居民身份證號碼位數(shù)不符!");
}
}
四、實驗結(jié)果和總結(jié)。
上面的程序只是個簡單的辨別身份證真?zhèn)蔚某绦颍斎?5和18位的身份證號可以辨別它的真?zhèn)危€可以將15位的身份證號轉(zhuǎn)變成18位的身份證號。
通過這個實驗,讓我更加了解了字符串中String類和StringBuffer類。通過對程序的調(diào)試,也知道了編程的一些技巧,這使得以后能更順利完成實驗。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -