小教程 - 编写 lemon 的 SPJ 文件 | Lucky_Glass's Blog
0%

小教程 - 编写 lemon 的 SPJ 文件

也是为了自己备忘


# 基本格式

1
2
3
4
5
#include<...> //bits/stdc++.h
using namespace std;
int main(int arc,char **fil){
return 0;
}

与平时我们写的 main 函数不同的是,它带了两个参数(当然这两个参数的命名随便你)。实际上第一个int参数没有用,重要的是 **fil 参数。

它其实是二维字符数组,总共包含 6 个字符串(lemon 只会用到 5 个),其中:

  1. fil[1] 是输入文件;
  2. fil[2] 是选手的输出文件;
  3. fil[3] 是提供的正确输出文件(因为支持SPJ,选手的输出和提供的输出可能不同,但是仍然正确);
  4. fil[5] 是输出分值的文件;
  5. fil[6] 是输出错误信息的文件;

注意到 fil[4] 是没用的

# 输入输出

然后我们可以用 C++ 的 fstream 库里的 ifstream,ofstream(文件输入流,文件输出流)来对多个文件进行输入输出。

用法如下:

1
2
3
4
5
ifstream in(inputfile); //inputfile是一个字符串(char[]),储存输入文件的路径
int num;
in>>num; //和 cin 的用法是一样的
ofstream out(outputfile); //outputfile 也是 char[],储存输出文件的路径
out<<num; //和 cout 的用法一样

那么我们可以这样实现 SPJ 的读入输出:

1
2
3
4
5
6
7
8
#include<...> //bits/stdc++.h
using namespace std;
int main(int arc,char **fil){
ifstream in(fil[1]),MYout(fil[2]),ACout(fil[3]);
ofstream score(fil[5]),info(fil[6]);

return 0;
}


# 获得结果

然后就在基础框架中加入你判断输出是否正确的代码,如果输出正确,则在 score 中输出 1,否则输出 0

由于 lemon 已经在内部决定了每个测试点的分值,那么输出 1 则代表该测试点得全分,0 则得 0 分。

如果你要提示选手是怎么答案错误的,可以在 info 中输出信息,将会在 lemon 的每个数据点的具体评测状态后显示 (...),点开就可以看到错误信息。

不要写中文,会乱码


# 简单的例子

输入数 a,b ,第一行输出 a*b,第二行输出 int 范围内任意小于 a 的数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*Lucky_Glass*/
#include<bits/stdc++.h>
using namespace std;
int main(int arc,char **fil){
ifstream in(fil[1]),MYout(fil[2]),ACout(fil[3]);
ofstream score(fil[5]),info(fil[6]);
int a,b;in>>a>>b;
int acout;ACout>>acout;
int myout;MYout>>myout;
//第一个数是确定的
if(acout!=myout){info<<"a*b wrong!";score<<"0";return 0;}
int small;MYout>>small;
if(small>=a){info<<"second answer wrong!";score<<"0";return 0;}
score<<"1";
return 0;
}


THE END

Thanks for reading!