随着信息技术的迅猛发展,教育领域中利用在线测试系统进行编程题自动评分的实践愈发普遍。针对传统编程题自动评分系统无法准确衡量学生对知识点掌握程度的问题,本文作者朱林琴等人提出了一种基于最小子程序匹配的C语言自动评分算法。该算法的核心思想在于通过标准化处理程序,将其转换为树形结构的子程序,并通过搜索与检测来划分出更小粒度的子程序,以便更精细地进行评分。这一方法显著提高了评分的准确度,实验结果表明该算法与传统人工评分的误差较小,更能反映学生的真实编程水平。
在详细探讨该算法之前,有必要先了解当前编程题自动评分的基本方式。目前,编程题自动评分方法主要分为两大类:动态测试和静态评分。动态测试是指对学生提交的代码进行编译和运行,并根据程序运行结果进行评分。这种方法快速且直接,但前提是程序必须能够成功运行。若程序运行结果不匹配或者存在编译错误、运行时错误或时间超时等问题,则程序会被判定为无效,并给出0分。动态评分的前提条件较为严格,可能会导致对学生的片面评价。另一方面,静态评分方法通过分析源代码和答案模板代码的相似度进行评分。常见的技术包括使用抽象语法树、系统依赖图等中间表现形式提取特征属性或度量值进行匹配。静态分析能在一定程度上评估学生程序与模板的相似度,从而生成学生得分,但其准确性受到源代码多样性和现有技术对程序理解度的限制。
最小子程序匹配评分算法的研究目标在于解决上述问题,它采用从小到大的递归式匹配方式来处理学生程序和模板程序。算法首先定义了基本子程序,这些子程序是实现某种功能的基本语句集合,可以包括声明语句、函数调用语句、赋值语句、选择分支语句、循环语句、返回语句和跳出语句等。这些基本语句可以通过并列、嵌套和顺序关系组合成功能复杂的子程序。将学生程序和模板程序分解为基本的子程序后,借助系统依赖图的数据依赖找出子程序之间的关系,并将子程序转换为有序树形式。由于子程序之间存在并列关系,在树结构中表现出的无序性,因此,本文中提到的有序树并非真正意义上的有序树。
算法的第三个重要部分是子程序分块预处理,这一环节针对C语言编程题自动评分研究中的一大难点:程序设计的多样性。为了尽可能精确地匹配到答案模板,算法会在评分之前对语句进行语义等价转换,消除语句的多样性,同时获得多个不同粒度的子程序。本文还提及了构造子程序有序树时的关系规则,以及如何通过这些规则将子程序切分为多个更小粒度的子程序集合,并最终根据这些规则和方法对C语言程序进行自动评分。
基于最小子程序匹配的C语言自动评分算法具有以下几大创新点和优势:
1. 提高评分准确性:通过将程序标准化处理并转换为树形子程序,进一步划分更小粒度的子程序进行匹配与评分,避免了传统评分系统中可能存在的片面性问题,能够更准确地反映学生的编程水平。
2. 改善学生水平评估:由于算法与人工评分误差小,相较于传统自动评分方法,更能客观评估学生对知识点的掌握程度和编程能力。
3. 适用于多种评分环境:算法通过预处理语句进行语义等价转换,并依据系统依赖图将程序转换为有序树,使其适应性增强,能够适用于不同的在线测试系统和编程环境。
本文提出的基于最小子程序匹配的C语言自动评分算法,为编程题自动评分领域带来了新的研究思路和技术突破,对于提升编程教育质量,实现教育信息化具有重要的参考价值。