任务说明一、实现模块判断传入的身份证号码的正确性
实现要求:
一、实现功能模块;
1、身份证号合法,返回0;
2、身份证号长度不合法,返回1;
3、身份证号第1~17位含有非数字的字符,返回2;
4、身份证号第18位既不是数字也不是英文小写字母x,返回3;
5、身份证号的年信息非法,返回4;
6、身份证号的月信息非法,返回5;
7、身份证号的日信息非法,返回6(考虑闰年情况);
二、针对所实现的模块编写对应的单元测试代码;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int
verifyIDCard(
char
* input);
int
is_leapyear(
int
year);
int
getyear(
char
* input);
int
getmonth(
char
* input);
int
getday(
char
* input);
int
check_1to17(
char
* input);
int
check18(
char
* input);
int
chech_year_month_day(
int
year,
int
month,
int
day);
int
main()
{
char
input[8][100] = {
"511002111222"
,
"511002abc123456789"
,
"51100219880808123a"
,
"511002188808081234"
,
"511002198813081234"
,
"511002198808321234"
,
"511002198902291234"
,
"511002198808081234"
};
int
i;
for
(i=0; i<8; i++)
{
printf
(
"the IDcard is: %s, the result is: %d
"
,input[i],verifyIDCard(input[i]));
}
return
0;
}
int
is_leapyear(
int
year)
{
if
(( (year%4==0) && (year%400!=0) ) || (year%400==0))
return
1;
return
0;
}
int
getyear(
char
* input)
{
int
year=0;
year = (input[6]-
'0'
) * 1000 + (input[7]-
'0'
) * 100 +
(input[8]-
'0'
) * 10 + (input[9]-
'0'
);
return
year;
}
int
getmonth(
char
* input)
{
int
month=0;
month = (input[10]-
'0'
) * 10 + (input[11]-
'0'
);
return
month;
}
int
getday(
char
* input)
{
int
day=0;
day = (input[12]-
'0'
) * 10 + (input[13]-
'0'
);
return
day;
}
int
check_1to17(
char
* input)
{
int
i;
for
(i=0; i<17; i++)
if
( !(input[i]>=
'0'
&& input[i]<=
'9'
) )
return
0;
return
1;
}
int
check18(
char
* input)
{
char
ch = input[17];
if
( (ch==
'x'
) || (ch>=
'0'
&& ch<=
'9'
) )
return
1;
else
return
0;
}
int
check_year_month_day(
int
year,
int
month,
int
day)
{
int
leap;
leap = is_leapyear(year);
if
(year<1900 || year>2100)
return
4;
if
(month<1 || month>12)
return
5;
switch
(month)
{
case
1:
case
3:
case
5:
case
7:
case
8:
case
10:
case
12:
{
if
(day<1 || day>31)
return
6;
break
;
}
case
4:
case
6:
case
9:
case
11:
{
if
(day<1 || day>30)
return
6;
break
;
}
case
2:
{
if
(leap)
{
if
(day<1 || day>29)
return
6;
break
;
}
else
{
if
(day<1 || day>28)
return
6;
break
;
}
}
}
return
0;
}
int
verifyIDCard(
char
* input)
{
int
year,month,day;
if
(
strlen
(input)!=18)
return
1;
else
{
if
(!check_1to17(input))
return
2;
else
{
if
(!check18(input))
return
3;
else
{
year = getyear(input);
month = getmonth(input);
day = getday(input);
return
check_year_month_day(year,month,day);
}
}
}
}
测试结果:
三、需要按PSP流程进行工作量估算,填写任务清单工作量估算表。
任务清单工作量估算表: