3.1 功能要求 为严格保证自动判卷的实现,同时满足学生方便答题需求,学生端答题界面须满足如下功能要求: (1)无需启动客户端编译器,学生直接在答题界面的可编辑区域编写代码,其他区域的代码无法修改;(2)具有便捷的编译运行程序的功能,并提示编译或运行错误;(3)学生编写的函数体和填写的代码段可准确无误上传至服务端。 3.2 实现方法要点 3.2.1 答题界面 (1)将题意说明和不可修改的源代码部分显示为只读;(2)识别考试源代码中的“//添加函数实现代码”字段,以及填空标记下划线 “_________________”,将对应区域设置为可编辑;(3)在可编辑区域对应的控制程序中添加键盘监听:实现对括号、引号的自动配对,以及 换行时提供自动缩进,为学生快速编写格式规范的代码提供方便。 3.2.2 编译运行 通过java.lang.Runtime实例的exec(String command)方法,启动独立进程调用编译和链接命令,并获取该进程的输入流,提取编译链接过程中的错误信息,实现编译错误提示;若编译正确,则运行程序。 3.2.3 上传代码 由于仅提取学生编写的函数题代码和学生填空代码段,只需提取可编译区域的文本记录即可,而且信息量小,因此可采用一般socket通信的形式(不用文件上传等形式)将代码段上传至服务端。 3.3 例子与图解 (1)将2中得到的考试模板和题意说明文件用于学生考试端程序题考试(如图8); (2)在函数编写区域编写代码,将填空横线删除并填写代码,然后直接点击编译运行(图9)。 (3)根据错误提示修改代码,重新编译运行(图10)。 (4)点击交卷后,学生编写的函数体和填空代码行上传至服务器(图11)。 4 服务端自动判卷逻辑业务 4.1 自动判卷业务设计 基于模板生成工具、学生答题客户端的设计和实现,自动判卷逻辑业务设计如下: (1)一般情况下:只需把学生上传的答题信息写入相应的判卷模板中,然后生成临时判卷源文件,针对这个临时文件编译运行即可得到判卷结果。 (2)异常情况:如果学生提交的程序没来得及调试正常而存在死循环,需要在A的基础上进行如下改进: 通过倒计时线程启动判卷程序,倒计时线程结束后,若判卷程序还在运行,则杀死,并将异常记录写入数据库。 |