也是为了自己备忘
# 基本格式
1 |
|
与平时我们写的 main 函数不同的是,它带了两个参数(当然这两个参数的命名随便你)。实际上第一个int参数没有用,重要的是 **fil
参数。
它其实是二维字符数组,总共包含 6 个字符串(lemon 只会用到 5 个),其中:
fil[1]
是输入文件;fil[2]
是选手的输出文件;fil[3]
是提供的正确输出文件(因为支持SPJ,选手的输出和提供的输出可能不同,但是仍然正确);fil[5]
是输出分值的文件;fil[6]
是输出错误信息的文件;
注意到
fil[4]
是没用的
# 输入输出
然后我们可以用 C++ 的 fstream 库里的 ifstream,ofstream
(文件输入流,文件输出流)来对多个文件进行输入输出。
用法如下:1
2
3
4
5ifstream 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
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*/
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;
}