C++笔记(6)——关于OJ的单点测试和多点测试

单点测试

PAT使用的就是单点测试(LeetCode应该也是单点测试)。单点测试中系统会判断每组数据的输出结果是否正确,正确则通过测试并获得这则测试的分值。题目的总得分等于通过的数据的分值之和。

代码编写上单点测试只要求程序能够按照正常逻辑执行一遍。

多点测试

多点测试要求程序能够一次性运行所有数据,并且要求所有输出结果都完全正确才能AC,只要一组数据输出错误那么这题就只能0分。大部分OJ都是这种方式。只有这种方式才能严格考验写出的代码是否严谨。多点测试的程序需要能够运行所有数据,所以必须保证程序有办法反复执行代码核心部分,所以需要用到循环。

通常题目有3中输入格式,下面是对应的输入程序:

while...EOF型

scanf函数返回值为成功读入的参数的个数,当读入失败的时候scanf函数返回-1,而C中使用EOF(End Of File)来表示-1。

while(scanf("%d", &n) != EOF) {
    // 这里填运行代码
}

另外有gets(str)

while(gets(str) != NULL) {
    // 这里填核心代码
}

while...break型

这是用在题目要求当输入的数据满足某个条件时停止输入时的,例如当输入的ab都为0时结束输入:

#include <stdio.h>

int main() {
    int a, b;
    while(scanf("%d%d", &a, &b) != EOF) {
        if(a==0 && b==0) break;
        printf("%d
", a+b);    // 这里可以换成别的
    }
    return 0;
}

另一种是将推出条件放在while判断中:

#include <stdio.h>

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

这样当ab中只要有1个不是0那么就会一直循环下去。

while(T--)型

这种就是每次都会给定测试数据的组数,所以需要变量T来存储程序要执行的次数,最后程序循环执行T次,每次解决一组数据:

#include <stdio.h>

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

此外,多点测试中要注意每次循环前重置一下变量和数组,重置数组通常用memsetfill

参考

《算法笔记》 胡凡 著