Windows系统对拍程序,其中包含c++11用法,请使用c++11标准编译。此对拍程序会在发现错误时显示错误行号以及对应内容,方便比对。

此对拍程序自动使用g++对源代码进行编译。如果出现找不到g++的错误,请将g++所在目录添加至系统的环境变量列表中;

也可直接注释掉主函数前几行不用自动编译,并将编译好的pai_data.exe(生成数据)、pai_user.exe(用户程序)、pai_std.exe(标准解答程序)放至与本程序所在同目录下。

准备就绪后编译并运行本程序即可。

UPD 2019-04-10:添加了对标程的计时。

UPD 2019-04-18:修复当文件尾没有换行时会导致错误判断的问题。

 #include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime> // 设置区
namespace Settings {
const int MAX_LEN = ; // 发现错误时,显示错误行数据的最大长度
const int CASE_CNT = ; // 对拍测试次数
const int BUFFER_SIZE = << ; // 每行的缓冲区大小
const char *const dataFile = "data.cpp"; // 随机生成数据的源代码文件名
const char *const userFile = "user.cpp"; // 需要测试的源代码文件名
const char *const stdFile = "std.cpp"; // 标准答案的源代码文件名
const char *const dataExeName = "pai_data.exe";
const char *const userExeName = "pai_user.exe";
const char *const stdExeName = "pai_std.exe";
const char *const dataOutputName = "pai_data.txt";
const char *const userOutputName = "pai_user.txt";
const char *const stdOutputName = "pai_std.txt";
} // namespace Settings using namespace Settings;
using namespace std; char cmd[BUFFER_SIZE], info[BUFFER_SIZE * ];
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE]; template <typename... T>
int run(const char *str, T... args) {
sprintf(cmd, str, args...);
return system(cmd);
} bool fileCompare(const char *stdOutput, const char *userOutput) {
FILE *fp_std = fopen(stdOutput, "r"), *fp_user = fopen(userOutput, "r");
if (fp_std == nullptr || fp_user == nullptr) {
sprintf(info, "Open file failed: %s\n", strerror(errno));
return false;
}
bool flag = true;
for (int i = ; !feof(fp_std) && !feof(fp_user); ++i) {
char *p1 = fgets(buf1, BUFFER_SIZE, fp_std);
char *p2 = fgets(buf2, BUFFER_SIZE, fp_user);
if (p1 == nullptr && p2 == nullptr) {
flag = true;
break;
} else {
int len1 = p1 ? strlen(p1) : -, len2 = p2 ? strlen(p2) : -;
if (p1 && p1[len1 - ] == '\n') p1[len1 - ] = , --len1;
if (p2 && p2[len2 - ] == '\n') p2[len2 - ] = , --len2;
if (p1 == nullptr || p2 == nullptr || len1 != len2 ||
strcmp(p1, p2)) {
if (len1 > MAX_LEN)
sprintf(p1 + MAX_LEN, "... (%d characters omitted)",
len1 - MAX_LEN);
if (len2 > MAX_LEN)
sprintf(p2 + MAX_LEN, "... (%d characters omitted)",
len2 - MAX_LEN);
sprintf(info,
"Difference found in line %d:\n std: %s\n user: %s\n",
i, p1 ? p1 : "(EOF Detected)",
p2 ? p2 : "(EOF Detected)");
flag = false;
break;
}
}
}
fclose(fp_std), fclose(fp_user);
return flag;
} int main() {
int totaltimeCnt = ;
printf("Compiling... ");
if (run("g++ %s -o %s", userFile, userExeName) ||
run("g++ %s -o %s", stdFile, stdExeName) ||
run("g++ %s -o %s", dataFile, dataExeName)) {
puts("Compile failed.");
printf("Press ENTER to exit.\n");
getchar();
return ;
} puts("Finished.");
clock_t stUser, edUser, stStd, edStd;
bool Accepted = true;
for (int i = , ret; i <= CASE_CNT; ++i) {
printf("Case %03d: ", i);
run("%s >%s", dataExeName, dataOutputName); // run std solution
stStd = clock();
ret = run("%s <%s >%s", stdExeName, dataOutputName, stdOutputName);
edStd = clock();
if (ret) {
printf("Non Zero Exit Code: Std solution returned value %d\n", ret);
Accepted = false;
break;
} // run user's solution
stUser = clock();
ret = run("%s <%s >%s", userExeName, dataOutputName, userOutputName);
edUser = clock();
if (ret) {
printf("Non Zero Exit Code: User's solution returned value %d\n",
ret);
Accepted = false;
break;
} if (!fileCompare(stdOutputName, userOutputName)) {
printf("Wrong answer.\n------------------------------\n");
printf("%s", info);
printf("------------------------------\n");
Accepted = false;
break;
} printf("Accepted. StdTime:%4d ms, UserTime:%4d ms\n",
int(edStd - stStd), int(edUser - stUser));
totaltimeCnt += int(edUser - stUser);
}
if (Accepted) {
printf("\nUser's solution got accepted after %d tests.\n", CASE_CNT);
printf("Average time spent: %.2f ms.\n",
double(totaltimeCnt) / CASE_CNT);
}
printf("Press ENTER to exit.\n");
getchar();
return ;
}

Windows系统对拍程序的更多相关文章

  1. [转]Linux/Windows下脚本对拍程序

    [新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...

  2. 手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  3. 制造测试数据的程序及对拍程序概述(Like CyaRon)

    作为一名OIer,比赛时,对拍是必须的 不对拍,有时可以悔恨终身 首先,对拍的程序 一个是要交的程序 另一个可以是暴力.搜索等,可以比较慢,但是必须正确 下面是C++版对拍程序(C++ & c ...

  4. [zt]手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  5. 对拍程序 x

    一.介绍 在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA.那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案. 所谓“对拍 ...

  6. 使用Prism6 建立 Windows 10 通用程序.

    使用Prism6 建立 Windows 10 通用程序. 目标: 使用prism6,建立Windows 通用程序项目. 1, 解决方案—添加新建项目—通用—空白应用—输入名称—确定—确定 2 ,引用上 ...

  7. 需要正确安装 Microsoft.Windows.ShellExperienceHost 和 "Microsoft.Windows.Cortana" 应用程序。

    windows 10 开始菜单修复工具 Win10开始菜单修复工具出现的原因,自从升级到Windows  10,一直BUG不断,而其中有一个BUG非常的让你印象深刻,就是开始菜单无响应,你用着用着电脑 ...

  8. windows中的程序放在linux上因为字符集不同出错

    问题 在把windows下的一个python脚本挪到linux下的时候,出现了一个奇怪的问题,就是标题那样的报错,很明显,shell没有用对应的python解释器去解释脚本,而是直接用shell解释了 ...

  9. Mac OS下编写对拍程序

    介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...

随机推荐

  1. Python爬虫实战教程:爬取网易新闻;爬虫精选 高手技巧

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. stars声明很多小伙伴学习Python过程中会遇到各种烦恼问题解决不了.为 ...

  2. Ant Design 方法默认传值,加上其他参数

    前端填坑之路Ant Design里面的一些触发方法,如OnChange,OnSelect等等,当你触发时,该时间会自动传一些值给方法. 这是Select里面的onChange调用,在红框中,他会自动传 ...

  3. Eclipse部署项目,常见几个问题解决方案

    一.java compiler level does not match the version of the inst 解决方案:(一般出现在拷贝项目) 第一步:在Eclipse环境中,鼠标右键选择 ...

  4. Unity比较常用的数据类型

    几种常见数据结构的使用情景 Array需要处理的元素数量确定并且需要使用下标时可以考虑,不过建议使用List<T> ArrayList不推荐使用,建议用List<T> List ...

  5. NIO学习笔记,从Linux IO演化模型到Netty—— 从BIO到epoll模型

    本文不涉及具体代码,只分析Linux IO演化的心路历程,学习资料来源网络,不保证一定正确,若有错误,欢迎指出. BIO 服务端创建socket(80端口),文件描述符3号. 当线程调用accept时 ...

  6. set()和get()方法

    在很多程序中,都喜欢定义一个privata变量,然后为这个私有变量加上get(),set()方法.那为什么不直接定义一个public变量呢?这样做到底有什么好处和意义呢?难道真的仅仅只是为了代码规范? ...

  7. HTML5基础-新增标签+新增属性+布局案例

    html5中常用的结构标签 article 文章 header 头部 nav 导航 section 区域 aside 侧边栏 hgroup 区块的相关信息 figure 定义一组内容及标题 figca ...

  8. CSS3中新增的对文本和字体的设置

    文字阴影 text-shadow: 水平偏移 垂直偏移  模糊 颜色 兼容性:IE10+ <!DOCTYPE html> <html lang="en" mani ...

  9. Mayor's posters POJ - 2528 线段树区间覆盖

    //线段树区间覆盖 #include<cstdio> #include<cstring> #include<iostream> #include<algori ...

  10. C++文件读写demo

    一.常用文件打开方式 二.读写文件步骤(文本文件) 1.写文件步骤 1)#include <fstream> //包含头文件 2)ofstream ofs; //创建流对象 3)ofs.o ...