【程设课发帖】对拍

当我和室友一起端坐在电脑前,为bug头痛的时候,对拍方法往往会让问题好解决一点。

如果屏幕前的你也有这样的困扰:

  • 测试数据过得了,但是保密数据总有几条WA了
  • 小数据过得了,大数据过不了,但是自己造大数据很麻烦
  • 有bug藏得很深,运行了很多次都没找到

那么,我建议你试一试对拍。

什么是对拍

借用网上博客中的说法,对拍就是你给两个程序,和一个随机数据生成器,然后系统去用这个随机数据生成器的输出作为你这两个程序的输入,然后比较你这两个程序的输出,可以找到一组使这两个程序输出不一样的数据(如果存在的话)。

对拍程序会把这两个不一样的输出“打在公屏上”,你可能根据这个正解和你的WA解,反推出你代码中的问题所在。

怎么写对拍

材料:

my_code.exe, std.exe, data.exe, bat.txt,将它们放在同一个文件夹下。

my_code.exe 是你的代码运行后生成的可执行文件。

std.exe 来自正确代码。它可以是TLE的暴力算法代码,也可以是你室友已经AC过的代码,还能是网上找的AC代码。总之,只要结果是对的就行。

data.exe 来自你写的随机数生成代码,下面会简单介绍怎么写。

接下来如果没看得很明白,推荐看这篇简单易懂的博客https://blog.csdn.net/code12hour/article/details/51252457。毕竟,我的语文不太好。

方法:

1. 随机数生成代码的写法如下。可以根据不同题目输入格式的不同,对其进行修改。

#include<bits/stdc++.h>

using namespace std;

int main(){

srand(time(0));

int a;

a=rand()%100;

printf("%d ",a); 

return 0;

}

2. 对拍程序的写法如下:

:again

data > input.txt

std < input.txt > std_output.txt

my_code < input.txt > my_code_output.txt

fc std_output.txt my_code_output.txt

if not errorlevel 1 goto again

pause

写好后,把后缀名从.txt改成.bat,双击即可运行。

如果要修改,可以右键-编辑。

运行界面

下图就是结果不一致时,我们看到的界面。可以看到,正确答案是7,而被debug的代码错误输出了6。

如果对拍程序一直运行,总是不停下来,就说明它没有拍出你的问题。

如果对拍程序没有拍出你的问题,那么你可以试着改变你造出的随机数的数据范围,或者干脆放弃对拍方法,老老实实地用另外的方法debug——毕竟,对拍只是检验代码的众多方式之一而已。

原文地址:https://www.cnblogs.com/nishida-rin/p/13689405.html