📄 sfzidentify.doc
字号:
居民身份证验证实验
一、 实验目的
通过上级编写和运行关于字符的程序来加深对String类和StringBuffer类等的了解,要求学生在上机实验前一定要非常清楚并灵活运用该章所讲过的内容,并且在上机实验前编写好实验内容要求的程序,便以上机调试,修改。
二、实验步骤。
1、编写一个与居民身份证有关的程序。
2、检验居民身份证的真伪。
3、获取真实居民身份证的信息。
4、将15位的旧身份证转换成18位的新身份证。
三、调试过程。
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个字符对象内容*/
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("该居民身份证号码位数不符!");
}
}
四、实验结果和总结。
上面的程序只是个简单的辨别身份证真伪的程序,输入15和18位的身份证号可以辨别它的真伪,还可以将15位的身份证号转变成18位的身份证号。
通过这个实验,让我更加了解了字符串中String类和StringBuffer类。通过对程序的调试,也知道了编程的一些技巧,这使得以后能更顺利完成实验。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -