⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 judge.cpp

📁 一个offlinejudge的源代码
💻 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 + -