基于Java语言的主观编程题考试系统设计

2021-04-20 02:23娄自婷
电子技术与软件工程 2021年2期
关键词:参考答案代码编程

娄自婷

(云南国土资源职业学院 云南省昆明市 652501)

1 引言

现在的期末考试中,很多大中专院校都使用了在线考试系统进行考试,该系统不仅可以提高学生实践操作能力,做到将理论与实践相结合;同时,通过该系统老师也可以更便捷、高效、快速地对学生的考试成绩进行汇总、整理及分析。但是大多数在线考试系统都只是基于选择题、判断题、填空题等客观题目,很少有主观题目。而《JAVA 程序设计》课程是高职院校计算机专业的必修基础课程,该课程主要培养学生动手编写程序的能力,因此,编程题在期末考试中占了很大的比例。但由于现阶段对主观编程题的技术还不成熟,所以该课程大部分采用的还是人工阅卷。因此,研究如何用计算机实现主观题自动评分具有较大的现实意义[1]。

2 Java编程题自动评分技术研究

2.1 主观编程题评分算法

早在1966年,就有外国学者Ellis Pagc 对文本相似度检测进行了研究,提出了让计算机同人工阅卷一样对主观题如作文进行评阅。在对自然语言的文本分析处理方法的研究同时,随着计算机教育的普及,程序代码的检测也在逐渐兴起。目前使用比较广泛的是Online Judge(OJ)在线判题系统,该系统通过对用户提交的代码进行编译和运行,对于能够运行的程序通过预先设定的测试集来检测代码运行的结果,以及运行时间是否在规定范围之内。该系统采用的是动态评分方式,返回结果有七种:答案不完全正确,运行超出时间限制,超出内存限制,输出超出限制,运行时出错,编译出错,程序通过,根据不同结果给予分值。

国内学者对主观编程题自动评分技术也做了大量的研究,并取得了很好的效果。2010年,娄不夜提出了一种基于反射机制、以class 文件为判断对象的java 编程题自动评分技术[1]。2013年,郑燕娥融合了程序查错及局部纠错技术、基于反射机制的黑盒测试技术、知识要点的正则表达式匹配评分技术,实现了Java 编程题自动评分[2]。2016年,曹亚妮针对C 语言设计了动态测试方法和静态分析方法相结合的编程题自动评分模型,其中动态测试方法采用黑盒测试对程序运行结果进行检查,并对程序结构的可信度进行判定,静态分析在代码规范化及代码预处理的基础上使用基于字符串相似度算法进行自动评分[3][4]。2018年,蒋慧勇提出了一种基于Java 反射机制的自动评分模型,该技术首先读取考试题中考生写的程序源代码,然后调用Java 反射机制对程序进行编译执行,并将执行结果读取放入内存,参考答案保存在XML 文档中,不同答案的组合分数不同,实现需要确定组合类型和对应分数,然后将规则写成正则表达式[5]。2019年,李震等人提出了通过比较运行结果、Findbugs 分析、文本相似度分析、关键词分析四个评分模块对代码进行评价。同样分为动态测试与静态分析,首先通过编译运行代码,将结果与参考答案进行比较,然后采用Findbugs 对代码进行静态分析,找出其中的潜在错误和不规范的编程习惯引起的警告,根据问题个数和错误等级给出分值。同时配合文本相似度分析,关键词分析得出一个综合评分。静态分析工具Findbugs 的引入对发现潜在问题,减少人工预置答案的局限性,提高了系统可用性[6]。

基于上述研究,本文提出一种使用静态分析与动态模拟执行代码相结合,适用于简单的主观编程题的自动评分技术,并就此设计并实现了完整的自动评分考试系统,为高职院校其他语言的编程题考试系统设计也提供了参考与借鉴。

2.2 正则表达式

在程序设计语言考试中,对于编程题而言,要实现某个功能方法可能存在很多种,因为很难用一个简单的 文本作为标准答案给分。如果指定特定的解题方法,则会存在局限性,限制考生思维,自动评分与人工评阅的误差也会增大。而是用正则表达式可以描述多种解题方法,既简单有方便,且正则表达式在文本匹配方面的功能强大、灵活而且高效[2]。

正则表达式是对某种字符串模式规则的描述,是由普通字符(英文字母及数字等)以及元字符组成的文字模式。它是一种可以用于字符串模式匹配和替换的强有力的工具[2]。在Java 中,正则表达式的字符串匹配需要通过java.util.regex 包中的Pattern 和Matcher 两个类来实现,其中Pattern 类是编译一个正则表达式的模式对象,Matcher 类是搜索是否匹配的匹配器对象[5]。元字符在正则表达式中的作用非常重要,其构造的准确性主要取决于元字符的应用是否合理。Java 正则表达式常用的元字符如表1所示。

表1:正则表达式常用的元字符

在Java 程序中,“”表示转义字符,“\”意味着正在插入一个正则表达式斜杠,那么随后的字符具有特殊意义。比如,“d”表示数字字符,那么在Java 中“\d”就表示正则表达式中的“d”[2]。

3 基于Java语言的主观编程题自动评分系统实现

为了验证自动评分技术的合理性和准确性,本人构建了一个原型系统。该系统开发使用了Eclipse 平台和MySQL 数据库。系统前端采用jsp + JavaScript + css 的组合技术开发,使用了jQuery 和bootstrap 框架,后端采用SpringBoot 框架实现。

3.1 总体设计思路

系统分为学生端与管理员端,学生端功能有:注册、登录、开始考试、查看成绩;管理员端有登录、学生管理(新增、修改、删除、查询)、学生试卷管理(查询、阅卷)、学生成绩管理(查询、删除)。数据库包括管理员表admin、学生成绩表performance、学生信息表student、学生试卷回答表student_answer。

学生考卷包括单选题、判断题、填空题和编程题四个部分。系统核心功能是使用静态分析与动态模拟执行代码相结合,完成编程题自动评分。其主要思想是:首先采用动态模拟执行代码,将考生答案转换为java 文件进行编译,能通过编译运行的结果与参考答案匹配,如果匹配成功或部分数据正确,使用正则表达式对核心代码进行再次匹配,根据二次匹配的结果给出分值;若编译运行的结果与参考答案不匹配,将源代码中的类、主方法、核心代码进行正则匹配,根据二次匹配的结果给出分值。

3.2 运行界面

学生提交试卷后,管理员在“学生考试管理”界面可查看到所有提交试卷学生名单,如图1所示。点击操作下“详情”按钮,可进入该生试卷详情界面,如图2所示。考试详情界面由试题、每道试题自动评分结果、参考答案和学生答案,各模块总分及总得分、提交按钮组成。该系统保留了修改分数的功能。

下面以一个for 循环输出1~100 之间的所有偶数程序为例。参考答案如下所示:

该考生程序存在一个语法错误,输出语句、变量名称与参考答案有细微区别但无误,系统首先采用动态模拟执行代码,无法得到运行结果,因此进行静态分析,使用正则表达式进行二次匹配。该题满分为10 分,知识要点分为5 个得分点,for 循环中三个表达式每个为2 分,if 语句为3 分,输出语句为1 分。用正则表达式对这5 个得分点进行描述,具体如下:

第一个得分点:[\s\S]*int [a-zA-Z]+\s*=\s*1;[\s\S]*

第二个得分点:[\s\S]*[a-zA-Z]+\s*<=\s*100;[\s\S]*

第三个得分点:[\s\S]*[a-zA-Z]+\s*\+\+[\s\S]*

第四个得分点:[\s\S]*if\s*\([a-zA-Z]+\s*%\s*2\s*==\s*0\)\s*\{[\s\S]*

第五个得分点:

[\s\S]*System\.out\.print(ln)?\([a-zA-Z]+\s*(\+\s*\"\W+\")?\);[\s\S]*

根据学生结果,语法应扣3 分。经过自动评分,得到学生评分结果为7 分,符合人工评阅结果。系统评分界面如图3所示。

试题详情界面可以针对自动评分结果进行二次人工阅卷,也可直接点击提交。提交之后管理员可进入“学生成绩管理”中查看总分数及各模块得分,如图4所示。此时学生也可再次进入考生系统查看考试分数。

3.3 系统测试及结果分析

考虑到学生答案存在多样性和差异性,本文针对以上编程题抽取了一个班级共50 份考卷,除正确答案外,有11 个存在明显语法错误和差异语句的考生答案。现对这11 个考生答案进行系统评分与人工评分比较,结果见表2,其中与人工评阅的误差指的是系统评分结果与人工评阅结果的差值。

表2:系统评分与人工评分结果及误差值

通过上述实验结果可以看出,系统评分结果与人工评阅结果存在一定的误差值,但是误差都在1 分以内,误差均值控制在0.545,符合自动评分标准。其余编程题通过系统的实现,也满足实用性、合理性、高效性原则。该系统不仅能减轻教师负担,还使系统计算的学生答案得分更具公平性和合理性,也为学生及时得到反馈结果提供可能。

4 结论

本文提出了一种基于Java 语言的主观编程题自动评分技术,采用动态模拟与静态分析相结合的方法,首先将考生答案保存为可编译的java 文件,判断程序是否可以编译运行,如果运行成功则返回运行结果,并与参考答案匹配,如果匹配成功或部分数据正确,使用正则表达式对核心代码进行再次匹配,根据二次匹配的结果给出分值,二次匹配的目的是检查考生的功能语句是否符合题目要求;若编译运行的结果与参考答案不匹配或无法运行,将源代码中的类、主方法、核心代码进行正则匹配,根据二次匹配的结果给出分值,这样做可以减少系统自动评分与人工评分的误差值,但也增加了正则表达式的设计难度。实验表明,该考试系统运行良好,自动评分结果与人工评阅结果误差较小,具有较高的准确率。且该系统保留了人工修改分数的功能,对实现上机考试具有一定的参考价值。

图1:学生考试管理界面

图2:试卷详情界面

图3:xx 学生编程题评分界面

图4:学生成绩管理界面

猜你喜欢
参考答案代码编程
编程,是一种态度
编程小能手
纺织机上诞生的编程
创世代码
创世代码
创世代码
创世代码
参考答案
参考答案