Java编程题目自动评判方法及系统与流程

文档序号:12362753阅读:862来源:国知局
Java编程题目自动评判方法及系统与流程

本发明涉及程序编写验证技术领域,具体涉及一种Java编程题目自动评判方法及系统。



背景技术:

计算机程序编程的应用在各个领域发展迅速,为了适应当前社会经济和信息产业化快速发展的需求,计算机程序编程已成为程序员必须熟练掌握的一种基本技能。近几年来,IEEE Spectrum通过跟踪Google搜索、社交网站如Stack Overflow、Twitter、Reddit和Hacker News上的相关讨论,GitHub上的项目,以及工作招聘等信息,分析了49种编程语言的流行度,Java编程语言的流行度一直名列前茅。另外,无论是学校对学生的Java语言的教学,还是培训机构对Java程序员的培训都是日益增加。因而,Java编程语言的前景无量,可为社会信息产业化快速发展起到不可替代的作用。

目前的编程类题目自动评判方法主要有3种,第一种,根据静态结果文件进行判分,评判系统通过比较考生提供的结果文件和预先准备的标准结果文件的内容进行评判;第二种,通过动态执行程序进行判分,评判系统动态编译考生提交的程序,并按照一定的测试用例动态执行程序,通过比较程序运行返回的结果和标准结果进行评判;第三种,根据程序源代码进行判分,评判系统按照一定的算法对考生提交的源程序代码和预先准备的标准源程序代码内容进行比较,依据它们的相似性进行评判。另外,这些方法在分数评定上仍存在一些问题:方法1和方法2使用黑盒的方式,只验证结果而不验证程序流程,无法完全保证程序的正确性,且程序中任何一个输出格式的错误都有可能导致整个程序错误;方法3也存在较大的问题,对大多数语言来说,完成某一功能的程序实现方法种类较多,单靠相似度判定还比较困难。已有的方法主要针对过程型语言的特点进行设计,只适合于面向过程的程序评判,并不适用于面向对象程序。与面向过程程序相比,面向对象程序无论从编程思想、程序结构,还是语法成分、成分之间的逻辑关系以及代码形式上都有其自身的特点,在程序评判时只查看结果或只比较相似度都是不完善的。



技术实现要素:

本发明的目的在于提出一种Java编程题目自动评判方法及系统,能够自动评判Java编程题目的答题代码,节省了人工资源,且提高了评判的全面性。

为达此目的,本发明采用以下技术方案:

一种Java编程题目自动评判方法,包括:

接收答题代码和Java编程题目的预设代码;

对所述答题代码和预设代码进行处理,并插入评判代码,得到待编译代码;

对所述待编译代码进行编译,并判断是否编译成功;

若是,则运行编译后的程序,执行所述评判代码;及,

通过所述评判代码的运行结果统计所述答题代码的得分。

优选地,所述对所述答题代码和预设代码进行处理,并插入评判代码,得到待编译代码具体为:

将所述答题代码和预设代码进行合并和拼接;

对不安全的代码进行过滤;

按照评判服务器运行的需要,将答题代码中的操作代码改写为评判代码。

优选地,所述通过所述评判代码的运行结果统计所述答题代码的得分之后还包括:

通过异步告知的方式将所述得分返回给考生客户端。

优选地,所述接收答题代码和Java编程题目的预设代码之前还包括:

考试服务器根据考试要求编写Java编程题目的题干并说明题意,选择性地提供预设代码;

考生客户端阅读所述Java编程题目并进行答题代码编写,并将所述答题代码上传至考试服务器。

作为本发明的另一个方面,提供一种Java编程题目自动评判系统,包括:考生客户端、考试服务器和评判服务器;

所述考生客户端,用于根据Java编程题目的预设代码进行答题,得到答题代码,并将所述答题代码提交至考试服务器;还用于接收返回的答题代码保存结果和评判结果;

所述考试服务器,用于接收所述答题代码和预设代码,对所述考生答题代码和预设代码进行处理,并插入评判代码,得到待编译代码,将所述待编译代码发送至评判服务器;用于保存所述答题代码并将保存结果发送至考生客户端;还用于接收评判服务器返回的评判结果,并将所述评判结果发送至考生客户端;

所述评判服务器,用于对所述待编译代码进行编译,并判断是否编译成功;若是,则运行编译后的程序,执行所述评判代码;通过所述评判代码的运行结果统计所述考生答题代码的得分,并将评判结果发送至考试服务器。

优选地,所述考试服务器中设置有异步告知单元,用于通过异步告知的方式将所述得分返回给考生客户端。

优选地,所述考试服务器中还设置有出题单元,用于根据考试要求编写Java编程题目的题干并说明题意,选择性地提供预设代码。

优选地,所述考生客户端中设置有答题单元,用于阅读所述Java编程题目并进行答题代码编写,并将所述答题代码上传至考试服务器。

优选地,所述评判服务器中设置有评判器集群和并发处理单元,所述评判器集群包含多个评判器,用于处理多个评判进程;所述并发处理单元,用于支持多个并发访问。

本发明的有益效果为:一种Java编程题目自动评判方法及系统,该方法包括:接收答题代码和Java编程题目的预设代码;对所述答题代码和预设代码进行处理,并插入评判代码,得到待编译代码;对所述待编译代码进行编译,并判断是否编译成功;若是,则运行编译后的程序,执行所述评判代码;通过所述评判代码的运行结果统计所述答题代码的得分,本发明通过在Java编程题目中插入多个评判代码,实现了自动评判Java编程题目的答题代码的功能,节省了人工资源,且提高了Java编程题目自动评判的全面性。

附图说明

图1是本发明实施例一提供的一种Java编程题目自动评判方法的流程图。

图2是本发明实施例二提供的一种Java编程题目自动评判系统的结构图。

图3是本发明实施例二提供的异步告知评判的示意图。

图4是本发明实施例二提供的题干的示意图。

图5是本发明实施例二提供的预设代码的示意图。

图6是本发明实施例二提供的检测代码的示意图。

图7是本发明实施例二提供的评判器集群示意图。

图8是本发明实施例二提供的并发处理单元示意图。

具体实施方式

下面结合图1-图8并通过具体实施方式来进一步说明本发明的技术方案。

实施例一

图1是本发明实施例一提供的一种Java编程题目自动评判方法的流程图。

一种Java编程题目自动评判方法,包括:

S10、接收答题代码和Java编程题目的预设代码;

S20、对所述答题代码和预设代码进行处理,并插入评判代码,得到待编译代码;

S30、对所述待编译代码进行编译,并判断是否编译成功;

S40、若是,则运行编译后的程序,执行所述评判代码;及,

S50、通过所述评判代码的运行结果统计所述答题代码的得分。

在本实施例中,所述评判代码采用了业界广泛应用的测试框架作为检测方式,与当前行业标准保持一致性,降低了出题人编写评判代码的难度,只要掌握了该语言的测试框架API(Application Programming Interface, 应用程序编程接口),则可以编写题目的评判代码,在本实施例中,所述Java编程题目允许输入多段评判代码,每段评判代码可以检测考生的答题代码的不同方面,对考生答题的逻辑正确性、结构正确性都可以进行详细的评判,本发明所述的自动评判方法对学生编写具有面向对象特性的Java编程题目中各种评分因素考虑的比较全面,一方面可方便众多的学校、培训机构或者公司里,经常需要对学生、学院或员工进行定期的考试或考核,省去了人工评判编程题所耗费的人力物力,另一方面可以推广具有实际意义的程序设计语言网络自动化考试,促进了计算机知识的普及。

在本实施例中,对所述待编译代码进行编译,并判断是否编译成功,若编译失败,则设置该题得分为零分,若编译成功,则运行编译后的程序,执行所述评判代码,若评判代码运行时间超过了题目设置的运行时限,或者运行时抛出异常,则判定该段评判代码未通过,由于考生代码运行时间如果过长,很有可能是代码出现死循环或是对评判系统的恶意攻击,因此对运行超过一定时间的代码视为不通过评判,同时关掉该进程。

在本实施例中,通过所述评判代码的运行结果统计所述答题代码的得分,另外还统计考生提交本题代码的次数得到相应的得分,最后的总分由这两部分的得分乘以不同的权重统计得到。

在本实施例中,所述步骤S20包括:

S21、将所述答题代码和预设代码进行合并和拼接;

S22、对不安全的代码进行过滤,防止恶意代码;

S23、按照评判服务器运行的需要,将答题代码中的操作代码改写为评判代码。

在本实施例中,某些操作代码如文件系统调用的代码需要转化成虚拟的文件系统调用代码,作为评判服务器需要的评判代码。

在替代实施例中,所述步骤S50之后还包括:

S60、通过异步告知的方式将所述得分返回给考生客户端。

在替代实施例中,所述步骤S10之前还包括:

S01、考试服务器根据考试要求编写Java编程题目的题干并说明题意,选择性地提供预设代码;

S02、考生客户端阅读所述Java编程题目并进行答题代码编写,并将所述答题代码上传至考试服务器。

实施例二

如图2所示,一种Java编程题目自动评判系统,包括:考生客户端10、考试服务器20和评判服务器30;

所述考生客户端10,用于根据Java编程题目的预设代码进行答题,得到答题代码,并将所述答题代码提交至考试服务器20;还用于接收返回的答题代码保存结果和评判结果;

所述考试服务器20,用于接收所述答题代码和预设代码,对所述考生答题代码和预设代码进行处理,并插入评判代码,得到待编译代码,将所述待编译代码发送至评判服务器30;用于保存所述答题代码并将保存结果发送至考生客户端10;还用于接收评判服务器30返回的评判结果,并将所述评判结果发送至考生客户端10;

所述评判服务器30,用于对所述待编译代码进行编译,并判断是否编译成功;若是,则运行编译后的程序,执行所述评判代码;通过所述评判代码的运行结果统计所述考生答题代码的得分,并将评判结果发送至考试服务器20。

在本实施例中,所述考试服务器20中设置有异步告知单元,用于通过异步告知的方式将所述得分返回给考生客户端10。

在本实施例中,由于Java编程题目的评判涉及到代码安全过滤、编译、部署运行和测试几个环节,而且每个环节都需要耗费非常多的系统资源,所以从考生提交代码到评判完成需要比较长的时间,对于考生来讲,如果让考生在提交代码之后去等待系统返回评判结果将会影响用户体验,本系统使用异步告知的方式来解决这种等待问题,当考生提交完答题代码之后,系统立即将答题代码保存在考试服务器20的数据库并提醒考生已将代码保存,之后,由评判服务器30从数据库中取出Java编程题目和考生答题代码进行评判,并将评判结果存回数据库,最后系统从数据库中取出评判结果并通知考生,这一过程如图3所示,相比于同步等待的形式,异步通知能使考生无须一直在界面上停留,而当评判结果完成时收到通知,这种方式不仅能使考生的交互和用户体验变得更自然,而且对于系统的响应和负载也能有很好的缓解。

在本实施例中,所述考试服务器20中还设置有出题单元,用于根据考试要求编写Java编程题目的题干并说明题意,选择性地提供预设代码。

在本实施例中,所述题干里可以写普通的文本,用于描述题目的内容、任务、要求等,用于显示给考生看,如图4所示为一个题干的具体例子;所述预设代码是出题者预先给出的代码,将会显示给考生看,也会和考生的答题代码进行融合一起编译和运行,一题可以有多块预设代码,在编译运行时会将所有预设代码都融合,如图5所述为一个预设代码的具体例子,出题者将对应的抽象类Shape作为预定义的代码。

在本实施例中,所述出题单元还包括检测代码,如图6所示,检测代码里将需要出题者写出用于校验考生代码的代码,将不会被考生看到,只有出题者才能查看和修改,这里使用到了Java平台中常用到的单元测试框架JUnit的相关概念。

在本实施例中,所述考生客户端10中设置有答题单元,用于阅读所述Java编程题目并进行答题代码编写,并将所述答题代码上传至考试服务器20。

在本实施例中,考生在考生客户端10的Web页面上阅读Java编程题目的题干、预定义类代码也即预设代码、要实现的类名等详细信息,使用编辑器或直接在页面控件中进行答题代码编写,编写结束后提交并上传至考试服务器20;考试服务器20将考生编写的答题代码、题目预设代码和评判代码发送至评判器,评判器根据预设评判代码判定程序结构和内容的正确性,并对代码编译执行,验证结果;评判器将评判分数和细节信息发送到消息服务器上,根据考试类型的不同(正式考试或练习)来决定评判分数和细节信息的处理方式(发送给考生或保存在考试服务器20中)。

在本实施例中,考生需要按要求填写代码里的类名,考生在作答时必须写出符合此名字的类,而且要求没有语法错误,此类名也是检查考生是否正确实现题目要求的一个方面。

在本实施例中,所述评判服务器30中设置有评判器集群和并发处理单元,所述评判器集群包含多个评判器,用于处理多个评判进程;所述并发处理单元,用于支持多个并发访问。

如图7所示为评判器集群示意图,在本实施例中,因为对程序代码(也即图7中的User Code)的评判需要耗费比较长的时间,对于大规模的考试,当要对大量考生的答题代码进行评判时,系统需要能支持水平扩展(即动态添加服务器)来均衡系统的压力负载,为了可以使用多个服务器集群来同时进行处理,需要将程序代码的评判功能从系统的其它业务逻辑中抽离出来,本系统将每个评判用一个独立的进程来运行,该进程包含评判过程(也即图7中的Judger)中的所有功能,包括代码过滤(也即图7中的Code Filter)、代码编译(也即图7中的Compilation)、程序部署和运行测试(也即图7中的Deploy and Run test)、结果返回(也即图7中的Return Result)这四个基本功能,评判进程之间相互独立,互不干扰,每个进程同时只评判一个题目,当一个评判进程出错时不会影响到其它进程,保证系统的稳定和高效,在一台服务器上可以运行多个评判进程,以充分利用服务器的资源,系统还支持多个服务同时运行,以达到水平扩展的目的。

如图8所示为系统并发处理单元示意图,在本实施例中,为了支持大规模的并发访问,我们使用了请求与任务分离、短任务与长任务分离处理的策略,首先系统所使用的Web服务器(Play Framework)使用了Java的NIO技术(非堵塞技术)来提高IO的性能,同时使用线程池(也即图8中的Thread Pool)来降低系统为每个用户请求分配线程的资源开销,这样使系统能同时处理更多的请求,然后在处理用户请求时,系统在设计上要求每个请求的处理时间都尽可能的短,当发现请求的处理时间过长时,系统就会直接让请求失效,对于一些耗时比较长的操作,比如为考生生成试卷,系统中使用异步处理来将请求和请求所指示的任务进行分离,在系统的集群中有一个消息服务器(也即图8中的MQ)和若干个工作服务器(也即图8中的Worker Server),当Web服务器接收到一个需要耗时较长的请求操作时,会根据请求的内容创建一个任务对象投递给消息服务器,同时发送响应给用户并结束请求,消息服务器接收到任务对象后就会将任务发送给一个工作服务器去处理,最后工作服务器处理完任务再把任务的结果通过消息服务器传回给Web服务器,通过这种方式可以尽量减少系统中的活动并发线程数,减轻系统的负载,提升页面的响应速度。

以上所述仅为本发明的具体实施方式,这些描述只是为了解释本发明的原理,而不能以任何方式解释为对本发明保护范围的限制。基于此处的解释,本领域的技术人员不需要付出创造性的劳动即可联想到本发明的其它具体实施方法,这些方式都将落入本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1