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位是不是正确的主要内容,如果未能解决你的问题,请参考以下文章

C语言题目:身份证号码与性别?

1. 用C语言写一段程序:从键盘上输入两数,判断其大小关系,将判断结果显示在屏幕上。

使用java判断输入身份证号位数是不是正确,判断输入是不是有效

软工作业PSP与单元测试训练

java中如何从键盘输入一个18位的身份证号码保存到字符数组Card中?

键盘输入一个字符,要求判断是不是为数字字符