问答题
已知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);
}
问答题
画出程序中所有函数的控制流程图。
【正确答案】
【答案解析】函数leap的流程图如下:
函数numdays的流程图如下左图所示。
main函数的流程图如下右图所示(语句的具体内容已略去)。

问答题
设计一组测试用例,使该程序所有函数的语句覆盖率和分支覆盖率均能达到100%。如果认为该程序的语句或分支覆盖率无法达到100%,则说明为什么。
【正确答案】
【答案解析】本题的程序用来打印输入日期的第二天日期,只要根据程序中的判断语句设计出相关的测试用例,就能使得所有函数的语句覆盖率和分支覆盖率均能达到100%。
为了满足leap函数的语句覆盖率和分支覆盖率均能达到100%,应当设置两个测试用例,其中一个是闰年,一个不是,在这里可以取2008年和2007年。
由于numdays函数的判定语句是对leap的函数值进行判定,满足了leap的覆盖率要求,就能够满足numdays的覆盖率要求。
对于main函数中的while语句,根据流程图,先使判断部分为1,然后为0,这样就可以达到覆盖要求。对于while语句之后的if...else if...else语句,只要能够使每个分支都执行一遍,就能达到覆盖要求。
根据以上分析,设计测试用例如下:
|
用例编号
|
年
|
月
|
日
|
leap
|
numdays
|
while
|
if...else if...else
|
输出结果
|
|
1
|
2008
|
2
|
30
|
1
|
29
|
1
|
|
error
|
|
2
|
2007
|
12
|
31
|
0
|
30
|
0
|
month=12
|
2008.1.1
|
|
3
|
6
|
10
|
31
|
0
|
31
|
0
|
today=
numdays
|
6.11.1
|
|
4
|
804
|
4
|
17
|
1
|
30
|
0
|
today!=
numdays
|
804.4.18
|
注意,这里的第1、2个用例使得leap函数中的return 1和return 0都能执行一遍,同时numdays函数中的if...else结构两个分支也都能得到执行;第1个用例也能够使while循环体能够得到执行;第2、3、4用例3个测试用例刚好使main中的if...else if...else 3个分支都执行一遍。