ACM简易对拍程序写法


对拍程序简介

一、对拍程序的用途


通过读入一系列测试数据,用两个程序分别运行出结果,比较两个程序运行结果的差异。


二、什么时候用对拍


在ACM比赛时,我们经常会遇到一个问题,就是你写了一份代码,信心满满地submit,结果返回的总是WA,而且你也找不出什么测试样例能把自己的代码叉掉,那个这个时候如果条件允许的话(比如题目可以写个小范围暴力等等得到必定正确的结果),可以试着用对拍。


三、对拍程序的优点


比起手动对拍,写个对拍程序效率比较高,每次能比较大量的数据。


四、对拍程序的写法


我们随便以一道题为例进行解释。



1. 新建文件夹


在一个磁盘中建立一个对拍文件夹(我选择C盘,但哪个盘无所谓)。


2. 生成测试数据


首先我们在文件夹里新建一个data.txt文档用以储存测试数据。


根据题意,y的范围为[1000,3000],m的范围为[1,12],x的范围为[0,9]。


我们知道可以调用库函数rand()随机产生一个int型整数,那么如何随机生成一个范围内的随机数呢,我们想到用模运算。


如果需要随机生成区间[x,y]内的数,可以用这样的语句来实现


printf("%d\n",x+rand()%(y-x+1));



生成后输出即可(见代码)


#include <cstdio>
#include <cstring>
//***************     对拍程序必备
#include <ctime>
#include <cstdlib>
//***************
#include <algorithm>
using namespace std;

typedef long long ll;
const int maxn = 1005;
const ll mod = 1e9+7;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;

int main()
{
    freopen("c://duipai//data.txt","w",stdout);  //文件打印语句
    srand(time(NULL));                           //必不可少
    int testcase=100;                            //测试数据组数,几百就差不多了
    while(testcase--)
    {
        int y=1000+rand()%(3000-1000+1);
        int m=1+rand()%(12-1+1);
        int x=0+rand()%(9-0+1);
        printf("%d %d %d\n",y,m,x);
    }
    return 0;
}


【PS】


如果要生成小数,可用以下语句


printf("%.2f\n",rand()*1.0/100);


如果要生成字符串,每个字符可以通过先生成[0,25]的整数,然后再加上 'a'('A')得到。


3. 生成正确结果

先新建一个AC.txt,然后用一个一定正确的程序跑出结果并储存。



建议输出结果时加上读入数据,这样如果结果不一样可以很快知道是哪组测试数据出错。



4. 生成错误结果


先新建一个WA.txt,然后用WA的程序跑出结果并储存。




进行好上面几步后文件夹里就出现了三个txt文档,里面就是相应的数据了,当然你肉眼去找差异效率就比较低且易找错,所以我们继续操作。


5. 新建对拍文档

新建一个result.txt,用以进行对拍。


打开文档,输入以下语句并保存。



然后把文档的拓展名从txt改为bat,运行便能得到对拍结果啦。(如有问题见文末)




这样就比较清楚地可以看到问题出在哪组数据了。


如果比较后没有问题,则会返回找不到差异




【PS】如果你把文档的拓展名改了后,图标依旧没有改变,那么你需要进行进行以下操作。


  1. 打开文件资源管理器(我的电脑)。

  1. 点击左上角的“查看”,然后点击下拉菜单右侧的“选项”。

  1. 点击“查看”,然后在高级选项里找到“隐藏已知文件的拓展名”,取消勾选就可以了。





猜你喜欢

转载自blog.csdn.net/my_sunshine26/article/details/77894284
今日推荐