黑盒测试

黑盒测试是指:系统后台会准备若干组输入数据,然后让提交的程序曲去运行这些数据,若输出的结果与正确答案完全相同(字符串意义上的比较),那么就称通过了这道题的黑盒测试,否则会根据错误类型而返回不同的结果。

根据黑盒测试是否对每组数据都单独测试还是一次性测试所有数据,分为单点测试和多点测试。


单点测试

判断每组数据的输入结果是否正确

若正确,该组数据便通过了测试,,并获得了这组数据的分值,也即题目的总得分是这些数据的分值之和

如下列代码就是一个单点测试

#include<cstdio>
int a,b;
scanf("%d%d",&a,&b);
printf("%d",a+b);
return 0;

多点测试

要求程序能一次性的运行所有的数据,并要求所有的输出结果都必须完全正确,否则便是0分。

相比起单点测试,多点测试更能考验做题人的代码是否严谨。

因为多点测试要求一次性运行所有数据,所以要求核心代码有办法反复执行,题目中一般会有三种输入格式,所以需要采用不同的输入方式。

1>.while…EOF型题目未指定输入的结束条件

默认读到文件末尾(对于黑盒测试来说,所有输入数据都是放在一个文件里的)

scanf函数虽然是一个输入函数,但是也有返回值类型,其返回值为输入的个数,若输入失败则返回-1,(且C语言中使用EOF来代表-1)

ps: EOF(end of file)

则我们可以使用这种写法


#include<cstdio>
int main(){
    int a,b;
	while(scanf("%d%d",&a,&b)!=EOF){
    	printf("%d",a+b);
	}
    return 0;
}

另外,在控制台输入数据时,不会触发EOF状态,因此可以通过<ctrl + z>(此时会显示一个^z)+来手动触发

若输入的是字符串,


while(scanf("%S",&str))!=EOF{
    ...
}

while(gets(str)!=NULL){
    ...
}

2>.while…break型

要求当数据满足某个条件时停止输入,即加一个if判断

#include<cstdio>
int main(){
    int a,b;
	while(scanf("%d%d",&a,&b)!=EOF){
    	printf("%d",a+b);
        if(a==0&&b==0)break;
	}
    return 0;
}								//在while...EOF内部进行循环

int main(){
    int a,b;
	while(scanf("%d%d",&a,&b)!=EOF,a||b){
    	printf("%d",a+b);
	}
    return 0;
}						//直接在while中进行条件判断,用逗号隔开

3>.while(T–)型

要求输入多少组数据,可以输入一个T,通过T–来进行控制

int main(){
    int T,a,b;
    scanf("%d",&T);
	while(T--){
        scanf("%d%d",&a,&b)
    	printf("%d",a+b);
	}
    return 0;
}

同样的也有三种输出方式

①正常输出,即

printf("%d",a+b);

printf("%d\n",a+b);

printf("%d\t",a+b);

②每组数据后额外多加一个空行

printf("%d\n\n",a+b);

③两组数据之间有空行,最后一组数据后无空行

int T;

...

printf("%d",a+b);
if(T>0) printf("\n");