问答题
已知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%。如果认为该程序的语句或分支覆盖率无法达到100%.需说明为什么。
【正确答案】根据以上分析,设计测试用例如下:
用例 编号 | 年 | 月 | 日 | leap | numdays | while | if…else if …else | 输出结果 |
1 | 2008 | 2 | 30 | 1 | 29 | 1 | | error |
2 | 2007 | 12 | 31 | 0 | 31 | 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用例三个测试用例刚好使main中的if…else if…else的三个分支都执行一遍。
【答案解析】