APP下载

自动阅卷系统中编程题的解决方法

2017-01-03周松

中国信息技术教育 2016年23期

周松

摘要:本文对当前自动阅卷系统中编程题的现状进行了分析,并提出了使用代入法解决完善程序题和使用文件输出法解决编程题两种解决方法,同时给出了一些实现细节。

关键词:自动阅卷;编程题;VBA

中图分类号:TP311 文献标识码:A 论文编号:1674-2117(2016)23-0071-03

现状和问题

在现代教学中,计算机课程的阅卷系统越来越多,从Office应用到各种高级编程语言都有,不过计算机本身的智能化程度不高,主要是按照事先设定好的程序运行的,所以在批改选择题时非常有优势,速度快,准确率高,但对主观程度比较高的,如完善程序,特别是编写程序,很多阅卷系统还解决得不够好,而编程题恰恰又是计算机编程语言课程考试的常见题型。

选择题的实现已经非常成熟,本文不再讨论。填空、简答、论述等题型也有了各种解决方法,虽然效果还不是很理想,但技术也是在不断进步的,这部分也不是本文要讨论的。本文以VBA为例,主要讨论主观性很强且会有多种不同答案但结果又都正确的完善程序和编写程序两种题型的阅卷方法。

完善程序题

1.一般的解决方法

完善程序题其实是填空题的一种,但里面填写的是程序的代码,下面就是一个完善程序的例子。

题目:从大到小输入3个数,如不符合要求则显示“输入不符合要求”,在空白处填入程序代码完善程序(如图1)。

一般的阅卷程序都在用枚举答案的方法,如将可以想到的x > y And y > z和y < x And z < x等答案和学生的答案进行比较,如果相符则判对,否则扣分。但其实这道题目还有很多其他答案也是正确的,如y < x And x > z和x > y And z < x,甚至也会有学生写成Not x <= y And Not y <= z和Not (x <= y Or y <= z)等答案。枚举是一种方法,但只适应于答案非常单一的题目,因此建议尽量不使用。下面笔者将介绍一种代入法,将学生的答案代入到阅卷系统中,根据生成的表达式结果来判定答案是否正确。

2.代入法

代入法就是将学生写的答案代入到事先编写好的程序中进行验证,图2中的函数t15就是为上题编写的验证函数,其中的参数x、y、z为输入的三个数,sExpression为获得的学生编写的答案。在t15函数中的第三行,就是On Error和Exit Function之间是一个空行,学生的代码将代入到这里。

那么如何在一个程序中动态地插入一行代码并运行呢?这里要用到module对象中的ProcStartLine属性和ReplaceLine方法。ProcStartLine属性是指返回一个值,该值标识指定的过程的起始行。ReplaceLine方法是指在标准模块中替换指定行。下面给出代入法的代码,如图3。

其中:①score是模块的名称。②sExpression = "t15 = " & "Not x <= y And Not x <= y"是将学生的答案存储在sExpression中。最终sExpression中存放的是“t15 = Not x <= y And Not y <= z”,这样如果“Not x <= y And Not y <= z”计算正确,则函数t15返回值为true,否则返回false。③lineNum = md.ProcStartLine("t15", vbext_pk_Proc)+3得到要将sExpression代入到t15函数的位置。④md.ReplaceLine lineNum, sExpression的功能是进行替换。将sExpression代入到t15函数中。⑤MsgBox(IIf(t15(5, 4, 3, sExpression), "得分", "不得分"))调用代入了学生答案的t15函数,得到结果。

3.注意事项

上述代码中给出的making()过程是一个演示程序,其中的"Not x <= y And Not y<= z"为学生编写的答案,应该是从学生的答案中提取,而不是像本例中这样直接写出来。另外对答案的处理使用了代码MsgBox(IIf(t15(5, 4, 3, sExpression), "得分", "不得分")),对于结果只是进行了显示,在实际应用中应该是将结果写入到学生的成绩表中。而且在函数t15(5, 4, 3, sExpression)中使了5, 4, 3为测试参数,应该按照软件测试的方法给出测试数据,多次调用t15函数进行验证。

编程题

编程题是主观性非常强的题目,每位学生的答案都有可能不一样,如果根据学生每句代码是怎么编写的给分是不现实的,所以好的解决方法是根据结果给分。具体方法是将学生的答案写入到一个文件中,然后阅卷系统读取该文件中的内容,判断答案是否正确。

将答案写入文件的代码如图4所示,其中"answer.dat"为答案文件名,tAnwser是学生的答案。

在具体实现时可以采用两种方法,一种是事先为学生搭建好程序的框架,上面的文件输出代码写在最后,要求学生不能修改已有的代码,完成编码后需运行代码。还有一种方法就是利用Module.InsertLines(Line, String)方法将文件输出代码插入到学生编写的代码的后面来输出答案。

结论

本文提出了准确评判学生编写的程序的方法,解决了程序设计上机考试中主观题评判不够准确的问题。提供的方法简单、容易实现,大大提高了判卷的准确性。这里还需要特别说明的是,学生编写的表达式或代码会有错误,所以在代码中一定要使用on error代码来对可能的错误进行处理,以保证阅卷的顺利进行。