问题 问答题

已知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\n",
tomorrow.year, tomorrow.month, tomorrow.day);

(1)画出程序中所有函数的控制流程图。
(2)设计一组测试用例,使该程序所有函数的语句覆盖率和分支覆盖率均能达到100%。如果认为该程序的语句或分支覆盖率无法达到100%,则说明为什么。

答案

参考答案:(1)函数leap的流程图如下:
[*]
函数numdays的流程图如下左图所示。
main函数的流程图如下右图所示(语句的具体内容已略去)。
[*]
本题的程序用来打印输入日期的第二天日期,只要根据程序中的判断语句设计出相关的测试用例,就能使得所有函数的语句覆盖率和分支覆盖率均能达到100%。
为了满足leap函数的语句覆盖率和分支覆盖率均能达到100%,应当设置两个测试用例,其中一个是闰年,一个不是,在这里可以取2008年和2007年。
由于numdays函数的判定语句是对leap的函数值进行判定,满足了leap的覆盖率要求,就能够满足numdays的覆盖率要求。
对于main函数中的while语句,根据流程图,先使判断部分为1,然后为0,这样就可以达到覆盖要求。对于while语句之后的if...else if...else语句,只要能够使每个分支都执行一遍,就能达到覆盖要求。
根据以上分析,设计测试用例如下:

用例编号