C++版测评程序
介绍
做完一道题目后,当你有一堆的测试数据,却没有用来测评的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
,按照提示输入即可测评。
结尾
如果还有其他疑问可以提在下面的评论区,我会一一解答。
如果你觉得这篇文章写的很好,记得 关注,点赞,评论,转发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?