钟耀章,桂 琼
(桂林理工大学,广西 桂林 541006)
ACM国际大学生程序设计竞赛是由国际计算机协会(ACM)主办的,比赛一般会有7~13个题目[1]。三个人一队,共同使用一台电脑,需要在5个小时内使用C/C++、Java和Python中的一种来编写程序从而解决问题。在线测评系统(Online Judge,OJ)先前的目标是为了锻炼参加ACM国际大学生程序设计竞赛的参赛者们。除此之外,在实际的计算机教学环境中也起到了很大的作用,学生在学习计算机基本算法或者数据结构类似课程的过程时,常常不能知道自己设计的算法和实现的代码是否完全正确而不能做出正确的判断。特别是一些刚入门的程序设计爱好者常常不能对自己所写的程序有一个很好的认识,在线测评系统凭借着严格的判题体系和大量的测试数据的优势完美地解决了这个问题。在线测评系统对比人工评判有着如下的优势:(1)效率高,人工评判时间漫长,不能让学生及时地了解到自己那些方面的不足,在线测评只需要几秒钟就能完成测评并实时将结果反馈给用户。(2)使用方便,你只需要有一台能联网的电脑就可以进行算法训练,并且题目多样性,大大提高学生的兴趣。(3)公平性,不会存在人为主观因素,系统是拿测试数据进行对比。本系统旨为算法爱好者提供一个在线学习、交流的平台。
本次要开发的ACM竞赛在线测评系统分为三个模块:前台服务模块、后台管理模块、后台测评模块[2]。前台服务模块有:用户注册登录、用户找回密码、修改个人信息、用户排名、题目预览、查看提交代码和报名竞赛等。后台管理模块有:用户管理、比赛管理、题目管理和管理员注册登录等。后台测评模块有:代码处理、代码编译、代码测试。系统总体框图如图1所示。
图1 ACM竞赛在线测评系统总体框图
前台服务模块指的是本系统普通用户使用的模块,就是用户打开浏览器输入本系统的url即可访问到系统,前台服务模块如图2所示。
图2 前台服务模块
(1)用户注册:使用本系统需要注册一个用户,输入学号,密码,名字,学校,专业班级,QQ,邮箱等。
(2)用户登录:使用本系统必须先登录,如果想要通过url的方式直接访问本系统,也会被系统拦截器拦下来。
(3)用户找回密码:当用户忘记自己的密码时,可以通过注册时的学号和邮箱来修改新的密码。
(4)修改个人信息:用户可以修改除了学号的其他基本信息。
(5)用户排名:用户可以查看自己在本系统的排名,根据你的解题数和你的提交次数做一个排名。
(6)题目预览:用户点击题目按钮时,系统会以每页10题的方式来显示当前系统的所有题目。
(7)查看提交代码:当用户提交代码后,系统会把用户提交的代码、运行时间、测评状态、提交时间和使用的语言等信息存储起来,用户可以查看本题提交状态和查看提交的代码,也可以查看其他用户提交的信息。
(8)报名竞赛:用户可以报名正在进行的竞赛。
后台管理模块是属于管理员的模块,可以对用户、题目和竞赛进行管理,后台管理模块如图3所示。
图3 后台管理模块
(1)管理员注册:如果想登录系统的后台管理页面,需要注册一个系统管理员用户。
(2)管理员登录:必须要登录才能访问系统后台管理模块,如果直接通过url的方式访问后台页面,也会被拦截器拦截并且跳转到登录页面。
(3)用户管理:管理员可以查看用户,并且对其进行修改删除操作。
(4)题目管理:管理员可以为系统新增题目、修改题目和删除题目。
(5)竞赛管理:管理员可以新增竞赛、新增竞赛题目和删除竞赛。
后台测评模块对用户提交的代码进行处理,判定是C还是Java等,编译代码,编译通过后运行代码,测评结果是否正确,后台测评模块如图4所示。
图4 后台测评模块
(1)用户端:用户需要通过浏览器,来访问本系统,首先需要注册成为本系统用户,然后登录使用本系统。用户忘记密码时,可以通过学号和电子邮箱来修改新密码。登录成功首页有题目、提交、比赛、个人信息和排行榜等按钮。题目页面会以每页10条数据进行分页显示题目,分别显示题目标题、题目难度、通过率和提交状态等信息。点击题目标题将会跳转到题目详情页面,在该页面可以进行代码提交。提交信息页面分别显示运行ID、提交用户、题号、运行时间、测评结果、提交时间等信息,点击运行ID会弹出模态框里面显示该次提交的代码。比赛页面分别显示竞赛标题,竞赛开始结束时间和竞赛当前状态。竞赛状态会根据竞赛开始结束时间和系统当前时间做对比,分3种状态:未开始、正在进行和已结束。用户可以修改除学号之外的个人信息,查看用户排行榜。
(2)管理员端:后台管理模块有用户管理、题目管理和竞赛管理功能。用户管理有用户修改和用户删除操作。题目管理有新增、修改和删除题目操作。竞赛管理有新增竞赛、删除竞赛和新增竞赛题目操作。
本OJ系统所支持的编程语言有C,C++,Java,整个测评功能模块的工作步骤如下:
(1)获取用户提交的源代码,如果是用户使用的是C、C++语言的话,会把代码保存在指定的文件夹下,XXXX.c或者.cpp的文件里,前面4位是系统随机产生字符,这也是保证文件名不能相同。如果用户选择的是Java语言的话,首先Java的类名必须是Main,随后生成XXXX.java文件。
(2)编译源代码生成的.c或者.java文件,系统会根据相应的文件调用不同的编译器,C/C++生成.exe文件,Java生成.class文件,前面的4位随机数和编译前是一样的。
(3)运行已经编译好的.exe或者.class文件,运行文件进行数据的输入输出用来和录入数据库的测试用例对比,得到结果,并将测评结果实时反馈给用户,测评功能模块流程如图5所示。
图5 测评功能模块
系统选择C/C++的编译器是WinGW,它是一个精简的Windows平台,支持C/C++、ADA编译器,使用较为方便[3]。
Java编译器选择JDK,它为Java应用程序开发提供了编译和执行环境,所有的Java写程序都依赖于它。
安装好编译器和配置好环境后就可以直接使用cmd窗口执行命令调用相应的编译器编译运行C/C++或Java文件。
(1)先获取用户提交的源代码,判断提交的是C/C++还是Java。
(2)将用户提交的代码存放在系统指定位置,并且C/C++命名为xxxx.c文件,Java命名为xxxx.java(用户提交的Java代码,类名必须为Main),文件名为随机四位字符。
(3)编译用户提交的代码,使用Runtime.getRuntime().exec方法可以调用cmd命令行窗口执行g++或者javac命令编译.c和.java文件。
(4)执行编译成功后的.exe文件或者.class文件,还是使用Runtime.getRuntime().exec方法调用cmd命令行窗口[4]。
Processprocess = Runtime.getRuntime().exec(“运行命令”);//执行编译
BufferedWriter bout = new BufferedWriter();
bout = newOutputStreamWriter(process.getOutputStream());// 获取子进程输出流
bout.write(sampleInput);// 输入数据库的测试样例
bout.close();
(5)将运行输出的结果和数据库测试数据进行对比,并将测评结果存放数据库
例如用户提交的是Java代码,Java源码测评程序流程图如图6所示。
图6 Java源码测评程序流程
ACM国际大学生程序设计竞赛是计算机界最有权威的竞赛之一,也被称为计算机界马拉松。在线测评系统是一个功能性很强且综合的系统,不仅要求会Java Web和数据库的知识还要求实现页面的简洁美观。本文对在线测评系统前台服务模块到后台管理模块和测评模块做了详细需求分析,着重介绍了实现在线测评的整个流程。系统设计已基本完成,能够在线测评并实时将结果反馈给用户。