APP下载

编程题自动阅卷系统的设计与实现

2014-09-26赵晓静

软件工程 2014年9期
关键词:C语言

摘 要:目前C语言编程题的自动阅卷主要采用比对程序运行结果的方法,这种方法由于不查看学生的程序内容,因此评分有失公允并且不能反映学生的真实水平。本系统采用动态评阅、结果对比、静态评阅相结合的方法,使评分结果公正、准确,更加接近于人工阅卷。该系统已经用于实际的教学环节中,收到了良好的效果。

关键词:C语言;编程题;自动阅卷

中图分类号:TP311 文献标识码:A

1 引言(Introduction)

目前,客观题的自动阅卷技术已经成熟运用在各类考试系统中,但主观题的阅卷却往往采用人工批改。在C语言的教学和考核过程中,编程题是C语言的常见题型,也是最能反映考生水平的考试题型。对于编程题,虽然程序运行结果是有唯一标准的,但程序的表达方式往往因人而异,难以统一。编程题的自动阅卷方法缺少完美的解决方法,一般需要人工辅助批改。

目前大多数阅卷方法是通过检查考生运行程序时生成结果文件的正确性来给分。如全国计算机等级考试(NCRE)上机考试中的编程题评阅系统,就是依赖程序的运行结果。此时如果考生程序中出现一个很小的错误,就会导致一个几乎接近正确的程序因无法运行而没有生成结果文件,考生将丢失全部分数[1]。另一方面,有些题目通过数学计算或其他方式,可以直接做出一个正确的结果文件,无需编写程序,如果考生利用这点来投机取巧,照样可以获得满分,这是很不公平的。这种评阅方法虽然简单,但评分很不科学,不能反映出考生的真实水平。

经过多年的研究和实践,我们建立了一个切实可行的编程题自动阅卷系统,本系统采用动态评阅、结果对比、静态评阅相结合的方法,把试题的总分数分解为结果分、语法分、词法分三个部分。在进行程序评阅时,每部分单独评分,最后累加各部分分数之和得出总分。

2 阅卷过程(Marking process)

阅卷流程设计如图1所示。

图1 阅卷流程

Fig.1 marking process

具体步骤如下:

(1)先检查考生文件夹中的学生提交的考试程序,如发现学生没有做过该题,则直接给0分,同时阅卷结束。

(2)对学生保存过的程序进行规范化处理[2],先删除程序注释语句,合并连续多个空格,保留一个,然后增加一个程序块,该程序块的功能是自动把程序结果输出到某个指定文件。这样,只要学生程序有输出结果,这个结果就能自动输出到文件。

(3)通过tcc命令对考生程序进行编译处理,如能生成可执行文件,表示程序没有语法错误,语法分为满分。接着运行可执行文件,如没有生成结果文件,结果分计为0分;如有结果文件,根据结果文件相似度给分,结果完全正确时给满分。

(4)如没有生成可执行文件,表示程序有语法错误,通过gcc命令可以轻松获取c程序的编译错误信息文件,根据错误信息,尽可能地改正程序中的错误,并根据错误数目给出相应语法分,同时结果分计为0分。

(5)进行词法分析和关键词比对[3],给出词法分。

(6)计算总分,阅卷结束。

3 阅卷关键技术(Marking key technology)

(1)编译和运行问题

假设prog1.c为源文件,编译成功后会生成目标文件prog1.obj和可执行文件prog1.exe,通过判断编译之后是否生成此文件来判断编译是否成功。部分程序虽然没有语法错误,能编译成功,但不一定能生成结果文件。特别是出现死循环时,运行的程序不能自行结束,系统用一个计时程序来解决这个问题,即在规定时间内检查程序进程,发现一直没有结束,就强行退出。

(2)语法分计算

通过命令“gcc 源文件2>错误结果文件”可以轻松获取c程序的编译错误信息文件,例如:“gcc prog1.c 2>1.txt”表示编译prog1.c文件,并把出错信息生成到文件1.txt中。当编译通过时文件内容为空,否则显示出错信息,基本格式为:“文件名:行号:错误提示”。例如:“prog1.c: In function `main':prog1.c:10: error: syntax error before "for" token”指出在main函数内,第10行中“for”前面有错。大部分情况下,for为首个关键字,故错误在第9行末尾,往往是由于丢失分号引起的。同理 “'XX'undeclared(first use in this function)”表示在使用XX变量前未定义;“missing terminating XXcharacter”表示丢失XX符号,这些错误均很容易改正。每改过一行错误,记录下行号并累计错误数。错误改正后重新编译程序,如仍有错误,导致编译不通过,则根据新错误的行号进行错误数累加,对已统计过的行号不重复计算。最后根据总错误数计算出语法得分。

(3)结果分统计

由于已准备好prog1.cint测试数据文件,学生程序也事先经过了规范化处理,只要学生程序有输出结果,就会生成格式一致的prog1.cout结果文件。测试数据文件中事先准备多行测试数据,对应结果文件中也有多行结果。评分时只需将学生程序结果文件读取并存放到二维数组中,和正确的结果文件进行逐行比对,然后根据相似度来获得相应的结果分值。如果学生程序有死循环等问题,则没有结果输出,结果分为零分。

(4)词法分统计

在人工阅卷时,老师会忽略不重要的错误,看关键语句是否正确,在自动阅卷过程中具体分为结构分析和关键词比对两步。结构分析是指先根据算法,将程序答案分割成各个语句模块,如声明语句、赋值语句、选择语句、循环语句、输入输出语句等。学生程序中只要有相应模块就给一定分值。

关键词对比是指我们把标准答案中的关键词,和学生答案中的关键词进行比较,根据关键词的个数给分。具体如下:编程题的源程序可以看成是多行的字符串,对程序的字符串进行扫描和分解,分离出一个个“单词”符号。这些单词符号就是c程序的基本词法单位。这些单词符号可以分成关键字、常数、标识符、运算符、界限符五类。在c语言里常用关键字有32个,如int、float,char等;常数包括整型、浮点型、字符型等;标识符可以用作变量名;运算符有算术运算符、逻辑运算符等;界限符有逗号、分号、括号等。分别放到不同数组中,进行对比。

4 结论(Conclusion)

基于上述编程题的自动阅卷系统已经开始使用,系统功能可以全部实现,对于正确的考生程序,系统能100%准确评分,对于存在错误的学生程序,与人工评分的结果相差无几,避免了极端分数的出现。同时本系统能减轻教师批改作业的负担,使学生的成绩更加公正、合理,大大提高阅卷效率,节省教学资源。采用这种方法对编程题进行自动阅卷,注重考生程序的内在结构,更加符合人工阅卷的思想,同时本系统也适用于其他程序设计语言课程,具有很好的实用价值和应用前景。

参考文献(References)

[1] 乔善平,刘振,朱波.编程题的计算机阅卷[J].计算机应用研究,

2004,8:229-231.

[2] 马培军,王甜甜,苏小红.基于程序理解的编程题自动评分方

法[J].计算机研究与发展2009,46(7):1136-1142.

[3] 温湘敏,胡琳.依据程序依赖关系匹配度的C语言程序设计题

评分方法[J].南昌大学学报(理科版),2013(10):502-506.

作者简介:

赵晓静(1973-),女,硕士,讲师.研究领域:计算机应用.endprint

摘 要:目前C语言编程题的自动阅卷主要采用比对程序运行结果的方法,这种方法由于不查看学生的程序内容,因此评分有失公允并且不能反映学生的真实水平。本系统采用动态评阅、结果对比、静态评阅相结合的方法,使评分结果公正、准确,更加接近于人工阅卷。该系统已经用于实际的教学环节中,收到了良好的效果。

关键词:C语言;编程题;自动阅卷

中图分类号:TP311 文献标识码:A

1 引言(Introduction)

目前,客观题的自动阅卷技术已经成熟运用在各类考试系统中,但主观题的阅卷却往往采用人工批改。在C语言的教学和考核过程中,编程题是C语言的常见题型,也是最能反映考生水平的考试题型。对于编程题,虽然程序运行结果是有唯一标准的,但程序的表达方式往往因人而异,难以统一。编程题的自动阅卷方法缺少完美的解决方法,一般需要人工辅助批改。

目前大多数阅卷方法是通过检查考生运行程序时生成结果文件的正确性来给分。如全国计算机等级考试(NCRE)上机考试中的编程题评阅系统,就是依赖程序的运行结果。此时如果考生程序中出现一个很小的错误,就会导致一个几乎接近正确的程序因无法运行而没有生成结果文件,考生将丢失全部分数[1]。另一方面,有些题目通过数学计算或其他方式,可以直接做出一个正确的结果文件,无需编写程序,如果考生利用这点来投机取巧,照样可以获得满分,这是很不公平的。这种评阅方法虽然简单,但评分很不科学,不能反映出考生的真实水平。

经过多年的研究和实践,我们建立了一个切实可行的编程题自动阅卷系统,本系统采用动态评阅、结果对比、静态评阅相结合的方法,把试题的总分数分解为结果分、语法分、词法分三个部分。在进行程序评阅时,每部分单独评分,最后累加各部分分数之和得出总分。

2 阅卷过程(Marking process)

阅卷流程设计如图1所示。

图1 阅卷流程

Fig.1 marking process

具体步骤如下:

(1)先检查考生文件夹中的学生提交的考试程序,如发现学生没有做过该题,则直接给0分,同时阅卷结束。

(2)对学生保存过的程序进行规范化处理[2],先删除程序注释语句,合并连续多个空格,保留一个,然后增加一个程序块,该程序块的功能是自动把程序结果输出到某个指定文件。这样,只要学生程序有输出结果,这个结果就能自动输出到文件。

(3)通过tcc命令对考生程序进行编译处理,如能生成可执行文件,表示程序没有语法错误,语法分为满分。接着运行可执行文件,如没有生成结果文件,结果分计为0分;如有结果文件,根据结果文件相似度给分,结果完全正确时给满分。

(4)如没有生成可执行文件,表示程序有语法错误,通过gcc命令可以轻松获取c程序的编译错误信息文件,根据错误信息,尽可能地改正程序中的错误,并根据错误数目给出相应语法分,同时结果分计为0分。

(5)进行词法分析和关键词比对[3],给出词法分。

(6)计算总分,阅卷结束。

3 阅卷关键技术(Marking key technology)

(1)编译和运行问题

假设prog1.c为源文件,编译成功后会生成目标文件prog1.obj和可执行文件prog1.exe,通过判断编译之后是否生成此文件来判断编译是否成功。部分程序虽然没有语法错误,能编译成功,但不一定能生成结果文件。特别是出现死循环时,运行的程序不能自行结束,系统用一个计时程序来解决这个问题,即在规定时间内检查程序进程,发现一直没有结束,就强行退出。

(2)语法分计算

通过命令“gcc 源文件2>错误结果文件”可以轻松获取c程序的编译错误信息文件,例如:“gcc prog1.c 2>1.txt”表示编译prog1.c文件,并把出错信息生成到文件1.txt中。当编译通过时文件内容为空,否则显示出错信息,基本格式为:“文件名:行号:错误提示”。例如:“prog1.c: In function `main':prog1.c:10: error: syntax error before "for" token”指出在main函数内,第10行中“for”前面有错。大部分情况下,for为首个关键字,故错误在第9行末尾,往往是由于丢失分号引起的。同理 “'XX'undeclared(first use in this function)”表示在使用XX变量前未定义;“missing terminating XXcharacter”表示丢失XX符号,这些错误均很容易改正。每改过一行错误,记录下行号并累计错误数。错误改正后重新编译程序,如仍有错误,导致编译不通过,则根据新错误的行号进行错误数累加,对已统计过的行号不重复计算。最后根据总错误数计算出语法得分。

(3)结果分统计

由于已准备好prog1.cint测试数据文件,学生程序也事先经过了规范化处理,只要学生程序有输出结果,就会生成格式一致的prog1.cout结果文件。测试数据文件中事先准备多行测试数据,对应结果文件中也有多行结果。评分时只需将学生程序结果文件读取并存放到二维数组中,和正确的结果文件进行逐行比对,然后根据相似度来获得相应的结果分值。如果学生程序有死循环等问题,则没有结果输出,结果分为零分。

(4)词法分统计

在人工阅卷时,老师会忽略不重要的错误,看关键语句是否正确,在自动阅卷过程中具体分为结构分析和关键词比对两步。结构分析是指先根据算法,将程序答案分割成各个语句模块,如声明语句、赋值语句、选择语句、循环语句、输入输出语句等。学生程序中只要有相应模块就给一定分值。

关键词对比是指我们把标准答案中的关键词,和学生答案中的关键词进行比较,根据关键词的个数给分。具体如下:编程题的源程序可以看成是多行的字符串,对程序的字符串进行扫描和分解,分离出一个个“单词”符号。这些单词符号就是c程序的基本词法单位。这些单词符号可以分成关键字、常数、标识符、运算符、界限符五类。在c语言里常用关键字有32个,如int、float,char等;常数包括整型、浮点型、字符型等;标识符可以用作变量名;运算符有算术运算符、逻辑运算符等;界限符有逗号、分号、括号等。分别放到不同数组中,进行对比。

4 结论(Conclusion)

基于上述编程题的自动阅卷系统已经开始使用,系统功能可以全部实现,对于正确的考生程序,系统能100%准确评分,对于存在错误的学生程序,与人工评分的结果相差无几,避免了极端分数的出现。同时本系统能减轻教师批改作业的负担,使学生的成绩更加公正、合理,大大提高阅卷效率,节省教学资源。采用这种方法对编程题进行自动阅卷,注重考生程序的内在结构,更加符合人工阅卷的思想,同时本系统也适用于其他程序设计语言课程,具有很好的实用价值和应用前景。

参考文献(References)

[1] 乔善平,刘振,朱波.编程题的计算机阅卷[J].计算机应用研究,

2004,8:229-231.

[2] 马培军,王甜甜,苏小红.基于程序理解的编程题自动评分方

法[J].计算机研究与发展2009,46(7):1136-1142.

[3] 温湘敏,胡琳.依据程序依赖关系匹配度的C语言程序设计题

评分方法[J].南昌大学学报(理科版),2013(10):502-506.

作者简介:

赵晓静(1973-),女,硕士,讲师.研究领域:计算机应用.endprint

摘 要:目前C语言编程题的自动阅卷主要采用比对程序运行结果的方法,这种方法由于不查看学生的程序内容,因此评分有失公允并且不能反映学生的真实水平。本系统采用动态评阅、结果对比、静态评阅相结合的方法,使评分结果公正、准确,更加接近于人工阅卷。该系统已经用于实际的教学环节中,收到了良好的效果。

关键词:C语言;编程题;自动阅卷

中图分类号:TP311 文献标识码:A

1 引言(Introduction)

目前,客观题的自动阅卷技术已经成熟运用在各类考试系统中,但主观题的阅卷却往往采用人工批改。在C语言的教学和考核过程中,编程题是C语言的常见题型,也是最能反映考生水平的考试题型。对于编程题,虽然程序运行结果是有唯一标准的,但程序的表达方式往往因人而异,难以统一。编程题的自动阅卷方法缺少完美的解决方法,一般需要人工辅助批改。

目前大多数阅卷方法是通过检查考生运行程序时生成结果文件的正确性来给分。如全国计算机等级考试(NCRE)上机考试中的编程题评阅系统,就是依赖程序的运行结果。此时如果考生程序中出现一个很小的错误,就会导致一个几乎接近正确的程序因无法运行而没有生成结果文件,考生将丢失全部分数[1]。另一方面,有些题目通过数学计算或其他方式,可以直接做出一个正确的结果文件,无需编写程序,如果考生利用这点来投机取巧,照样可以获得满分,这是很不公平的。这种评阅方法虽然简单,但评分很不科学,不能反映出考生的真实水平。

经过多年的研究和实践,我们建立了一个切实可行的编程题自动阅卷系统,本系统采用动态评阅、结果对比、静态评阅相结合的方法,把试题的总分数分解为结果分、语法分、词法分三个部分。在进行程序评阅时,每部分单独评分,最后累加各部分分数之和得出总分。

2 阅卷过程(Marking process)

阅卷流程设计如图1所示。

图1 阅卷流程

Fig.1 marking process

具体步骤如下:

(1)先检查考生文件夹中的学生提交的考试程序,如发现学生没有做过该题,则直接给0分,同时阅卷结束。

(2)对学生保存过的程序进行规范化处理[2],先删除程序注释语句,合并连续多个空格,保留一个,然后增加一个程序块,该程序块的功能是自动把程序结果输出到某个指定文件。这样,只要学生程序有输出结果,这个结果就能自动输出到文件。

(3)通过tcc命令对考生程序进行编译处理,如能生成可执行文件,表示程序没有语法错误,语法分为满分。接着运行可执行文件,如没有生成结果文件,结果分计为0分;如有结果文件,根据结果文件相似度给分,结果完全正确时给满分。

(4)如没有生成可执行文件,表示程序有语法错误,通过gcc命令可以轻松获取c程序的编译错误信息文件,根据错误信息,尽可能地改正程序中的错误,并根据错误数目给出相应语法分,同时结果分计为0分。

(5)进行词法分析和关键词比对[3],给出词法分。

(6)计算总分,阅卷结束。

3 阅卷关键技术(Marking key technology)

(1)编译和运行问题

假设prog1.c为源文件,编译成功后会生成目标文件prog1.obj和可执行文件prog1.exe,通过判断编译之后是否生成此文件来判断编译是否成功。部分程序虽然没有语法错误,能编译成功,但不一定能生成结果文件。特别是出现死循环时,运行的程序不能自行结束,系统用一个计时程序来解决这个问题,即在规定时间内检查程序进程,发现一直没有结束,就强行退出。

(2)语法分计算

通过命令“gcc 源文件2>错误结果文件”可以轻松获取c程序的编译错误信息文件,例如:“gcc prog1.c 2>1.txt”表示编译prog1.c文件,并把出错信息生成到文件1.txt中。当编译通过时文件内容为空,否则显示出错信息,基本格式为:“文件名:行号:错误提示”。例如:“prog1.c: In function `main':prog1.c:10: error: syntax error before "for" token”指出在main函数内,第10行中“for”前面有错。大部分情况下,for为首个关键字,故错误在第9行末尾,往往是由于丢失分号引起的。同理 “'XX'undeclared(first use in this function)”表示在使用XX变量前未定义;“missing terminating XXcharacter”表示丢失XX符号,这些错误均很容易改正。每改过一行错误,记录下行号并累计错误数。错误改正后重新编译程序,如仍有错误,导致编译不通过,则根据新错误的行号进行错误数累加,对已统计过的行号不重复计算。最后根据总错误数计算出语法得分。

(3)结果分统计

由于已准备好prog1.cint测试数据文件,学生程序也事先经过了规范化处理,只要学生程序有输出结果,就会生成格式一致的prog1.cout结果文件。测试数据文件中事先准备多行测试数据,对应结果文件中也有多行结果。评分时只需将学生程序结果文件读取并存放到二维数组中,和正确的结果文件进行逐行比对,然后根据相似度来获得相应的结果分值。如果学生程序有死循环等问题,则没有结果输出,结果分为零分。

(4)词法分统计

在人工阅卷时,老师会忽略不重要的错误,看关键语句是否正确,在自动阅卷过程中具体分为结构分析和关键词比对两步。结构分析是指先根据算法,将程序答案分割成各个语句模块,如声明语句、赋值语句、选择语句、循环语句、输入输出语句等。学生程序中只要有相应模块就给一定分值。

关键词对比是指我们把标准答案中的关键词,和学生答案中的关键词进行比较,根据关键词的个数给分。具体如下:编程题的源程序可以看成是多行的字符串,对程序的字符串进行扫描和分解,分离出一个个“单词”符号。这些单词符号就是c程序的基本词法单位。这些单词符号可以分成关键字、常数、标识符、运算符、界限符五类。在c语言里常用关键字有32个,如int、float,char等;常数包括整型、浮点型、字符型等;标识符可以用作变量名;运算符有算术运算符、逻辑运算符等;界限符有逗号、分号、括号等。分别放到不同数组中,进行对比。

4 结论(Conclusion)

基于上述编程题的自动阅卷系统已经开始使用,系统功能可以全部实现,对于正确的考生程序,系统能100%准确评分,对于存在错误的学生程序,与人工评分的结果相差无几,避免了极端分数的出现。同时本系统能减轻教师批改作业的负担,使学生的成绩更加公正、合理,大大提高阅卷效率,节省教学资源。采用这种方法对编程题进行自动阅卷,注重考生程序的内在结构,更加符合人工阅卷的思想,同时本系统也适用于其他程序设计语言课程,具有很好的实用价值和应用前景。

参考文献(References)

[1] 乔善平,刘振,朱波.编程题的计算机阅卷[J].计算机应用研究,

2004,8:229-231.

[2] 马培军,王甜甜,苏小红.基于程序理解的编程题自动评分方

法[J].计算机研究与发展2009,46(7):1136-1142.

[3] 温湘敏,胡琳.依据程序依赖关系匹配度的C语言程序设计题

评分方法[J].南昌大学学报(理科版),2013(10):502-506.

作者简介:

赵晓静(1973-),女,硕士,讲师.研究领域:计算机应用.endprint

猜你喜欢

C语言
基于Visual Studio Code的C语言程序设计实践教学探索
51单片机C语言入门方法
基于C语言的计算机软件编程
C语言程序设计课程教学与学科专业相结合的探索
《C语言程序设计》翻转课堂教学改革要点
浅谈基于C语言的计算机软件程序设计
高职高专院校C语言程序设计教学改革探索
基于C语言的学生成绩管理系统的设计与实现
基于C语言的常用排序算法比较研究
论子函数在C语言数据格式输出中的应用