在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】

在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】

ID:479646

大小:360.50 KB

页数:37页

时间:2017-08-09

上传者:U-944
在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】_第1页
在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】_第2页
在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】_第3页
在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】_第4页
在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】_第5页
资源描述:

《在线判题系统设计与实现【计算机科学专业】【毕业设计+文献综述+开题报告】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

(20届)本科毕业论文在线判题系统设计与实现 摘要:计算机编程学习过程中,单单只接受老师所传授的知识是不够的,而要在课后自己进行编程练习和巩固老师教的知识。而OnlineJudge系统很好的为我们提供了一个学习和练习的平台。它可以对程序原代码进行编译和执行,并通过预先设计的测试数据来检验程序原代码的正确性。本课题结合计算机学科编程语言教学中的需求,利用VisualStudio2010功能强大的集成开发环境,使用ASP.NET和SQLServer后台数据库,开发了一个能够实现C/C++程序在线自动评判的网上编程学习系统。系统包括前台管理模块和后台判定模块。本系统很好的为用户提供了一个学习编程、掌握编程与编程交互的平台。关键词:程序设计;在线判题;API;编译器 DesignandimplementationoftheOnlineJudgeAbstract:Computerprogramminglearningprocess,justonlyacceptedtheknowledgetaughtbytheteacherisnotenough,buttopracticeprogramandtheconsolidationoftheirteacher'sknowledgeintheafter-school.TheOnlineJudgesystemprovidesagoodplatformforlearningandpracticing.Itcancompiletheprogramandexecutesourcecode,andtestdatathroughpre-designedtotestthecorrectnessofprogramsourcecode.Thissubjectcombinestheneedsoflearningcomputerprogramming,usingVisualStudio2008whichprovidesapowerfulintegrateddevelopmentplatform,ASP.NETandSQLServer2005,tobuildthisE-LearningsystemwhichcanjudgeC/C++programs.Thissystemisdividedintotwoparts:FrontManagementModuleandBackgroundJudgmentModule.Keywords:Program;OnlineJudge;API;Compiler 目录1引言11.1课题背景、意义11.2系统开发语言C++21.3相关技术简介31.3.1.Net简介31.2.3VisualStudio简介41.2.3SQLserver简介42研究的基本内容及解决方法42.1课题的基本内容42.2要解决的技术难点及解决方法42.2.1登陆信息管理42.2.2题库的设计实现52.2.3编译的实现53系统总体设计与目标73.1系统设计的原则73.2系统设计方法83.3系统结构83.4系统结构图83.1系统设计目标94系统详细设计94.1用户注册与登录104.2题库的具体实现114.3后台程序算法的实现与分析124.4判题的实现134.5系统测试21结束语23致谢24参考文献25 1引言1.1课题背景、意义   随着信息化进程的飞速发展以及计算机技术的普及,高等院校开设了越来越多的计算机课程。和传统的课程比较,计算机课程具有实践性很强的特点。学生要学好这些课程不但要认真学习理论知识,还需要大量的实践训练。例如,C语言课程的学习,就需要编写大量的程序,才能够积累足够的经验,真正掌握程序设计的方法,编写出正确、高效的程序。对传统课程的考核多采用笔试的方式,但是,对于计算机方面的课程,特别是程序设计语言类课程这是不够的,因为它并不能促使学生在平时的学习中加强实践的锻炼。如何对这些课程进行有效的考核,成为一个长期工作在第一线的计算机教育工作者反复思考和不断探索的问题[1]。在目前的教学方式中,多数高等院校基本上还是采用基于传统方式的笔试来考核学生的计算机课程水平,然后在此基础上稍作补充。在上机实践考试中,学生采用FTP,Email,甚至手写的方式提交编程作业,老师需要对他们的作业进行一一批阅,相当多的时候,任课教师从学生处得到的是一些低效的,甚至不能运行通过的源代码,可是却要花费不少时间来判断分析学生程序到底在什么地方出错,然后给出相应的得分。这需要老师和学生花费很多的精力,效果也不是很好。学生更无法得知自己所编写的程序存在哪方面的问题,因而不能有效及时地进行更正[2]。而OnlineJudge可以自动批阅作业并给出成绩,并且直接统计学生作业的提交情况,以及成绩的登记。这给老师带来了很大的方便,同时学生也可以通过OnlineJudge直接查询答题状况。采用OnlineJudge后,老师可以通过对参数进行设置,限制学生提交的编程作业的类型、文件大小、运行时间长短和空间大小。学生在提交编程作业时能够很快的得到作业是否正确的反馈。一方面,OnlineJudge可以对作业进行自动编译,检查出程序是否存在语法错误;另一方面,它还能验证程序是否能得到正确结果,以及所花费的代价(时间和空间上的)。根据后处理的结果与相应的参数设置,OnlineJudge能自动给出学生此次编程作业的成绩。这大大地减小了学生提交错误程序的概率,还能给出与程序相应的成绩。当然老师也可以进行再次审查,对学生的作业提出评语,修改成绩等。这种方式完全模拟了使用程序设计语言解决实际问题的过程,编写程序、不断测试修改、根据结果反馈修改程序[2]。这样的考试方式对学生的学习过程具有很好的指导作用。与此同时,还消除了老师在检查作业的过程中的主观因素,增加了学生之间的公平性。OnlineJudge的实现,能很快地运用到现实的学习生活中去,有效的考核学生的真实水平,促使学生更好的学习计算机知识,强化学生的实践能力,给学生和老师带来立竿见影的效果;极大地提高了学生和老师双方面的效率,减轻了老师在教学管理上的负担[3];还使学生将来能更好地适应快速发展的信息化时代;进一步发挥出计算机网络对当今教育领域甚至其他行业的突出贡献。33 1.2系统开发语言C++系统采用的主要开发技术是C++。C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“Cplusplus”,“CPP”。它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。C语言之所以要起名为“C”,是因为它是主要参考那个时候的一门叫B的语言,它的设计者认为C语言是B语言的进步,所以就起名为C语言;但是B语言并不是因为之前还有个A语言,而是B语言的作者为了纪念他的妻子,他的妻子名字的第一个字母是B;当C语言发展到顶峰的时刻,出现了一个版本叫CwithClass,那就是C++最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的++运算符来体现它是C语言的进步,故而叫C++,成立了C++标准委员会。美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(BjarneStroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“CwithClasses”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtualfunction)、运算符重载(operatoroverloading)、多重继承(multipleinheritance)、模板(template)、异常(exception)、RTTI、命名空间(namespace)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC1988-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准,下一次标准更新原定是在2009年,目前我们一般称该标准C++0x,但是由于对于新特性的争端激烈,除了在TechnicalReport1(tr1)中的新增修改被基本确定外,完整的标准还遥遥无期。况且遗憾的是,由于C++语言过于复杂,以及经历了长年的演变,直到现在(2010年)都没有有一个编译器完全符合这个标准。目前最符合和接近C++标准的编译器有为GNUGCC4.6.1和VisualStudio2010sp1等。另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。根据《C++编程思想》(ThinkinginC++)一书所评述的,C++与C的效率往往相差在正负5%之间。所以有人认为在大多数场合C++完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)[3]。1.C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。2.C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。3.C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。33 1.C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。2.C++避免平台限定或没有普遍用途的特性。3.C++不使用会带来额外开销的特性。4.C++设计成无需复杂的程序设计环境。1.3相关技术简介本系统是基于VisualWebDeveloper和SQLServer开发环境下的毕业设计过程管理系统,是以VisualWebDeveloper为前台开发工具,以SQLServer作为后台数据库开发的B/S(浏览器/服务器)结构的应用系统。1.3.1.Net简介系统采用的主要开发技术是.Net技术。.Net首先是一个平台,它定义了一种公用语言子集(CommonLanguageSubset,CLS),这是一种为符合其规范的语言与类库之间提供无缝集成的混合语。.Net统一了编程类库,提供了对下一代网络通讯标准,可扩展标记语言(ExtensibleMarkupLanguage,XML)的完全支持,使应用程序的开发变得更容易,更简单。Microsoft.Net计划还将实现人机交互方面的革命,微软将在其软件中添加手写和语音识别的功能,让人们能够与计算机进行更好的交流,并在此基础上继续扩展功能,增加对各种用户终端的支持能力。最为重要的是.Net将改变因特网的行为方式:软件将变为服务。与Microsoft的其他产品一样,.Net与Windows平台紧密集成,并且与其他微软产品相比它更进一步:由于其运行库已经与操作系统融合在了一起,从广义上把它称为一个运行库也不为过。.Net框架是.Net平台的基础架构。其强大功能来自于公共语言运行时(CommonLanguageRuntime,CLR)环境和类库。CLR和类库紧密结合在一起,提供了不同系统之间交叉与综合的解决方案和服务。.Net框架创造了一个完全可操控的、安全的和特性丰富的应用执行环境。这不但使得应用程序的开发与发布更加简单,并且成就了众多种类语言间的无缝集成。.Net的核心组件包括:●一组用于创建互联网操作系统的构件块,其中包括Passport.Net(用于用户认证)以及用于文件存储的服务、用户首选项管理、日历管理以及众多的其他任务。●构建和管理新一代服务的基本结构和工具,包括VisualStudio.Net、.Net企业服务器、.NetFramework和Windows.Net。●能够启用新型智能互联网设备的.Net设备软件。●.Net用户体验。.Net结构包括:●虚拟对象系统(VisualObjectSystem,VOS)类型系统33 ●元数据●公用语言规范(CommonLanguageSpecification,CLS)●虚拟执行系统(VisualExecutionSystem,VES)简而言之,.Net是一种面向网络、支持各种用户终端的开发平台环境。微软的宏伟目标是让.Net彻底改变软件的开发方式、发行方式、使用方式等等,并且不止是针对微软一家,而是面向所有开发商与运营商。.Net的核心内容之一就是搭建第三代因特网平台,这个网络平台将解决网站之间的协同合作问题,从而最大限度地获取信息。在.Net平台上,不同网站之间通过相关的协定联系在一起,网站之间形成自动交流,协同工作,提供最全面的服务。1.3.2VisualStudio简介VisualStudio2008ExpressEditions包括VisualWebDeveloper2008ExpressEdition、VisualBasic2008ExpressEdition、VisualC#2008ExpressEdition、VisualC++2008ExpressEdition和VisualJ#2005ExpressEdition。VisualWebDeveloper是一种简便的、易学易用的开发工具,重点专注于使用ASP.NET3.5进行网络开发,构建动态网络应用。通过具有易用的拖拽界面的可视化设计器、功能强大的代码编辑器、嵌入式数据控制和到SQLServer的集成入口、以及对VisualBasic,C#和J#等多种语言的支持,创建并管理网络应用。VisualWebDeveloper内置完备的开发套件,可以快速进行Web应用开发。通过所见即所得的拖拽界面就可以创建出美观、易用的网站。内置60余种控件、上百段代码片断,可以幅度降低创建互动式Web应用的时间。支持页面模板,从而统一地管理网页的排版与布局。通过IntelliSense,可以更快的访问资源库和方法。并可以通过CommonTasks和SmartTags调用最常用的Web开发功能。此外,VisualWebDeveloper2008Express提供使用ASP.NET3.5开始构建网络应用的所有材料。它包括:通过易用的拖拽界面使创建网络应用更加容易的VisualDesigner。功能丰富的强大的代码编辑器,例如Intellisense,它可以使编写代码和HTML变得更加迅速。使用嵌入式数据控制和到MicrosoftSQLServer2005Express的集成入口,快速创建数据驱动的网络应用。支持多种语言:VisualBasic,C#和J#。使用嵌入式的全功能的初学者套件来起步,如PersonalWebStarterKit。1.3.3SQLserver简介MicrosoftSQLServer2005ExpressEdition(SQLServerExpress)是基于MicrosoftSQLServer2005的数据库平台。它也可用于替换MicrosoftDesktopEngine(MSDE)。与MicrosoftVisualStudio2005集成之后的SQLServerExpress使得能够轻松开发数据驱动的应用程序,这些应用程序功能丰富、提供了增强的存储安全性并可快速进行部署。33 Microsoft具有高级服务的SQLServer2005ExpressEdition(SQLServerExpress)是SQLServerExpress的一个版本,包括新的图形管理工具、报告功能和基于文本的高级搜索功能。这两个SQLServerExpress版本可以根据协议重新进行分发。其中每个版本都可以充当客户端数据库和基本服务器数据库。SQLServer2005ExpressEdition是适用于负载较小的网站的一种轻型数据库服务器。它作为可选组件提供,可以在VisualWebDeveloper安装过程中进行安装。与MicrosoftAccess相似,可以使用SQLServer2005特定的强大功能,将数据库作为独立的文件进行创建和部署。这为构建网站提供了不可估量的数据库功能和管理功能。33 2研究的基本内容及解决的问题2.1课题的基本内容1.用户注册的实现。2.用户信息的管理。3.题目的设计与算法实现。4.建立数据库保存信息。5.编译器的调用于实现。6.调用后台源程序。7.判断输入程序的真确性。2.2解决的问题2.2.1登录信息管理表1权限信息表表2用户角色信息表33 2.2.2题库的设计实现程序设计在线判题系统的题库由各类基本程序设计题组成,程序设计题目是进行判题和评分的单元,是测试驱动源文件。在本系统中,并不是所有的题目都能够进行在线编译判题,所以设计时必须针对程序设计题程序设计在线判题系统设计一个特定的题目结构,这种题目结构的目的在于考核学生对于一定的知识点的掌握并且能够被正确评估,一个切实可行的方案是限定程序题目的输入和输出。在程序中适当的留空,在这种条件下系统就能够有效实现程序正确性的判定。每一道题目由以下五部分组成:Input(标准输入),Output(标准输出),RII.c(程序填空)。Text(题目的正文),Title(题目标)。为此引用MYSQL建立后台使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。支持AIX、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、OpenBSD、OS/2Wrap、Solaris、Windows等多种操作系统。为多种编程语言提供了API。支持多线程,充分利用CPU资源。优化的SQL查询算法,有效地提高查询速度。既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。提供TCP/IP、ODBC和JDBC等多种数据库连接途径。提供用于管理、检查、优化数据库操作的管理工具。.可以处理拥有上千万条记录的大型数据库。2.2.3编译的实现用户提交(submit)代码之后,OJ调用相应的编译器(compiler)编译这段代码,如果出现编译错误(CE),立即将编译器给出的CE消息返回给用户。.如果编译阶段通过后,将代码转换为可执行文件.exe(C/C++)或类文件.class(Java)。然后需要调入事先准备好的各类测试数据考验用户程序。.这时候OJ需要执行用户程序,但用户程序是读入和写出标准I/O流,与你准备好的输入/输出测试数据需要一个连接器(connector)。这里我准备使用类似管道的技术。.在windows上可以书写批处理.bat文件,将输入数据1000.in文件重定向到1000.exe,然后将1000.exe执行后存入标准输出流的数据重定向到输出数据1000.out文件中。这时候如果有运行时错误RE则和处理CE过程类似。如果有运行结果,则将这一结果和标准结果做对比。33 3系统总体设计与目标3.1系统设计的原则1)实用性:系统的设计从用户的需求出发,满足了判题活动的一系列要求,而且力求用户操作方便、简单易懂、界面友好。2)安全性:系统采用了输入“用户名”和“密码”来识别用户的登录界面,从而防止了非法用户的入侵;通过对用户权限的设置实现了管理员与用户相分离,充分保证了系统的安全性。3)可维护性和可扩展性:系统具有良好的可扩展性和可维护性。系统中各个模块的独立性可以完全保证各个模块的适当扩展和修改不会影响到其他模块的运行。4)标准性:软件设计严格执行国家有关软件工程的标准,保证系统质量,提供完整、准确、详细的开发文档。5)简单化:界面尽量简单化,做到实用、方便,尽量满足不同角色用户的需要。3.2系统设计方法结构化方法是系统在设计时采用的主要方法。结构化方法的基本思路就是把整个系统开发过程分为若干阶段,每个阶段进行若干活动,每项活动应用一系列标准、规范、方法和技术,完成一个或多个任务,形成符合给定规范的产品。结构化系统开发方法的特点是:1)用“自上而下”的开发策略,进行系统分析和系统设计,然后“自下而上”地开发和调试各个模块,最后实现模块联调和整个系统的联调。2)工作文件的标准化与文档化。即每一阶段、每一步骤都有详细的文档记录,并有完整的管理制度。3)强调面向用户的特点。即将用户的参与程度和满意与否作为系统开发能否成功的关键。4)结构化开发方法在大多数情况下是信息系统工程开发的有效方法。它首先用结构化分析(SA)对软件进行需求分析,然后用结构化设计(SD)方法进行总体设计,最后是结构化编程(SP)。结构化方法又可以分为自顶向下和自底向上开发方法。两者结合是实际开发过程中常用的方法。结构化方法的主要原则是:1)用户参与的原则;2)“先逻辑,后物理”的原则;33 1)“自顶向下”的原则;2)工作成果描述标准化的原则。3.3系统结构判题模块中在线编译器和在线判题器的设计和实现。调用编译配置脚本,传入参数题目号、使用语言,使用语言决定调用GCC、G++或其他编译器。然后编译脚本对程序进行编译并执行,输出提交程序的结果文件。在线判题器使用BashShell脚本语言实现。首先检查由编译脚本输出的结果文件,如果编译出错则判定CompileError(编译错误)并返回。如果程序编译通过,判题脚本fo水出子进程,根据题目的相应限制设置进程运行的时间、空间限制。同时判题脚本判断子进程运行及返回状态,分别判定RuntimeError(运行时错误),Timelimitexceeded(程序运行超时),Memorylimitexceeded(内存使用超限),并且返回。33 3.4系统结构图图1系统总体结构图3.5系统设计目标预期系统应达到的实施效果:程序设计语言熟练程度和程序设计能力是计算机相关专业学生的最基本的技能。传统的上机练习往往依赖于教师的指导,在教师资源有限的情况下,上机指导教师的工作量普遍较大。设计一个能对程序设计题进行在线编译判题不需任何人工辅助的系统,不仅可以给学生提供一个训练程序设计能力的互动平台[13]33 。也使教师能够通过系统更能把握学生对教学内容掌握程度并可作为监督学生学习的重要工具,还可以在一定程度上强化实践、激发自主性;其次,作为一个网络教学练习和考试系统,提供了在线判题功能,可以有效降低教师的阅卷工作量。33 4系统详细设计4.1用户登录系统登录界面部分,前台视觉设计如下图所示:图2登录界面设计4.2题库的具体实现程序设计在线判题系统的题库由各类基本程序设计题组成,程序设计题目是进行判题和评分的单元,是测试驱动源文件。在本系统中,并不是所有的题目都能够进行在线编译判题,所以设计时必须针对程序设计题程序设计在线判题系统设计一个特定的题目结构,这种题目结构的目的在于考核学生对于一定的知识点的掌握并且能够被正确评估,一个切实可行的方案是限定程序题目的输入和输出。在程序中适当的留空,在这种条件下系统就能够有效实现程序正确性的判定。每一道题目由以下五部分组成:Input(标准输入),Output(标准输出),FII.c(程序填空),Text(题目的正文),Title(题目标)。对于一个考核学生是否掌握求两个数和与差的题目示例如下:(a)Text:题目的内容,是对题目的说明。如题:“程序填空,不要改变与输入输出有关的语句。输入整数a和b,计算并输出a、b的和与差。例:输入2—8;输出Thesumis一6;Thedifferenceis10”。(b)Title:题目标题,如上述的题目标题就是“求两个数的和与差”。(c)Input:程序的标准输入。如上述的题目输入就是“2—8”。(d)Output33 :程序的标准输出,作为提交程序输出的语义匹配的模板。如上述的题目输出就是“Thesumis一6:Thedifferenceis10”。(c)Fill.c:程序主体,空缺部分需要学生填写完整(以C语言为例),空缺部分可以是所要考核的知识点的关键部分。比如:#icludeintmain(){inta,b,sum,diff;scanf(“%d%d”,&a,&b);sum=a+b;diff=a—b:/*fill_n*/printf(“Thesumis%d\n”,sum);printf(“Thedifferencels%d\n”,diff);}程序题目作为记录存入数据库中,其中还包括其他的属性,例如题目类型,知识点,难度,程序进程运行的时间、空间限制。题目类型、知识点、难度用于出卷;程序进程运行的时间、空间限制用于控制判题时服务器资源。4.3后台源程序算法的实现与分析算法设计与分析的基本方法[8]:1).递推法  递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出相邻几步的关系,从而达到目的,此方法称为递推法。2).递归  递归指的是一个过程:函数不断引用自身,直到引用的对象已知。3).穷举搜索法  穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。4).贪婪法  贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回溯。5).分治法  分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。6).动态规划法33   动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。7).迭代法迭代法是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程,为实现这一过程所使用的方法统称为迭代法。4.4判题的实现下图是程序设计在线判题系统的实现原理。下载Fill.c完成并提交程序标准输入(Input)输出结果在线编译、执行在线判题标准输出(Output)判题结果图3判题原理33 程序设计在线判题系统的测试用例运行控制是整个系统运行控制中心,包含调度编译和判题两个功能。这部分的实现需要涉及操作系统的部分底层操作,如信号操作、进程间通信和控制等,所以系统测试用例运行控制主程序选择C++实现。用户交互由PHP程序实现,后台数据库系统采用MySQL。PHP程序负责与用户交互,处理用户登录、查看题目、提交答案、比对输出和显示结果等请求。系统测试用例运行控制具体设计流程如下:考生首先在PHP页面下载程序题目,完成程序填空部分或者整个程序,然后提交题目到判题服务,并在数据库中插入相应的记录,提交要求判题信号,然后主程序收到信号后读取数据库记录,并且调用判题主程序。判题主程序是判题系统的核心子系统,它主要功能是负责接收和分派判题请求,并且调用判题模块实现判题评分。判题主程序首先主要负责从数据库中读取所需要的题库信息(Input、Output和Fill.c),为每一题目建立临时工作目录,并把这些信息保存到临时工作目录。一旦考生通过WEB页面提交要求被评估源代码,判题主程序接收到提交请求并且自动查询数据库,检查题库表中是否有对应题目存在,并同时查询题目状态是否为可提交到数据库判题运行表(t_runs表)。然后判题主程序从数据库中读取提交的源代码,把用户提交的源程写入到对应临时磁盘文件,写入判题请求到进程通信管道,请求中包括请求判题的ID(runid),用来唯一标识。然后调用判题模块,先对提交的程序进行编译,接着把编译运行后的输出与对应的题目的Output进行比较,判断答案是否正确,将结果写入数据库,并删除临时文件。具体实现见下图3。使用System()调用判题脚本将运行结果与Output进行对比设置其它运行环境,使用fork()系统调用执行程序(子程序中进行),使用exit()退出子程序使用setrlimit(intresourse,structrlimit*rlim)系统调用限制进程的运行时间和内存编译是否成功处理编译失败情况,将编译失败信息写回数据库将结果写回数据库,删除临时目录和临时文件,清理现场删除临时文件,清理现场使用System()系统调用执行编译脚本程序根据题目ID,读数据库题目信息,包括Input、Output,建立临时工作目录编译判题开始是否图4在线编译判题流程33 判题模块负责处理判题的具体实现,包含在线编译器和在线判题器两个重要部件,是一个处理用户、操作系统、数据库、判题系统多方面交互的过程:判题模块首先查询数据库判题运行表(小ns表)获得提交详细信息,同时查询当场考试信息表获得当前考试时间,比较提交时间是否在考试时间内,如果不在考试时间内则判定超时并返回。如果在考试时间内,调用编译配置脚本,传入参数题目号、使用语言,使用语言决定调用GCC、G++或其他编译器。然后编译脚本对程序进行编译并执行,输出提交程序的结果文件。在线判题器使用BashShell脚本语言实现。首先检查由编译脚本输出的结果文件,如果编译出错则判定CompileError(编译错误)并返回。如果程序编译通过,判题脚本fo水出子进程,根据题目的相应限制设置进程运行的时间、空间限制。同时判题脚本判断子进程运行及返回状态,分别判定RuntimeError(运行时错误),TimeIim计exceeded(程序运行超时),Memoryljm计exceeded(内存使用超限),并且返回。最后更新数据库判题运行表(t_runs)写入判题结果和输出,删除工作临时文件,进行语义匹配,给出分数。系统实现调用g++编译器判断用户程序的对错。#include#include#include"daemon.h"#include"executer.h"#include"compiler.h"constintBufferSize=50;intbuffer[BufferSize];boolisJudgeActivated=false;QSemaphorefreeBuffer(BufferSize);QSemaphoreusedBuffer;voidjudge(intid){QSqlQueryquery;QStringtempString;query.prepare("selectcompilerfromstatuswhererunID=:id");query.bindValue(":id",id);query.exec();query.first();QStringlanguageName=query.value(0).toString();QStringcompilerName;QStringListopt;if(languageName=="C++")33 {compilerName="g++";opt<<"-w"<<"-o"<<"../judge/oexe/temp.exe";tempString="../judge/src/";tempString.append(QString::number(id));tempString.append(".cpp");opt<

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭