程序设计题在线评阅技术的研究
2019-09-10林宁
摘 要:本文针对目前计算机专业毕业生就业难的问题,提出开发一个程序设计类课程在线学习系统,有助于减轻教师的工作量、增加学生的代码量,从而提高学生的编程能力,但程序设计题的主观性较强,大多数在线评阅的准确率难以令人满意;本文就程序设计题的在线评阅技术进行探讨,给出了程序设计题自动评阅模块的实现方法、评阅目标和原则,以及题目测试数据的要求、静态评阅实现的方法、语法错误检测方法,还给出了运行结果自动评阅的实现方法等;评阅的技术具有一般性,可以应用到C语言、C++和Java等语言的自动评阅上。
关键字:程序设计题;在线评阅;静态评阅;C语言
中图分类号:TP311.1 文献标识码:A 文章编号:2096-4706(2019)08-0104-03
Abstract:In view of the difficult employment of computer graduates at present,this paper puts forward that the development of an online learning system of programming courses can help reduce the workload of teachers,increase the amount of code for students,and thus improve the programming ability of students. However,the subjectivity of programming problems is strong,and the accuracy of most online reviews is difficult to be satisfied. This paper discusses the online evaluation technology of program design questions,and gives the realization method of automatic evaluation module of program design questions,the goal and principle of evaluation,the requirement of test data,and the realization method of static evaluation. The method of syntax error detection and the realization method of automatic evaluation of running results are also given in this paper. The technology of review is general and can be applied to automatic review in C language,C++ language and Java language.
Keywords:programming questions;online evaluation;static evaluation;C language
1 現状及问题
据不完全统计,我国软件人才总量不足,结构也不合理,软件测试专业人员缺口高达20万,Java软件工程师每年的缺口为15万左右,各行各业对计算机人才的需求不减,而计算机专业却是高校应届生就业率较低的专业之一。对于计算机类专业的毕业生,有很多公司抱怨其实践能力较差,高校培养出来的人才难以符合企业需求。社会需要的是编程能力强、开发水平高、掌握新技术的计算机应用创新型人才。因此在教学方面急需转变传统教学方式,增强学生编程实践能力,以培养适应市场需求的应用型人才。
为了适应社会对计算机专业人才的需求,我院与企业双主体共同培养计算机专业人才,计算机科学与技术专业和数据科学与大数据技术专业成为首批合作的专业。校企协同育人的模式有利于培养适应社会需求的应用型人才,但这也带来了新的挑战。在专业课程模块上将会开设更多与企业需求的前沿技术相关的课程,如数据挖掘技术与应用、神经网络与深度学习应用和智能机器人等课程,这些课程的学习都要求学生具备较好的编程能力。C语言、C++和Java程序设计等是计算机及大数据专业的重要基础课程,学好这些课程将为后续专业课程的学习打下坚实基础。如何提高学生的基础编程能力?在教学中可以通过增加学生的编程代码量来提高学生的编程能力,然而传统的教学方式势必会加重教师的教学负担,开发一个程序设计类课程在线学习系统有助于减轻教师的工作量、增加学生的代码量,从而提高学生的编程能力。由于程序设计题的主观性较强,现有的自动评阅准确率难以令人满意,目前能用于教学与考试的系统并不多,针对这一情况,本文就程序设计题的在线评阅技术进行探讨。
2 自动评阅模块
自动评阅模块是程序设计题在线评阅系统的重要组成部分,该模块能够实现对学生提交的程序进行自动评阅。该模块实现的功能包括:接收学生提交的程序、对程序进行去掉注释处理、静态评阅、输出语句标准化、动态评阅,并将评阅结果返回给学生且保存到数据库等。在线评阅系统接收提交的程序后,Web服务器与判分的守护进程创建Socket连接,并将程序以及测试数据发送给守护进程;自动评阅系统首先将提交的程序中所有的注释全部去掉,然后对必须包含的关键字进行匹配,并计算静态相似度。对提交程序中的printf输出语句格式控制进行标准化处理;然后编译、运行学生程序,输入测试数据,再判断输出的结果是否正确,可通过反复多次运行学生程序来提高判分的准确率。
评判系统满足以下目标和原则:
(1)实现并行评阅,对同时提交的程序可以同时进行判分,且相互之间不影响结果。
(2)在评阅过程中,控制每个判分进程资源的使用,合理分配服务器的内存和CPU资源。
(3)评阅的可靠性,保证判分的准确率在测试中超过某个值。
3 题目输入输出要求
输入值是用来检测学生程序是否正确。输入值对学生来说是看不到的,输入值可以设置若干组,后台判分程序根据输入的组数来执行程序,每执行一次程序输入一组值。设置多组输入值的好处是避免出现对某些题目的误判。例如:
题目:用C语言编写一个命题公式赋值计算器,通过键盘输入一组赋值,实现自动计算命题逻辑公式的真值。
该题输出的结果只有两种情况:1或0,如果只有一组输入值,那么学生只需在程序中输出1或0就可以得分。设置了多组值,且输出结果有的为0,有的为1,这样不管是学生的程序输出1还是0都会被判分进程判为0分。
在动态评阅时,系统将多次运行学生程序,根据所有的运行结果来进行判分。输出值也是分为多组的,每组输出值是对应一组输入值的,输出值是出题老师事先根据输入值计算出来的标准结果。用输出值与运行学生的程序进行关键字的对比来计算动态相似度,输出值也相当于标准答案。
4 在线评阅的关键技术
4.1 静态评阅
静态评阅目的是检查程序是否包含必要的關键字或者框架,这样可以限制学生使用某些知识来解决问题。例如,题目中要求使用自定义的结构体,那么提交的程序中必须包含有struct{}这样的框架,否则该程序被检测为没有按照题目要求完成,被判为0分。在判断关键字前首先去掉注释,避免提交的程序中含有大量注释,造成误判。静态评阅的处理流程图:
将程序去掉注释后,还需要进一步检测程序中是否包含某些关键字,检测关键字的算法如下:
(2)从程序文件中使用fgets()读取新的一行到字符数组str中,转(3),读取失败,转(4);
(3)在关键序列S中循环将关键字取出,每次循环使用strstr()函数检测关键字是否存在于str字符串中。如果strstr()函数返回指针非空,则i=i+1,并从序列S中删除该关键字;
(4)关键字检测结束,i为程序中包含关键字的个数。
4.2 语法错误检测
程序的语法错误是自动评阅中常见的错误,因此学生的程序提交到服务器后首先要进行语法上的检查,造成语法错误主要有两方面的原因:一是程序本身存在书写上的错误,导致编译无法通过;二是编译器的差异造成编译无法通过;如对于C语言来说,编译器的类型比较多,如VC++,VS2010、VS2015等,也有Linux环境运行的编译器gcc等,这些差异会造成在一个编译器能编译通过,但另一个编译器无法通过。因此,自动评阅系统应给出错误的理由或提示。
如何检测提交的程序是否有语法错误呢?最直接的方法是通过调用服务器上编译器的命令检测,如在linux系统下C语言在判分程序中使用system函数调用shell命令进行编译,C语言函数system()调用gcc命令编译学生提交的程序。使用system()函数调用命令的格式如下:
如果编译通过,将会生成可执行文件,说明程序没有语法上的错误,否则,后面步骤不再执行,该题直接判为0分。
4.3 无限运行程序的终止
有时在运行提交的程序时,会出现这样的情况,死循环、要求输入大量的数据等,如下面两个程序片段:
在这种情况下,该进程是不会自动终止的,这种情况下往往需要限制提交程序的运行时间,采用非正常终止的手段。
4.4 运行结果的评阅
本文采用了多组测试值,对提交的程序进行多次测试,目的是提高评阅的正确率。对评阅结果分以下三种情况:
(1)每一组测试结果都正确,则提交程序是正确的。
(2)部分测试值结果错误,说明提交的程序不完全正确。
(3)所有测试值得到的结果是错误的,则该程序错误。
在动态评阅方法上,判断程序是否正确的方法是对比程序运行结果。对比的方法有两种,一是完全匹配法,二是关键字匹配法。
完全匹配方法,即运行提交的程序后,得到的运行结果与标准答案进行匹配,当结果完全一致,那么程序是正确的,否则程序是错误。
关键字匹配法,标准答案中只给出主要的关键字,如果运行结果包含所有的必要关键字,那么我们认为是正确的。
如题目:输入整数n,计算并输出n!;实现的代码如下:
后台给出的标准答案是只输出n!的值,并没有其他字符。从上面的代码可以看出程序输出了提示的语句“请输入n的值:”,如果采用完全匹配方法程序是错误的。如果采用关键字匹配法,提交的程序是正确的。目前很多系统采用的是完全匹配的方法,这种评阅方法对输出有严格要求;对于关键字匹配法的实现方法是首先要尽量去除无关的输出字符,然后再检测输出结果中的关键字,这种评阅方法放宽了输出的要求。
5 结 论
本文对程序设计题的自动评阅的一般方法进行了探讨,一些方法已经被应用到C语言自动评阅系统上;国内很多自动评阅系统在评阅后学生只能看到对或错的两种结果,学生往往难以修改程序;作为练习系统,我院开发的在线评阅系统增加了错误提示功能,学生可以根据不同的错误类型对程序进行修改,同时减轻了教师辅导工作量;本文提及的技术也可以应用到C++、Java等语言的自动评阅系统的开发中。
参考文献:
[1] 林宁,左悦.基于Linux的C语言编程题在线评分平台的搭建 [J].福建电脑,2018,34(9):45-46.
[2] 何文广,周珂,熊刚强,等.VB.NET程序设计题动态评阅技术研究 [J].实验室研究与探索,2017,36(11):122-125.
[3] 刘悦芳.依据程序依赖关系匹配度的C语言程序设计题评分方法 [J].电子技术与软件工程,2019(1):238.
作者简介:林宁(1981-),男,汉族,广西北流人,讲师,硕士,研究方向:软件理论与应用、信号与信息处理、算法分析。