一.身份证号码合法性判断
问题描述
我国公民的身份证号码特点如下:
1.长度为18位
2.1-17位只能为数字
3.第十八位可以是数字或者小写英文字母
4.身份证号码的第7-14位表示持有人生日的年月日信息
请实现身份证号码合法性判断的函数,除满足以上要求外,需要对持有人生日的年月日信息进行校验,年份大于等于1900,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除或能被400整除的年份。闰年2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,不用考虑
函数返回值:
1.如果身份证号合法,返回0
2.如果身份证号长度不合法,返回1
3.如果身份证号第1-17位含有非数字的字符,返回2
4.如果第十八位既不是数字也不是英文小写字母x,返回3
5.如果身份证号的年信息非法,返回4
6.如果身份证号的月信息非法,返回5
7.如果身份证号的日信息非法,返回6(请注意闰年的情况)
注:除成功的情况外,以上其他情况合法性判断的优先级依次降低,也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断
要求实现函数
int verifyIDCard(char *input)
示例:
1.输入:"511002 111222"返回1
2.输入:"511002 abc123456789" 返回2
3.输入:"511002 19880808123a"返回3
4.输入:"511002 188808081234" 返回4
5.输入:"511002 198813081234" 返回5
6.输入:"511002 198808321234"返回6
7.输入:"511002 198902291234"返回7
8.输入:"511002 198808081234"返回0
代码如下:
#include<iostream>
#include<ctype.h>
printf直接输出数字using namespace std;
int verifyIDCard(char *input)
{
    int i;
    int n=0;
    int year=0;
    int month=0;
    int day=0;
    char *a=input;
    for(i=6;i<10;i++)
    {
        year=year*10+(a[i]-'0');
    }
    for(i=10;i<12;i++)
    {
        month=month*10+(a[i]-'0');
    }
    for(i=12;i<14;i++)
    {
        day=day*10+(a[i]-'0');
    }
    int len=strlen(input);
    if(len!=18)
    {
        cout<<"身份证号长度不合法"<<endl;
        return 1;
    }
    else
    {
        for(i=0;i<17;i++)
        {
            if((a[i]>='0')&&(a[i]<='9'))
            {
                n++;
            }
            else
            {
                break;
            }
        }
        if(n==17)
        {
            if((isdigit(a[17]))||(a[17]=='x'))
            {
                if((year>=1900)&&( year <=2100))
                {
                    if((month>=1)&&( month <=12))
                    {
                        if((year%4==0)&&(year%100!=0)||(year%400==0))
                        {
                            if(((month==2)&&((day>=1)&&(day<=29)))||(((month>=1)&&(month<=12)&&(month!=2))&&((day>=1)&&(day<=31))))//缺少对每个月具体天数的判断,这里没有考虑
                            {
                                cout<<"身份证号码合法"<<endl;
                                return 0;
                            }
                            else
                            {
                                cout<<"身份证号码日信息非法"<<endl;
                                return 6;
                            }   
                        }
                        else
                        {
                            if(((month==2)&&((day>=1)&&(day<=28)))||(((month>=1)&&(month<=12)&&(month!=2))&&((day>=1)&&(day<=31))))//缺少对每个月具体天数的判断,这里没有考虑
                            {
                                cout<<"身份证号码合法"<<endl;
                                return 0;
                            }
                            else if(((month==2)&&(day==29)))
                            {
                                cout<<year<<"是平年,2月没有29天"<<endl;
                                return 7;
                            }
                            else
                            {
                                cout<<"身份证号码日信息非法"<<endl;
                                return 6;
                            }
                        }
                    }
                    else
                    {
                        cout<<"身份证号码月信息非法"<<endl;
                        return 5;
                    }
                }
                else
                {
                    cout<<"身份证号码年信息非法"<<endl;
                    return 4;
                }
            }
            else
            {
                cout<<"第十八位既不是数字也不是英文小写字母x"<<endl;
                return 3;
            }
        }
        else
        {
            cout<<"身份证号第1-17位含有非数字的字符"<<endl;
            return 2;
        }
    }
}
int main()
{
    int verifyIDCard(char *input);
    int result;
    char *p=NULL;
    while(1)
    {
        p=(char *)malloc(50);   
        printf("请输入身份证号码:\n");
        scanf("%s",p);
        result=verifyIDCard(p);
        printf("%d\n",result);
        free(p);
    }
    return 0;
}
       
测试结果:
       
二.手机号码合法性判断
问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
1、  长度13位;
2、  以86的国家码打头;
3、  手机号码的每一位都是数字。
请实现手机号码合法性判断的函数要求:
1)  如果手机号码合法,返回0;
2)  如果手机号码长度不合法,返回1
3)  如果手机号码中包含非数字的字符,返回2;
4)  如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】  无
【返回】  判断的结果,类型为int。
    示例
输入:  inMsisdn = “869123456789“
输出:  无
返回:  1
输入:  inMsisdn = “8813912345678“
输出:  无
返回:  3
输入:  inMsisdn = “8613912345678“
输出:  无
返回:  0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
int verifyMsisdn(char *inMsisdn)
{
    int i;
    int len=strlen(inMsisdn);
    if(len==13)
    {
            for(i=0;i<len;i++)
            {
                if(inMsisdn[i]>='0'&&inMsisdn[i]<='9')
                {
                    continue;
                }
                else
                    break;
            }
            if(i==len)
            {
                if(inMsisdn[0]=='8'&&inMsisdn[1]=='6')
                {
                    printf("手机号码合法\n");
                    return 0;
                }
                else
                {
                    printf("手机号码不是以86打头的\n");
                    return 3;
                }
            }
            else
            {
                printf("手机号码中包含非数字的字符\n");
                return 2;
            }
    }
    else
    {
        printf("手机号码长度不合法\n");
        return 1;
    }
}
int main()
{
    char *p=NULL;
    int result;
    while(1)
    {
    p=(char *)malloc(50);   
    printf("请输入电话号码:\n");
    scanf("%s",p);
    result=verifyMsisdn(p);
    printf("%d\n",result);
    free(p);
    }
    return 0;
}
测试结果: