嵌入式身份证系统查询由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“身份证查询系统”。
课 程 设 计
用C语言实现身份证系统查询
课程: Windows CE嵌入式开发
姓名: 学号:
第一章
需求分析报告
1.1背景
中国是个人口大国,对于这么多的人我们怎样才能知道他是具体来自哪儿的呢,身份证的出现很明显解决了这个问题。每个人都有自己的出生地、姓名、出生年月,通过对这些具体信息的总和加上相应的组合方式形成了身份证号码。怎样才能利用身份证号码就能知道他是谁的呢,那么用C语言写的这个身份证查询系统就是为了实现输入身份证号码后能告诉我们这个号码所属人的具体信息,而且是很方便很快捷地将其显示出来。对于到银行开账号、办理移动号码等需要身份证证明的地方这个系统都是非常适用的。
1.2数据需求
身份证号码执行标准:18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》。18位号码前6位是地址码,用ABCDE来表示;中间的8位是公民的出生日期,用YYYYMMDD来表示 ;后3位是顺序码,顺序码是当前面地区和出生日期都一样认的顺序编码,用XXX来表示;最后一位是验证码,用R来表示。总体结构可以用字母表示如为ABCDEFYYYYMMDDXXXR。其具体含义如下:
① 地址码(ABCDEF):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
② 出生日期码(YYYYMMDD):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位(不足两位加0)、2(同上)位数字表示,之间不用分隔符。
③ 顺序码(XXX):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
④ 校验码(R),一位数字,通过前17位数字根据一定计算得出。
1.3数据表示
A:国内区域华北三省二市 2 东北三省 3 华东六省一市 4 华南六省 5 西南四省一市 6 西北五省 7 台湾 8 港澳
B(或者说是AB,就是前2位):省(直辖市,自治区,特别行政区)代码
按照A划定的分区定义省代码,有直辖市的,直辖市列前,其余按离直辖市的距离排序,没有直辖市的,按离北京的远近排序。
具体省(直辖市,自治区,特别行政区)代码如下: 11-15 京 津 冀 晋 蒙 21-23 辽 吉 黑
31-37 沪 苏 浙 皖 闽 赣 鲁 41-46 豫 鄂 湘 粤 桂 琼 50-54 渝 川 贵 云 藏 61-65 陕 甘 青 宁 新 81-82 港 澳 CD:城市代码
从01开始排,对于直辖市,CD=01表示市辖区,CD=02表示辖县;省的城市代码从省会开始排,比如2101=沈阳 2102=大连„„ 只有地级城市有独立的城市代码,县级市没有。
EF:市辖区、郊区、郊县、县级市代码
如果EF=00,指代这个城市,不特定区县;对于非直辖市,如EF=01,指代市辖区(任意一个区),02开始指代特定的区。
其中:
E=0代表市辖区,E=1代表郊区,E=2代表郊县,E=8代表县级市。
对于直辖市,从01开始就依次排区,没有市区和郊区的代码区分。
四、生日期码(YYYYMMDD)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。
五、顺序码(XXX)(身份证第十五位到十七位)是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:007的就是个男生,而且和他同年月日生的男生至少有两个,他们的后四位是001*和003*。分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。
六、关于校验码
校验码是通过一系列数学计算得出来的,具体校验的计算方式如下:
1.对前17位数字本体码加权求和
公式为:S = Sum(Ai * Wi), i = 0,..., 16
其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 通俗解释:身份证第一位数字X7+第二位X9+第三位X10+第四位X5+第五位X5+第六位X8+第七位X4+第八位X1+第九位X6+第十位X3+十一位X7+十二位X9+十三位X10+十四位X5+十五位X8+十六位X4+十七位X2;计算出总和(用S)表示。
2.以11对计算结果取模
Y = mod(S, 11)通俗解释:用S除以11,看最后的余数。如果除尽,为0;余数为1,则计为1;最大余数为10;全部数字为0-10共11个数字。(用Y表示)。
3.根据模的值得到对应的校验码
对应关系为:
Y值: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2 通俗解释:余数为0,则校验码为1;依次类推:余数为1,则校验码对应0;以下:2--X;3--9;4--8;5--7;6--6;7--5;8--4;9-3;10-2。
对于设计的这个程序数据要求选取以下一些:
地址码:422129 生日:1991 顺序号110 姓名:张三 地址码:322129 生日:1990 顺序号022 姓名:李四 地址码:222129 生日:1981 顺序号011 姓名:王五 地址码:122129 生日:1994 顺序号102 姓名:赵六 地址码:422129 生日:1986 顺序号051 姓名:刘七
第二章
2.程序设计
2.1写程序代码
利用C语言编写一段程序,能够实现身份证信息的查询以及随机生成身份证号。
代码如下:
#include #include “Head.h” IdentityInfor * ID_Judge(IdentityInfor *ID){ int w,i,j;int s=0;
for(j=18;j>1;j--)
{
w=pow(2,j-1);
w=w%11;
s+=(ID->IDNumber[18-j]-'0')*w;
}
s=s%11;
if(s==0&&ID->IDNumber[17]=='1'||s==1&&ID->IDNumber[17]=='0'||s==2&&ID->IDNumber[17]=='x'||s==2&&ID->IDNumber[17]=='X'||s==3&&ID->IDNumber[17]=='9'
||s==4&&ID->IDNumber[17]=='8'||s==5&&ID->IDNumber[17]=='7'||s==6&&ID->IDNumber[17]=='6'||s==7&&ID->IDNumber[17]=='5'
||s==8&&ID->IDNumber[17]=='4'||s==9&&ID->IDNumber[17]=='3'||s==10&&ID->IDNumber[17]=='2')
return ID;
else
return 0;} void ID_Judge_Input(IdentityInfor * head,int language){
IdentityInfor *ID;char Num[40],Pro[40],City[40],Town[40];char temp[40];int i,j,m;//for count int n;//number of IDs int t;int s,w;//sum,weight FILE *Test_Read;
if(language)
printf(“●How many IDs do you want to input: ”);else
printf(“●请输入你要输入的身份证个数: ”);scanf(“%d”,&n);for(m=1;m
t=1;
printf(“nNO.%d:n”,m);
while(t==1)
{
ID=(IdentityInfor *)malloc(sizeof(IdentityInfor));
s=0;
if(language)
printf(“ ●Input the ID Number and your name:n”);
else
printf(“ ●请输入身份证号和姓名: ”);
scanf(“%s%s”,ID->IDNumber,ID->name);
if(ID_Judge(ID)==0)
{
if(language)
printf(“●Error,please input againn”);
else
printf(“●输入有误,请重新输入n”);
free(ID);
t=1;
}
else
{
ID=ID_Judge(ID);
t=0;
}
}
Test_Read=fopen(“ID_data.txt”,“r”);
if(Test_Read==NULL)
{
printf(“Error!n”);
exit(1);
} while(!feof(Test_Read))
{
fscanf(Test_Read,“%s%s%s%s”,Num,Pro,City,Town);
if(strncmp(ID->IDNumber,Num,6)==0)
break;
}
if(strncmp(ID->IDNumber,Num,6)==0)
{
if(language)
printf(“n ●You come from:%s %s %s ”,Pro,City,Town);
else
printf(“n ●你来自:%s %s %s ”,Pro,City,Town);
strcpy(ID->Adre.pro,Pro);
strcpy(ID->Adre.city,City);
strcpy(ID->Adre.town,Town);
}
else
{
if(language)
printf(“ ●Not find!n”);
else
printf(“ ●没有找到!n”);
free(ID);
goto BACK;
}
/*====================Birthday_Judge=======================*/
if(language)
printf(“n ●Birthday: ”);
else
printf(“n ●出生日期: ”);
for(i=6,j=0;i
{
printf(“%c”,ID->IDNumber[i]);
temp[j]=ID->IDNumber[i];
}
temp[j]=' ';
strcpy(ID->Birthday.year,temp);
printf(“年”);
} } for(i=10,j=0;iIDNumber[i]);temp[j]=ID->IDNumber[i];} temp[j]=' ';strcpy(ID->Birthday.month,temp);printf(“月”);for(i=12,j=0;iIDNumber[i]);temp[j]=ID->IDNumber[i];} temp[j]=' ';strcpy(ID->Birthday.day,temp);printf(“日n”);/*====================Female or Male=======================*/ if(ID->IDNumber[16]%2!=0){ printf(“ ●性别:男n”);strcpy(ID->sex,“男”);} else { printf(“ ●性别:女n”);strcpy(ID->sex,“女”);} fclose(Test_Read);ID->next=head->next;head->next=ID;2.2操作内容
2.2.1输入***109这个身份证号码查询她的信息。
2.2.2输入地址码为422129,生日码为19901015,顺序码为002,输出她的身份证号码。2.3查询结果
题2.2.1显示结果为地址为“湖北省武穴市”,出生日期为1990年,性别 女。
题2.2.2显示号码结果为***026
总结
经过两个星期对这个程序的摸索,对C语言这门语言有了更深一层的认识,大大的增加了我对C的了解,对它的功能,函数方面有了很深的研究,完全丰富了我的课余生活,也深刻体会到以前所学的知识只是皮毛,大大方便了我在以后使用C这门语言了。正所谓不钻研不努力是不可能获取知识,现在明确认识到体验到这一点了。