毕业设计程序设计在线测评系统的设计与实现.docx
- 文档编号:11174031
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:39
- 大小:703.33KB
毕业设计程序设计在线测评系统的设计与实现.docx
《毕业设计程序设计在线测评系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《毕业设计程序设计在线测评系统的设计与实现.docx(39页珍藏版)》请在冰豆网上搜索。
毕业设计程序设计在线测评系统的设计与实现
程序设计在线测评系统的设计与实现
摘要
程序设计在线测评系统是以传统的测评系统为基础,通过分离显示页面和测评来实现的一个基于Internet的分布式判题系统。
本文分析了程序比赛的现状以及存在的问题,提出了将网页显示和测评完全分离的测评模式。
用户登录系统后,可以自由做题也可以进行比赛,题目信息和提交的程序是通过Web来管理的,提交程序后,系统通过程序测评机轮询扫描数据库来实现程序的测评,并将测评结果返回给用户。
搭建了一个稳定、高效的程序设计在线测评系统。
系统以Eclipse为开发工具,运用Java语言和MySQL数据库,结合JSP、Maven等技术,实现了数据管理、程序提交以及程序测评等功能,满足了用户的需求,达到了预期的设计目的。
关键词:
在线测评;程序设计;分布式
TheDesignandImplementationof
ProgrammingOnlineJudgeSystem
Abstract
ProgramingonlinejudgesystemisanInternet-baseddistributedjudgmentsystem,whichisbasedonthetraditionaltestingsystemandachievedbyseparatingtheuserinterfaceandjudge.
Thispaperanalyzesthepresentsituationandproblemsoftheprogramingcompetition,suggeststhemodelwhichseparatestheUIandthejudgecompletely.Afterlogininginthesystem,userscandoexerciseortakepartinthecompetition.TheinformationoftheexercisequestionsandsubmittingismanagedthroughtheWeb.Iftheprogramhasbeensubmitted,thesystemwillscanthedatabaseinturnbyevaluationmachinetojudgeitandprovidethefeedbacktousers.
BycombiningtheJSPandMaventechnologies,applyingtheEclipseasthedevelopmenttoolandusingtheJavalanguageandMySQLdatabase,thissystemhasachievedfunctionsincludingdatamanagement,programsubmittingandprogramtestingtomeettheusers’needs.Andithasalsorealizedthepurposeofthedesign.
Keyword:
OnlineJudge;Programming;DistributedSystem
附件1:
开题报告
附件2:
英文翻译原文及译文
1绪论
1.1研究背景和意义
1.1.1OJ历史
OJ(在线测评系统,OnlineJudge)原本是大学生参加ACM程序设计竞赛的测评系统,具有绝对的公平性,其自动测评代码的功能大大节约了手工测评的人力成本[1]。
1.1.2目前各高校的程序设计在线测评系统情况
目前绝大多数高校都没有自己的测评系统,学生的编程练习主要在北京大学OJ、杭州电子科技大学OJ以及华中科技大学OJ等主流OJ上进行。
但是使用别人的测评系统存在一系列局限性,没法使用学校内部的题目,也不方便组织自己学校内部的比赛。
OJ能够自动测评程序的正确性,而现在依旧有很大一部分学校的程序设计教学要依靠人力手动评判代码。
依靠人工测评,很大程度上将会增加程序设计教学负担,而且也不能保证测评的准确性和规范性。
因此各大高校很有必要开发自己的程序设计在线测评系统。
国内外在线评测系统普遍基于Linux平台进行开发,基于Linux可以让测评更稳定,也大大简化了开发的难度。
但是由于国内普遍使用Windows系统,高校中能够真正使用Linux的人并不多,所以基于Linux的OJ给系统的使用带来了巨大的障碍[2]。
1.1.3程序设计在线测评系统开发的必要性和可行性
如果将用于比赛的OJ用于高校的计算机教学,每一个学校都拥有自己内部的OJ,那么学生可以更加方便的进行在线编程练习,提高编程能力。
教师也可以减少教学负担,不必人工测评学生代码的正确性。
为了降低系统的耦合性,我们可以考虑将OJ的Web显示部分和测评部分完全分离,Web部分完成对OJ上包括用户、题目、比赛、权限等各类信息的增删改查的管理。
测评部分负责测评用户提交的代码的准确性,并及时返回结果给用户。
前台的界面显示和后台的测评机可以通过共享数据库或者Socket通信来实现交互。
1.2相关技术
系统开发环境为Java+MySQL,后端基于最新的SpringBoot快速开发框架。
前端设计使用当前的主流网页框架BootStrap,严格遵循W3C标准,完美兼容Chrome,Firefox等多种主流浏览器。
并且通过JSP实现前后端数据交互。
1.2.1Java
Java语言是由Sun公司推出的一门与平台无关的,安全的,面向对象的,分布式的解释型语言[2]。
Java语言具有继承、封装和多态性。
它沿袭了C语言的语法,面向对象模型和C++相似,但是去掉了C++中的指针,结构等运算,降低了学习难度,减少了代码出错的机会。
Java语言主要由四个方面组成:
(1)Java语法,也就是Java编程语言;
(2)Java文件格式;(3)JVM(Java虚拟机,JavaVirtualMachine)是Java的核心,用来处理Java生成的字节码,它相当于一个虚拟计算机,可以在不同平台上将字节码解释称对应平台的机器指令,使得Java语言能够一次编译,跨平台运行;(4)JavaAPI(应用程序编程接口,ApplicationProgrammingInterface),应用程序编程接口,对开发人员提供功能支持,同时又屏蔽了下层繁琐的实现过程,节约了开发成本。
1.2.2SpringBoot
SpringBoot是一种基于Spring4的全新Web框架。
它能够以很少的代价快速开发出Spring应用。
基本不用XML,采用全Java代码的方式做配置,只需很少的注解便能快速搭建出MVC(模型-视图-控制器,Model-View-Controller)框架。
使程序员从以往SSH繁冗的XML配置中解脱出来。
SpringBoot支持约定大于配置,让我们更容易创建基于Spring的应用。
不过SpringBoot并没有增强Spring本身的功能,只是降低了Spring开发的学习门槛,让基于Spring的应用从配置到运行变的更加简单,极大程度上提高了开发效率。
1.2.3SpringDataJpa
JPA(Java持久化规范,JavaPersistenceAPI)是由Sun公司在JavaEE5中提出的Java持久化接口,是目前流行的ORM(关系映射技术,ObjectRelationMapping)技术,是一套ORM实体操作的标准。
JPA用于维护实体类的生命周期,能够将运行中的实体对象持久到数据库中去。
主要包括三个方面的内容:
(1)映射数据库表,可以通过注解或者XML配置来实现实体类和数据库表之间的关系映射;
(2)能够快速对实体类进行增删改查操作;(3)支持原生的SQL查询语句,同时也约定了面向对象的查询语句。
JPA在程序中的位置如图1.1所示
图1.1JPA位置介绍
使用SpringBootJpa只需要很少的注解就能配置好JPA的应用。
1.2.4JSP
JSP(Java服务页面,JavaServerPages)是由Sun公司提倡开发的可以同时嵌入Java代码和HTML的跨平台的网页技术,其本质相当于模板引擎,可以实现前台界面和后台Java程序的数据交互。
1.2.5Bootstrap
BootStrap是一个整合了CSS、JS、HTML的前端开源框架。
他由Twitter的设计师MarkOtto和JacobThornoton合作开发完成。
Boostrap提供了简单优雅的前段开发规范,可以帮助前端较弱的程序员快速设计出简洁,大方的页面。
1.2.6MySql
MySQL是一个小型关系数据库管理系统。
它目前属于Oracle,从前由瑞典的MySQLAB公司开发。
MySQL虽然比起Oracle,SQLServer功能上会有些不足,但是其现有功能基本能够满足中小型数据库开发。
而且由于其开源特性,可以免费使用,极大程度上能够减少开发成本。
目前是最好的关系数据管理系统应用软件之一。
1.2.7Maven
Maven是一个用于项目构建的自动化工具,它依赖管理工具和项目信息管理工具,提供了中央库,能够帮我们自动配置外部Jar包[4]。
从此开发者不必手工添加jar包到BuildPath,一切都可以交给Maven的Pom.xml文件来管理。
1.2.8Lombock
Lombock是一个可以通过简单注解来创建代码,消除冗余代码的开源小工具。
在Java的开发过程中基本上要对每一个实体类的每一个属性添加对应的Get和Set方法,类似这样的样板代码过多,就会让开发者弄混真实代码和样板代码,而且当你要删除或者修改某个属性的时候,也要对应删除和修改相应的Get和Set方法,这样一来就很容易导致错误。
可是如果你使用Lombock只需在字段上添加@Get和@Set这样的注解,就能自动帮你完成Get和Set方法的添加,还能同步与你的属性的修改。
如果你依然觉得对每一个属性都添加@Get和@Set很麻烦,那么你可以选择对整个类添加@Data注解,它会自动为你的所有字段添加上Get和Set方法,而且还会自动实现equals()、hashCode()和toString()方法。
2程序设计在线测评需求分析
软件需求分析是软件开发生命周期中最重要的环节,其主要任务是了解用户需求,给系统的开发提出建设性目标。
一个合适需求分析能够节约软件开发的成本,减少开发者的编码压力。
本章节主要从功能分析和性能分析两个方面阐述了程序在线测评系统的主要需求。
2.1功能需求分析
网站主要分为公共浏览部分和私有部分。
(1)未登录用户
未登录用户可以浏览题目信息,浏览公开的比赛信息,查看所有的程序测评状态,浏览系统用户公开信息和所有用户的做题提交状态。
(2)普通登陆用户
普通用户可以提交代码,参加公开的比赛、获取密码的私有比赛、查看比赛状态以及修改个人基本信息。
(3)系统管理员
用户管理功能:
添加账号,屏蔽账号,重置用户密码,为普通用户赋予管理权限。
题目管理功能:
添加题目信息,修改题目信息,屏蔽题目,不可以删除题目。
比赛管理功能:
添加比赛信息,修改比赛信息,在比赛开始之前可以删除比赛信息。
评判管理功能:
修改题目数据信息后对相应题目的提交记录进行重判。
比赛结束后也可以来一轮重判来确保比赛的公平性。
2.2性能需求分析
(1)海量数据的提交
系统拟采用分布式设计,Web和测评完全分开。
采用Web和测评分离的模式,一是可以增加测评系统的稳定性,二是面对高负载的访问量,可以增加测评服务器来分流测评。
系统的具体结构如图2.1所示。
图2.1程序设计在线测评系统结构图
(2)恶意代码的攻击
测评的具体实现可以部署在Linux的Sandbox中,Sandbox推荐使用华中科技大学的开源测评,Sandbox是一个安全的沙盒运行环境,能够有效的应对绝大部分恶意代码的攻击。
3系统概要设计
3.1系统总体结构
系统主要分为:
题目模块、用户模块、比赛模块、测评模块四大部分。
系统结构如
图3.1所示。
图3.1系统结构图
(1)题目模块:
具有管理题目权限的管理员可以增加,修改,屏蔽题目信息。
(2)用户模块:
普通用户可以注册,登录,修改个人信息,超级管理员可以给用户分配权限。
(3)比赛模块:
具有管理比赛权限的管理员添加,屏蔽,修改比赛信息。
登录用户可以参加比赛,查看比赛排名和提交状况。
(4)测评模块:
系统自动评测用户提交的代码。
系统管理员可以手动重判用户提交的测评,
具体题目的测评,和每一次比赛的测评。
3.2数据库设计
系统数据库设计有用户表、题目表、提交代码结果记录表、提交代码表、比赛表、比赛题目表、记录编译错误表、记录运行错误表和权限表这9张数据表,数据库设计E-R图如图3.2所示。
图3.2数据库E-R图
数据库设计具体数据字段如下。
(1)系统用户表
系统用户表名为Users,用来记录系统用户具体信息,如表3-1所示。
表3-1用户表(Users)
字段名
字段类型
长度
是否允许为空
备注
user_id
Varchar
20
否
主键
用户编号
Varchar
100
是
用户电子邮件
submit
Int
11
是
总提交次数
solved
Int
11
是
解题个数
续表3-1
字段名
字段类型
长度
是否允许为空
备注
defunct
Char
1
否
是否屏蔽(Y/N)
defunct
Char
1
否
是否屏蔽(Y/N)
password
Varchar
32
是
密码(加密)
reg_time
Datetime
是
注册时间
nick
Varchar
100
否
昵称
school
Varchar
100
是
所在学校
(2)题目表
题目表名为Problems,用来记录系统题目的具体信息,如表3-2所示。
表3-2题目表(Problems)
字段名
字段类型
长度
是否允许为空
备注
problem_id
int
11
否
题目编号,
主键自动生成
title
varchar
200
否
标题
description
text
是
题目描述
inupt
text
否
输入说明
output
text
否
输出说明
sample_input
text
否
输入参照
sample_output
text
否
输出参照
hint
text
是
提示
source
varchar
100
是
来源
in_date
datetime
否
加入时间
time_limit
int
11
否
限时(秒)
memory_limit
int
11
否
空间限制(MByte)
续表3-2
字段名
字段类型
长度
是否允许为空
备注
defunct
char
1
否
是否屏蔽(Y/N)
accepted
int
11
是
总正确次数
submit
int
11
是
总提交次数
(3)程序提交代码结果记录表
提交代码记录表名为solution,用来记录用户提交代码的具体信息,以及提交
代码所返回的结果。
其中提交代码结果记录表solution中的字段problem_id对应题目表problems的主键problem_id。
提交代码结果记录表solution中的字段user_id对应用户表users的主键user_id,如表3-3所示。
表3-3提交代码结果记录表(solution)
字段名
字段类型
长度
是否允许为空
备注
solution_id
int
11
否
运行编号(主键)自动生成
problem_id
int
11
否
问题编号
user_id
char
20
否
用户编号
time
int
11
否
用时(秒)
memory
int
11
否
所用空间(MB)
in_date
datetime
否
加入时间
result
smallint
6
否
结果
language
tinyint
4
否
语言
contest_id
int
11
是
所属于竞赛组
num
tinyint
4
否
题目在竞赛中的顺序号
code_lenght
int
11
否
代码长度
Judgetime
datetime
是
判题时间
result字段对应配置文件中的评判结果,有如下8种情况:
①AC(通过,Accepted);
②WA(答案错误,WrongAnswer);
③TLE(超过时间限制,TimeLimitExceed);
④MLE(超过内存限制,MLE);
⑤OLE(超过输出限制,OutputLimitExceed);
⑥RE(运行时错误,RuntimeError,RE);
⑦PE(格式错误,PresentationError);
⑧CE(编译错误,CompileError)。
Language对应配置文件中的提交代码所用的编程语言:
C、C++、Pascal、Java、Ruby、Bash、Python、PHP、Perl、C#、Obj-C、FreeBasic等。
(4)提交代码表
提交代码记录表名为source_code,它的主键solution_id字段对应提交代码结果记
录表solution的主键solution_id字段,如表3-4所示。
表3-4提交代码记录表source_code
字段名
字段类型
长度
是否允许为空
备注
solution_id
int
11
否
运行编号(主键)自动生成
source
text
否
源代码
(5)比赛表:
比赛表名为contest,用来记录赛事信息的具体情况,如表3-5所示。
表3-5比赛表(contest)
字段名
字段类型
长度
是否允许为空
备注
contest_id
int
11
N
比赛id(主键)
自增长
title
varchar
255
Y
比赛标题
start_time
datetime
Y
开始时间
(年月日时分)
end_time
datatime
Y
结束时间
(年月日时分)
defunct
char
1
N
是否屏蔽(Y/N)
description
text
Y
描述
private
tinyint
4
公开/内部(0/1)
(6)比赛题目表
比赛题目表名为contest_problem,它记录了每一场比赛所包含的题目信息。
其中比
赛题目表contest_problem中的字段problem_id对应题目表problems的主键problem_id,比赛题目contest_problem中的字段contest_id对应比赛表contest的主键contest_id,如表3-6所示。
表3-6比赛题目表(contest_problem)
字段名
字段类型
长度
是否允许为空
备注
problem_id
Int
11
否
题目编号
contest_id
Int
11
否
比赛编号
title
char
200
否
标题
num
Int
11
否
比赛中题目编号
(7)记录编译错误表
编译错误记录表名为compileInfo,用来记录用户提交代码编译错误具体信息,编
译错误记录表compileInfo中的字段solution_id对应提交代码结果记录表solution的主键solution_id,如表3-7所示。
表3-7编译信息错误记录表(compileInfo)
字段名
字段类型
长度
是否允许为空
备注
solution_id
int
11
否
主键(提交编号,也就是运行主键)
Error
text
是
编译错误原因
(8)记录运行错误表
运行错误记录表名为runtimeInfo,用来记录用户提交代码运行错误具体信息,其
中字段solution_id对应提交代码结果记录表solution的主键solution_id,如表3-8所示。
表3-8运行错误记录表(runtimeInfo)
字段名
字段类型
长度
是否允许为空
备注
solution_id
int
11
否
运行编号(主键)
error
text
是
错误记录
(9)用户权限表
用户权限表名为privilege,用来给普通用户赋予权限。
用户权限表privilege的字段
user_id对应系统用户表users的主键user_id,rightstr用来区分是否为管理员,具体信息如表3-9所示。
表3-9用户权限表(privilege)
字段名
字段类型
长度
是否允许为空
备注
user_id
char
20
否
用户主键
rightstr
char
30
否
管理权限
defunct
char
1
否
是否屏蔽(Y/N)
4系统详细设计
4.1概述
系统主要包括用户模块,题目模块,比赛模块,测评模块四大模块,系统的主要功能都由这四大模块实现。
4.1.1SpringBootJpa数据库连接
系统中的所有数据库操作都基于SpringBootJpa框架。
通过定义配置文件参数,即可自动完成数据库连接初始化操作:
#数据源设置DataSourcesettings
spring.datasource.url=jdbc:
mysql:
//115.29.35.18:
3306/jol
spring.datasource.username=lyh
spring.datasource.password=lyh
spring.datasource.driverClassName=com.mysql.jdbc.Driver
#设置使用的数据SpecifytheDBMS
spring.jpa.database=MYSQL
#设置执行代码时显示sql语句Showornotlogforeachsqlq
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 程序设计 在线 测评 系统 设计 实现