关于C语言程序设计题自动评分算法的探究

2020-11-08 12:30许芝卉李建华
关键词:程序设计语句人工

许芝卉,李建华

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

目前,计算机程序设计语言考试评卷软件,对于客观题的自动评分工作能很好地完成,但对于主观题并没有很好的解决方法。比如程序设计题,多数采用比对结果法,即根据程序运行出来的结果给出相应的评分,而对于考生程序的内容并不查看。在这样的评分方案下,程序题的得分只有两个,正确满分,错误或没有结果是零分。而程序设计题若有一个小小的错误(如语法错误)都不可能有结果,而考生也将丢失整个程序的分数,这与通常意义下的人工评阅试卷的结果是不一致的,文中就是探讨一种接近传统人工阅卷的计算机自动评分算法[2]。

1 C 语言程序设计题评分系统现状与发展趋势

C程序设计是国际上广泛流行的计算机程序设计语言,在高等院校中,大多数非计算机专业的理科生都将C 程序设计语言作为一门必修课来开设,对该门课程的考核多数采用人工命题、人工阅卷评分的方法,采用这种方法往往效率不高,通常还会受到任课教师人为因素的影响,比如代码不规范等等。这种人工评阅程序设计试卷的方法已经不能适应高等教育发展的需要了,而利用计算机实现无纸化考试是今后教育发展的需要,现在国家计算机等级考试就是采用的这种方式。对于客观题的自动评分工作能很好地完成,但对于主观题的评分还是没有好的解决方案。比如常用的结果比对法还是不能很好地反映考生的真实水平,存在很大的不合理性[4]。

2 C 程序设计自动评分系统的流程设计与实现

对于C程序设计题自动评分主要从两个方面着手,首先是要检查程序的运行结果是否正确;其次是要检查程序中的语法和程序中的逻辑是否合理。本系统的程序设计题自动评分可用结构化流程图1。同一题目,每个人的编程思路和编程习惯是不相同的,当然程序运行结果也会有差异,错误也各种各样,可能有的结果大致三种情况:(1)有结果文件,且编译运行后得到正确结果;(2)有结果文件,但运行结果不正确;(3)没有结果文件,源程序不能编译运行。对于第一种情况,可利用结果比对法,对于第二种情况,说明程序代码有问题,可能是逻辑错误也可能是输出错误等,对于这种情况,需要针对程序中的一些特征属性进行分析,并进行结构相似度匹配,综合给出评分[2],对于第三种情况,那可能是由多种因素形成,需具体问题具体分析。

2.1 程序运行结果比对法

对于程序设计题中有运行结果的可通过比对考生的运行结果文件,若与标准答案中的结果完全一致,则可得满分,若不完全一致,则可依据输出数据的正确数量给予一定比例的得分[1]。

2.2 程序动态评分法

若考生程序出现无程序运行结果的情况,通常的处理方法为:(1)可以在C 系统下对程序进行模拟运行来获得程序的运行结果;(2)若程序中有语法错误,则可根据语法分析来找出程序中错误的地方,去设计程序的改错算法,改正考生程序中可能出现的错误,最终使程序能够运行,当然错误信息仍需保留,若考生程序经过评阅修改得以运行,同时也获得了正确结果,则可根据保留的错误信息来扣除对应的分数;(3)若利用上述方法设计仍无法运行或结果仍然不正确的情况,则可以采用下面的评阅方法[1]。

图1 结构化流程图

2.3 程序静态评阅法

程序静态评阅方法是指通过程序中的若干条语句静态检查来得到对应的评阅信息。首先本系统应做好准备工作,根据准备好的题目在考生题库文件中设置若干条关键语句,然后根据关键语句的数量检查学生程序的逻辑是否合理,并给出对应的分数值[1]。

3 动态和静态相结合的评分方案和可行性

上述3种评阅方法,相对于只用结果比对成绩的评阅方法是有积极意义的,但和人工阅卷按步骤评分有一定差别,主要针对高等院校理科专业学生期末考试而设计的,评分规模不大且测评语句的行数也不会太多。程序自动测评准确性的提高是本文要解决的主要问题[1],下面通过实例来探讨。

例1编写程序:通过输入x的值,输出y的值。

例2从键盘输入10个学生的成绩放入score数组中,统计并输出这10个学生的平均成绩。

下面是例1 和例2 的C 程序设计题的人工评分标准。

例1 C程序如下:

例1 中若输入函数写成这样scanf(“%d”,x); 编译时不显示语法有错误,再比如y=2*x-1; 若写成y=2x-1;出现这样的错误程序都不会有结果。例2中最容易错的就是sum=0; 语句的位置,若位置错了就不能出现正确结果。若采用结果比对法就是零分,若是人工阅卷只会失去很少的分数。为了避免这种情况的发生就需要采用动态和静态相结合的评阅方法[4]。

C程序设计题的评分方案应从如下几个方面来探讨:

(1)通过程序运行结果来评定;

C 程序有自己的特殊性,在程序设计中可以通过设置,把程序运行结果的数据保存成数据文件,学生考试结束后,就可以根据这个数据文件中的结果与标准答案进行比对,而标准答案文件在抽取试题时已经生成。

(2)通过对源程序进行修改的方法进行评定;

C程序文件可以作为文本文件进行读和写的操作,C 程序经过编译运行可能会出现两种情况:有运行结果但不正确或没有运行结果。若程序没有运行结果大致的原因是这几个方面:出现死循环、有语法错误、有语句问题,通过分析我们去找错和改错,当然要尽可能地把程序中的语法及语句错误标记出来,生成错误文件;同时也要保证学生所编写程序正确的那些部分不被破坏。学生程序经过修改没有问题后,可生成修改后的文件,并重新命名,新的源程序若编译正确后生成可执行文件,若该可执行文件生成正确,则可以通过Shell 函数去调用可执行文件使学生程序得以运行,若编译不正确则退出系统[2]。

(3)通过关键语句对程序进行评定。

一个程序应该如何给出合理的评阅分数呢?对同一道编程题目来说,编程思路和编程方法会有很多种,但基本语句是确定的,比如循环类问题(如求1-100 之和、求5!等),循环语句有三种(while 语句、do—while 语句和for 语句),但无论用哪一种循环基本算法是确定的,在题库文件中先存入考试题目的关键语句,评分时可结合关键语句的数量给出较为合理的分数[3]。

4 结束语

主要用于在校大学生期末C程序题的考查,所考题目的程序语句不会太多(一般不会超过50行),通过上述几种评阅方法,尽可能地给考生一个合理的评阅分数,与传统的结果比对评分方法相比较,这种设计更加接近人工阅卷,更具推广性。

猜你喜欢
程序设计语句人工
人工3D脊髓能帮助瘫痪者重新行走?
医学专业“Python程序设计”课程教学改革总结与思考
人工“美颜”
基于Visual Studio Code的C语言程序设计实践教学探索
从细节入手,谈PLC程序设计技巧
高职高专院校C语言程序设计教学改革探索
人工制冷
我喜欢
冠词缺失与中介语句法损伤研究
人工降雪