2.10黑盒测试 系统后台会准备若干组输入数据,然后让提交的程序去运行这些数据,如果输出的结果与正确的答案完全相同(字符串意义上的比较),那么就称通过了这道题目的测试,否则会根据错误类型而返回不同的结果,其中,根据黑盒测试是否对每组测试数据进行单独测试,或者是一次性测试所有的数据,又可以分为单点测试和多点测试。 2.10.1单点测试 对于单点测试来说,系统会根据每组数据输出的结果是否正确,如果输出正确,那么对于该组数据来说就是通过了测试,并且获得了这组数据的得分,在这种情况下,题目的总得分等于通过的数据的分支之和。 从代码的编写上来说,单点测试只需要按照正常的逻辑执行一遍程序就可以了。程序只需要对于一组数据能够完整执行即可。
2.10.2多点测试 多点测试要求程序能够一次运行所有的数据,并且要求所有的输出结果都必须是完全正确的,才能算作这道题通过了测试,而且只要有其中一组数据的输出是错误的,那么这道题就是0分。 (1)while…EOF类型 如果题目没有给定输入的结果条件,那么就默认读取到文件的末尾,对于黑盒测试来说,所有的输入的数据都是放在一个文件里面的,系统会让程序去读取这个文件里面的输入数据,然后执行程序输出结果。那么如果题目没有指定什么时候结束输入,一般都是指定输入完所有的数据为止 scanf是有返回值的,scanf函数的返回值为其成功读入的参数的个数 正常的控制台(屏幕黑框)当中的1输入一般是不会失败的,只有在读取文件的时候到达文件的末尾导致无法读取的现象才会产生读入的失败,这个时候,scanf函数会返回-1而不是0,而C语言当中使用EOF(即End of File)来代表-1 这就是给我们一个启发,当题目没有说明由多少数据需要读入的时候,就可以利用scanf的返回值是否为EOF来判断输入是否结束,于是就有了下面的这种写法:while(scanf("%d",&n)!=EOF){ }
#include<stdio.h> #include<math.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF){ printf("%d\n",a+b); } return 0; }另外,当在黑框里面输入数据的时候,并不会触发EOF状态,因此如果想要在黑框里面手动触发EOF,可以按下<Ctrl+Z>组合键,这个时候就会显示^Z,按下键的时候就可以结束while了。
while(scanf(“%s”,str)!=EOF){ } while(gets(str)!=NULL){ }(2)while–break类型的 这种类型是while…EOF类型的延伸。还有
#include<stdio.h> #include<math.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF){ if(a==0&&b==0)break; printf("%d\n",a+b); } return 0; } 另一种更加简洁的写法 #include<stdio.h> #include<math.h> int main() { int a,b; while(scanf("%d%d",&a,&b),a||b){ printf("%d\n",a+b); } return 0; }(3)while(T–)类型的 在这种类型当中,题目会给出测试数据的组数,然后才给出相应数量的组数的输入数据,
#include<stdio.h> #include<math.h> int main() { int T,a,b; scanf("%d",&T); while(T--){ scanf("%d%d",&a,&b); printf("%d\n",a+b); } return 0; }三种常见的输出类型 1.正常输出 要求需要每两组输出数据的中间没有额外的空行,即输出的数据是连续的多行 2.每组数据输出以后都额外加一个空行 这个要求非常容易实现的,只需要在每组输出结束以后额外输出一个换行符\n就可以了,
#include<stdio.h> #include<math.h> int main() { int a,b; while(scanf("%a%d",&a,&b)!=EOF){ printf("%d\n",a+b); printf("\n"); } return 0; }3.两组输出数据之间有一个空行,最后一组数据的后面没有空行 这一般是在第三种输入类型while(T–)的情况下,只需要通过判断T是否已经减小到0来判断是否应当输出额外的换行
#include<stdio.h> #include<math.h> int main() { int T,n,a; scanf("%d",&n); while(T--){ int sum=0; for(int i=0;i<n;i++){ scanf("%d",&a); sum=sum+a; } printf("%d\n",sum); if(T>0) printf("\n");} }与这种要求类似的要求的是:输出一行N个整数,每两个整数之间用空格隔开,最后一个整数后面不允许加上空格,做法是类似的。
for(int i=0;i<N;i++){ printf("%d",a[i])); if(i<N-i) printf(""); else printf("\n");}在多点测试当中,每一次循环都需要重置一下变量和数组,否则在下一组数据来临的时候变量和数组的状态就不是初始状态了,而重置函数一般使用memset函数或者fill函数