APP下载

基于人工评分思路的C语言自动评分算法研究

2020-06-02李建华许芝卉

关键词:静态语义程序

李建华,许芝卉*

(山西大同大学数学与统计学院,山西大同 037200)

C 语言是高级程序设计语言,是各高校中理工科的一门必修课,也是计算机等级考试的科目之一。C语言的编程题如果能够用计算机自动评分的话,那么对学生编程练习自评以及利用计算机实现无纸化考试都具有十分重要的意义。因此,各种自动评分系统也应用而生。动态测试评分法是目前较多在线测试系统中用到的评分方法,其前提是程序能运行成功,程序编译失败或运行结果不匹配等情况都以0分处理[1-3]。这种评分方法对学生的学习考察存在着片面性。我们知道C 语言毕竟是语言类,用它编程和我们用汉语言写作一样,存在着多样性。这样由于学生编写的源代码存在着多样性,以及现有的技术对程序的理解度、语义分析的准确度还不是很成熟等原因,评分的细节及准确性会受到影响。

那么,如果为了迎合评分软件的功能,对于程序设计题规定算法结构,这样就背离了此类试题考核的初衷,也不符合程序设计的灵活多样性特征。语言类课程教学的最终目的就是培养学生的实际应用能力,然而面对纷繁复杂的现实问题,不同学生对于同一个问题的解答结果也是不尽相同的。因此,没有必要也不应该强求答案的一致性,这就给计算机自动评分带来很大困难。

目前针对程序主观题的自动评分方法主要分为两类:静态分析和动态测试。这两种方法各有利弊。动态测试实现起来简单快速,但局限性强,只能处理程序完整的题目,结果只是满分或零分两种情况,不能按步骤给分;静态分析与人工阅卷评分方式较为贴近,可以按照程序步骤给分,这样也就可以适用于绝大多数程序题的自动阅卷。然而静态分析通常需要完备答案库,才可能使学生的多样化答案找到匹配答案。所以这会出现本来答案正确但是没匹配到答案的情况,导致不能完全保证评分正确。针对这些问题,提出一种基于人工评分思想的评分算法,从实际出发,采用静态分析、动态测试相结合的方法进行自动评分,尽可能减少错误批改,客观公正地给出考试成绩。

1 自动评分系统设计思想

教师在人工评分时会将学生编写的程序与试卷标准答案进行比对,如果与标准答案的结果一样就会给出满分。如果学生编写的代码与所有的备案答案都不完全一样,教师会根据评分标准按知识点给分。正是参考人工阅卷的这种方式来解决自动阅卷的难点问题。

先用动态测试评分方法来测试。动态测试的过程是将源程序进行预处理和编译,然后检测是否生成相应的可执行文件[4-5]。动态测试记录程序运行时的编译结果与运行结果,如果编译成功,并且结果运行正确,那就是满分;如果编译成功,但结果运行与答案不匹配,或编译不成功,那么转为静态评分法。静态分析方法的本质是模式匹配,也就是对考生答案的源程序进行语法语义等分析,依据考生答案和标准答案之间的匹配度给考生判分。

目前的很多自动化评分系统的评分策略是按结果评分的,这种策略会产生不合理的结果,如:仅因为个别小错误而使一个基本正确的程序不能编译运行,这种情况系统会给予整个程序不得分的结果。就这一不合理情况进行一些改进,系统设计的总体思路如图1所示。

图1 系统流程图

2 基于人工评分思路的自动评分算法

2.1 动态测试评分

建立测试程序相应的输入、输出对的集合,对学生答题的源程序进行编译连接,编译成功,运行学生程序,然后判定对于特定的输入程序能否得到期待的输出。如果运行结果与标准答案内容完全相同,则说明结果正确,得满分。用windows 内部功能,记录考生操作的每一步骤,形成独立日志文件,传送到服务器上,作为评分的必需内容。评分时,如搜索不到指定日志文件,就可认定为“抄袭”[6]。根据C程序的编译原理,源文件编译成功后会生成相对应的后辍为.obj 文件和后辍为.exe 的目标文件,可通过判断编译之后是否有后辍为.exe文件来确定编译是否成功。

2.2 静态分析评分

当程序编译不成功,或运行结果与答案不符,转入静态分析评分。以下是总结的几种静态分析方式。

2.2.1 基于得分语句查找的评分

人工评分时,教师会在学生所写程序中找出相应能得分的点,并根据评分标准给出相应的得分,如果没有找到关键得分的程序段,就不会得到分数。由教师提供一系列试题答案,记录在答案文本文件中。教师在答案模板中把关键得分语句按得分点分成一段一段的,并标配相应得分分数。自动评分过程是对学生源程序进行词法分析后,查找能与关键得分语句相匹配的程序语句,并把相应可得的分数累计起来。该方法保证在学生程序有语法错误、不能正常运行的情况下,也能得到合理的分数。

2.2.2 算法思想的对比评分

算法思想对比,可以通过抽取程序骨架与标准骨架相比对。这种方法可用于语义有错误的情况。如那些编译成功,但运行出来的结果却与答案不同,或者是无法编译运行的代码,可以通过提取骨架的方法来检查其算法思想是否合理准确。虽然在C语言中针对于同一个问题的解答结果是不尽相同的,可以编写出多种不同的代码,但是其算法思想是基本一致的[6]。例如用不同的方法来实现排序:

(1)用起泡法来实现排序

(2)用选择排序法实现排序

(3)用一般排序法实现排序

根据C语言的关键字对以上几种程序进行骨架的抽取,尽管用不同的方法来实现程序,但我们会发现骨架都为for()for()if(){}或者for(){for()if(){}}等,这样就可以用从考生文抽取的骨架与标准的骨架相对比,根据异同程度给予一定的分数。

2.2.3 书写格式多样化评分

C 语言程序的一大特点就书写格式灵活多样。如命名多样性,同样性质的变量可以定义为不同的名称,标识符只要满足规范可以任意组合字符,而且书写时会出现有无空格之类的区别。针对这种情形可以先采用正则表达式来表示程序中的关键算法,然后再进行字符匹配方法。例如一段简单的程序

可表示为:

这种形式可以表示程序的核心算法,而且具有通用性。

2.2.4 基于程序语义分析的评分

对程序进行语义分析,将学生程序进行程序标准化转换,这种转化就是消除程序表达方式多样化,如把while 和do…while 语句等表循环的语句都换成for 语句。然后与由教师提供的记录在答案文本文件中的一系列模板程序(相当于提供编程题的参考答案)进行程序匹配。计算它们的语义相似程度,给出学生程序的评分结果。语义相似度越高,程序得分就越高。该方法保证在程序运行结果有误但基本思路正确的情况下也可以得到合理的分数[7]。

3 结语

根据人工批卷的主观思想而设计的自动评分系统算法,自动评分系统可用于面向学生实践能力考核的C语言编程题考试。动态测试与静态分析相结合可以更好得体现人工阅卷的思维过程,如果将上述的四种静态分析方法能灵活地结合在一起的话,效果会更佳。自动评分系统不仅可以减轻教师的阅卷负担,还可以用于学生自评,其反馈结果可帮助学生进一步了解学情,从而有针对的进行改进与学习,对于实现无纸考试具有重要的实际应用意义和推广价值。

猜你喜欢

静态语义程序
真实场景水下语义分割方法及数据集
最新进展!中老铁路开始静态验收
静态随机存储器在轨自检算法
动得多,还要坐得少——评WHO《身体活动与静态行为指南》
给Windows添加程序快速切换栏
试论我国未决羁押程序的立法完善
猜猜他是谁
“程序猿”的生活什么样
英国与欧盟正式启动“离婚”程序程序
“吃+NP”的语义生成机制研究