对拍方法

扫码查看

首先声明:对拍有很多种方法,此处仅展示一种。

对拍原理

对拍的目的是通过大量数据验证某一算法或数据结构的正确性。因此对拍首先需要一个保证正确的算法(一般是暴力算法)提供所谓“标准答案”,此外还需要一个“数据生成器”,用来生成输入数据,最后通过批处理文件将两者进行比较,如果没有问题就生成下一组数据进行比较,如果两者不同就自动停止,表明找到了一个反例。

对拍步骤

第0步:确保文件资源管理器设置为显示扩展名。如果设置为不显示,打开的方法是:“文件资源管理器\(\rightarrow\)查看\(\rightarrow\)显示扩展名”。

第1步:最好建立一个独立文件夹,因为对拍所需要的源程序与其他文件较多。

第2步:新建一个文本文件(其实任意类型均可),将名称改为“enter”(注意没有扩展名

第3步:写三个程序:第一个是数据生成器(不妨设为data.cpp,将输入数据写入data.in文件中),第二个是提供标准答案的程序(不妨设为std.cpp,从data.in文件中读取输入数据,将答案写入std.out文件中),第三个是验证的算法的程序(不妨设为test.cpp,从data.in文件中读取输入数据,将答案写入test.out文件中)。

第4步:保证三个程序都成功编译(同目录下有.exe文件)

第5步:新建一个文本文件,在文本文件中键入以下代码:

@echo off
data.exe
std.exe
time<enter
test.exe
time<enter
fc std.out test.out || pause
%0

第6步:将该文件后缀名改为.bat并运行。

代码解释:

@echo off

意思是关闭回显功能。原本的批处理文件在执行命令时会将命令本身显示在窗口中,而该语句就将该功能关闭。

data.exe/std.exe/test.exe

分别指运行数据生成器、标算和测试算法。

time<enter

输出运行命令时的当前时间。目的是判断标算或测试算法是否含有bug,陷入死循环。同时也可以营造出一种“刷屏”的感觉。

fc std.out test.out || pause

表示比较std.out和test.out两个文件是否完全相同,如果不同就暂停。

%0

表示循环执行该组命令,永不退出。

01-02 00:22
查看更多