已知C源程序如下:
/*Input today’s date,output tomorrow’s date*/
/*version 2*/
#include<stdio.h>
struct ydate
int day;int month;int year;;
int leap(struct ydate d)
if((d.year%4==0&&d.year%100!=0)||(d.year%400==0))
return 1;
else
return 0;
int numdays(struct ydate d)
int day;
static int daytab[]=
31,28,31,30,31,30,31,31,30,31,30,31);
if(leap(d)&&d.month==2)
day=29;
else
day=daytab[d.month-1];
return day;
int main(void)
struct ydate today,tomorrow;
printf("format of date is:year,month,day 输入的年、月、日之间应用逗号隔开\n");
printf("today is:");
scanf("%d,%d,%d",&today.year,&today.month,&today.day);
while(0>=today.year
|| today.year>65535 || 0>=today.month || today.month>12) ||
0>=today.day || today.day>numdays(today))
printf("input date error!reenter the day!\n");
printf("today is:");
scanf("%d,%d,%d",&today.year,&today.month,&today.day);
if(today.day!=numdays(today))
tomorrow.year=today.year;
tomorrow.month=today.month;
tomorrow.day=today.day+1;
else if(today.month==12)
tomorrow.year=today.year+1;
tomorrow.month=1;
tomorrow.day=1;
else
tomorrow.year=today.year;
tomorrow.month=today.month+1;
tomorrow.day=1;
printf("tomorrow is:%d,%d,%d\n\",
tomorrow.year,tomorrow.month,tomorrow.day);
画出程序中所有函数的控制流程图;
参考答案:
函数leap的流程图如下:
函数numdays的流程图如下:
main函数的流程图如下(语句的具体内容已略去):
本题的程序用来打印输入日期的第二天日期,只要根据程序中的判断语句设计出相关的测试用例,就能使得所有函数的语句覆盖率和分支覆盖率均能达到100%。
为了满足leap函数的语句覆盖率和分支覆盖率均能达到100%,应当设置两个测试用例,使得一个是闰年,一个不是,在这里可以取2008年和2007年。
由于numdays函数的判定语句是对leap的函数值进行判定,满足了leap的覆盖率要求,就能够满足numdays的覆盖率要求。
对于main函数中的while语句,根据流程图,先使判断部分为1,然后为0,这样就可以达到覆盖要求。对于while语句之后的If…else if…else语句,只要能够使每个分支都执行一遍,就能达到覆盖要求。