李伟光 陈希
摘 要:随着ACM-ICPC(国际大学生程序设计竞赛)在世界各地的广泛举办,竞赛中使用的OJ(在线评判系统)也成为各大高校内部训练、举办竞赛的必备系统。为适应民办高校进行ACM选拔和备赛的需要,开发了GOJ(光华在线评判)系统。该系统包括前台Web网站(B/S架构)、后台评判系统(C/S架构)和数据库3部分,在Windows下的.NET平台进行开发。评判程序是软件模拟的一个C/S架构程序,这样不仅节省了评判服务器的成本,在安全方面也将风险降至最低。
关键词:GOJ B/S C/S .NET
中图分类号:TP31 文献标识码:A 文章编号:1674-098X(2015)10(a)-0046-03
ACM-ICPC是由国际计算机界历史最悠久、最具权威性的组织ACM(Association for Computer Machinery,计算机学会)主办的国际大学生程序设计竞赛,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛。
竞赛中使用的OJ(在线评判系统)也成为各大高校内部训练、举办竞赛的必备系统。Online Judge系统(简称OJ)是一个在线的评判系统。用户可以在线提交程序多种程序(如C、C++、JAVA)源代码,OJ系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。一个用户提交的程序在Online Judge系统下执行时会受到比较严格的限制,包括运行时间限制、内存使用限制、安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件,然后返回给用户一个状态,如通过(Accepted,AC)、答案错误(Wrong Answer,WA)、超时(Time Limit Exceed,TLE)等等,因此一个好的OJ系统对于ACM-ICPC是非常重要的 [1]。
1 GOJ系统构成
整个GOJ系统分为3个部分:(1)前台Web网站,供用户查看题目、提交程序,供管理员管理整个OJ系统。(2)后台评判系统,这是GOJ系统的核心部分,它用来对用户进行练习或者比赛所提交的代码进行评判,其检测过程非常严格。(3)GOJ系统所使用的后台数据库系统。
GOJ系统的整个实现过程是:用户通过前台B/S架构的Web网站提交程序代码至数据库中,然后由后台C/S架构的评判程序发现数据库中用户提交的代码,并对其进行编译、运行、评判,最后由评判程序更新数据库中用户提交的程序状态,并将该结果显示在前台网站。
2 需求分析
2.1 基础部分功能需求
GOJ系统基础部分应具有以下功能:第一,具有能够提交题目,给出提交结果的功能。第二,答题结果由GOJ用户提交,因此,应具有用户的注册和登录功能。第三,应具有排名功能,方便教师了解学生在系统上的训练情况,也能促进学生学习的热情。排名功能可以有:每日排名、每周排名、每月排名和总排名。第四,提交情况应可以方便查看,而且提交情况应具有筛选功能。第五,每个题目应具有提交状态分析功能,即根据提交状态表统计出每个题目的通过数、答案错误数等数据,让用户了解该题目的难易程度。
2.2 竞赛部分功能需求
GOJ的开发主要就是为了用其举办ACM赛事,因此赛事部分应具有以下功能:第一,竞赛应分类型,包括内部赛和公开赛两种。内部赛只允许使用内部发放的帐号,公开赛在竞赛之前、竞赛过程中用户可以登录GOJ的Web网站进行注册参赛。第二,要具有判断本场比赛的状态功能。比如,比赛若未开始,不允许任何用户进入比赛查看题目,而比赛一旦结束,不允许任何用户提交题目。第三,赛事题目不允许重复提交,每个队伍提交成功的题目不允许再次提交。第四,要具有参赛队伍排名功能,这也是ACM竞赛最重要的部分。按照提交成功的题目数、提交耗时为所有参赛队伍排名。其中,参赛队伍要分组,包括标准参赛队伍和观摩队伍。排名表也要足够详细,能够看出参赛队伍每道提交题目耗费的时间和提交次数。第五,提交题目的统计功能。要能够统计出整场竞赛,每个题目的通过数、答案错误数等数据,用来观察题目的难易程度,方便赛后分析题目。
2.3 管理部分功能需求
GOJ的用户应至少分成3种:第一种是普通用户,第二种是管理员,第三种是超级管理员。其中超级管理员具有最高权限,能够管理GOJ所有功能。管理员能够管理GOJ部分功能和普通用户。普通用户只能管理自己的用户,即修改个人信息和密码,以及其它基础操作。超级管理员或管理员登录后,能看到进入GOJ管理页面的链接,而普通用户则无法进入GOJ管理界面。
GOJ管理部分应具有以下功能:第一、赛事管理功能,包括添加、修改、删除赛事。第二、题目管理功能,包括GOJ基础题库管理和赛事题目管理。题目管理包括题目的添加、修改、删除功能。第三、用户管理功能,要能够管理GOJ基础部分的所有用户,包括用户信息的查看、修改,以及竞赛参赛用户的添加、查看、修改功能。由于参赛用户往往很多,并且由管理员一人添加,所以参赛队伍要具有批量添加功能,参赛队伍的密码要能够随机生成。参赛队伍浏览页面要具有为参赛队伍随机排列座位的功能。第四、用户提交代码的查看功能。要能够查看用户提交的源代码,为以后的打印功能做准备。
3 设计部分
GOJ的基础部分模块设计如图1所示。在这里我们把Web网站的页面设计成英文界面,并且使用OJ中最常见的词汇,让用户在使用我们的GOJ之后也可以快速的适应其它OJ。
图1中第2行模块将在网站的菜单栏直接显示。其中“Online Judge”模块包括“Home”(返回主页)和“FAQ”(进入FAQ页面)两部分。“Contests”按钮将链接至赛事列表。Contests下面的分支是由点击Contests按钮进入赛事列表选择一场赛事之后的菜单栏显示。“Problem”包括“Problem List”(题目列表)、“Status”(提交状态页面)和“Submit”(提交页面)3部分。从“Problem List”进入题目列表,选择题目之后可以浏览题目,以及具有查看题目提交情况和提交本题目代码的链接。“Authors”包括“Ranklist”(总排名)、“Day Ranklist”(每日排名)、“Week Ranklist”(每周排名)和“Month Ranklist”(每月排名),供用户查看排名情况。Member模块登录之后字模块将变成“Modify Information”,“Modify Password”,“Logout”3个子模块,菜单栏上的Member字样将会被用户的用户名所替代。如果登录用户具有管理员权限那么菜单栏上Member之后将会增加一个“OJ管理”按钮,点击之后进入GOJ管理系统。
GOJ的管理系统模块设计如图2所示。
由于管理系统是由内部工作人员使用,在这里为了使用方便将更多的使用中文。其中“Online Judge”用来返回OJ首页。赛事管理用来浏览当前的赛事列表,在列表选中赛事之后可以修改和删除赛事。题目管理包括OJ基础部分题目的添加、修改、删除以及赛事题目的添加、修改、删除。用户管理模块,包括添加参赛队伍,其中添加参赛队伍要能够批量添加参赛队伍,队伍密码随机生成。管理参赛队伍能够编辑和删除参赛队伍,并且能够随机排列座次。OJ用户管理要能够管理OJ所有的用户信息,包括修改用户信息和删除用户。如果是超级管理员登录,将会多增加一个“管理员管理”的子模块。代码查看包括赛事提交代码、OJ提交代码,用来查看用户提交的源代码,也为以后的打印功能预留下扩展空间。GOJ管理系统的母板页将会增加用户权限检查的功能,用户如果未登录或者不是管理员将无法进入GOJ管理系统。
数据库[2]设计如下所述。
用户要能够提交题目就一定要有一个表来存储题目,并且这个表的字段要包括题目的信息,那么我们为这个表起名为tb_Status(状态表),状态表的主键应该是一个自增主键,其它字段应包括提交的题目号、题目提交的状态(默认值为Waiting)、提交语言,还有等待更新的运行时间、内存使用,提交既有的代码长度、提交者、提交时间、提交代码,这张状态表将是OJ的核心表格,前台Web用户通过向此表添加代码,后台评判程序更新此表状态等字段来向前台用户反馈出用户提交代码的运行结果。
状态表中需要题号和提交者两字段,因此还需要题目列表和用户表。
用户表一定要有用来登录的用户ID和用户密码,同时也要有用户的个人信息,包括用户名、电话号和email等。状态表的提交者字段应该是用户表中用户ID在状态表的外键。用户有管理员、超级管理员和普通用户之分,由于管理员只是少量用户所以我们单独建立一张管理员表,包括两个字段即可,一是管理员ID,用来引用用户表的用户ID,另外一个是管理员级别。
在题目表中,能唯一标识一道题目的就是题号,所以题目表中的主键就是题号。在这里题号也可以设置为一个自增主键方便添加题目。其它字段包括题目标题、题目时间上限、题目内存上限、题目总提交数、通过数、题目描述、题目输入描述、题目输出描述、输入用例、输出用例以及用来评判用的并且是用户不可见的评判输入、输出用例。
GOJ系统最核心的用途就是安排一场ACM竞赛,那么每场竞赛就要有其自己的属性。因此我们建立赛事列表,为了方便使用赛事列表的主键我们使用自增主键,其它字段应包括赛事标题、赛事开始时间、赛事时长以及赛事类型。参加ACM竞赛的角色应该是一只队伍,因此要建立参赛队伍表。首先要标识此队伍参加了哪场竞赛,所以一定要使用赛事列表中的赛事ID主键在这里,同时也要标识这场竞赛中的队伍,那么我们在这里把赛事ID和队伍ID设置为联合主键,共同决定队伍表中一条记录。参赛队伍要有登录用的密码、队伍类型、队伍所在学校、队伍名称、教练姓名、队员1姓名、队员2姓名、队员3姓名以及座位号。ACM竞赛最终要使用的就是竞赛排名,排名是根据每个队伍在竞赛中所取得的成绩排列的,那么每个队伍的成绩就是每个队伍应该具有的属性,因此将标识成绩的属性添加到队伍列表中包括提交总数、耗时总时间、每道题目的耗时、每道题目的提交次数。
对于赛事题目列表,在基础部分的题目列表基础上要增加赛事ID和题目颜色(ACM竞赛中每道题目对应一种气球的颜色),题号和赛事ID作为联合主键。赛事提交状态表也是要增加一个赛事ID,由于状态表中的主键是自增主键,在这里也不需要再设置联合主键了。
4 结语
通过对GOJ系统的设计与开发,得出以下结论。
(1)系统架构方面:一个完整的系统不一定是C/S架构或B/S架构。如果需要可以同时使用两个架构,各取其优进行组合。
(2)开发平台方面:GOJ没有像以往的在线评判系统一样在Linux平台下开发,而是在Windows下的.NET[3]平台进行开发。.NET平台有着高效的开发和维护效率,图形化界面方面也要优于Linux。并且,在前台网站、评判程序和数据库三大模块的相互调用方面可实现无缝连接。
(3)软件模拟方面:在开发需要考虑成本和安全性方面的项目时,软件模拟是一种有效的实现方法。在GOJ中评判程序是软件模拟的一个C/S架构程序,这样不仅节省了评判服务器的成本,在安全方面也将风险降至最低。
参考文献
[1] 李文新,郭炜.北京大学程序在线评测系统及其应用[J].吉林大学学报(信息科学版),2005(23):170-177.
[2] 邵超,张斌,张巧荣.数据库实用教程——SQL Server 2008[M].北京:清华大学出版社,2009.
[3] 旁娅娟,房大伟,吕双.ASP.NET从入门到精通(第二版)[M].北京:清华大学出版社,2010.