1自动判题系统现状
随着计算机技术和通信技术的发展,以网络技术为支撑的教学辅助系统得到了长足的进步,各种自动判题系统相继出现。但目前成熟应用的自动判题系统中,主要是对客观类题目的自动评判,而对于主观题,尤其是程序设计题的自动评判,由于有诸多的技术难点,应用还不太广泛。目前实际应用的程序设计题的自动评判系统,主要分为两类。一类是以静态文本比对,一类是动态结果测试。第一类系统主要以填空题的形式出现,如全国计算机等级考试的机试系统。给出题目的大部分程序,关键的代码部分要求用户填写。系统根据用户填写的文本进行静态比对来测试是否正确。这种系统功能比较单一、刻板,容易压抑学生的创造性和自由发挥,也难以确测试学生的程序设计能力。第二类系统主要以特定的输入输出数据来进行测试,如ACMOnlineJudge系统。题目要求输入指定的数据,检测用户程序是否能够得到相应的输出数据。这类系统只对输入和输出数据格式做少量限定,可以让用户自由设计自己的算法和代码,对于鼓励学生的积极性和创造性来说,相对于第一种系统是一个很大的进步。这类系统用于比赛是合适的,已经成功运作了多年,但是对于作为教学辅助的实验系统和作业系统来说,有很多使用上的不便,比如不便于划分上课班级,不便于老师在期末的时候统计学生实验成绩等,因此难以促进教学效果的进一步提高。
2系统分析
本文借鉴了ACM竞赛平台的判题模式,结合高校教学的特点,设计了一种自动判题系统,使学生在日常作业、上机实验和自测练习时,能够及时准确地发现错误,设计出正确、合理、高效的程序。以信息化技术更新教学方法和教学手段,辅助日常教学,达到更好的教学效果。系统总体结构和主要功能模块详述如下。第一,用户管理:用户管理是指所有用户在使用系统前必须注册个人信息,个人信息内容包括用户ID、用户姓名、用户身份(教师、学生、管理员)、密码、E-mail等。为了便于以课程和班级为单位进行管理,还需设计由学生名单批量导入和导出的功能。第二,课程管理:课程管理是指教师可以申请开设课程,课程信息包括课程ID、课程名称、课程教师、选课人员、课程有效时间、课程介绍等相关内容。课程开设和取消的申请由教师提交,管理员批准。第三,题库管理:题库管理包括以下几个功能:出题管理、题目分类管理、作业选题、实验选题、课外练习选题等。出题管理是指有权限的用户可以按照指定的格式进行出题,管理员审核通过后可以把它们加入题库,以便于管理,同时设置题目批量导入的功能。每个题目都有难度属性和章节属性,管理员可以按属性对题目进行分类。教师可以从题库中选择题目留作作业、实验或课外练习等用途。第四,题目代码管理:每个学生用户都可以浏览教师设置好的题目(作业、实验、练习等),在编写完成代码后提交到系统中,系统调用评判模块,对程序进行评测,给出评判结果。第五,自动评判模块:自动评判模块是系统的核心部分,通过调用GCC等Linux系统自带的编译程序,考查编译结果和数据测试结果,给出题目代码是否通过等提示。第六,论坛模块:为了给用户一个自由讨论交流的平台,本系统附带一个讨论论坛。所有注册用户都可以发表帖子和对帖子进行回复。论坛管理的细节参见参考文献[2],在此不再详述。第七,统计管理:信息统计是指允许管理员和教师对于课程为单位的所有用户答题情况进行统计,并进行排序、报表、导出为文件等操作。具体统计项目包括用户的登录情况、在线总时长、提交问题数、每次实验的得分等。
3自动评判模块的实现
自动评判模块是整个系统的核心模块,它负责编译并运行用户提交的代码,并给用户反馈评判结果。评判结果按类型主要可分为以下几类:第一,CompileError(编译错误):这是指代码没用通过编译,程序中存在语法错误。第二,RuntimeError(运行期错误):程序编译通过,不过运行时发生错误。此结果一般是由于数组越界,指针操作违法等引起。第三,WrongAnswer(答案错误):程序正常运行并输出了结果,不过答案是错误的。第四,PresentationError(输出格式错误):输出时表达格式错误,一般可能是多了空格、空行等引起的。第五,Time/MemoryLimitExceeded(超限错误):程序运行超出了规定的时间/内存限制。一般是算法效率不高导致的。第六,Accepted(接受):程序代码运行结果正确。在系统评判时,本文调用了Linux系统下自带的GCC编译器来进行编译。GCC(GNUCompilerCollection)是一套由GNU开发的编程语言编译器。原本只能处理C语言,现在已经扩展为可处理C++、Fortran、Pascal、Objective-C、Java等编程语言。因此可以满足绝大多数程序设计课程的需要。当系统监听到用户提交程序代码后,在服务器中新建一个评判专用的进程。在该进程中调用GCC命令,用适当的参数执行对代码的编译过程。GCC在经过预编(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)四个过程后,给出编译结果。如果代码有编译错误,则把编译错误反馈给用户;否则,运行程序代码,并从数据库中取出该题目的输入数据,应用管道技术逐字读入,记录程序相应的输出数据。然后从数据库中取出正确的输出数据,与运行结果进行比较,根据比较结果给出对应的反馈信息。如果程序在规定的时间内仍未输出完成,则强行结束该评判进程,并把超限错误反馈给用户。
4结论
本文开发了基于ACM/ICPC竞赛平台模式的程序设计题的在线自动评测系统,可以有效解决高等院校程序设计类课程的作业、实验和课外练习的在线自动评判问题。本系统对于促进学生学习的积极性和主动性、降低教师大量重复性的工作量、提高学生的学习效率、改进教学效果等方面都有显著作用。
作者:黄宏博