一.身份证号码合法性判断
问题描述
我国公民的身份证号码特点如下:
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;
}
测试结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论