ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++版测评程序

2022-09-13 20:36:18  阅读:196  来源: 互联网

标签:测评 int 程序 C++ lans 测试数据 printf fprintf include


目录

介绍

做完一道题目后,当你有一堆的测试数据,却没有用来测评的OJ,就只能一个数据一个数据的测试时,你的心态一定是崩的,所以需要我们自己来编写一个测评程序,批量进行测评,有助于加快测评速度。

代码(judge.cpp

其实代码很简单,很通俗易懂,萌新应该都看得懂

#include<cstdlib>
#include<iostream>
#include<string>
#include<cstring>
#include<ctime>
#include<cstdio>
#include<cmath>
#include<windows.h>  //这里写了一堆头文件,虽然除了一个以外都可以使用万能头文件,但是拒绝万能头文件从我做起
using namespace std;
int cw(int a){   //一个拆位函数
	int ans=0;
	while(a>0){
		ans++;
		a/=10;
	}
	return ans;
}
int main(){
	string name,in=".in",outans,out=".out",exe=".exe",exefile=".exe",infile=".in",outfile=".out",ansfile=".csv";  //现将需要用到的文件后缀名写好,方便后期使用
	int g,gn,n,fen,ff=0,flag1=0,flag2=0;
	double TT=0.0;  //这里的TT记录每个测试点中所用的最大时长,用双精度浮点数提高精度
	printf("请输入题目名:");
	cin>>name;
	printf("请输入测试数据中输出文件的后缀名(ans / out):");  //有些题目的测试数据中的输出文件的后缀名是'.out'但有些是'.ans'
	cin>>outans;
	outans.insert(0,".");
	printf("请输入测试数据末尾数字格式:1.题目名后直接加数字没有0补位  2.题目名后加数字有0补位  (输入编号1/2即可): ");  //有些测试数据是题目名直接加数字,比如'name1.in',而有些测试数据是题目名后加数字且有0补位,比如'name001.in'
	scanf("%d",&g);
	printf("请输入测试数据个数:");
	scanf("%d",&n);
	int wn=cw(n)
	printf("请");
	while(g==2){
		printf("输入补位后数字总位数:");
		scanf("%d",&gn);
		if(wn>=gn)
			break;
		printf("位数过少,至少%d位\n请重新",wn); 
	}
	exefile.insert(0,name);
	infile.insert(0,name);
	ansfile.insert(0,name);
	outfile.insert(0,name);
	fen=100/n;   //此处记录一个测试数据多少分
	FILE* lans=fopen(ansfile.c_str(),"w");  //这里程序还会把测评结果保存到csv表格中
	fprintf(lans,"编号,结果,用时(s),得分\n");
	string cmd2="del ",cmd4="del ";
	for(int i=1;i<=n;i++){
		string cmd1="copy ",cmd3="fc ";
		cmd1+=name;
		cmd3+=outfile;
		cmd3+=" ";
		cmd3+=name;
		switch(g){      //这个switch中是分别加上in和out/ans文件中的数字
			case 1:{
				if(i<10){
					cmd1+=char(i+'0');
					cmd3+=char(i+'0');
				}
				else if(i<100){
					cmd1+=char(i/10+'0');
					cmd1+=char(i%10+'0');
					cmd3+=char(i/10+'0');
					cmd3+=char(i%10+'0');
				}
				else if(i<1000){
					cmd1+=char(i/100+'0');
					cmd1+=char((i/10)%10+'0');
					cmd1+=char(i%10+'0');
					cmd3+=char(i/100+'0');
					cmd3+=char((i/10)%10+'0');
					cmd3+=char(i%10+'0');
				}
				else if(i<10000){
					cmd1+=char(i/1000+'0');
					cmd1+=char((i/100)%10+'0');
					cmd1+=char((i/10)%10+'0');
					cmd1+=char(i%10+'0');
					cmd3+=char(i/1000+'0');
					cmd3+=char((i/100)%10+'0');
					cmd3+=char((i/10)%10+'0');
					cmd3+=char(i%10+'0');
				}
				break;
			}
			case 2:{
				for(int j=gn-1;j>=0;j--){
					int gog=pow(10,j);
					cmd1+=char((i/gog)%10+'0');
					cmd3+=char((i/gog)%10+'0');
				}
				break;
			}
		}
		cmd1+=in;
		cmd1+=" ";
		cmd1+=infile;
		cmd3+=outans;
		fprintf(lans,"%d,",i);
		int time1,time2;
		double T;
		system(cmd1.c_str());
		time1=clock();
		system(exefile.c_str());
		time2=clock();
		T=double((double(time2)-double(time1))/1000.0);
		TT=T>TT?T:TT;
		if(T>1.0)   //这里判断次测试点是否超时(默认时间限制1s,可自行修改)
			fprintf(lans,"TLE,%.3lf,%d\n",T,0),printf("TLE,%.3lf,%d\n",T,0),flag2=2;
		else if(!system(cmd3.c_str()))   //如果没有时间超限则判断输出是否正确
			fprintf(lans,"AC,%.3lf,%d\n",T,fen),printf("AC,%.3lf,%d\n",T,fen),ff+=fen;
		else
			fprintf(lans,"WA,%.3lf,%d\n",T,0),printf("WA,%.3lf,%d\n",T,0),flag1=1;
	}
	cmd2+=infile;
	cmd4+=outfile;
	system(cmd2.c_str());
	system(cmd4.c_str());
	fprintf(lans,"总结果,");
	if(flag1==0&&flag2==0)   //最后输出一行总结果
		fprintf(lans,"AC,");
	else if(flag1==1&&flag2==0)
		fprintf(lans,"WA,");
	else if(flag2==2)
		fprintf(lans,"TLE,");
	fprintf(lans,"%.3lf,%d",TT,ff);
    fclose(lans);
	return 0;
}

注:C++暂时不支持获取运行内存,所以不能判断内存超限,而且既然可以测评说明编译不会错,所以也不能判断是否编译错误

怎么样,是不是非常的通俗易懂(bushi)

那我来讲一下使用说明吧!

使用说明

把上面这串代码编译后的文件(judge.exe)放进在带有测试数据(.in .out/.ans)的文件夹,把你写的代码编译好的文件(.exe)(注意 :你的程序需要用加上freopen,输入文件名为 题目名+.in ,输出文件名为 题目名+.out ,更多有关内容可自行搜索)也放在那个文件夹里面,然后运行judge.exe,按照提示输入即可测评。

结尾

如果还有其他疑问可以提在下面的评论区,我会一一解答。

如果你觉得这篇文章写的很好,记得 关注,点赞,评论,转发

标签:测评,int,程序,C++,lans,测试数据,printf,fprintf,include
来源: https://www.cnblogs.com/wutongxue132/p/16690692.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有