Windows系统对拍程序
Posted sandychn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows系统对拍程序相关的知识,希望对你有一定的参考价值。
Windows系统对拍程序,其中包含c++11用法,请使用c++11编译。
此对拍程序自动使用g++对源代码进行编译。如果出现找不到g++错误,请将g++所在目录添加至系统的环境变量列表中。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <ctime> 5 6 // 设置区 7 namespace Settings { 8 const int MAX_LEN = 20; // 当发现错误时,显示错误行数据的最大长度 9 const int CASE_CNT = 100; // 测试次数 10 const int BUFFER_SIZE = 1 << 10; // 每行的缓冲区大小 11 const char *const testFile = "1.cpp"; // 需要测试的源代码文件名(相对路径) 12 const char *const stdFile = "2.cpp"; // 标准答案的源代码文件名(相对路径) 13 const char *const dataFile = "3.cpp"; // 随机生成数据的源代码文件名(相对路径) 14 } 15 16 using namespace Settings; 17 using namespace std; 18 char cmd[BUFFER_SIZE], info[BUFFER_SIZE]; 19 char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE]; 20 21 template <typename ...T> 22 int run(const char *str, T ...args) { 23 sprintf(cmd, str, args...); 24 return system(cmd); 25 } 26 27 bool fileCompare(const char *stdOutput, const char *userOutput) { 28 FILE *fp_std = fopen(stdOutput, "r"), *fp_user = fopen(userOutput, "r"); 29 if (fp_std == nullptr || fp_user == nullptr) { 30 perror(nullptr); 31 return false; 32 } 33 for (int i = 1; !feof(fp_std) && !feof(fp_user); ++i) { 34 char *p1 = fgets(buf1, BUFFER_SIZE, fp_std); 35 char *p2 = fgets(buf2, BUFFER_SIZE, fp_user); 36 if (p1 == nullptr && p2 == nullptr) { 37 return true; 38 } else if (!p1 || !p2 || strcmp(p1, p2)) { 39 sprintf(info, 40 "Difference found in line %d: std: %.*s user: %.*s", 41 i, MAX_LEN, p1 ? p1 : "(EOF Detected) ", 42 MAX_LEN, p2 ? p2 : "(EOF Detected) "); 43 break; 44 } 45 } 46 return false; 47 } 48 49 int main() { 50 printf("Compiling... "); 51 run("g++ %s -o test.exe", testFile); 52 run("g++ %s -o std.exe", stdFile); 53 run("g++ %s -o data.exe", dataFile); 54 printf("Finished. "); 55 clock_t st, ed; 56 for (int i = 1; i <= CASE_CNT; ++i) { 57 printf("Case %03d: ", i); 58 run("data.exe >data.txt"); 59 run("std.exe <data.txt >std.txt"); 60 st = clock(); 61 run("test.exe <data.txt >test.txt"); 62 ed = clock(); 63 if (!fileCompare("std.txt", "test.txt")) { 64 printf("Wrong Answer. ------------------------------ "); 65 puts(info); 66 printf("------------------------------ Note: At most %d characters will be shown for both lines. ", MAX_LEN); 67 printf("Press anykey to exit. "); 68 getchar(); 69 break; 70 } else { 71 printf("Accepted. Time: %dms. ", int(ed - st)); 72 } 73 } 74 return 0; 75 }
以上是关于Windows系统对拍程序的主要内容,如果未能解决你的问题,请参考以下文章