level 2
🌟苏卡不列斯基
楼主
如何写一个Lemon的Special Judge
在OI竞赛自测中,许多教练们或者是大触们(模模模模模)都会自己出题。Lemon评测系统因为它的多线程评测和简洁,并且还能自动添加试题的功能而导致它实在是没的说,就是好用。
但是嘛,很多人不会写SPJ。不会写SPJ。不会写SPJ。(大触会的话轻喷哈)
然而教程也很少。。。这真的是坑啊,作者博客居然也是无效URL,抓狂。。。
所以这个教程就是为了让大家了解如何使用
正确的
姿势来写一个Lemon的SPJ并且使用正确的方式使用它。
·写法
首先来讲是怎么写。
在Lemon的评测系统中,与cena类似,都是用main函数中的文件名数组读入。但是具体的含义好像是不大一样。
intmain(int argc,char *argv[])
{
/*
argv[1]:输入文件
argv[2]:选手输出文件
argv[3]:标准输出文件
argv[4]:单个测试点分值
argv[5]:输出最终得分的文件
argv[6]:输出错误报告的文件
*/
}
主函数是这么用的。
然后下面贴出整个程序的.cpp代码。Java大神请无视!
【Lemon_Special_Judge.cpp】参上
#include<fstream>
#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
usingnamespace std;
ofstreamfscore,freport;
ifstreamfin,fout,fstd;
intthis_point;
stringmainception;
stringacep;
voidJudge()
{
getline(fout,mainception);
getline(fstd,acep);
if(acep!=mainception)
{
freport<<"人名都错了,你怎么算的?\n正确答案是“"<<acep<<"”\n而你却输出了“"<<mainception<<"”";
fscore<<0<<endl;
}
else
{
getline(fout,mainception);
getline(fstd,acep);
if(acep!=mainception)
{
freport<<"名字对了,但是计算出了错误。\n正确答案是“"<<acep<<"”\n而你却输出了“"<<mainception<<"”\n"<<endl<<"看在你对了一点的份上就给你1分好了。";
fscore<<1<<endl;
}
else
{
fscore<<this_point<<endl;
freport<<"完全正确,无可挑剔。"<<endl;
}
}
}
intmain(int argc,char *argv[])
{
/*
argv[1]:输入文件
argv[2]:选手输出文件
argv[3]:标准输出文件
argv[4]:单个测试点分值
argv[5]:输出最终得分的文件
argv[6]:输出错误报告的文件
*/
fin.open(argv[1]);
fout.open(argv[2]);
fstd.open(argv[3]);
fscore.open(argv[5]);
freport.open(argv[6]);
this_point=atoi(argv[4]);
Judge();
fin.close();
fout.close();
fstd.close();
fscore.close();
freport.close();
return 0;
}
标准C++的文件操作,C大触轻喷哈!
在程序中,通过调用“Judge”函数来进行得分判定,并将信息和得分输出。
当然,如果有大触想要自己写的话,请一定一定注意下面这个问题:
ofstreamfscore,freport;
ifstream fin,fout,fstd;
一定要注意啊!!!千万不能直接使用fstream定义这些变量!!!一定要区分!!!!!!我在这个坑里爬了5天才滚出来啊……
·使用方法
然后就是怎么使用的问题。
cena至少在自定义校验器选项中还告诉你选择校验器的地址。但是。。。

这什么啊!什么啊!什么啊!什么啊!什么啊!什么啊!什么啊!
就一个白色的框到底该填什么!!!!!!
后来我才发现,那个地方是这样的。
首先,把你的cpp打包成exe。
然后把它放在你的题目的目录下面。比方说,我的叫“mvp”,评测exe的名字叫“Lemon_Special_Judge.exe”。
然后你在白框里输入:“mvp\Lemon_Special_Judge.exe”
然后再去评测。你会发现,成了!



如果答案部分正确的话。。。就输出自定义的信息。

2017年01月10日 03点01分
1
在OI竞赛自测中,许多教练们或者是大触们(模模模模模)都会自己出题。Lemon评测系统因为它的多线程评测和简洁,并且还能自动添加试题的功能而导致它实在是没的说,就是好用。
但是嘛,很多人不会写SPJ。不会写SPJ。不会写SPJ。(大触会的话轻喷哈)
然而教程也很少。。。这真的是坑啊,作者博客居然也是无效URL,抓狂。。。
所以这个教程就是为了让大家了解如何使用
正确的
姿势来写一个Lemon的SPJ并且使用正确的方式使用它。
·写法
首先来讲是怎么写。
在Lemon的评测系统中,与cena类似,都是用main函数中的文件名数组读入。但是具体的含义好像是不大一样。
intmain(int argc,char *argv[])
{
/*
argv[1]:输入文件
argv[2]:选手输出文件
argv[3]:标准输出文件
argv[4]:单个测试点分值
argv[5]:输出最终得分的文件
argv[6]:输出错误报告的文件
*/
}
主函数是这么用的。
然后下面贴出整个程序的.cpp代码。Java大神请无视!
【Lemon_Special_Judge.cpp】参上
#include<fstream>
#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
usingnamespace std;
ofstreamfscore,freport;
ifstreamfin,fout,fstd;
intthis_point;
stringmainception;
stringacep;
voidJudge()
{
getline(fout,mainception);
getline(fstd,acep);
if(acep!=mainception)
{
freport<<"人名都错了,你怎么算的?\n正确答案是“"<<acep<<"”\n而你却输出了“"<<mainception<<"”";
fscore<<0<<endl;
}
else
{
getline(fout,mainception);
getline(fstd,acep);
if(acep!=mainception)
{
freport<<"名字对了,但是计算出了错误。\n正确答案是“"<<acep<<"”\n而你却输出了“"<<mainception<<"”\n"<<endl<<"看在你对了一点的份上就给你1分好了。";
fscore<<1<<endl;
}
else
{
fscore<<this_point<<endl;
freport<<"完全正确,无可挑剔。"<<endl;
}
}
}
intmain(int argc,char *argv[])
{
/*
argv[1]:输入文件
argv[2]:选手输出文件
argv[3]:标准输出文件
argv[4]:单个测试点分值
argv[5]:输出最终得分的文件
argv[6]:输出错误报告的文件
*/
fin.open(argv[1]);
fout.open(argv[2]);
fstd.open(argv[3]);
fscore.open(argv[5]);
freport.open(argv[6]);
this_point=atoi(argv[4]);
Judge();
fin.close();
fout.close();
fstd.close();
fscore.close();
freport.close();
return 0;
}
标准C++的文件操作,C大触轻喷哈!
在程序中,通过调用“Judge”函数来进行得分判定,并将信息和得分输出。
当然,如果有大触想要自己写的话,请一定一定注意下面这个问题:
ofstreamfscore,freport;
ifstream fin,fout,fstd;
一定要注意啊!!!千万不能直接使用fstream定义这些变量!!!一定要区分!!!!!!我在这个坑里爬了5天才滚出来啊……
·使用方法
然后就是怎么使用的问题。
cena至少在自定义校验器选项中还告诉你选择校验器的地址。但是。。。

这什么啊!什么啊!什么啊!什么啊!什么啊!什么啊!什么啊!就一个白色的框到底该填什么!!!!!!
后来我才发现,那个地方是这样的。
首先,把你的cpp打包成exe。
然后把它放在你的题目的目录下面。比方说,我的叫“mvp”,评测exe的名字叫“Lemon_Special_Judge.exe”。
然后你在白框里输入:“mvp\Lemon_Special_Judge.exe”
然后再去评测。你会发现,成了!



如果答案部分正确的话。。。就输出自定义的信息。