对拍
例如测试大整数加法程序是否正确
首先需要准备3个程序
- 你认为是正确的程序(要测试正确性的程序) (bigAdd.cpp)
- 比较有把握的暴力程序(Add.cpp 保证在小规模数据中一定是正确的)
- 数据生成器 (gen.cpp)
数据生成器(对拍器gen.cpp)
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main () {
srand( (unsigned)time(NULL) ); //随机种子
unsigned int a, b; //无符号整数,否则会溢出
a = (rand() << 16) + rand();
b = (rand() << 16) + rand();
a %= 100000;
b %= 100000;
cout << a << "\n" << b << "\n";
return 0;
}
比较有把握的暴力程序(Add.cpp)
#include <iostream>
using namespace std;
int main () {
long long a, b;
cin >> a >> b;
cout << a+b;
}
要测试的程序(bigAdd.cpp)
#include <cstdio>
#include <cstring>
char a[212], b[212];
int c[212], d[212];
int main() {
int l1, l2, i, k, t;
scanf("%s%s", a, b);
l1 = strlen(a), l2 = strlen(b);
for(i = 0; i < l1; i++) c[l1-i-1] = a[i]-'0';
for(i = 0; i < l2; i++) d[l2-i-1] = b[i]-'0';
l1 > l2 ? k = l1 : k = l2;
for(i = 0; i <= k; i++)
t = c[i] + d[i], c[i] = t % 10, c[i+1] += t / 10;
while(!c[k] && k) k--;
for(; k >= 0; k--)
printf("%d", c[k]);
return 0;
}
批处理命令
新建文本文档,然后复制下面命令,后缀名改为bat。表示批处理程序,可以命名为duipai.bat
(在运行这个批处理命令的时候,前面的3个程序一定要先编译,才会生成.exe可执行文件)
@echo off
:loop
gen.exe > data.txt
bigAdd.exe < data.txt > mystd.txt
Add.exe < data.txt > std.txt
fc /A mystd.txt std.txt
if not errorlevel 1 goto loop
pause
:end
@echo off 表示关闭输入显示
其中gen.exe > data.txt表示运行gen.exe输出结果到data.txt
bigAdd.exe < data.txt > mystd.txt 表示bigAdd读入data.txt的数据输出到std.txt
fc /A mystd.txt std.txt 表示比较mystd.txt和std.txt,fc是比较命令,/A表示只显示每个不同处的第一行和最后一行,如果文件不同会返回1,相同是0
if not errorlevel 1 goto loop 表示如果fc命令返回的不是1就继续循环
pause 文件不同就会暂停,以便观察数据
:end 结束循环,或者写成goto loop 继续对拍
这样就可以不断测试程序了