问题 问答题

已知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语句,只要能够使每个分支都执行一遍,就能达到覆盖要求。

多项选择题 案例分析题
单项选择题