对拍程序

对拍

例如测试大整数加法程序是否正确

首先需要准备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 继续对拍

这样就可以不断测试程序了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值