论文导读:本文以常见的C语言课程为例,对C语言程序设计题的自动评分方法进行了研究,在比较结果的评分方法基础上,设计了动态评阅与静态评阅相结合的方法,评分结果更加公正、准确。所谓静态评阅,是指通过对考生程序中语句的静态检查获取评阅信息。编译原理讲述了开发高级语言编译器的一整套原理和方法,我们可以借鉴这些原理和方法,结合C语言自身的特点设计出详实的改错算法。
关键词:自动评分,编译原理,静态检查
0引言
目前,国内外已有很多有关计算机语言类课程的考试软件,它们大多已能很好地完成对常见客观试题的自动评阅工作,但是对于一些主观性很强的题目,尤其是程序设计题,还没有很好的解决方案。其中主要采用的是结果评分法,即只依据程序运行结果给出相应分数,而并不查看考生程序内容。在这种评分机制下,程序中一个小小的错误就将导致一个几近正确的程序无法运行,从而因无运行结果,考生将丢失全部分数。这与传统人工阅卷中的评分原则是不相一致的,评分结果也并不能反应出考生的真实水平。本文以常见的C语言课程为例,对C语言程序设计题的自动评分方法进行了研究,在比较结果的评分方法基础上,设计了动态评阅与静态评阅相结合的方法,评分结果更加公正、准确。
1指导思想
经过大量分析与研究,我们设计了动态评阅和静态评阅相结合的方法实现对程序设计题的评分。具体步骤如下:
(1)结果对比。检查考生程序的结果文件,若与标准答案文件中的结果一致,则可得满分。若不完全一致,可依据正确输出数据的数量以予一定比例的得分。
(2)动态评阅。对于无结果的考生程序,我们可在系统控制下对其进行模拟运行以获取运行结果。对有语法错误的考生程序,可以通过词法分析和语法分析程序找出错误,同时设计改错算法尽最大可能改正考生程序中的错误,最终使程序得以运行并保留错误信息。若考生程序经评改、运行,获取了正确结果,则可依据错误信息从总分中扣除相应的分数。若仍无法运行或结果不正确,则采用静态评阅。
(3)静态评阅。所谓静态评阅,是指通过对考生程序中语句的静态检查获取评阅信息。系统事先在程序设计题的题库文件中根据考试题目设置有多条关键语句,评分时,通过检测考生程序中关键语句的数量可判断其逻辑合理性,给出相应分值。
尽管上述评分方法,仍不可能做到像人工阅卷一样实现真正的按步骤评分,但相对于以往只按结果评定成绩的评分方法,相信该系统还是有积极意义的。由于考试题都是较小的程序,评分可以做到较大程度的准确。
3解决方案
程序设计题的评分最为复杂,在确定了程序设计题评分目标后,着重从以下四个方面进行了考虑:
(1)通过运行结果判定程序功能是否实现
我们要判断一个程序是否正确,就是要看其是否完成了要求的功能,即程序的运行结果是否与实际应有的结果相符。C程序的运行结果是可以通过数据文件保存起来的,因而只要我们合理设计考题源程序中的部分内容,即在程序中指定程序结果的存储文件,则在考生答题结束后,我们即可依据该结果文件中的内容是否与标准答案相符来判定考生程序的正误。标准答案文件可在抽取试题时同时生成。
(2)采用“以程序改程序”的方法对错误的考生程序进行评改,使其趋于正确
C语言源程序文件是扩展名为.C的文本文件,可被作为普通文本文件一样进行读写处理。一个没有运行结果的程序不外乎两种情况,或是有语法错误,或为死循环。针对前者,我们可以采用词法分析及语法分析方法进行处理。词法分析和语法分析任务有两个,一是找错,即要尽可能地找出程序中的词法及语法错误,生成错误文件;二是改错,要将发现的每一处错误尽最大可能修改正确,以便程序得以运行。编译原理讲述了开发高级语言编译器的一整套原理和方法,我们可以借鉴这些原理和方法,结合C语言自身的特点设计出详实的改错算法。
(3)在程序中编译运行修改后的考生程序
编译器的设计是相当复杂而繁重的工作,由少数人在短期内去开发一个全新的编译器是不现实也是不可能的。Turbo C提供有行编译命令TCC.EXE,其使用方法类似于一般的DOS命令,可以将C程序直接编译为目标代码和可执行程序。据此,评分程序可在Visual Basic中借助Shell函数调用TCC命令程序,从而对考生程序进行编译。通过检查编译结果即可执行文件是否生成,可判定考生程序是否正确。可执行文件为.EXE文件,可作为外部程序被其它程序所调用。若可执行文件生成正确,可再通过Shell函数调用可执行文件使考生程序得以运行。
(4)用API函数防止系统崩溃
如果考生程序为一个死循环程序,被 Shell启动后将使系统陷入崩溃。Windows提供有很多控制应用程序运行的API函数。论文参考。为防止此种情况发生,可利用VisualBasic调用相应的API函数来处理。
(5)通过合理设计关键语句,检验考生程序的逻辑准确性
对于运行结果不正确,或经过评改仍无法运行的程序及死循环的程序,如何评阅以给出较合理的分数呢?这个问题其实就是要检验程序的逻辑合理性。一个可用多种方法编制的程序,由于其功能是确定的,因而其所采用的基本算法应是一致的。如求1至100的和,则不论用哪种循环语句,其基本算法都应是累加求和。考虑在给出的考生源程序中,可事先设定好存放结果的变量,并对程序中其它变量的命名加以适当规定,如循环变量必须使用i、j、k等。经过这样的设计,使得试题程序中存在有部分确定的关键语句。在编程题的题库文件中,我们可事先存放好正确的关键语句,评分时通过查找考生程序中这些关键语句的数量,即可给出相应的较合理的分数。
由于本系统主要用于对在校学生C语言基础应用能力的考核,要求考生编制的源程序均不是很复杂,因此经过上述一系列的评改方法,本系统对考生程序是能够给出一个较合理的考试分数的。与以往以结果论成败的评分方法相比,本系统给出的评阅结果将更加接近于人工阅卷的结果。
4 系统设计
(1)功能结构分析
对程序设计题进行自动评卷较为复杂,主要包括两个方面:一是要检验结果的正确性,二是要检测程序的语法和逻辑是否符合要求。程序设计题阅卷评分系统的功能结构图如图1所示。
 
图1 程序设计题评分系统功能结构图
(2)评阅流程设计
经过对C程序结构的透彻分析与研究,对程序设计题的评阅主要采用结果对比、静态评阅与动态评阅相结合的方法,具体步骤如下:
1)结果对比
检查指定的结果文件是否存在,若存在则与标准答案文件进行对比。与标准答案文件内容完全相同,则说明结果正确,得满分,否则转去静态评阅。若无结果文件,执行动态评阅。
2)动态评阅
①对考生源程序进行编译连接,若生成可执行文件成功,则运行考生程序并进行结果检查,若生成失败,说明考生程序存在语法错误,转入以下过程继续处理。
②对考生源程序进行词法分析。扫描源程序,将其转化为特定格式的TOKEN串,存入TOKEN文件。
③根据词法分析的结果,即TOKEN文件,进行语法分析。论文参考。详细指出程序中存在的语法错误,生成错误文件,在保证不对考生程序正确部分产生破坏的前提下,尽最大可能将考生程序修改正确,生成修改后的TOKEN文件。
④调用转换程序将修改后的TOKEN文件重新生成为C语言源程序,其与考生源程序不同名,称其为新生源程序。
⑤调用TCC程序以命令行方式对新生源程序进行编译连接。论文参考。
⑥编译连接成功,运行新生源程序的执行文件,并调用API函数控制程序运行, 以防由于死锁的发生导致系统崩溃;编译失败则退出动态评阅过程,改用静态评阅。
⑦对新生源程序的运行结果进行检测,若有结果,则转去进行结果比较,若无结果则转去进行静态评阅。
3)静态评阅
从程序设计题题库文件中读取该试题的关键语句,对考生程序进行检测。根据检测出的考生程序中的关键语句的条数判断程序的逻辑合理性,给出相应分值。
5 结论
本文提出了一种较新的C语言程序设计题的自动评分方法,对其进行了系统的研究与设计。通过运用编译原理的理论编写相应的评改算法,可实现对C语言程序设计题的自动评分,此种方法已经过代码设计初步实现,经测试,评分结果更加人性化,更加接近于人工阅卷的结果。此种评分方法对于如C++、JAVA等程序的自动评分方法的设计,具有一定的参考价值。
参考文献:
[1] 段汉周,凌捷,郑衍衡. Visual Basic程序设计考核自动评阅系统中若干问题的研究. 计算机工程,2001,27(4)
[2] 李丁. 计算机考试系统中自动评分策略的研究与实现.计算机与现代化,2002(9):8
[3]王春霞. 自动阅卷系统的开发. 盐城工学院学报,2002,15(1)
[4] 何涛. 自动化考试系统设计与开发:[学位论文]. 吉林大学
|