C++ ACM比赛专用对数器

用途:
  • 用于比赛的时候程序产生错误,却苦于无法找到错误的数据样例。
使用方式
  • 每次对拍,只需要编辑sample(stringstream &sout)函数,即可生成样例。(建议先生成小范围数据)
注意事项
  • 首先修改对数器里面的mpat("C:/Users/");为当前文件所在位置。
  • 当出现错误样例数超过5次,则会停止对拍。
  • 可以在sample文件夹下查看生成的错误样例。
  • 对拍程序名 分别为AB,可修改变量anbn
实例
  1. 在文件夹下建立如下文件,包括对拍程序A对拍程序B对拍器sample文件夹
    对拍器

  2. 在对数器文件里,编辑文件所在地方
    我所在的路径为:C:/Users/x_mn/Desktop/【自闭处】/
    在这里插入图片描述

  3. 编辑sample()函数,生成随机样例。(注意:输出使用的是sout!!!)
    d_rand()用于生成整数
    f_rand()用于生成小数
    c_rand()用于生成字符

    在这里插入图片描述
    这里生成的样例是输出n个随机的数。
    在这里插入图片描述

  4. 点击编译运行,对数器即可。

对数器代码
//需要建立主路径 和主路径下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;
}

  • 3
    点赞
  • 3
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值