C语言试题生成与考试系统的设计与实现

当前,网络教学方兴未艾。网上考试已在其中扮演了重要的角色,传统试卷考试方式有待提高。网络教学已从其规范性、科学性及考试工作组织、管理的统一性,影响到教学质量的好坏。基于此,本系统开发实现了基于B/S模式的c试题生成与考试系统,其中数据库采用MYSQL,开发平台是jsp,开发工具是eclipse+myeclipse,服务器采用tomcat。本系统实现了三个功能模块即试题管理模块、在线考试模块、自动评分模块。试题管理模块包括上传试题、试题管理、试卷的自动生成。在线考试模块包括学生登录、考试鉴权、考试时间控制和一些简单的考试意外的避免。自动评分模块包括制定评分规则自动评分和答案的返回。 用户机则不需要安装任何应用程序直接通过浏览器就可以访问。本系统的实现有利于提高网络教学的质量同时大大拓展了考试的灵活性,阅卷效率,以及保证了考试的公平性、答案的安全性。

  1. 课题背景

随着计算机技术和互联网技术的发展,网络技术已经逐渐渗入社会生活各个层面。传统的试卷考试方式已不能满足现代化教育的需求。网络教学已经成为全球性的大趋势。网络教育除了学习其中的内容之外,对学习效果的评估也是一个必不可少的方面。考试作为教学测评的一种最主要的手段,其规范性、科学性以及考试工作的组织、管理等,直接关系到教学测评的准确性和客观性,从而也影响到教学质量的好坏。

使用网络考试系统可以使考试在本地进行,也可以在异地进行,打破了以往把考生聚集在一起参加考试的局面,大大拓展了考试的灵活性。试卷根据题库中的内容即时生成,可避免考试前的压题。使用计算机判卷,大大提高阅卷效率;还可以直接把成绩送到数据库中,进行统计、排序等操作。试题内容放在服务器上,考生通过姓名、准考证号码和口令进行登录,考试答案也存放在服务器中,这样考试的公平性、答案的安全性可以得到有效的保证。而且使用试题自动生成系统把从固定在单一试卷中的试题发展到了可以自由组合的题库,再到现在的多媒体试题库.随着题库的建立,组卷变得方便了,测试的形式也发生着变化,由所有学生同考一张试卷的大规模的集体测试发展到了同一场考试使用等同考查效力的不同试卷。这样更能适应我们的现代化教育,使我们的教学质量得到极大的提高。极大的节省了人力和物力,提高了效率。

通过以上分析,得出结论;在科技化飞速发展的今天,我们只有充分利用身边的资源使用科学的考试方式,才能使教育跟上时代的步伐。也只有这样才能使我们的教育水平更上一层楼。

  1. 试题自动生成系统开发的目的和意义

目前国内许多学校在考试方式上还是保留了原有的老师统一出题,学生集中在同一个地方用笔作答的考试方式,这样的考试方式存在着学多弊端。例如:老师出题花费大量时间,印刷试卷花费时间和钱财,造成大量纸张的浪费。人工判题速度慢而且还容易出错,使得考一次试需要花费大量人力和物力。这些弊端的存在使得传统考试越来越不适应现代教学的需要。因此,如何使考试过程变得方便、高效、快捷、公正,是现代教育的一个重要课题。使用试题自动生成系统就能避免这些弊端,通过随机抽取不同的试题,保证了一人一卷从而极大的降低了作弊的几率。而且也避免了印刷试卷浪费的人力物力。

本C语言试题自动生成系统借鉴了许多优秀的先进的网络考试系统的思想,再结合自己所学的知识,开发出来的一套简单的考试系统,主要是目的是检查自己综合运用自己所学知识的能力。本系统完全可以满足一些小型考试的需要,并通过对各种客观题考试情况的长期研究,以灵活、通用为主要设计思想,开发适合于各种客观试题测验的系统。本系统将会提高许多学校对学生考试的效率,极大程度上减轻了老师的工作量,同时加强了对学生所学知识的检测。提高了教学质量。该系统也还可以用于其它部门的考试。例如一些驾校,单位的考试。

考试是网络教学的重要部分,日渐普及的网络教学呼唤着功能强大的网络考试系统的出现。网络考试系统方便了传统考试中的各个环节。提高了试题管理的自动化、标准化、便捷化,也提高了试题的安全性和保密性。试题的自动生成,使每个考生都有一套不同的试题,把固定在单一试卷中的试题发展到了可以自由组合的题库,随着题库的建立,组卷变得方便了,测试的形式也发生着变化,由所有学生同考一张试卷的大规模的集体测试发展到了同一场考试使用等同考查效力的不同试卷,而且可以跨地域的进行同一考试,除了在本地也可以在异地进行,打破了以前考试的局限性。在成绩统计方面,可以方便快捷地实现成绩统计,如各种均值,方差,分布等的计算,同时还可以方便地评判考试的信度和效度。通过使用试题自动生成系统完全摆脱了纸和笔,考生使用计算机答卷,然后通过网络提交试卷,系统自动阅卷。基于计算机网络的考试需要专门的较高水平的技术支持,网络考试已经发展成为一种产业。

发展网络教学有着非常深远的意义,网络教学在全世界范围内得到了迅速的发展。在国外,美国每年大约有近1700万人通过网络接受教育和培训;欧洲网络教育规模也很大,巨大的需求推动了网上教育业的快速发展。目前,在国际市场上比较著名的网上教育软件产品有:Lotus公司LearningSpace,英属哥伦比亚大学计算机科学系开发的WebCT,WBT System公司的TopClass和加拿大Simon Fraser大学开发的Virtual-U等。美国的NTU,英国的Open College都是十分典型的网络教育示例。

目前国内许多学校的教育水平都不是很高,不能满足教育部在“面向21世纪教育振兴行动计划”中的决定。在未来的几年,中央政府将集中投入相当数量的资金,并广泛吸取地方、企业、个人的资金和力量共同完成现代远程教育框架的构建。网络考试在现代化教育中是越来越重要,而在考试过程中,试题的自动生成相当重要,它的正常运行保证了后面考试的质量。所以研究试题的自动生成是相当重要的环节。整体来说 ,国外的网上考试系统有一定的优势,但在一定范围内的考试采用的技术还停留在局部范围内基于Client-Serve:结构的应用程序,真正应用性很好的考试管理工具也还没有出现.所以我们有研究考试系统的必要。现在,科学技术的飞速发展把人类社会推向了一个崭新的时代——网络时代,世界经济发展已进入一个激烈竞争的年代,谁拥有好的教育水平,谁就会创造出更好的知识财富,从而对经济的发展起到巨大的推动作用。新一代远程教学系统的网络传输结构将会具有很强的可扩展性和不同系统间的互操作性。教育信息内容从简单的文件系统组织向教育信息资源库建设发展,从以前的以课程教学内容逐步向以学科体系为出发点构建教学内容过渡。好的考试系统将能很好的检测学习者学习的积极性、主动性。能有效的及时的弥补学习者在学习过程中所存在的知识缺陷。

纵观国内外网络考试系统,它们大多采用SQL SERVER,ACCESS和MySQL作为为后台数据库,在结构上采取B/S, C/S两层开发模式,在评分系统中主要支持客观题的自动评分,没有对主观题的自动评分进行研究和开发,从而对系统的功能和实用性带来了一定制约。本系统也是对客观题的做出自动评分,试题的自动生成也只局限于选择、判断和填空。

  1. 开发环境

1.3.1硬件配置及外设设备与配置

硬件环境:硬件平台是指开发与运行所需要的硬件环境,主要包括计算机机型及一些硬件配置。由于本c语言试题自动生成系统是一个基于web架构小型的MIS系统,因此对服务器端有一定的配置要求,客户端只需要安装IE浏览器就可以了,对计算机硬件的要求都不高,比较经济,只须配备如下即可: 

本系统服务器端的运行环境规定:

处理器型号:Intel P4 2.8G;

内存容量:512 M;

外存容量:80G;

网络环境:联网状态或企业内部网中;

1.3.2软件平台及语言

软件平台是指系统开发与运行的软件环境。本系统在开发时选用了兼容性比较好的Windows XP(SP2)版和JSP作为主要的开发技术,由于JSP可以不加修改地在大多数的Web Server上运行,符合“Write once, run anywhere”(“一次编写,多平台运行”)的Java原则,实现了程序与服务器平台的独立性,使得基于JSP技术的应用程序更易于维护和管理。所采用的开发软件主要有eclipse+myeclipse 、Dreamweaver 2004等,数据库方面考虑到与Windows XP兼容性以及所开发的系统的一些信息的数量,所以选择MySQL。服务器采用tomcat ,Web服务器和数据库连接技术采用JDBC。

  1. 项目总览
  2. 总体设计

项目总体设计框架图如图2-1:

  1. 模块划分及各模块的基本功能

本c语言试题生成与考试系统划分为三个功能模块:

⑴ 试题管理模块:该模块的主要工能有上传试题、试题管理、试卷的自动生成。该模块针对的是管理员,管理员有且只有一个不能添加。所有的试题都是管理员通过逐个添加或者通过Excel模板批量上传到数据库里的,当输入的试题有误时,还可以试题管理功能对该试题进行修改。此外,试题管理还包括对试卷的设置。例如:试卷类型的设置、考试持续时间的设置,两次考试时间间隔的设置。试题的自动生成是通过一条SQL语句加上数据库自带的一个随机函数随机从题库里面选出与考试配置相符合的试题类型和数量来组成一套试卷。每个考生所生成的试卷不是一样的。

⑵ 在线考试模块:该模块主要针对的是考生。该模块主要包括考生登录、考试鉴权、考试时间控制和一些简单的考试意外的避免。当用户进入到登录界面时,该功能可以验证登陆用户的身份以及对本系统的操作权限。当检测到是管理员用户时就跳转到用户页面,当检测到是学生用户时候就进入学生页面。考试鉴权主要是检测用户是否合法,还有该用户是否重复登陆。考试时间的控制主要是考试所需要的时间设置,当考试时间到的时候会弹出一个提示框,如果考生不提交改试卷将作为作弊处理在数据库里面强制插入一条0分记录。在考试过程中考生强制退出也是作0分处理。一些简单的考试意外的避免主要是当考生登陆以后,点击准备好了这个按钮以后,试题自动生成。这时候,你再后退重新点击准备好了这个按钮时试题不会改变,与第一次生成的试题一样。

⑶ 自动评分模块:该模块主要包括制定评分规则自动评分和答案的返回。根据考试的答案与存放在数据库的正确答案相比较判断出正误,试题的分值已由管理员输入数据库的,只需根据判断出的正确的试题取出相应的分值进行累加即可。当考生提交后会把正确答案和考生所选的答案返回给考生。

  1. 数据库设计

表2-1 数据库中表介绍

表  名

简  介

功   能

admin

管理员信息表

记录管理员的一些信息

config

试卷信息表

记录试卷的一些设置信息

score

考生成绩表

记录考生的考试成绩的一些信息

student

学生信息表

记录学生的一些信息

tiku

试题信息表

记录试题的一些信息

数据库中主要表的结构如下:

名称:管理员信息表;标识:admin;数据来源:管理员自己设置;

表2-2 管理员信息表

名称

类型

默认值

属性

主索引(P)

Id

unique

Id

Int(11)

Yes

<空>

Auto_increment

Name

Varchar(11)

No

<空>

Latin1

Password

Varchar(41)

No

<空>

Latin1

Email

Varchar(50)

No

<空>

名称:试卷信息表;标识:config;数据来源:管理员添加;

表2-3 试卷信息表

名称

类型

默认值

Xnum

Int(11)

No

<空>

Pnum

Int(11)

Yes

<空>

Tnum

Int(11)

Yes

<空>

last

Int(11)

No

<空>

internal

Int(11)

No

<空>

名称:成绩信息表;标识:score;数据来源:前台页面获取;

表2-4 成绩信息表

名称

类型

默认值

属性

主索引(P)

Id

unqiue

Id

Int(11)

yes

Auto_increment

S_id

Bigint(10)

no

<空>

score

Bigint(10)

yes

<空>

rightnum

Int(11)

yes

<空>

startd

datetime

no

0000-00-00 00:00:00

endd

datetime

yes

<空>

ip

Varchar(15)

no

<空>

名称:学生信息表;标识:student;数据来源:管理员输入;

表2-5 学生信息表

名称

类型

默认值

属性

主索引(P)

id

unique

Id

Int(11)

yes

<空>

Auto_increment

S_id

Bigint(10)

no

<空>

S_name

Varchar(11)

no

<空>

Latin1

S_psw

Varchar(50)

yes

<空>

Latin1

Sex

Varchar(20)

yes

<空>

Latin1

Major

Varchar(50)

yes

<空>

Latin1

Grade

Vaechar(11)

yes

<空>

Latin1

Email

Varchar(50)

no

<空>

名称:题库信息表;标识:tiku;数据来源: 管理员输入;

如果是选择题,kind里面的值是(X);正确答就存放在answer字段,

如果是判断题,kind里面的值是(P);正确答就存放在answer字段,1表示正确,2表示错误。

如果是填空题,kind里面的值是(T);正确答案存放在keya字段,answer字段的值为1表示第一个,也就是keya。

表2-6 题库信息表

名称

类型

默认值

属性

主索引(P)

Id

unique

Id

Int(11)

yes

<空>

Auto_increment

Question

Varchar(200)

no

<空>

Latin1

keya

Varchar(200)

no

<空>

Latin1

keyb

Varchar(200)

yes

<空>

Latin1

keyc

Varchar(200)

yes

<空>

Latin1

keyd

Varchar(200)

yes

<空>

Latin1

Answer

Varchar(10)

yes

<空>

Score

Int(3)

no

<空>

kind

Char(1)

yes

<空>

上述几张表就只有学生信息表和成绩表之间有关系,它们是通过S_id建立关系的。

  1. 实现技术和方案选择
  2. B/S模式与C/S模式

C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极小部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓的三层3-tier结构。这样就大大简化了客户端载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本。

由于C/S模式是针对性开发,缺少通用性的特点,业务变更或改变不够灵活,而且需要专门的客户端安装程序,分布功能弱,兼容性差,故本系统采用B/S模式来设计,在企事业单位内部局域网内建立B/S结构的网络应用,并通过Internet/Intranet模式下的数据库应用,相对易于把握,成本也较低。

  1. JSP和ASP

ASP(Active Server Pages,活动服务器网页)是Microsoft公司在1996年底推出的一种取代CGI(公共网关接口,即Common Gateway Interface)运行与服务器端的Web应用程序开发技术,它内含于IIS3.0(Microsoft Internet Information Server 3.0)以上的版本中。通过ASP我们可以结合HTML网页、ASP指令和ActiveX组件建立动态、交互且高效的Web服务器应用程序。

JSP(Java Server Pages)是由Sun Microsystems公司于1999年6月推出的新技术,是基于Java Servlet以及整个Java体系的Web开发技术,为基于Web应用实现动态交互网页制作提供的技术环境支持。

由于ASP通常只应用于Windows NT/2000平台,而JSP则可以不加修改地在大多数的Web Server上运行,其中也包括了NT的系统,适应更广泛的平台,符合“Write once, run anywhere”(“一次编写,多平台运行”)的Java原则,实现了程序与服务器平台的独立性,而且基于JSP技术的应用程序比基于ASP的应用程序易于维护和管理,所以本系统才用JSP作为主要的开发技术,在配合HTML和JavaScript脚本语言来开发。

  1. JDBC 和ODBC

ODBC(开放式数据库连接)是一个数据库编程接口,由Microsoft建议并开发。ODBC允许程序使用结构化查询语言(SQL)作为数据访问标准,应用程序可通过调用ODBC的接口函数来访问来自不同DBMS(数据库管理系统)的数据。对于应用程序来讲ODBC屏蔽了异种数据库之间的差异。Web也是一类应用,和其他应用程序一样可以通过ODBC实现对数据库的访问。

JDBC(Java Database Connectivity)是Java中连接数据库的技术,Java程序通过JDBC驱动程序与数据库相连,执行查询、提取数据等等操作。

在JSP中访问数据库可以使用Sun公司的Java JDBC API,也可以使用JDBC-ODBC桥接器,而ODBC并不适合在Java中直接使用,因为ODBC是一个用C语言实现的API,从Java程序调用本地的C程序会带来一系列安全性、完整性和健壮性方面的缺点。故本系统采用纯JDBC连接,通过安装Mysql JDBC来建立JSP服务器与Mysql之间的连接管理。

  1. 主要开发软件

在本系统的开发过程中,界面设计主要采用Dreamweaver MX 2004和Fireworks MX 2004等工具,后台语言采用JSP和JavaScript,web服务器采用Apache Tomcat,数据库方面考虑到与操作系统的兼容性以及所针对的信息量不是很大,所以采用Mysql。

  1. 项目特色
  2. 试题生成

由于防止学生作弊,在每个不同用户登陆时该系统所生成的试题是不一样的,是随机的。而且每次试题生成后不管学生怎样刷新或重新登陆试题都不会变(只要是在规定的考试时间段内),strSql = " select * from tiku where kind='"+kind+ "' order by rand() limit " + Number + "";该方法主要是通过一条SOL语句从数据库里面取出试题,试题的随机性主要是考Mysql里面自带的rand()函数实现。该函数的功能主要是就每次随机生成不同的试题。Kind表示试题的类型由前台页面传进来。Number是试题的数量也是由前台页面传进来,所以管理员可以根据考试的需要设置试题的数量和类型。不同类型的试题可以设置不同的数量。这样使试卷更具灵活性,更容易发挥考试的特点。试题的不一样也降低作弊率,提高了考试的可信度,增加了试卷的有效性,把学生对知识的掌握情况真实的反映在试卷上了。

  1. 局部刷新

本系统在添加学生的时候采用了AJAX思想实现局部刷新,当你在填写资料时候,系统会有一些提示,这些提示的出现都不是整体刷新后出现的,都是局部刷新就出现了。在你提交以后也不局部刷新也面这样节约了很多时间,瞬间就可以继续添加下一个学生。

主要实现代码如下:

function validate(){

       //考生编号

       var s_id = document.getElementById("s_id").value;

      

       //向后台passwordValidation传一个参数,s_id

       var url = "/exam/s_idvalidation.do?s_id=" + s_id

       document.getElementById("wrong").innerHTML = "正在检查考生编号是否重复,请稍等!";

      

       //判断浏览器类型

       if (window.ActiveXObject) {

        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

    }

    else if (window.XMLHttpRequest) {

        xmlHttp = new XMLHttpRequest();

    }    

    //请求后台方式

       xmlHttp.open("POST",url);

       //调用callback

       xmlHttp.onreadystatechange = callback;

       //发送到服务器

       xmlHttp.send(null);

}

function callback(){

       //考生编号

       var s_id = document.getElementById("s_id").value;

       //请求状态 完成

       if(xmlHttp.readyState==4){ 

              //服务器的HTTP状态码为OK

              if(xmlHttp.status==200){     

                     //考生编号重复

                      if(xmlHttp.responseText==0){

                            document.getElementById("wrong").innerHTML = "考生编号重复!";

                            document.getElementById("flag").value=0

                           

                     }else if(xmlHttp.responseText==1){

                     document.getElementById("wrong").innerHTML = "考生编号可以使用!";

                                  

                            document.getElementById("flag").value=1

                            }                         

              }

       }

后台收到前台传来的值进行判断并返回一个值给前台,前台调用上面集中方法实现局部刷新的。

  1. 项目分析、设计、开发

在前面我们已经提到该系统主要由三个模块组成,即试题管理模块、在线考试模块、自动评分模块。试题管理模块包含上传试题、试题管理、试卷生成、成绩管理这些功能。如图所示:

  1. 试题管理模块的设计

试题管理模块分为:上传试题、试题管理、试卷生成、成绩管理。

5.1.1上传试题

管理员登录后可以根据界面上的表格添加试题,这种方式一次只能添加一道试题。也可以在界面上下载Excel表格模版批量的上传试题。这种方式一次可以添加多道试题。上传的表格必须以文本的形式进行上传,否则会出错。通过Question upload action接收上传文件,然后在javabean里调用readquestionexcel方法解析Excel文,实现上传。上传成功后如果发现有错,还可以在题库管理页面进行修改。

5.1.2试题管理

在试题管理模块中可以对试题进行查看、删除、添加、修改。每条记录前都有一个复选框,选种你不需要的记录然后点击删除按钮。在每条记录后面都有一个编辑查看的链接,通过该链接可以进行查看和修改。修改完毕后对数据库中的数据进行updat即可。点击添加按钮,可以进入添加试题的页面。还可以通过我们前面所提到的批量上传进行试题的添加。

实现更新的代码如下:

strSql = "update tiku set question='" + question + "',keya='" + keya

                + "',keyb='" + keyb + "',keyc='" + keyc + "',keyd='" + keyd

                + "',answer='" + answer + "',score='" + score + "',kind='"

                + kind + "' where id='" + id + "'";

        System.out.println(strSql);

        db.OpenSql("lock table tiku write");

        // 如果插入成功就返回真否则返回假

        if (db.ExecSql(strSql) == 0) {

            db.OpenSql("unlock tables");

            return false;

        } else {

            db.OpenSql("unlock tables");

            return true;

        }

    }

实现插入的代码如下:

strSql = "insert into tiku values(null,'" + question + "','" + keya

                + "','" + keyb + "','" + keyc + "','" + keyd + "','" + answer

                + "','" + score + "','" + kind + "')";

        System.out.println(strSql);

        db.OpenSql("lock table tiku write");

        try {

            // 如果插入成功就返回真否则返回假

            if (db.ExecSql(strSql) == 0) {

                db.OpenSql("unlock tables");

                return false;

            } else {

                db.OpenSql("unlock tables");

                return true;

            }

        } catch (Exception e) {

            db.OpenSql("unlock tables");

            return false;

        }

}

5.1.3试卷生成

管理员可以对考试的各个参数进行设置。每道试题的分值,各种题型的数量。考试的时间等等。设置的这些信息是通过session来传递信息的。按照sesion传递的信息在题库中随机的抽取试题。在Mysql中自带一个随机函数rand()利用这个函数产生一个随机数,然后根据这个随机数取出相应的试题。所以题库里面的试题越多,两张试卷出现相同试题的几率就越小。为了保证一张试卷不出现相同的试卷只有通过管理员在把试题输入到题库的时候不要输入相同的试题。这种情况本系统没有考虑。

实现代码如下:

public static ArrayList randomQuestions(DB db, String Number, String kind)

            throws SQLException {

        // 新建一个数组用来保存返回随机题目

        ArrayList list = new ArrayList();

        ResultSet rs;

        // 查询数据库语句变量

        String strSql;

strSql = " select * from tiku where kind='" + kind

                + "' order by rand() limit " + Number + "";

        // System.out.println(strSql);

        // 执行sql查询

        rs = db.OpenSql(strSql);

       

        while (rs.next()) {

            Questions qe = new Questions();

            qe.setanswer(rs.getString("answer"));

            qe.setkeya(rs.getString("keya"));

            qe.setkeyb(rs.getString("keyb"));

            qe.setkeyc(rs.getString("keyc"));

            qe.setkeyd(rs.getString("keyd"));

            qe.setquestion(rs.getString("question"));

            qe.setscore(rs.getString("score"));

            list.add(qe);

        }

        // 如果ResultSet不为空就关闭它

        if (rs != null) {

            rs.close();

        }

        return list;

    }

通过调用该SQL语句从数据库里取出试题。然后通过session把值传到前台。实现试题的自动生成。本试题自动生成系统对每次生成的试卷没作保存处理。

5.1.4成绩管理

成绩管理主要是对学生考试成绩的查看和删除。还可以查看考试时的ip地址以及考试开始时间和结束时间。

  1. 在线考试模块的设计

在线考试模块分为:在线考试模块分为:鉴权考试、学生登陆、时间管理、意外避免。

5.2.1考试鉴权

每次系统都会判断该用户存不存在。防止一些不具有本次考试资格的学生登陆。

判断用户是否存在的实现代码如下:

public static boolean checkUserAccount(DB db, String s_id)

            throws SQLException {

        String strSql;

        ResultSet rs;

        // 编写sql变量

        strSql = "select * from student where s_id='" + s_id + "'";

        // 查询数据

        rs = db.OpenSql(strSql);

        // 如果sql结果集中有数据表示当前用户是合法用户返回true后者返回false

        if (rs.next()) {

            // 如果ResultSet不为空就关闭它

            if (rs != null) {

                rs.close();

            }

            return true;

        } else {

            // 如果ResultSet不为空就关闭它

            if (rs != null) {

                rs.close();

            }

            return false;

        }

    }

5.2.2学生登录

通过用户名系统能直接判断出是管理员还是学生,管理员有且只有一个。所有学生的用户名、密码以及一些相关的信息都是管理员通过Web页面来添加、删除、修改。其中用户名为学生的学号,密码默认值为123。登陆成功后学生可以修改自己的密码。

检查用户名和密码是否正确的实现代码如下:

public static boolean checkUser(DB db, String s_id, String psw)

            throws SQLException {

        String strSql;

        ResultSet rs;

        // 编写sql变量

        strSql = "select * from student where s_id='" + s_id

                + "' and s_psw = password('" + psw + "')";

        // 查询数据

        rs = db.OpenSql(strSql);

        // 如果sql结果集中有数据表示当前用户是合法用户返回true后者返回false

        if (rs.next()) {

            // 如果ResultSet不为空就关闭它

            if (rs != null) {

                rs.close();

            }

            return true;

        } else {

            // 如果ResultSet不为空就关闭它

            if (rs != null) {

                rs.close();

            }

            return false;

        }

    }

5.2.3时间管理

时间对考试来说是至关重要的。在c语言试题自动生成系统中,为学生设置了考试开始时间和考试剩余时间。使考生在考试过程中对时间好有个把握。显示剩余时间的时钟是一个动态时钟,这个时钟显示的时间是由服务器控制的,这样避免了考生因修改自己计算机的系统时间而出现的作弊现象。当服务器到达考试时间时候,系统会弹出一个对话框显示时间到。如果迟迟不点确定按钮,系统会自动向数据库插入一条零分记录。即作为作弊行为来处理。

5.2.4意外避免

当考生登陆后点击准备好了按钮后开始考试,为了防止考生进行刷新或后退使生成的试题发生变化,这样会影响考试的结果。本系统在这方面进行了防止,使考生在考试时间段内后退也好刷新也好都不能是生成的试题发生变化。本系统还防止了学生通过多次登陆来生成不同试题然后提交多份考卷的现象。通过调用isuesrlogin这个方法来实现对用户多次登陆的侦听。

主要实现代码如下:

public static boolean isUserLogin(HttpSession session,String username){

        boolean flag = false;

        if(list != null && list.size() > 0){

            for(int i=0;i<list.size();i++){

                if(list.get(i).equals(username)){

                    flag = true;

                    break;

                }

            }

        }

        if(!flag){ //没有相同的用户登录

            list.add(username);

            session.setAttribute("id", username);

            System.out.println("=======" + username);

        }

        return flag;

    }

    public static void removeUserSession(String username){

        System.out.println("destoryed " + username);

        list.remove(username);

    }

   

}

防止刷新后退使试题改变的主要实现代码如下:

try {

            String flagt = request.getParameter("flagt");

            Student student = (Student) session.getAttribute("sinfo");

            if (student != null) {

                if (!flag.equals(flagt) && flagt != null

                        && session.getAttribute("qex") == null) {

                    System.out.println("正常登录");

                    flag = flagt;

原理就是当你点击准备好了按钮之后产生一个随即数传到后台,后台根据这个随机数判断是否是刷新。

  1. 自动评分模块的设计

5.3.1自动评分

本系统的自动评分的实现主要是通过从数据库取出正确答案与考生所选或填的答案进行比较,如果正确则把该试题的分值进行加发运算。

5.3.2答案返回

当考生提交试题后,会把考生自己选择的答案和试题的正确答案反馈给考生。

  1. 系统测试与分析
  2. 测试的方法

测试的方法有黑盒测试和白盒测试两种。黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否已经检查。该试题自动生成系统是按照先采用白盒测试对系统的实现函数逐个的进行测试,然后对系统实现的功能逐个进行测试。接下来就是按照需求分析对系统进行黑盒测试。

  1. 测试的步骤

在测试该系统需求测试的功能时,有较详细的测试步骤,对每个功能点进行逐项测试。

系统对考生考试客户端的测试步骤如下:

  1. 考生终端与考点服务器能否正常连接,异常时是否有提示。
  2. 考生按照正确的用户名和密码能否正常登陆进考试系统。
  3. 学生能否正常的进行在线考试,包括答题、交卷、答案的返回。
  4. 考试结束后是否可以恢复环境。

系统对管理员客户端的测试步骤如下:

  1. 管理员终端与考点服务器能否正常连接,异常时是否有提示。
  2. 管理员按照正确的用户名和密码能否正常登陆进考试系统。
  3. 管理员能否正常的进行学生信息的添加、删除、修改;对试题的上传、修改;对考试的设置等。
  4. 管理员退出后是否可以恢复环境。
  1. 测试的结果

本系统已在如下环境下测试通过:

CPU:AMD 2500+;内存:512M;

操作系统:Windows XP (SP2);

其他软件:Mysql;Tomcat 5.0;

由于时间仓促,在系统运行期间可能会遇到各种问题,本人将会根据客户反馈的各种问题在以后的学习中不断完善本c语言试题生成与考试系统。

  1. 运行效果

 

根据上述分析资料和设计资料,经过实践,基本完成了系统所需的功能。以下是系统相关的截图,演示了系统功能的操作过程。

首先,进入系统登陆界面后输入用户名和密码就可以进入系统进行相应的操作,当以管理员身份登陆成功后可以进行学生管理、题库管理、成绩管理、考试设置、密码修改这些操作。学生管理操作如图7-2所示。

未完待续。。。。 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典毕设项目-博客系统(spring boot、spring mvc、mybatis) gitee开源源码

目录 项目背景 核心技术 项目页面设计 注册页面 登录页面 博客列表页 博客详情页 个人博客列表页 个人博客发布页 个人博客修改页 项目模块与需求分析 AOP 处理模块 用户模块 文章模块 项目创建 实现 AOP 模块 实现登录拦截器 拦截器 拦截注册 实现统一数据…

补充C语言

1.关键字 前言: C90一共有32个关键字,C99比C90多了5个关键字,但主流的编译器对C99关键字支持的不是特别好, 所以后面主要以C90的32个关键字为标准1.1认识auto关键字 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i 0;auto int j 0;retur…

为什么要参加软考?软考如何备考?

软考是指软件工程师职业资格考试&#xff0c;它是由国家人力资源和社会保障部颁发的国家级职业资格证书&#xff0c;是目前我国最具权威性的计算机职业资格证书之一。软考考试内容丰富&#xff0c;包括软件工程、软件测试、软件项目管理、数据库等多个方面&#xff0c;考试难度…

Java分布式事务(七)

文章目录 🔥Seata提供XA模式实现分布式事务_业务说明🔥Seata提供XA模式实现分布式事务_下载启动Seata服务🔥Seata提供XA模式实现分布式事务_搭建聚合父工程构建🔥Seata提供XA模式实现分布式事务_转账功能实现上🔥Seata提供XA模式实现分布式事务_转账功能实现下🔥Se…

Qt-Web混合开发-CEF加载网页简单示例(12)

Qt-Web混合开发-CEF加载网页简单示例&#x1f499;&#x1f353; 文章目录Qt-Web混合开发-CEF加载网页简单示例&#x1f499;&#x1f353;1、概述&#x1f41b;&#x1f986;2、实现效果&#x1f605;&#x1f64f;3、实现功能&#x1f42e;&#x1f434;4、Qt部分关键代码&am…

2023/4/2总结

题解 线段树OR树状数组 - Virtual Judge (vjudge.net) 正如这道题目一样&#xff0c;我的心情也如此。 1.这道题是线段树问题&#xff0c;更改学生值即可&#xff0c;不需要用到懒惰标记。 2.再去按照区间查找即可。&#xff08;多组输入&#xff0c;拿20多次提交换来的&am…

2023大数据开发就业前景怎么样?

大数据开发就业班正在火热招生中。 大数据开发做什么&#xff1f; 大数据开发分两类&#xff0c;编写Hadoop、Spark的应用程序和对大数据处理系统本身进行开发。大数据开发工程师主要负责公司大数据平台的开发和维护、相关工具平台的架构设计与产品开发、网络日志大…

【算法基础】(一)基础算法 --- 位运算

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;算法基础 &#x1f525;专栏简介&#xff1a;该专栏主要更新一些基础算法题&#xff0c;有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下&#xff0c;互相监督打卡学习 &#x1f339; &#x1f339; &#x1f3…

C语言函数大全--d开头的函数

C语言函数大全 本篇介绍C语言函数大全–d开头的函数 1. detectgraph 1.1 函数说明 函数声明函数功能void detectgraph(int *graphdriver, int *graphmode);通过检测硬件确定图形驱动程序和模式 1.2 演示示例 #include <graphics.h> #include <stdlib.h> #incl…

【Java 并发编程】一文读懂线程、协程、守护线程

一文读懂线程、协程、守护线程1. 线程的调度1.1 协同式线程调度1.2 抢占式线程调度1.3 设置线程的优先级2. 线程的实现模型和协程2.1 内核线程实现2.2 用户线程实现2.3 混合实现2.4 Java 线程的实现2.5 协程2.5.1 出现的原因2.5.2 什么是协程2.5.3 Java19 虚拟线程 - 协程的复苏…

Activiti7与Spring、Spring Boot整合开发

Activiti整合Spring 一、Activiti与Spring整合开发 1.1 Activiti与Spring整合的配置 1)、在pom.xml文件引入坐标 如下 <properties><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version> </properties> <d…

【源码教程案例】AI绘画与安全在未来主要方向有哪些?

AI绘画在未来有许多潜在的发展方向,以下是一些可能的重点领域 高质量图像生成:随着生成模型的不断改进,未来的AI绘画可能会产生更高质量、更真实的图像,以满足各种应用场景的需求。 个性化创作:AI绘画可以通过用户的个性化偏好和需求来定制艺术作品。这种定制可能包括颜…

【gitlab部署】centos8安装gitlab(搭建属于自己的代码服务器)

这里写目录标题部署篇序言要求检查系统是否安装OpenSSH防火墙问题准备gitlab.rb 配置坑点一忘记root密码重置使用篇gitlab转换成中文git关闭注册入口创建用户部署篇 序言 在团队开发过程中&#xff0c;想要拥有高效的开发效率&#xff0c;选择一个好的代码开发工具是必不可少的…

JUnit5用户手册~并行执行

两种运行模式 SAME_THREAD&#xff1a;默认的&#xff0c;测试方法在同一个线程CONCURRENT&#xff1a;并行执行&#xff0c;除非有资源锁junit-platform.properties配置参数配置所有测试方法都并行 junit.jupiter.execution.parallel.enabled true junit.jupiter.execution.…

Kafka3.0.0版本——生产者分区及分区策略

目录一、生产者分区优点二、生产者发送消息的分区策略2.1、默认的分区器2.2、指定分区(partition)值2.3、没有指明分区(partition)值&#xff0c;但有key 的情况2.4、 既没有分区(partition)值&#xff0c;又没有key 值的情况三、指定分区(partition)值的代码示例四、没有指明分…

vscode折叠展开快捷键

1.折叠所有代码 (按住ctrl 分别点击k和0) ctrlk,ctrl0 2.展开所有代码 (按住ctrl 分别点击k和j) ctrlk,ctrlj 3. 折叠鼠标竖线所在位置的节点以及当前节点下的子节点&#xff08;递归折叠&#xff09; ctrlk,ctrl[ 4. 展开鼠标竖线所在位置的节点以及当前节点下的子节点&#…

OpenFeign 源码解读:动态代理+负载均衡实现

OpenFeign使用EnableFeignClients开启服务&#xff0c;该注解标有Import(FeignClientsRegistrar.class)&#xff0c;该ImportBeanDefinitionRegistrar会利用扫描路径的方式扫描java文件中带有的FeignClient(...)的接口&#xff0c;关于这种扫描注解的方式&#xff0c;我仿照写了…

软件测试 - 测试用例常见面试题

1.测试用例的要素测试用例是为了实施测试而向被测试的系统提供的一组集合, 这组集合包含 : 测试环境, 操作步骤, 测试数据, 预期结果等要素.例如 : 在 B 站输入框输入一个空格, 检查结果测试用例标题 : 输入框输入空格测试环境 : Windows 系统, 谷歌浏览器-版本 111.0.5563.65&…

固态硬盘需要分区吗 固态硬盘怎么分区

磁盘分区是在磁盘中划分几个逻辑部分&#xff0c;来更充分的利用磁盘空间&#xff0c;对保存的数据进行分类储存&#xff0c;方便使用。今天小编给大家介绍一下&#xff0c;固态硬盘需要分区吗&#xff0c;固态硬盘怎么分区。 一、固态硬盘需要分区吗 固态硬盘是需要分区的&a…

Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化

一、redis命令 1.redis通用命令 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有&#xff1a; keys 查看符合模板的所有key&#xff0c;不建议在生产环境设备上使用&#xff0c;因为keys会模式匹配所有符合条件的key&#…