为什么80%的码农都做不了架构师?>>>
概述
Project Lemon 是一款由国内神犇(Jia zhi peng)开发维护的开源OI评测机 - 兼容性比Cena更好,更快,更稳定。 资源:
- Google Code:https://code.google.com/archive/p/project-lemon/
- GitHub:https://github.com/Sojiv/Project_lemon
- Windows v1.2版: 度盘:http://pan.baidu.com/s/1o8sjk18 | n5m9
网上已经有很多讲解使用的教程,但基本都是介绍C或C++的,如:
- https://blog.csdn.net/OoLuoChenoO/article/details/75669563
- [https://jingyan.baidu.com/article/d621e8da5cda732865913ffa.html]
- (https://jingyan.baidu.com/article/d621e8da5cda732865913ffa.html) 本文主要介绍一下使用lemon进行Java测评的经验。
配置编译器
- 通过菜单:工具->选项->切换到
编译器
如下所示:
- 通过点击
+
号,打开选择添加JDK编译器,如下所示:
- 选择javac.exe及java.exe的路径,如下所示:
请选择您机器的JDK安装目录,选择相应的路径。
- 设置编译器运行参数 由于我们Java源码期望以UTF-8的编码格式,为了让编译器正常工作,需要为javac添加编译参数, 点击
选项
页面编译器
TAB页右下角的高级
打开如下页面:
这里,我们将编译器参数
(即javac的参数)的原内容后添加一个-encoding utf8
以保证可以正确编译带中文的UTF-8源文件,否则会报 编译错误,原因是无法识别UTF-8 Java源文件中的中文。 至此,我们就完成了JDK编译器的设置及编译参数的设置。
新建比赛及测试点
-
新建比赛 新建比赛,过程可以直接参考Lemon的使用方法---小白都听得懂的最全解析 这里我们重点要说下,Java试题如何编写的问题。
-
新建试题 我们以一个简单的加法算法Add为例子:在data下添加一个Add文件夹,Add试题中有三个测试点每个测试点对应一个输入和一个输出, 分别对应1.in 1.out 2.in 2.out 3.in 3.out文件, 如下所示:
以1.in及1.out为例,输入文件中是以空格隔开的数字如:1 2 3,输出文件中是这些数字通过题目要求的加法运算后的值如 6, 这样一一对应的输入和输出就形成了一个测试点:
回到lemon软件页面点击 控制——>自动添加试题 导入刚刚创建的题库信息,导入时需要配置试题的分数,默认是一百分,各个测试点平分试题的分数,该值后边可以修改。
点击确定后页面如下所示,我们一般直接采用标准输出即可,不必采用文件输出的配置,同时比较模式建议修改为逐行比较模式(忽略多余的空格和制表符)
Java试题类框架
为了让Lemon方便测评,同时方便选手进行作答,个人建议给每个试题都提供一个Java类模板,模板里完成从x.in文件中,并将读入的字符串值转成相应数值 类型等逻辑,仅让选手完成题目要求的算法。拿加法算法的题目来说,提供以下Java模板类:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Add {
/**
*请在该方法中作答,可以在此类中定义新的方法,但不要创建新的类,
*请自动通过单元测试验证该方法逻辑的正确性。
*/
public int answer(int[] items){
}
/**
*【注意】选手请保留这块代码不动
*/
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("Add.in");
BufferedReader in = new BufferedReader(fr);
String temp[] = in.readLine().trim().split("\\s+");
int[] items = new int[temp.length];
for (int i=0;i
这样,选手仅需要在answer(int[] items)方法中完成加法的运行即可,如下所示:
...
public class Add {
public int answer(int[] items){
int result = 0;
for (int item : items) {
result += item;
}
return result;
}
...
}
自动收试卷
和cena相比,lemon内置支持更多的编译器,如lemon支持JDK,而cena是不支持的。但lemon却没有cena的自动收试卷的功能。不过没有关系,因为收卷即是将客户端某目录下的文件统一抓取到服务端,因此我们可以使用cena来收卷,再用lemon来改卷,具体如下所示:
即服务端的cena及lemon都创建的比赛目录都指向相同的目录,如d:\test目录,选手机都安装cena客户端,填写好各自姓名及答题目录,答题目录都指向C:\TEST,这样就使用cena服务端进行自动收卷,将各客户端选手的答题收到c:\test\source目录下,用cena收完卷,用lemon就可以进行测评了。