用途:
- 用于比赛的时候程序产生错误,却苦于无法找到错误的数据样例。
使用方式
- 每次对拍,只需要编辑
sample(stringstream &sout)
函数,即可生成样例。(建议先生成小范围数据)
注意事项
- 首先
修改
对数器里面的mpat("C:/Users/");
为当前文件所在位置。 - 当出现错误样例数超过
5次
,则会停止对拍。 - 可以在
sample
文件夹下查看生成的错误样例。 - 对拍程序名 分别为
A
和B
,可修改变量an
和bn
。
实例
-
在文件夹下建立如下文件,包括
对拍程序A
,对拍程序B
,对拍器
,sample文件夹
。
-
在对数器文件里,编辑
文件所在地方
。
我所在的路径为:C:/Users/x_mn/Desktop/【自闭处】/
-
编辑
sample()
函数,生成随机样例。(注意:输出使用的是sout
!!!)
d_rand()
用于生成整数
f_rand()
用于生成小数
c_rand()
用于生成字符
这里生成的样例是输出n个随机的数。
-
点击编译运行,对数器即可。
对数器代码
//需要建立主路径 和主路径下sample/ 保证程序文件存在
#include <bits/stdc++.h>
using namespace std;
string mpat("C:/Users/"); //主路径 注意末尾跟/!!!! linuxpwd查看当前路径
string an("A"), bn("B"); //程序名字
int brek = 5; //几个错误停止 -1不停止
int cmpt = 1; //编译模式
void exec(const string &cmd, string &res)
{
char buf[1024];
FILE *fp = _popen(cmd.c_str(), "r"); //linux下改为popen
while (fgets(buf, 1024, fp))
res.append(buf);
_pclose(fp); //linux下改为pclose
}
void wrfile(const string &path, stringstream &ss)
{
string str;
FILE *fp = fopen(path.c_str(), "wb");
while (getline(ss, str))
fprintf(fp, "%s\r\n", str.c_str());
fclose(fp);
}
long long d_rand(long long l, long long r) //随机生成(l,r)内的一个整数
{
int k = rand() % 4;
long long t = rand();
for (int i = 0; i < k; i++)
t = t << 16 | rand();
return l + t % (r - l + 1);
}
double f_rand(double l, double r) //随机生成(l,r)内的一个小数
{
double t = rand() / 32767.0;
return l + t * (r - l);
}
char c_rand(const string &ch) //随机生成一个字符串
{
return ch[rand() % ch.size()];
}
void sample(stringstream &sout) //样例生成
{
//此处编写对拍程序
int n=d_rand(1,5);
printf("%d\n",n);
}
int main()
{
srand(time(NULL));
rand();
if (cmpt) //编译功能
{
system(("g++ " + mpat + an + ".cpp -o " + mpat + an + ".exe -std=c++11").c_str()); //C++11支持
system(("g++ " + mpat + bn + ".cpp -o " + mpat + bn + ".exe -std=c++11").c_str());
}
string num, aout, bout, spat = mpat + "sample/"; //样例生成子路径
int cnt = 0, wa = 0;
while (wa != brek) //几个错误停止
{
stringstream ss;
ss << ++cnt;
ss >> num;
aout.clear(), bout.clear(), ss.clear();
sample(ss);
wrfile(spat + num + "samp.txt", ss);
cout << cnt;
exec(mpat + an + ".exe < " + spat + num + "samp.txt", aout);
exec(mpat + bn + ".exe < " + spat + num + "samp.txt", bout);
if (aout == bout)
{
remove((spat + num + "samp.txt").c_str());
remove((spat + num + an + "ans" + an + ".txt").c_str());
remove((spat + num + bn + "ans" + bn + ".txt").c_str());
}
else
{
ss.clear();
ss.str(aout);
wrfile(spat + num + "ans" + an + ".txt", ss);
ss.clear();
ss.str(bout);
wrfile(spat + num + "ans" + bn + ".txt", ss);
wa++;
}
cout << "\t" << wa << endl;
}
return 0;
}