APP下载

基于Java的考试系统对C语言程序题的考核及自动判卷功能的设计与实现

2016-05-14邵新慧李响刘成伟张晟东

中国科技纵横 2016年6期
关键词:Java语言C语言

邵新慧 李响 刘成伟 张晟东

【摘 要】在考试系统中,实现自动判卷是程序题考核设计的核心。围绕该核心,开发设计“教师端程序题模板生成工具”、“学生端答题界面”、“服务端自动判卷逻辑业务”三个子模块,以确保每一个程序题都有一个全面而准确的判卷模板与之对应,学生可以方便快捷地在可编辑区域编写代码并进行测试和提交,判卷模板和学生代码自动组合并编译成一个可执行程序,从而得到判卷得分临时数据文件,考试系统通过读取该临时数据得到判卷结果。

【关键词】考试系统 程序题 自动判卷 C语言 Java语言

随着计算机技术的发展,越来越多的考试采用上机考试的形式。对选择题、判断题这类有固定答案的考试题型的判卷是很简单的;然而,对程序题这种表述形式多样化的题型,很难通过自动判卷给出合理的分数,多数是针对某一个运行结果进行判断,未能满足根据得分点进行判卷的需求。本文通过详细介绍“教师端程序题模板生成工具”、“学生端答题界面”、“服务端自动判卷逻辑业务”三个模块的设计,阐述了程序题自动判卷、以及合理评分的解决方案,在一定程度上提升了程序题考试的可行性、以及程序题判卷的合理性。

1 自动判卷功能的设计方案

1.1 设计思路

由于考试系统的开发语言是面向对象语言Java;程序题考核所用的语言为是C语言。所以很难通过代理模式实现对C语言程序的处理。因此,可将程序题判卷从系统整体设计中独立出来,两者之间通过某个简单的数据存储建立联系。

记事本文件(设为grade.txt)可作为上述的中介数据存储,其主要用于存储学生得分记录。一方面:系统可以读取文件信息将得分记录存入数据库;另一方面:grade.txt可以通过调用java.lang.Runtime实例的exec(String command)方法运行某个可执行文件(设为judgeMain.exe)来得到。而judgeMain.exe文件、也可以通过调用exec(String command)方法对某个源文件(设为judgeMain.cpp)进行编译和链接而生成。

其中,judgeMain.cpp文件是可以实现自动判卷、并将得分纪录写入记事本的源代码文件。因此,只要获得judgeMain.cpp文件,自动判卷问题就可以得到解决。

1.2 设计方案

1.2.1 核心方案

获取judgeMain.cpp文件,使考试系统整体设计和程序题自动判卷业务逻辑相对独立,通过exec(String command)方法编译、链接、运行判卷程序。

1.2.2 judgeMain.cpp文件的获取

假设A:每个用于学生考试的考试模板都有一个与之对应的判卷模板,该判卷模板通过输出流生成一个记事本文件,并且学生在考试模板里填写的内容可以自动而正确地填写到判卷模板里。

假设B、有一个简单可用的程序题模板生成工具,通过该工具,结合某个欲要考核算法或知识点的源代码文件,能够简单快速的生成一一对应的考试模板和判卷模板。

假设C、有一个严格规范而且灵活简洁的程序题答题编译界面,既方便学生填写、编译、运行程序,而且可以准确地将学生填写区域的代码上传到服务器。

可见,假设B和C成立时,A成立,从而可获得judgeMain.cpp文件。

1.2.3 结论:开发以下两个模块支撑自动判卷实现

(1)教师端程序题模板生成工具;(2)严格而便捷的学生断答题界面。

1.2.4 根据以上分析,自动判卷模板的原理可用图1来描述

2 教师端程序题模板生成工具

2.1 功能实现

为实现程序题自动判卷功能,设计程序题模板生成工具,并让其实现以下功能:导入一个源文件, 生成一一对应的考试模板、判卷模板,并为生成的考试、判卷模板提供浏览、测试功能,以便及时修改和调整。

2.2 设计方法

2.2.1 对导入源文件预处理

对源文件以注释的形式添加一些特殊标记,通过识别这些特殊标记对源代码自动修改或增添。例如:

//code_fosOpen 开文件流标记,在判卷模板中自动增加定义记事本文件的输出流代码;

//code_fosClose 关文件流标记,在判卷模板中自动增加关闭文件流和释放内存代码;

//code_judge 判卷变量标记,设置得分点;

//code_delete 挖空行标记,所设置行变为下划线;

//edit_function 编辑函数标记,设置函数,由学生编写函数体;

//code_resetInstance 修改用例标记,为判卷模板和考试模板设置不同的测试用例。

2.2.2 判卷函数头文件、静态库文件

功能:在判卷模板中将考生答案和正确答案进行对比。

文件描述:

(1)头文件(compare.h),文件内容如右图。(2)静态库文件(compare.lib),为compare.h中声明的方法提供具体实现。

文件引用:

#include"compare.h"

#pragma comment(lib,"compare.lib")

2.2.3 模板生成工具设计

针对1中的不同标记,该工具会自动生成相应的按钮,通过点击按钮和简单的设置生成判卷、考试模板:

(1)判卷模板。点击按钮实现函数体编写、代码段填空、判卷变量的选择,通过对判卷变量正确值的设置、以及判卷代码插入位置的设置,可预览、测试、生成判卷模板。

(2)考试模板。在判卷模板设置的基础上,通过对测试用例进行修改,可预览、测试、生成考试模板,并具有相应题目说明文件的编写功能。

2.3 原理解释与图解

现结合一个简单的例子对模板生成工具的原理进行解释,并用图解展示:

第一步:选择载入用于生成考试、判卷模板的.cpp源文件,然后根据按钮提示,选择挖空行、编辑函数、判卷变量等,并根据提示进行必要的设置(见图3)。

附:为便于说明问题,此处以一个求取平方数的简单程序为例,本例中只有一个判卷变量(对应一个得分点)的设置,对于较复杂的程序,可以设置多个得分点。

第二步:点击“预览”菜单对将要生成的判卷模板进行预览,初步查看是否正确,然后点击“测试”菜单选择对判模板进行自动编译运行,若正常运行,转步骤三;若失败,根据编译运行的错误提示,返回步骤一进行修改设置。

第三步:点击“生成”菜单,选择保存位置,即可生成判卷模板(见图4)。

第四步:进行用例修改,修改后的用例用于生成学生考试模板(见图5)。

第五步:预览、测试运行,最终生成考试模板,并根据运行结果编写题意说明文件(见图6,图7)。

3 学生端答题界面

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的基础上进行如下改进:

通过倒计时线程启动判卷程序,倒计时线程结束后,若判卷程序还在运行,则杀死,并将异常记录写入数据库。

逻辑图如下(图12)。

4.2 评分过程

在考试、判卷模板制作过程中,可以根据每个题目的实际情况设计判卷(得分)变量,并针对每一个判卷变量考核知识点难度设置得分权重(学生不知道具体的得分变量和权重)。然后,将学生上传的代码插入到判卷模板中,生成judgeMain.cpp,针对每个得分点都会调用compare函数比较学生答案和标准答案,得到一个布尔型返回值,然后根据这个返回值在记事本文件(grade.txt)里写入1(得分)或0(不得分)。

该自动判卷程序可满足对一个程序题进行细节得分点的判断,而不是笼统的仅仅判断最终答案,在一定程度上保证了给分的合理性。

5 结语

通过上述方案设计的程序题考核与判卷模块,是东北大学数值分析考试系统(可通过程序题考核学生对数值算法的理解与应用能力)的重要组成部分,该考试系统的测试结果和初期使用情况证明:对于程序题考核和自动判卷,这样的设计方案是可行的、对判卷过程中的常处理是可行的,最终判卷结果是合理的。

参考文献:

[1]申田静.国内在线考试系统研究综述[J].中国教育技术装备,2015(14):19-21.

[2]冯山,许毅,朱大勇.Visual C++集成开发环境中编译链接中间文件的管理及其空间回收.四川师范大学学报:自然科学版,2003,26(2):205-208.

[3]高洪岩. Java多线程编程核心技术.北京:机械工业出版社,2015.

作者简介:邵新慧(1970—),女,山东青岛人,副教授,博士,教师,数值代数理论与应用研究。

猜你喜欢

Java语言C语言
基于Visual Studio Code的C语言程序设计实践教学探索
基于C语言的计算机软件编程
C语言程序设计课程教学与学科专业相结合的探索
基于Android平台的健康医疗APP设计与开发
高职高专院校C语言程序设计教学改革探索
计算机软件开发中的JAVA编程语言分析
用户隐私保护之手机密码保险箱
论子函数在C语言数据格式输出中的应用
非计算机专业C语言教学探讨