c语言:要求从键盘上输入其一身份证号码,判断第18位是不是正确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言:要求从键盘上输入其一身份证号码,判断第18位是不是正确相关的知识,希望对你有一定的参考价值。
参考技术A 第18位只能是0-9或者x#include<stdio.h>
int main(void)
char str[20];
scanf("%s",str);
if(str[17]>='0'&&str[17]<='9' || str[17]=='x') puts("right");
else puts("wrong");
return 0;
软工作业PSP与单元测试训练
任务说明(二选一):
一、实现模块判断传入的身份证号码的正确性;
实现要求:
一、实现功能模块;
身份证号码长度为18位,由17位数字和一位检验码组成。
对输入的身份证号码的正确性进行判断
(1)检验校验位
十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
其中Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
再计算模Y = mod(S, 11),通过模Y得到对应的校验码:1 0 X 9 8 7 6 5 4 3 2
(2)检验年月日是否合理
年份大于等于1900年,小于等于当前年份,还需要考虑闰年、大小月的情况。闰年,能被4整除且不能被100整除或能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。
如输入的身份证合法,则输出该身份证正确!
如输入的身份证格式不对,则输出该身份证格式错误,请重新输入!
如输入的身份证不正确,则输出该身份证无效,不是合法的身份证号码,请重新输入!
二、针对所实现的模块编写对应的单元测试代码;
#include<stdio.h> #include<string.h> #include<time.h> int strtonum(char *str){ int num=0; for(int i=0;i<strlen(str);i++){ num=num*10+str[i]-\'0\'; } return num; } char verifydate(char *date){ struct tm *local; time_t t; t=time(NULL); local = localtime(&t); int year,month,day,c=local->tm_year; char s[5]; memset(s,0,sizeof(s)); memcpy(s,date,4); year=strtonum(s); memset(s,0,sizeof(s)); memcpy(s,date+4,2); month=strtonum(s); memset(s,0,sizeof(s)); memcpy(s,date+6,2); day=strtonum(s); if(year<1900 || year>(c+1900))return 0; if(month<1 || month>12)return 0; if(day>31 || day<1)return 0; if(day==31){ if(month==2 || month==4 || month==6 || month==9 || month==11)return 0; else return 1; } if(day==30){ if(month==2)return 0; else return 1; } if(day==29){ if(year%4==0){ if(year%100!=0)return 1; else if(year%400==0)return 1; } else return 0; } return 1; } void verifyID(char IDnum[]){ int m[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},sum=0; char last[11]={\'1\',\'0\',\'x\',\'9\',\'8\',\'7\',\'6\',\'5\',\'4\',\'3\',\'2\'}; for(int i=0;i<17;i++){ sum=sum+((IDnum[i]-\'0\')*m[i]); } if(IDnum[17]==last[sum%11]) printf("该身份证正确!\\n"); else printf("该身份证无效,不是合法的身份证号码,请重新输入!\\n"); } int main() { char IDnum[18],birthday[8]; while(1){ gets(IDnum); if(strlen(IDnum)==18){ memcpy(birthday,IDnum+6,8); if(verifydate(birthday)==0) printf("该身份证无效,请重新输入!\\n"); else verifyID(IDnum); } else printf("该身份证格式错误,请重新输入!\\n"); } return 0; }
测试结果:
三、需要按PSP流程进行工作量估算,填写任务清单工作量估算表。
任务清单工作量估算表:
PSP阶段 |
时间估算(小时) |
实际实际(小时) |
|
计划 |
估计每个阶段的时间成本 |
0.6 |
0.5 |
开发 |
需求分析 |
0.6 |
0.3 |
系统设计 |
0.8 |
0.3 |
|
设计复审 |
0.5 |
0.2 |
|
代码实现 |
1.5 |
1.5 |
|
代码复审 |
1 |
0.5 |
|
测试 |
0.5 |
0.5 |
|
报告 |
测试报告 |
1 |
0.5 |
总结 |
0.3 |
0.2 |
以上是关于c语言:要求从键盘上输入其一身份证号码,判断第18位是不是正确的主要内容,如果未能解决你的问题,请参考以下文章
1. 用C语言写一段程序:从键盘上输入两数,判断其大小关系,将判断结果显示在屏幕上。
使用java判断输入身份证号位数是不是正确,判断输入是不是有效