身份证号码验证课程设计.docx
- 文档编号:23544606
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:41
- 大小:272.81KB
身份证号码验证课程设计.docx
《身份证号码验证课程设计.docx》由会员分享,可在线阅读,更多相关《身份证号码验证课程设计.docx(41页珍藏版)》请在冰豆网上搜索。
身份证号码验证课程设计
1绪论····························································1
1.1课题内容与要求··············································1
1.2需求分析····················································1
1.3操作环境·····················································1
2功能实现设计····················································2
2.1总体设计·····················································2
2.1.1程序设计组成框图········································2
2.1.2数据流图················································2
2.2详细设计·····················································3
2.2.1存放信息设计···········································4
2.2.2构造函数设计···········································4
2.2.3判断信息是否正确·······································9
2.2.4新旧身份证号转换······································13
2.2.5窗口类的创建及实现····································13
3运行结果························································14
4总结····························································16参考文献···························································17
附录·······························································18
1绪论
1.1课题内容与要求
课题内容
身份证第18位(校验码)的计算方法:
(1)将前面的身份证号码17位分别乘以不同的系数:
从第一位到第十七位的系数分别为:
7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;
(2)将这17位数字和系数相乘的结果相加;
(3)用加出来和除以11,得余数;
(4)余数0-1-2-3-4-5-6-7-8-9-10
对应的最后一位身份证号码为1-0-X-9-8-7-6-5-4-3-2;
身份证号码的第七位到十四位为出生年月日,应符合现实;
课题要求
(1)使用java语言完成本课题的程序设计,并具有一定的深度和难度;
(2)结构化程序设计,源程序要有适当的注释,使程序容易阅读;
(3)能先对问题进行分析然后进行设计最后进行编码的原则。
每一步都要有文档产生;
(4)程序一定要做必要的测试和分析,必须得到合理结果;
(5)可适当添加功能,让程序更具有实用性。
(6)提交的所有材料必须符合《长沙理工大学课程设计管理规定》(长理工大[2005]8号)的要求。
1.2需求分析
本课题主要目的是为了设计一套程序来验证给出的身份证号是否正确,如若正确将身份证号所体现的关键信息性别,年龄,出生日期展现给用户,同时考虑到实实际情况给出了十五位身份证号转十八位,以及十八位转十五位的算法,从而给相关部门机构带来方便。
1.3操作环境
MyEclipse8.5
2功能实现设计
2.1总体设计
根据上面的分析,将系统分为几大部分:
判断身份证号的位数以及每一位是否正确,判断出生年月是否符合实际,根据算法运算对比校验码是否正确,新旧身份证号转换,提取输出关键信息。
2.1.1程序设计组成框图
2.1.2数据流图
N
Y
NY
N
Y
N
Y
2.2详细设计
2.2.1存放信息设计
导包,定义一个接口类用于其他类实现,定义个身份证类用于实现接口,定义存放年份,月份,天数,性别,年龄,校验码对应表,校验码,身份证号码,错误标识的容器。
//定义一个接口用于其它类实现
interfaceIdCardInterFace{
intdigitCheck(finalStringid);//位数检查
booleancharCheck();//字符检查
booleandateCheck();//日期检查
booleanefficacyCode();//效验码检查
}
//定义个身份证类用于实现接口IdCardInterFace
classIdCardimplementsIdCardInterFace{
publicfinalstaticintsystemTime=newGregorianCalendar().get(Calendar.YEAR);//取得当前系统年份
protectedintyear;//用于存放年份
protectedintmonth;//用于存放月份
protectedintdate;//用于存放日期天数
protectedStringsex;//用于存放性别
protectedintage;//用于存放年龄
protectedHashMap
privateintremainder;//存放效验码
privateinttotals;//存放每一位字符值与它所对应的加权因子的乘积的和
protectedStringid;//存放身份证号码
privatestaticintDATE_SIGN;//存放日期错误标志
2.2.2构造函数设计
之后定义构造函数,检查各项的正确性。
特别是二月的检查,要区分平年和闰年,平年二月日期到28号,闰年为29号。
构造计算校验码的函数,运用java语言的运算规则,按照给出的校验码计算规则计算校验码。
//定义构造函数
publicIdCard(){
}
publicIdCard(Stringid){
this.id=id;
//用于存放效验码对应表
remainGroup=newHashMap
remainGroup.put(0,"1");
remainGroup.put(1,"0");
remainGroup.put(2,"X");
remainGroup.put(3,"9");
remainGroup.put(4,"8");
remainGroup.put(5,"7");
remainGroup.put(6,"6");
remainGroup.put(7,"5");
remainGroup.put(8,"4");
remainGroup.put(9,"3");
remainGroup.put(10,"2");
}
//检查位数的正确性
publicintdigitCheck(finalStringid){
if(id.length()==18){
return18;
}elseif(id.length()==15){
return15;
}else{
return0;
}
}
//检查每一位的正确性
publicbooleancharCheck(){
if(id.length()==17){
Patternp=Ppile("[0-9]{17}");
Matcherm=p.matcher(id);
returnm.matches();
}elseif(id.length()==18){
Stringstr=id.substring(0,id.length()-1);
Stringstr1=id.substring(id.length()-1,id.length());
Patternp=Ppile("[0-9]{17}");
Matcherm=p.matcher(str);
if((str1.matches("\\d")||str1.equals("X"))&&m.matches()){
returntrue;
}else{
returnfalse;
}
}else{
Patternp=Ppile("[0-9]{1,18}");
Matcherm=p.matcher(id);
returnm.matches();
}
}
//检查日期的正确性
publicbooleandateCheck(){
year=Integer.parseInt(id.substring(6,10));//取得年份
//判断年份的正确性
if(year<1900||year>IdCard.systemTime-18){
DATE_SIGN=1;
returnfalse;
}else
{
month=Integer.parseInt(id.substring(10,12));//取得月份
//判断月份的正确性
if(month<=12){
//判断天数的正确性
date=Integer.parseInt(id.substring(12,14));//取得天数
if(year%4==0&&(year%100!
=0||year%400==0))//判断是否为闰年
{
//判断二月份的天数正确性
if(month==2){
if(date<=29){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}else{
//判断其它月份的天数正确性
if((month<8&&month%2!
=0&&date<=31)||(month<8&&month%2==0&&date<=30)){
returntrue;
}elseif((month>=8&&month%2==0&&date<=31)||(month>=8&&month%2!
=0&&date<=30)){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}
}
//判断平年的正确性
else{
//判断二月的天数正确性
if(month==2){
if(date<=28){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}else{
//判断其它月份的天数正确性
if((month<8&&month%2!
=0&&date<=31)||(month<8&&month%2==0&&date<=30)){
returntrue;
}elseif((month>=8&&month%2==0&&date<=31)||(month>=8&&month%2!
=0&&date<=30)){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}
}
}else{
DATE_SIGN=2;
returnfalse;
}
}
}//endofdateCheck
//}
//计算效验码
publicintcomputeEfficacyCode(){
if(id.length()==18){
for(inti=id.length();i>1;i--){
intai=Integer.parseInt(id.substring(18-i,19-i));
intwi=(int)Math.pow(2,i-1)%11;
totals=totals+ai*wi;
}
}
else{
for(inti=id.length()+1;i>1;i--){
intai=Integer.parseInt(id.substring(18-i,19-i));
intwi=(int)Math.pow(2,i-1)%11;
totals=totals+ai*wi;
}
}
remainder=totals%11;
returnremainder;
}
2.2.3判断信息是否正确
对于给定的身份证号,通过调用前面的构造函数,来验证各方面信息是否正确,出生年月日是否符合实际,特别是平年闰年二月的判定,性别的判定,以及由前17位计算出的校验码是否和身份证号的第十八位的匹配。
判定过程中运用了很多循环语句,对于错误运用java的异常处理。
//检查日期的正确性
publicbooleandateCheck(){
year=Integer.parseInt(id.substring(6,10));//取得年份
//判断年份的正确性
if(year<1900||year>IdCard.systemTime-18){
DATE_SIGN=1;
returnfalse;
}else
{
month=Integer.parseInt(id.substring(10,12));//取得月份
//判断月份的正确性
if(month<=12){
//判断天数的正确性
date=Integer.parseInt(id.substring(12,14));//取得天数
if(year%4==0&&(year%100!
=0||year%400==0))//判断是否为闰年
{
//判断二月份的天数正确性
if(month==2){
if(date<=29){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}else{
//判断其它月份的天数正确性
if((month<8&&month%2!
=0&&date<=31)||(month<8&&month%2==0&&date<=30)){
returntrue;
}elseif((month>=8&&month%2==0&&date<=31)||(month>=8&&month%2!
=0&&date<=30)){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}
}
//判断平年的正确性
else{
//判断二月的天数正确性
if(month==2){
if(date<=28){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}else{
//判断其它月份的天数正确性
if((month<8&&month%2!
=0&&date<=31)||(month<8&&month%2==0&&date<=30)){
returntrue;
}elseif((month>=8&&month%2==0&&date<=31)||(month>=8&&month%2!
=0&&date<=30)){
returntrue;
}else{
DATE_SIGN=3;
returnfalse;
}
}
}
}else{
DATE_SIGN=2;
returnfalse;
}
}
}//endofdateCheck
//}
//计算效验码
publicintcomputeEfficacyCode(){
if(id.length()==18){
for(inti=id.length();i>1;i--){
intai=Integer.parseInt(id.substring(18-i,19-i));
intwi=(int)Math.pow(2,i-1)%11;
totals=totals+ai*wi;
}
}
else{
for(inti=id.length()+1;i>1;i--){
intai=Integer.parseInt(id.substring(18-i,19-i));
intwi=(int)Math.pow(2,i-1)%11;
totals=totals+ai*wi;
}
}
remainder=totals%11;
returnremainder;
}
2.2.4新旧身份证号转换
考虑到现在还确实存在一些旧身份证,特设计了此模块用于新旧身份证的转换。
按照新旧身份证的转换规则,进行新旧身份证号的转换。
//定义一个NewIdCard类用于进行新身份证号码的操作
classNewIdCardextendsIdCard{
publicStringnewId;
publicStringBufferoldId;
publicNewIdCard(StringnewId){
super(newId);
this.newId=newId;
}
//用于将新身份证号码转换成旧身份证号码
publicvoidnewToOldIdCard(){
oldId=newStringBuffer(newId);
oldId=oldId.delete(6,8);
oldId=newStringBuffer(oldId.substring(0,oldId.length()-1));
}
}
2.2.5窗口类的创建及实现
为了方便用户使用该套程序,创建一个窗口类,便于输入和直观的将结果展现用户眼前。
创建窗口类过程中主要是用到了java的组件的相关功能,同时还有事件处理机制,用于鼠标和键盘的输入处理。
关键程序如下
//定义个窗口类
classIdCardGuiextendsFrame{
publicLabellb=newLabel();
publicJDialogdialog;
publicstaticStringstrError=null;
privateStringid;
//初使化对文本框
publicJTextFieldtf1;
publicJTextFieldtf2=newJTextField("",23);
publicJTextFieldtf3=newJTextField("",23);
publicJTextFieldtf4=newJTextField("",23);
publicJTextFieldtf5=newJTextField("",23);
publicJTextFieldtf6=newJTextField("",23);
JButtonbt=newJButton("查询");
3运行结果
图3.1显示主菜单
图3.2位数输入错误
图3.3检查每一位是否正确
图3.4月份对应日期有误(平年二月无29日)
图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 身份证号码 验证 课程设计