任务说明(二选一):
一、实现模块判断传入的身份证号码的正确性;
二、实现模块判断传入的电子邮箱账号的正确性;
实现要求:
一、实现功能模块;
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\n",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流程进行工作量估算,填写任务清单工作量估算表。
任务清单工作量估算表:
PSP阶段 |
时间估算(小时) |
实际实际(小时) |
|
计划 |
估计每个阶段的时间成本 |
0.5 |
0.5 |
开发 |
需求分析 |
1 |
1 |
系统设计 |
1.5 |
1 |
|
设计复审 |
0.5 |
0.5 |
|
代码实现 |
2 |
1.5 |
|
代码复审 |
1 |
0.5 |
|
测试 |
1 |
1.5 |
|
报告 |
测试报告 |
1 |
0.5 |
总结 |
0.2 |
0.1 |