联系方式: 微信:biyebang QQ: 629001810
摘 要
当前,网络教学方兴未艾。网上考试已在其中扮演了重要的角色,传统试卷考试方式有待提高。网络教学已从其规范性、科学性及考试工作组织、管理的统一性,影响到教学质量的好坏。基于此,本系统开发实现了基于B/S模式的c试题生成与考试系统,其中数据库采用MYSQL,开发平台是jsp,开发工具是eclipse+myeclipse,服务器采用tomcat。本系统实现了三个功能模块即试题管理模块、在线考试模块、自动评分模块。试题管理模块包括上传试题、试题管理、试卷的自动生成。在线考试模块包括学生登录、考试鉴权、考试时间控制和一些简单的考试意外的避免。自动评分模块包括制定评分规则自动评分和答案的返回。 用户机则不需要安装任何应用程序直接通过浏览器就可以访问。本系统的实现有利于提高网络教学的质量同时大大拓展了考试的灵活性,阅卷效率,以及保证了考试的公平性、答案的安全性。
系统设计 项目总体设计框架图如图2-1: 本c语言试题生成与考试系统划分为三个功能模块: ⑴ 试题管理模块:该模块的主要工能有上传试题、试题管理、试卷的自动生成。该模块针对的是管理员,管理员有且只有一个不能添加。所有的试题都是管理员通过逐个添加或者通过Excel模板批量上传到数据库里的,当输入的试题有误时,还可以试题管理功能对该试题进行修改。此外,试题管理还包括对试卷的设置。例如:试卷类型的设置、考试持续时间的设置,两次考试时间间隔的设置。试题的自动生成是通过一条SQL语句加上数据库自带的一个随机函数随机从题库里面选出与考试配置相符合的试题类型和数量来组成一套试卷。每个考生所生成的试卷不是一样的。 ⑵ 在线考试模块:该模块主要针对的是考生。该模块主要包括考生登录、考试鉴权、考试时间控制和一些简单的考试意外的避免。当用户进入到登录界面时,该功能可以验证登陆用户的身份以及对本系统的操作权限。当检测到是管理员用户时就跳转到用户页面,当检测到是学生用户时候就进入学生页面。考试鉴权主要是检测用户是否合法,还有该用户是否重复登陆。考试时间的控制主要是考试所需要的时间设置,当考试时间到的时候会弹出一个提示框,如果考生不提交改试卷将作为作弊处理在数据库里面强制插入一条0分记录。在考试过程中考生强制退出也是作0分处理。一些简单的考试意外的避免主要是当考生登陆以后,点击准备好了这个按钮以后,试题自动生成。这时候,你再后退重新点击准备好了这个按钮时试题不会改变,与第一次生成的试题一样。 ⑶ 自动评分模块:该模块主要包括制定评分规则自动评分和答案的返回。根据考试的答案与存放在数据库的正确答案相比较判断出正误,试题的分值已由管理员输入数据库的,只需根据判断出的正确的试题取出相应的分值进行累加即可。当考生提交后会把正确答案和考生所选的答案返回给考生。 表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 <空> 表2-3 试卷信息表 名称 类型 空 默认值 Xnum Int(11) No <空> Pnum Int(11) Yes <空> Tnum Int(11) Yes <空> last Int(11) No <空> internal Int(11) No <空> 名称 类型 空 默认值 属性 主索引(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 <空> 名称 类型 空 默认值 属性 主索引(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建立关系的。 由于防止学生作弊,在每个不同用户登陆时该系统所生成的试题是不一样的,是随机的。而且每次试题生成后不管学生怎样刷新或重新登陆试题都不会变(只要是在规定的考试时间段内),strSql = " select * from tiku where kind='"+kind+ "'order by rand() limit " + Number + "";该方法主要是通过一条SOL语句从数据库里面取出试题,试题的随机性主要是考Mysql里面自带的rand()函数实现。该函数的功能主要是就每次随机生成不同的试题。Kind表示试题的类型由前台页面传进来。Number是试题的数量也是由前台页面传进来,所以管理员可以根据考试的需要设置试题的数量和类型。不同类型的试题可以设置不同的数量。这样使试卷更具灵活性,更容易发挥考试的特点。试题的不一样也降低作弊率,提高了考试的可信度,增加了试卷的有效性,把学生对知识的掌握情况真实的反映在试卷上了。 本系统在添加学生的时候采用了AJAX思想实现局部刷新,当你在填写资料时候,系统会有一些提示,这些提示的出现都不是整体刷新后出现的,都是局部刷新就出现了。在你提交以后也不局部刷新也面这样节约了很多时间,瞬间就可以继续添加下一个学生。 主要实现代码如下: functionvalidate(){ //考生编号 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 = newActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } //请求后台方式 xmlHttp.open("POST",url); //调用callback xmlHttp.onreadystatechange = callback; //发送到服务器 xmlHttp.send(null); } functioncallback(){ //考生编号 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 }elseif(xmlHttp.responseText==1){ document.getElementById("wrong").innerHTML= "考生编号可以使用!"; document.getElementById("flag").value=1 } } } 后台收到前台传来的值进行判断并返回一个值给前台,前台调用上面集中方法实现局部刷新的。 在前面我们已经提到该系统主要由三个模块组成,即试题管理模块、在线考试模块、自动评分模块。试题管理模块包含上传试题、试题管理、试卷生成、成绩管理这些功能。如图所示: 试题管理模块分为:上传试题、试题管理、试卷生成、成绩管理。 管理员登录后可以根据界面上的表格添加试题,这种方式一次只能添加一道试题。也可以在界面上下载Excel表格模版批量的上传试题。这种方式一次可以添加多道试题。上传的表格必须以文本的形式进行上传,否则会出错。通过Question upload action接收上传文件,然后在javabean里调用readquestionexcel方法解析Excel文,实现上传。上传成功后如果发现有错,还可以在题库管理页面进行修改。 在试题管理模块中可以对试题进行查看、删除、添加、修改。每条记录前都有一个复选框,选种你不需要的记录然后点击删除按钮。在每条记录后面都有一个编辑查看的链接,通过该链接可以进行查看和修改。修改完毕后对数据库中的数据进行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("locktable tiku write"); // 如果插入成功就返回真否则返回假 if(db.ExecSql(strSql) == 0) { db.OpenSql("unlocktables"); return false; } else { db.OpenSql("unlocktables"); return true; } } 实现插入的代码如下: strSql = "insert into tiku values(null,'" + question +"','" + keya + "','" +keyb + "','" + keyc + "','" + keyd + "','" +answer + "','" +score + "','" + kind + "')"; System.out.println(strSql); db.OpenSql("lock tabletiku write"); try { // 如果插入成功就返回真否则返回假 if (db.ExecSql(strSql) ==0) { db.OpenSql("unlocktables"); return false; } else { db.OpenSql("unlocktables"); return true; } } catch (Exception e) { db.OpenSql("unlocktables"); return false; } } 管理员可以对考试的各个参数进行设置。每道试题的分值,各种题型的数量。考试的时间等等。设置的这些信息是通过session来传递信息的。按照sesion传递的信息在题库中随机的抽取试题。在Mysql中自带一个随机函数rand()利用这个函数产生一个随机数,然后根据这个随机数取出相应的试题。所以题库里面的试题越多,两张试卷出现相同试题的几率就越小。为了保证一张试卷不出现相同的试卷只有通过管理员在把试题输入到题库的时候不要输入相同的试题。这种情况本系统没有考虑。 实现代码如下: public static ArrayListrandomQuestions(DB db, String Number, String kind) throwsSQLException { //新建一个数组用来保存返回随机题目 ArrayListlist = new ArrayList(); ResultSetrs; //查询数据库语句变量 StringstrSql; strSql = " select * from tiku where kind='" + kind + "' order byrand() limit " + Number + ""; //System.out.println(strSql); // 执行sql查询 rs = db.OpenSql(strSql); while (rs.next()) { Questions qe = newQuestions(); 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把值传到前台。实现试题的自动生成。本试题自动生成系统对每次生成的试卷没作保存处理。 成绩管理主要是对学生考试成绩的查看和删除。还可以查看考试时的ip地址以及考试开始时间和结束时间。 在线考试模块分为:在线考试模块分为:鉴权考试、学生登陆、时间管理、意外避免。 每次系统都会判断该用户存不存在。防止一些不具有本次考试资格的学生登陆。 判断用户是否存在的实现代码如下: public static boolean checkUserAccount(DB db, String s_id) throws SQLException { String strSql; ResultSet rs; // 编写sql变量 strSql = "select * fromstudent 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; } } 通过用户名系统能直接判断出是管理员还是学生,管理员有且只有一个。所有学生的用户名、密码以及一些相关的信息都是管理员通过Web页面来添加、删除、修改。其中用户名为学生的学号,密码默认值为123。登陆成功后学生可以修改自己的密码。 检查用户名和密码是否正确的实现代码如下: public static boolean checkUser(DB db, String s_id, String psw) throws SQLException { String strSql; ResultSet rs; // 编写sql变量 strSql = "select * fromstudent 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; } } 时间对考试来说是至关重要的。在c语言试题自动生成系统中,为学生设置了考试开始时间和考试剩余时间。使考生在考试过程中对时间好有个把握。显示剩余时间的时钟是一个动态时钟,这个时钟显示的时间是由服务器控制的,这样避免了考生因修改自己计算机的系统时间而出现的作弊现象。当服务器到达考试时间时候,系统会弹出一个对话框显示时间到。如果迟迟不点确定按钮,系统会自动向数据库插入一条零分记录。即作为作弊行为来处理。 当考生登陆后点击准备好了按钮后开始考试,为了防止考生进行刷新或后退使生成的试题发生变化,这样会影响考试的结果。本系统在这方面进行了防止,使考生在考试时间段内后退也好刷新也好都不能是生成的试题发生变化。本系统还防止了学生通过多次登陆来生成不同试题然后提交多份考卷的现象。通过调用isuesrlogin这个方法来实现对用户多次登陆的侦听。 主要实现代码如下: public static boolean isUserLogin(HttpSession session,Stringusername){ boolean flag =false; if(list != null&& list.size() > 0){ for(inti=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 voidremoveUserSession(String username){ System.out.println("destoryed" + username); list.remove(username); } } 防止刷新后退使试题改变的主要实现代码如下: try { String flagt =request.getParameter("flagt"); Studentstudent = (Student) session.getAttribute("sinfo"); if (student !=null) { if(!flag.equals(flagt) && flagt != null &&session.getAttribute("qex") == null) { System.out.println("正常登录"); flag =flagt; 原理就是当你点击准备好了按钮之后产生一个随即数传到后台,后台根据这个随机数判断是否是刷新。 根据上述分析资料和设计资料,经过实践,基本完成了系统所需的功能。以下是系统相关的截图,演示了系统功能的操作过程。 首先,进入系统登陆界面后输入用户名和密码就可以进入系统进行相应的操作,当以管理员身份登陆成功后可以进行学生管理、题库管理、成绩管理、考试设置、密码修改这些操作。学生管理操作如图7-2所示。 源文件
1 项目总览
1.1总体设计
1.1模块划分及各模块的基本功能
1.2数据库设计
试卷信息表;标识:config;数据来源:管理员添加;
名称:成绩信息表;标识:score;数据来源:前台页面获取;
表2-4 成绩信息表
学生信息表;标识:student;数据来源:管理员输入;
表2-5 学生信息表
1.1试题生成
1.2局部刷新
2 项目分析、设计、开发
1.1试题管理模块的设计
5.1.1上传试题
试题管理
5.1.3试卷生成
5.1.4成绩管理
1.1在线考试模块的设计
5.2.1考试鉴权
5.2.2学生登录
5.2.3时间管理
意外避免
版权所有© 帮我毕业网 并保留所有权利