哈喽!这里是一只派大鑫,不是派大星。本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习。更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段找到好的方法、路线,让天下没有难学的程序(只有秃头的程序员 2333),学会程序和算法,走遍天下都不怕!
在逐渐“内卷”化的形势下,算法体现得越来越重要了,无论是找工作、学习、竞赛,只要是学习计算机的内容,必然少不了算法。因此很多小伙伴也趁早刷起了算法题~
但是呢,我们也不能找到网站就开始进行刷题了,这样不好,在练习算法之前还有很多需要先了解的事,明白了这些事,才能让我们在刷算法的过程中更顺利~
话不多说,直入主题。
Q1:黑盒测试
黑盒测试是指:系统后台会准备若干组输入数据,
然后让提交的程序去运行这些数据,
如果输出的结果与正确答案完全相同(字符串意义上的比较),那么久称通过了这题的黑河测试,否则会根据错误类型而返回不同的结果。
其中,根据黑盒测试是否对每组测试数据单独测试或是一次性测试所有测试数据,又可以分为单点测试和多点测试。
Q2:单点测试
对单点测试来说,系统会判断每组数据的输出结果是否正确。
如果输出正确,那么对该组数据来说就是通过了测试,并获得了这组数据的分值。
在这种情况下,题目的总得分等于通过的数据的分值之和。
例如PAT、洛谷就是采用了单点测试,并且对每组数据都会给出相应的测评结果。
从代码编写上来说,单点测试只需要按正常的逻辑执行一遍程序即可,是“一次性”的写法,即程序只需要对一组数据能够完整执行即可。
以A+B为例,下面就是一个可以通过测试的代码:
#include<stdio.h>
int main(){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return 0;
}
Q3:多点测试
与单点测试相对,多点测试要求程序能一次运行所有数据,
并要求所有输出结果都必须完全正确,才能算这题通过;
而只要有其中一组数据的输出错误,本题就只能得0分。
对多点测试来说,由于要求程序能运行所有数据,因此必须保证程序有办法反复执行代码的核心部分,这就要用到循环。
而题目一般会有3种输入的格式,需要采用不同的输入方式。
下面就分别讲述着三种输入方式!
多点测试输入方式(1)——while...EOF型
如果题目没有给定输入的结束条件,那么就默认读取到文件末尾。
对黑盒测试来说,所有输入数据都是放在一个文件里的,系统会让程序去读取这个文件里的输入数据,然后执行程序并输出结果。
那么如果题目没有指定何时结束输入,一般都是指输入完所有数据(即到达文件末尾)为止。
如何解决这样的输入要求呢?
scanf函数的返回值为其成功读入的参数的个数!
只有在读取文件时到达文件末尾导致的无法读取现象,才会产生读入失败。
这个时候,scanf函数会返回-1而不是0,且C语言中使用EOF(即End Of File)来表示-1
于是我们可以这样处理:
while(scanf("%d",&n) != EOF){
...
}
例如:
int main(){
int a,b;
while(scanf("%d%d",&a,&b) != EOF){
printf("%d\n",a+b);
}
return 0;
}
另外需要注意的是,在黑框框里输入数据时,并不会出发EOF状态。
这时我们可以按<Ctrl + Z>组合键,这时就会显示一个^Z ,我们再按下<Enter>键就可以结束while了!
还有,如果读入字符串,就会有scanf和gets两种方式,它们也有一些小区别如下:
while(scanf("%s",str) != EOF){
...
}
while(gets(str) != NULL){
...
}
多点测试输入方式(2)——while...break型
这种类型是while...EOF型的延伸,题目要求当输入的数据满足某个条件时停止输入。
很简单,此时我们再while...EOF的内部进行判断,当满足退出条件时中断(break)当前while循环即可,如下所示:
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;
}
多点测试输入方式(3)——while(T--)型
在这种类型中,题目会给出测试数据的组数,然后才给出相应数量组数的输入数据。
由于给定了测试数据的组数,因此用一个变量T来保存,并在程序开始时读入。
在读入T之后,下面就可以进行T次循环,每次循环解决一组数据的输入与输出,
while(T--)就是循环执行T此的含义。下面的代码体现了这种写法:
int main(){
int T,a,b;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
printf("%d",a + b);
}
return 0;
}
以上就是多点测试的三种输入类型。
下面讲解三种常见的输出类型!
(1)正常输出
这种输出类型要求需要每两组输出数据中间没有额外的空行,即输出数据是连续的多行。
(2)每组数据输出之后都额外加一个空行
这种要求非常容易实现,只需要在每组输出结束之后额外输出一个换行符\n即可。
int main(){
int a,b;
while(scanf("%d%d",&a,&b) != EOF){
printf("%d",a + b);
printf("\n");
}
return 0;
}
(3)两组数据之间有一个空行,最后一组数据没有空行
这一般是在第三种输入类型while(T--)的情况下,只需要通过判断T是否已经减小到0来判断是否应该输出额外的换行。
int main(){
int T,a,b;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
printf("%d",a + b);
if(T > 0) printf("\n");
}
return 0;
}
与这种要求类似的要求是:输出一行N个整数,每两个整数之间用空格隔开,最后一个整数后面不允许加上空格。做法是类似的,如下面的代码所示:
for(int i = 0;i < N; i++){
printf("%d",a[i]);
if(i < N - 1) printf(" ");
else printf("\n");
}
最后强调:
在多点测试中,每一次循环都要重置一下变量和数组,否则在下一组数据来临的时候,
变量和数组的状态就不是初始状态了。
将初始化的操作放在while( ) { } 内
而重置数组一般使用memset函数 或是 fill函数