使用lemon测评系统进行Java竞赛测评

为什么80%的码农都做不了架构师?>>>   hot3.png

概述

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测评的经验。

配置编译器

  1. 通过菜单:工具->选项->切换到编译器如下所示:

使用lemon测评系统进行Java竞赛测评_第1张图片

  1. 通过点击+号,打开选择添加JDK编译器,如下所示:

使用lemon测评系统进行Java竞赛测评_第2张图片

  1. 选择javac.exe及java.exe的路径,如下所示:

使用lemon测评系统进行Java竞赛测评_第3张图片

请选择您机器的JDK安装目录,选择相应的路径。

  1. 选择后确认预览,如下所示: 使用lemon测评系统进行Java竞赛测评_第4张图片

点击完成即可添加对应的JDK编译器,如所示: 使用lemon测评系统进行Java竞赛测评_第5张图片

  1. 设置编译器运行参数 由于我们Java源码期望以UTF-8的编码格式,为了让编译器正常工作,需要为javac添加编译参数, 点击 选项页面编译器TAB页右下角的高级打开如下页面:

使用lemon测评系统进行Java竞赛测评_第6张图片

这里,我们将编译器参数(即javac的参数)的原内容后添加一个-encoding utf8以保证可以正确编译带中文的UTF-8源文件,否则会报 编译错误,原因是无法识别UTF-8 Java源文件中的中文。 至此,我们就完成了JDK编译器的设置及编译参数的设置。

新建比赛及测试点

  1. 新建比赛 新建比赛,过程可以直接参考Lemon的使用方法---小白都听得懂的最全解析 这里我们重点要说下,Java试题如何编写的问题。

  2. 新建试题 我们以一个简单的加法算法Add为例子:在data下添加一个Add文件夹,Add试题中有三个测试点每个测试点对应一个输入和一个输出, 分别对应1.in 1.out 2.in 2.out 3.in 3.out文件, 如下所示:

使用lemon测评系统进行Java竞赛测评_第7张图片

以1.in及1.out为例,输入文件中是以空格隔开的数字如:1 2 3,输出文件中是这些数字通过题目要求的加法运算后的值如 6, 这样一一对应的输入和输出就形成了一个测试点:

使用lemon测评系统进行Java竞赛测评_第8张图片

回到lemon软件页面点击    控制——>自动添加试题    导入刚刚创建的题库信息,导入时需要配置试题的分数,默认是一百分,各个测试点平分试题的分数,该值后边可以修改。

使用lemon测评系统进行Java竞赛测评_第9张图片

点击确定后页面如下所示,我们一般直接采用标准输出即可,不必采用文件输出的配置,同时比较模式建议修改为逐行比较模式(忽略多余的空格和制表符)

使用lemon测评系统进行Java竞赛测评_第10张图片

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来改卷,具体如下所示:

使用lemon测评系统进行Java竞赛测评_第11张图片

即服务端的cena及lemon都创建的比赛目录都指向相同的目录,如d:\test目录,选手机都安装cena客户端,填写好各自姓名及答题目录,答题目录都指向C:\TEST,这样就使用cena服务端进行自动收卷,将各客户端选手的答题收到c:\test\source目录下,用cena收完卷,用lemon就可以进行测评了。

转载于:https://my.oschina.net/stamen/blog/3032414

你可能感兴趣的:(使用lemon测评系统进行Java竞赛测评)