软工作业PSP与单元测试训练

任务说明(二选一):

一、实现模块判断传入的身份证号码的正确性;

 

实现要求:

一、实现功能模块;

身份证号码长度为18位,由17位数字和一位检验码组成。

对输入的身份证号码的正确性进行判断

(1)检验校验位

十七位数字本体码加权求和公式

S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
其中Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
再计算模Y = mod(S, 11),通过模Y得到对应的校验码:1 0 X 9 8 7 6 5 4 3 2
(2)检验年月日是否合理
年份大于等于1900年,小于等于当前年份,还需要考虑闰年、大小月的情况。闰年,能被4整除且不能被100整除或能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。

如输入的身份证合法,则输出该身份证正确!

如输入的身份证格式不对,则输出该身份证格式错误,请重新输入!

如输入的身份证不正确,则输出该身份证无效,不是合法的身份证号码,请重新输入!

二、针对所实现的模块编写对应的单元测试代码;

#include<stdio.h>
#include<string.h>
#include<time.h>
int strtonum(char *str){
    int num=0;
    for(int i=0;i<strlen(str);i++){
        num=num*10+str[i]-'0';
    }
    return num; 
} 
char verifydate(char *date){
    struct tm *local;
    time_t t;
    t=time(NULL);
    local = localtime(&t);
    int year,month,day,c=local->tm_year; 
    char s[5]; 
    memset(s,0,sizeof(s)); 
    memcpy(s,date,4); 
    year=strtonum(s); 
    memset(s,0,sizeof(s)); 
    memcpy(s,date+4,2); 
    month=strtonum(s); 
    memset(s,0,sizeof(s)); 
    memcpy(s,date+6,2); 
    day=strtonum(s); 
    if(year<1900 || year>(c+1900))return 0; 
    if(month<1 || month>12)return 0; 
    if(day>31 || day<1)return 0; 
    if(day==31){ 
        if(month==2 || month==4 || month==6 || month==9 || month==11)return 0;
        else return 1; 
    } 
    if(day==30){ 
        if(month==2)return 0;
        else return 1; 
    } 
    if(day==29){ 
        if(year%4==0){ 
            if(year%100!=0)return 1; 
            else 
                if(year%400==0)return 1;
        } 
        else return 0; 
    } 
    return 1; 
} 
void verifyID(char IDnum[]){
    int m[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},sum=0;
    char last[11]={'1','0','x','9','8','7','6','5','4','3','2'};
    for(int i=0;i<17;i++){
        sum=sum+((IDnum[i]-'0')*m[i]);
    }
    if(IDnum[17]==last[sum%11])
        printf("该身份证正确!\n");
    else
        printf("该身份证无效,不是合法的身份证号码,请重新输入!\n");
}
int main()
{
    char IDnum[18],birthday[8];
    while(1){
        gets(IDnum);
        if(strlen(IDnum)==18){
            memcpy(birthday,IDnum+6,8);
            if(verifydate(birthday)==0)
                printf("该身份证无效,请重新输入!\n");
            else
                verifyID(IDnum);
        }
        else
            printf("该身份证格式错误,请重新输入!\n");
    }
    return 0;
}

测试结果:

 

三、需要按PSP流程进行工作量估算,填写任务清单工作量估算表。

 

任务清单工作量估算表:

PSP阶段

时间估算(小时)

实际实际(小时)

计划

估计每个阶段的时间成本

 0.6

 0.5

开发

需求分析

 0.6

 0.3

系统设计

 0.8

 0.3

设计复审

 0.5

 0.2

代码实现

 1.5

 1.5

代码复审

 1

 0.5

测试

 0.5

 0.5

报告

测试报告

 1

 0.5

总结

 0.3

 0.2

转载于:https://www.cnblogs.com/jliblog/p/8570881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值