想问一下这个完整程序

img


希望有个完整程序!我只会一个一个硬算,可以在关键部分写一下注释嘛,学习真的艰难。

运行结果:

img

代码:

#include <stdio.h>

//判断是否是数字字符
int isNumber(char c)
{
    if(c>='0' && c<='9')
        return 1;
    else
        return 0;
}

//11010519491231002x
//将p中的n个字符转换为数字,比如p="12345",n=2,则取前2位输出12
int trans(char* p,int n)
{
    int s = 0,i;
    for(i=0;i<n;i++)
    {
        if(isNumber(p[i]))
            s = s*10 + (p[i]-'0');
        else
            return -1; //非数字
    }
    return s;
}

int main()
{
    char str[20]={0};
    int qz[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
    int i = 0;
    int year = 0,month=0,day = 0;
    char* p = str; //指针指向输入的字符串
    int sum = 0;
    int yzm[] ={'1','0','X','9','8','7','6','5','4','3','2'};
    scanf("%s",str); //得到字符串

    for(i=0;i<17;i++)//处理前17个字符
    {
        if(isNumber(str[i])==0)//如果不是数字字符说明不合法
        {
            printf("wrong\n");
            return 0;
        }else
        {
            sum += (str[i] -'0') * qz[i]; //数字位乘以对应的权值求和
        }
    }
    sum = sum%11; //求除以11的余数
    year = trans(p+6,4); //得到年份
    month = trans(p+10,2);//得到月
    day = trans(p+12,2);//得到日
    
    if(str[17]=='x') //将小写的x转成大写X,避免误判,因为上面字符数组中定义的是X
        str[17] = 'X';
    if(yzm[sum] == str[17] )
        printf("correct,出生年月为: %d年%d月%d日\n",year,month,day);
    else
        printf("wrong\n");
    return 0;
}

用字符串接收身份证号码,然后按照格式分解出各个数据项进行有效性判断和校验码生成

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632