📄 judge.cpp
字号:
/*
AppName: OfflineJudge 1.0beta(离线评测系统)
Usage:
@param 1: cpp文件名(必需)
@param 2: .in文件所在目录(可选,默认为.\test)
@param 3: .out文件所在目录(可选,默认为.\answer)
@return: 见namespace Error
*/
#include<ctime>
#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<io.h>
using namespace std;
//----- BEGIN Configration
//common settings
namespace Settings{
const static char* Title="Offline Judge 1.0beta\n\tPowered by Acumon(踏雪赤兔).\n";
const static char* DefaultInPath=".\\test"; //默认测试数据路径
const static char* DefaultStdPath=".\\answer"; //默认标准输出数据路径
const static char* DefaultInExt=".in"; //默认测试数据扩展名
const static char* DefaultStdExt=".out"; //默认标准输出数据扩展名
const static double TimeLimit= 1.0; //限时
const static int bufLen= 1024; //缓冲区大小
const static char* GppParam="-o _judge -ansi -fno-asm -O2 -Wall -lm --static -DONLINE_JUDGE";//g++编译器参数
}
//return value and return string
namespace Error{
//return value
const static int NoError=0;
const static int TooFewParam=1;
const static int TooManyParam=2;
const static int NoCppFile=3;
const static int NoInputFile=4;
const static int NoStandardFile=5;
//output string
const static char* TooFewParamMsg="Error: Too few parameters\nUsage: judge [cppfilename] [.in path] [.out path]";
const static char* TooManyParamMsg="Error: Too many parameters\nUsage: judge [cppfilename] [.in path] [.out path]";
const static char* NoCppFileMsg="Error: No such .CPP file";
const static char* NoInputFileMsg="Error: No .IN file";
const static char* NoStandardFileMsg="Error: No .OUT file";
}
// judge output string
namespace Result{
const static char* CE="Result: Compile Error";
const static char* RTE="Result: Runtime Error";
const static char* TLE="Result: Time Limit Exceeded";
const static char* WA="Result: Wrong Answer";
const static char* PE="Result: Presentation Error";
const static char* AC="Result: Accepted";
}
//----- END Configration
class Timer{ //封装clock()函数
public:
void reset(){
beginClock=clock();
}
double get(){
return double(clock()-beginClock)/CLOCKS_PER_SEC;
}
Timer(){
reset();
}
private:
time_t beginClock;
};
int main(int argc, char** argv){
//参数检查
if(argc<2){
puts(Error::TooFewParamMsg);
return Error::TooFewParam;
}
if(argc>4){
puts(Error::TooManyParamMsg);
return Error::TooManyParam;
}
puts(Settings::Title);
//参数设定
const char* cpp_name=argv[1]; //待测cpp文件名
const char* in_path= argc>=3 ? argv[2] : Settings::DefaultInPath;
const char* std_path= argc>=4 ? argv[3] : Settings::DefaultStdPath;
const char* in_ext=Settings::DefaultInExt;
const char* std_ext=Settings::DefaultStdExt;
char buf[Settings::bufLen];
int cmdReturn;
//编译CPP
puts("Compiling...");
sprintf(buf, "g++ \"%s\" %s",cpp_name, Settings::GppParam);
cmdReturn=system(buf);
// CE
if(cmdReturn==1){
puts(Result::CE);
return Error::NoError;
}
putchar('\n');
// run
bool fail=false;
_finddata_t test_in,tmp; //保存找到文件的结构,有name属性,见io.h
int hFile;
sprintf(buf, "%s\\*%s", in_path,in_ext);
hFile = _findfirst(buf,&test_in);
if(hFile==-1){
puts(Error::NoInputFileMsg);
return Error::NoInputFile;
}
do{
printf("Testing file:%s\n", test_in.name);
Timer timer;
sprintf(buf,"_judge < %s\\%s > _judge.out", in_path, test_in.name);
cmdReturn=system(buf);
double duration=timer.get();
printf("Time used: %lf second(s)\n", duration);
if(duration>Settings::TimeLimit){
printf("%s\n\n", Result::TLE);
fail=true;
}else{
//比较输出文件
char std_out[Settings::bufLen]; //std文件名
sprintf(std_out,"%s\\%s ", std_path, test_in.name);
memcpy(strstr(std_out,in_ext),std_ext,strlen(std_ext)); //更改后缀名:.in→.out
if(_findfirst(std_out,&tmp)==-1){
puts(Error::NoStandardFileMsg);
system("del _judge.out");
system("del _judge.exe");
return Error::NoStandardFile;
}
sprintf(buf,"fc %s _judge.out >fc.out",std_out);
cmdReturn=system(buf);
if(cmdReturn==1){ //不相等
//删除空白再比较文件
sprintf(buf,"fc/w %s _judge.out >fc.out",std_out);
cmdReturn=system(buf);
if(cmdReturn==0){
printf("%s\n\n",Result::PE);
fail=true;
}else{
printf("%s\n\n",Result::WA);
fail=true;
}
}else{
printf("%s\n\n",Result::AC);
}
system("del _judge.out");
system("del fc.out");
}
}while(_findnext(hFile,&test_in)!=-1);
system("del _judge.exe");
puts(fail ? "Wrong on some case(s). >_<" : "Nice performance! ^_^");
return Error::NoError;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -