摘 要 利用网络和数据库技术,结合目前硬件价格普遍下跌与宽带网大力建设的有利优势,我们基于B/S模式研究开发了试题库与在线考试系统这一ASP应用程序。它运用方便、操作简单,效率很高,现阶段虽只实现了试卷的客观题部分,但已具有试题(卷)录入、修改和查询,手工组卷与自动组卷以及进行在线考试等重要功能,也就是说实现了真正的无纸化考试,满足任何授权的考生随时随地考试并迅速获得成绩,并给出其详细的成绩分析与试卷评估,同时也大大减轻了教师出题、组卷和改卷等繁重的工作量。
引 言
现阶段,学校与社会上的各种考试大都采用传统的考试方式,在此方式下,组织一次考试至少要经过五个步骤,即人工出卷、考生考试、人工阅卷、成绩评估和试卷分析。显然,随着考试类型的不断增加及考试要求的不断提高,教师的工作量将会越来越大,并且其工作将是一件十分烦琐和非常容易出错的事情,可以说传统的考试方式已经不能适应现代考试的需要。随着计算机应用的迅猛发展,网络应用不断扩大,如远程教育和虚拟大学的出现等等,且这些应用正逐步深入到千家万户。人们迫切要求利用这些技术来进行在线考试,以减轻教师的工作负担及提高工作效率,与此同时也提高了考试的质量,从而使考试更趋于公证!客观!更加激发学生的学习兴趣。例如目前许多国际著名的计算机公司所举办的各种认证考试绝大部分采用这种方式。为了适应新形势的发展,我们推出了这一系统,使其尽快在各类考试中发挥高效、便捷的作用,把老师从繁重的工作中解脱出来!
一、基本简介
试题库与在线考试系统采用ASP、HTML、Frontpage2000/98、Javascript、VBScript、Java编程语言、图形编辑与数据库等工具,通过基于WEB服务器访问纯WEB页面,实现在线组卷与考试等各项相关的功能。
它是专门用于试题(卷)录入、查询、修改、删除、组卷和参加在线考试的ASP应用程序。其最大的特点是开放性、方便性和灵活性。主要是指一般的用户不仅可以轻松地向题库添加、修改和查询试题(卷),而且还可以自动新增科目并建立相应的数据表;它还允许用户根据自己的需求,从现有的试题库中灵活地抽取各类试题,以组建适合于自身所需的试卷。而且,自测试卷的难易程度和形式以及各大题分数等都由用户根据需要确定。考生通过浏览器进行有效的身份验证登录后,输入正确的试卷编号,并要求在规定的时间内进行答题,当达到规定的时间后,系统将自动予以提交。一旦考生做完后便能立即看到预先记录在库中的标准答案和自己的平时成绩(正规考试试卷不得随意更改以及答案将不及时提供),并且其答案和分数将被记入库中以供审核和查阅,并作为成绩评估和试卷分析的历史数据;另外,还可完全由计算机自动按照"难度系数"灵活、随机的抽取试题库中的各类试题组成各种形式的试卷,其内容会随着库中试题的改变而改变,不妨把它称之为实时的互动的试卷。
用户对象主要是大、中、小学及职业学校等单位的教师及学生和企事业单位的教育部门(因企事业单位每年要对员工进行素质、安全教育与技能等方面的培训及考试等)。
二、运行环境与系统结构
此应用程序可广泛运行于国际互联网即Internet,也可适用于内部的局域网。其运行要求和逻辑结构分别如下:
客户端:Windows95/98,Internet Explorer(IE)等
服务器端:Windows NT/Windows2000,Internet Information Server (IIS)4.0及其以上版本,IE等;或者Windows98,Personal Web Server(PWS),IE等。
数据库:采用SQL Server,运行于服务器端。
试题库与在线考试系统逻辑结构图
三、系统特点
系统联为一体,界面整齐、美观,操作简单、方便。另外,支持按权限对系统进行操作,即不同类型的用户拥有相异的权限对题库执行不同的操作。主要是在首页通过两种不同的方式进入相异的操作界面,以确保整个数据库中数据的安全性及完整性。其主要特点体现在以下三个方面:
(1) 自主设计数据库 ⑵ 自主调用数据库 ⑶ 自主管理数据库
自主设计数据库是指用户能够根据自己的需要创建新科目数据库(即系统实现了自动建表的功能),让数据库真正成为用户自己的数据库。不过,只要库中已存在该科目名称及表名,则不予重建,这样就保证了数据的统一性;自主调用数据库即允许用户能自由地从数据库中抽取试题组成试卷,试卷中有几道大题和小题以及是否提供查看答案均由用户自行设置并选题。通常来说,一份高质量的试卷,需要用户反复推敲、比较和琢磨,用户就象进超市买东西一样能方便地把看中的取出来,也可反悔把不需要的退回去,并且在形成一份完整的试卷之前,允许任意调整该试题的次序。在组卷时,还可以多份试卷选取同一试题或同一知识点的试题,但严禁一套试卷中出现知识点相同(似)且难度一致的试题。不过,其最大的缺陷在于目前只实现了试卷中的客观题部分,即包括判断、单选和多选题。而且,还没有实现客观题部分和真正的多媒体试卷;自主管理数据库指一般用户具有添加、修改和检索数据的权力,实现数据库的可扩充性和开放性。而管理员则另具有删除数据的权力,从而达到了系统数据统一性和一致性的目的,具体情况请见系统演示。
四、详细设计
4.1、试题(客观题部分)设计
在以往的考试中,判断题常常是通过画" ╳ "," "来判断;而单选题往往在四个供选的答案A、B、C、D中选择唯一正确的答案;另外,多选题跟单选题在根本上没什么区别,只是供选的答案和标准答案多一些。因而,本系统中所涉及的单选题和多选题跟过去的大体相同,主要不同在于把判断题巧妙地转化为只有两个选项的单选题,并且假设多选题一般情况下也是最多提供六个备选答案,标准答案至少有一个。故各题型的样题设计如下:
判断题-->如:重发器也叫中继器: (A)错 (B)对
单选题-->如:HUB是指: (A)网桥 (B)集线器 (C)网关 (D)路由器
多选题-->如; Internet上使用的网络协议是: (A)IPX/SPX兼容协议 (B)TCP/IP协议 (C)NetBEUI协议 (D)X.25协议 (E)ATM LAN仿真用户 (F)快速红外线协议
4.2、数据库设计
4.2.1、试题结构
通常,每一类型的试题都应有一个表结构。但考虑到目前系统存贮空间已经不受物理空间的限制。因此,我们采用按科目而不按试题类型方案来建立数据表,更不把所有科目的全部试题集中在一起,只是每道客观题均有六个备选答案项,还有一个表用来记录各科目数据表的相关属性。这样,查询起来较方便,可能会节约时间,也不致于造成数据十分杂乱等。详细设计如下表所示:
说明:
1. 按科目(一般以1个学期为标准)分别定义各表,表名一律由中文名汉字拼音首字母构成。例如,软件工程---RJGC;计算机网络---JSJWL;小学二年级上期数学---XXENJSQSX
2.字段名是指该字段的中文名
3.字符标识一般由中文名拼音首字母构成,外键字段最好与主表对应字段同名
4.若该字段为字符型,则对应的长度栏填最大允许长度,若为固定长度则加'定'字
5.若该字段可以为空,则对应的NULL栏填Y,否则不填
6.若该字段为主键,则对应的主键栏填Y,否则不填
科目数据信息表
字段名
字符标识
类型
长度
NULL
主键
说明
科目中文详细名称
KMMC
CHAR
50
以中文为准,例如"计算机网络"
科目表名
KMBM
CHAR
50
Y
一律由上面中文名拼音首字母构成,如"JSJWL"
录 入 者
LRZ
CHAR
15
默认为录入员登入帐号
录入日期
LR_DATE
DATE
10
默认为录入时的系统日期
备 注
MEMO
CHAR
50
Y
4.2.2、试卷结构
试卷一般包括客观题(判断题、单选题或多选题)和主观题(填空题、短文字题或长文字题),即一套试卷包括若干大题,每道大题包含若干小题。但是,本系统的试卷目前只涉及客观题部分。故大题数暂定为最多3道,小题数总和若干,而且,在此表中只存贮该科目试卷相应的试题编号,其试题内容则在调用时到相应科目中查询获得。
4.2.3、用户、留言信息结构
A、超级用户:在此系统中有且仅有一个,即系统管理员。他具有一般用户所没有的至高无上的权力,即具有删除用户、留言、试题以及试卷等信息的权力。它不需注册,在数据库没有它的任何相关信息,但可由管理员自己更改用户名和密码。确保万一数据泄密而造成系统的危害。
B、一般用户:主要是指学校的教师及学生和企事业单位的教育部门等。另外,所有用户可能会对我们的系统发表意见或相互之间答疑。
4.2.4、考生答案成绩表结构
实际考试日期可能因某种原因推迟考试而与试卷表中的考试日期有所不同。因而,此表应与用户、试卷及试题库等多表相关联,关系比较复杂。
4.3、功能模块详细设计
下面,按照录入试题-出卷-进行考试等流程就各个模块分别进行详细讨论,具体情况见系统源程序及演示。考虑到数据的保密与安全问题,凡进入系统的用户,必须先注册,然后通过验证才能进入。否则,进入"SORRY"页面。
4.3.1、录入模块
许可的用户根据自身教学目的和要求,可以向库中添加各种类型且符合要求(对不符合的将给出提示和警告,并且不予保存!)的试题和试卷以及各自的意见与疑难问题等。一旦添加成功,只有管理员才能删除。
①试题录入
首先,用户选择试题所属科目。若下拉菜单中没有该科目,则点击右边的新增科目,即进入这一页面,只要输入新增科目详细名称(一般以一个学期修完为标准)和表名(最好由汉语拼音首字母组成),即可由系统根据已设定好的字段自动建立新的科目试题表。返回、刷新一次页面,即可看到新增的科目名称。而且,在本系统中其它需要选择科目的地方也会自动更新。
其次,每道试题有类型、难度系数、选自书籍及章节、试题内容与答案和标准答案等栏目。用户一一输入完(对于该试题不需要的答案项,则默认为"不填"),按"提交"后,即可看到预览效果。如果输入不合法,或者该科题库中已有该试题编号和内容等,则系统给出相应的提示或警告,以待更正。
②试卷录入
此子模块包括两个部分,即标识试卷的基本信息录入和手工组卷部分。其基本信息有试卷编号、标题、套数、难度、科目名称、考试性质与日期等,而卷中试题将通过后面的手工组卷模块予以实现。对于用户输入的不符合系统要求的数据,系统仍旧给出提示或警告。
③用户留言
凡使用此系统的用户可能对我们的工作有许多良好的建议和意见,或者有一些疑难问题需要大家共同探讨的话,可以在此提出。
4.3.2、查询模块
系统中的所有用户均可检索试题、试卷、用户及留言等信息。只是试题检索界面较复杂,但它已实现了多种条件的组合查询,非常适合于数量繁大的试题库。而后三者相对来说比较简单,"默认"或"空白"的情况下,则按该表中的系统默认的字段显示其全部信息。使用起来比较灵活、方便。
4.3.3、修改模块
用户除了只修改自己的部分资料(包括用户帐号、密码和E-Mail)外,还可修改试题及试卷,而留言则不许修改。只要用户选择科目和输入编号,即可进行修改。不过,对于各表中的主键不准修改,避免了造成系统中的数据混乱,或者覆盖其它有用数据的现象。如果用户执行了非法操作,则必须重新操作。
4.3.4、组卷模块
在组卷过程中,我们肯定会遇到有许多题目是关于同一个教学内容的,这里称之为关于同一考核点的试题。因此,在组装一份试卷时,对于同一考核点的试题只能出一道题。这里设计一种快速选题算法,该算法只需经一次比较,便可判定是否已选过该考核点的试题,且又可以有针对性地重点选取某个考核点的试题。即每一道题都设有一个相关码,对于同一章、同一节、同一考核点的题,则相关码相同,显然,前面章节的相关码都要小于后面章节的相关码。故在组卷时,同一试卷中不允许出现相关码相同的试题。所以,在选题过程中每选出一题,就要与已经选出的题的相关码逐一进行比较,若该题的相关码与已选各题的相关码均不相同,则可将该题加入到试卷中,否则,放弃该题,重新进行选题。
下面,在只考虑最佳情况下,即每次选出的题都恰好是尚未选过的,每选一道题就要与已选出的各题逐一比较,假设已选出了M题,再选下一题时,则需比较M次,不妨设一份试卷的总题数为N,在最佳情况下,则总的比较次数为:
0,1, 2,…N-2,N-1
即时间复杂度为O(N),这样,就可保证下面算法中选择出来的试题编号都合法。
基本算法:
{定义参数,获得整套试卷的共同限制参数,即包括输入必要条件得到必要参数和 输入任选条件得到任选参数}
必要参数组合= A1 AND A2 ~~AND An;任选参数组合= B1 OR B2 ~~OR Bn;
大题数dts =3 '默认为3道大题;小题数xts=0 '默认为50道小题;
IF 无判断题 THEN dts=dts - 1 END IF '开始计算大题数
IF 无单选题 THEN dts=dts - 1 END IF
IF 无多选题 THEN dts=dts - 1 END IF
开始扫描相应科目的试题库,获得临时所有符合条件的试题预览,接着开始手工细选试题以生成试卷或计算机自动组卷。
IF 符合必要参数组合 THEN
SELCECT 任选参数
B1:显示符合必要参数+B1的试题编号及内容
B2:显示符合必要参数+B2的试题编号及内容
┋ ┋ ┋
Bn:显示符合必要参数+Bn的试题编号及内容
END SELCECT
END IF
IF dts>= 1 THEN
IF 试题编号合法THEN xts=xts + 1
ELSE 请输入合法的试题编号!
END IF
IF dts>xts THEN xts必须大于或等于dts!
ELSE
IF 某已存在的题型中小题数为0 THEN 该题型至少要有1道试题!
END IF
END IF
IF 判断题存在且分数<= 0 OR分数>100 THEN 请修改!
ELSE TOTALFEN= TOTALFEN +PDTF
END IF
IF 单选题存在且分数<= 0 OR分数>100 THEN 请修改!
ELSE TOTALFEN= TOTALFEN +DXTF
END IF
IF 多选题存在且分数<= 0 OR分数>100 THEN 请修改!
ELSE TOTALFEN= TOTALFEN +TSTF
END IF
IF TOTALFEN <= 0 OR TOTALFEN > 100 THEN
总分在1---100分之内!
END IF
ELSE 试卷大题数不得为0!
IF testtime<= 0 OR testtime>= 4 (hour) THEN
考试时间必须满足0 <testtime< 4 (hour)!
END IF
END IF
IF所有数据均合法 THEN 则将该试卷的相关信息存盘
END IF
主要有下面两个子模块:
其一:手工组卷模块
用户提交相关限制条件,由系统根据这些条件先从大的范围内调出试题,稍后再手工通过复选按钮细选以生成自己所需的试卷,即利用现有的试题库,可编制出多份试卷。在组卷时,可以对所选的每一试题进行增删,顺序进行调整,并可自行规定各大(小)题分数和试卷的考试时间(默认值前已述及)。总之,能作出用户完全满意的试卷,以供在线考试或测试使用。
其好处关键在于---选题随机性强、成卷速度较快、试卷质量高;知识考核点分布均匀,且内容覆盖面容易控制。例如,期中考试时,只考前一半内容时,只要选取章节码小于或等于某个指定的值,则一定不会出现后一半内容的试题。
其二:计算机自动卷模块
完全由系统自动按照"易-中-难"顺序和根据用户选择的信息,灵活、随机的抽取试题库中的各类试题组成试卷,试卷内容会随着库中试题的改变而改变,试卷库中没有保存试卷的基本信息及相应的试题编号,不妨称之为活动的互动的试卷。不过,其试卷质量不高,难易程度把握不当,知识考核点分布不均,一般只作在线练习使用。
4.3.4、进入在线考场模块
进入在线考场是本系统非常重要的部分之一。因为一个系统如果涉及到现实的话,就必须考虑得十分周到、完善。考生登录后,只要输入已编辑好的试卷编号,就可以调出其试卷进行在线考试或测试,其答题信息通过单、复选按钮选择答案来反映。为了防止考生多次提交试卷和规范考场纪律,采取自愿交卷和到了规定的时间自动收卷两者有机结合的方式、限制考试时间和期限以及禁用鼠标等办法予以实现。但真正的无人监视的考试好象不能用软件实现,而且其安全性在系统设计中也很重要。因此,在设计过程中注意了以下几个问题:
1、只有考生自己才能参加考试!2、考试时间到了将自动交卷!
3、限制提交次数,暂只提供一次机会!4、禁止用户联网作弊!
上图为此模块程序设计详细流程图
4.3.5、在线练习模块
计算机自动组卷模块组成的互动的试卷(卷库中没有保存此类试卷的任何信息!)是通过单复选按钮来反映用户的做题信息。它主要用于平时的在线练习等,让用户了解自身的不足,并有针对性地进行复习和训练。因此,用户做完后,只要点击"查看答案",就可以与相应试题的标准答案对比,以便及时反馈情况,而没有提供成绩判定与分析和时间限制等。
4.3.6、成绩分析与试卷评估模块
考生每参加一次考试,系统根据已有的标准答案很快得出其分数,再根据不同的分数段给出相异的评语。一方面与其它同科考生进行横向对比,得出各个考生之间的差别;另一方面,也通过用户一段时期内参加同科考试的成绩来做纵向比较,用以说明其掌握该科目内容的实际程度,以便做出相应的决定。另外,管理员先给出一套完整试卷的预先评估,然后由系统自动根据同一试卷编号的所有用户成绩给出其实际的评估,并且都有一个难度等级,把两次评估进行比较得出该卷的难易程度以及更详细的评估情况。
4.3.7、删除模块
在整个系统中,只有系统管理员具有此权限。管理员通过复选按钮选择要删除的用户、留言、试卷及科目,而对于数量较大的试题库则通过输入或选择条件,就可达到删除那些过时的无用的试题,当然,对于那些恶意破坏系统的用户,管理员有权删除他,以示惩罚。这样就可确保数据库不至于十分庞大和其安全性。
五、ADO--ActiveX Data Object操作数据库的几个步骤
第一步数据库数据来源设定。若要访问数据库,需在"控制面板"中的"ODBC Data Sources",建立数据库名称(选择Users DSN),点击"Add"按钮,选定数据库所用的驱动程序和文件等。
第二步使用"Server.CreateObject"建立连接的对象,并使用"Open"打开待访问的数据库。set adocon=Server.CreateObject("ADODB.Connection");adocon.Open "zxtest"
第三步设定SQL命令,使用"Execute"命令,即可开始执行访问数据库的动作。
sqlstr ="select * from jsjwl where stbh like 'PD' order by stbh ASC"
set rs = adocon.Execute(sqlstr) ′adocon为第二步所设定的对象名称
第四步使用Recordset对象的命令,显示结果,其中rs为第三步所定义。
rs.fields.count:记录的字段数;
rs(i).name:第i(指针)个字段名,i由0算起到rs.fields.count-1;
rs(i):读取第i(指针)个字段的记录,i由0算起到rs.fields.count-1;
rs("字段名"):读取指定的字段的记录;rs.eof:是否已指定最末条;
rs.movenext:将指针移到下一条;rs.moveprev:将指针移到上一条;
rs.movefirst:将指针移到第一条;rs.movelast:将指针移到最末条;
第五步使用后关闭数据库:
rs.close;adocon.close
六、数据的安全与保密
由于此系统的特殊性,数据的安全与保密显得尤为重要。保密性是指用户在网上的所有信息应有一定的保密度,不同类型的用户之间的内容是互相保密的。安全性是指用户参加一次活动是一个安全的过程,对于所有用户的动作,服务器都加以跟踪。为了确保其安全与保密性,一要确保考生不能联网作弊;二要在试卷上实时加以监控;三要在时间上加以严格的控制等。主要通过下列两种途径予以实现:
其一,凡进入在线考试的用户,都要通过用户身份验证(见下图)才能进入。而且,不同用户具有不同的操作权限,支持按权限进行操作,确保数据的公共性与私有性。不允许用户执行非法的操作,防止用户无意或有意的破坏。
其二,禁止用户查看所有试卷的源文件及拷贝功能,方法有二:
1、禁止使用鼠标右键等功能;
II、试卷库中的试卷将以无下拉菜单及工具栏等的页面方式呈现在浏览者面前。
七、附录:源程序列表
由于源代码繁多,限于篇幅,无法一一列举,现只公布部分代码,具体以系统实物为准。下面是录入试题.asp文件:
<script language="VBScript">
<!-- 'Written by HeKai 2001
Function datacheck()'确保前台输入数据合法
dim errflag, msg
errflag = True
if Len(Trim(luru.xzsj.value)) = 0 Then
focusto(1); errflag = false; msg="请输入 '选自书籍名称'"
ElseIf Len(Trim(luru.stnr.value)) = 0 Then
focusto(9); errflag = false; msg=" '试题内容' 呢"
ElseIf Len(Trim(luru.A.value)) = 0 Then
focusto(10); errflag = false; msg=" '答案_A' 呢"
┋ ┋ ┋
ElseIf Len(Trim(luru.F.value)) = 0 Then
focusto(15); errflag = false; msg="请还原成默认值"
End if
If (errflag = false) then
msg = msg & vbCRLF
MsgBox msg, 64, "提示"
Exit Function
End if
datacheck = errflag; luru.Submit
End Function
Sub focusto(x)'将鼠标定位在出错处
document.luru.elements(x).focus()
End Sub
--></script>
以下是录入试题.inc文件:
<script Language="VBScript" RunAt="Server">
Function check_Pass()'检查库中是否已有此数据
kmxxmc = Request.Form("kmxxmc")
stbh = Request.Form("stbh") stnr = Request.Form("stnr")
SQLstr = "select * from " & kmxxmc & " where stbh=" & "'" & stbh & "'"
SQLstr = SQLstr & " or tmnr=" & "'" & stnr & "'"
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
set sa1=adocon.Execute(SQLstr)
If sa1.EOF Then
check_Pass = False
Else
check_Pass = True
End If
sa1.Close adocon.Close
End Function
Sub Add_Comment()'开始插入数据并显示出来
Dim kmxxmc,xzsj,tmlx,nycd,jxyq,stbh,stnr
Dim A,B,C,D,E,F,bzda,lrz,Picstr,SQLstr,lr_date,zhang,jie
kmxxmc = Request.Form("kmxxmc") xzsj = Request.Form("xzsj")
┋ ┋ ┋
bzda = Request.Form("bzda") zhang = Request.form("zhang")
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
SQLstr = "insert into " & kmxxmc & " (xzsj,tmlx,tmnd,jxyq,stbh,tmnr, bxda_a,"
SQLstr = SQLstr & ",jie,lrz) values (" & "'" & xzsj & "'," & "'" & tmlx & "',"
┋ ┋ ┋
SQLstr = SQLstr & "'," & "'" & date & "'," & "'" & zhang & "'," & "'" & jie & "'," SQLstr = SQLstr & "'" & lrz & "')"
set sa1 = adocon.Execute(SQLstr)
Picstr="<img src='/images/hekai.jpg'>"
Response.Write "恭喜!此为<i> " & lrz & "</i> 刚才录入的试题"
Response.Write Picstr & " 试题编号:" & stbh
Response.Write "试题内容:" & stnr & "<br>"
Response.Write "答案_A:" & A & "<br>"
┋ ┋ ┋
adocon.Close
End Sub
Sub Register()
If check_Pass() Then '如果库中已有的话,则给出提示信息
Show_Warning()
Else '否则添加进去
Add_Comment()
End If
End Sub
Sub Show_Warning()'给出提示信息的函数
Response.Write("<p>")
Response.Write("<center>很抱歉<p>")
Response.Write("库中已有此试题编号或试题内容,请返回前页修改!")
Response.Write("</center>")
Response.Write("Made by hekai himself in 2001")
End Sub
</script>
此为"检索试题"的程序代码:
<script Language="VBScript" RunAt="Server">
Function adjust_sql(adj_str)
'目的---转换查询字符串中的特殊字符至SQL指令
Dim final_str, i 'WRITE BY HEKAI2001
adj_str = Trim(adj_str)
final_str = "" '每次从传进来的字符串中取出一个字符,并判断是否为下述三个字符之一: DOS的Filter符号"|"、左中括号"["以及单引号"'"
If Len(adj_str) > 0 Then
For i = 1 To Len(adj_str)
Select Case Mid(adj_str, i, 1)
Case "[": final_str = final_str & "[[]"
Case "|": final_str = final_str & "[{-}]"
Case "'": final_str = final_str & "[&-()"
Case Else: '以上皆非则什么事都不做!
final_str = final_str & Mid(adj_str, i, 1)
End Select
Next
End If
adjust_sql = final_str
End Function
Sub Output_shiti()
Dim kmxxmc,xzsj,stbh,zhang,jie,tmlx,nycd,jxyq,lrz,stnr,cond_count, Picstr
Dim SQLstr,mf,zhangfw,jiefw,stbhfw,nycdfw,lr_datefw,lr_date
'记录指定条件的栏位总数
cond_count = 10; mf = "%"
Picstr="<img src='/images/hk.gif'>"
'取得表单栏位内容
kmxxmc = Request.Form("kmxxmc")
stbh = Request.Form("stbh")
┋ ┋ ┋
stnr = Request.Form("stnr")
'调整SQL指令中的特定字元
kmxxmc = adjust_sql(kmxxmc)
stbh = adjust_sql(stbh)
┋ ┋ ┋
stnr = adjust_sql(stnr)
If Len(xzsj) = 0 Then cond_count = cond_count - 1
If Len(stbh) = 0 Then cond_count = cond_count - 1
┋ ┋ ┋
If Len(stnr) = 0 Then cond_count = cond_count - 1
SQLstr = "select * from " & kmxxmc & " where "
If Len(stbh) > 0 Then
SQLstr = SQLstr & " stbh " & stbhfw & "'" & stbh & "'"
If cond_count > 1 Then
SQLstr = SQLstr & " and "
cond_count = cond_count - 1
End If
End If
┋ ┋ ┋
If Len(stnr) > 0 Then
SQLstr = SQLstr & " tmnr like " & "'" & mf & stnr & mf & "'"
If cond_count > 1 Then
SQLstr = SQLstr & " and "
cond_count = cond_count - 1
End If
End If
SQLstr = SQLstr & " order by lr_date DESC "
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
set sa1 = adocon.Execute(SQLstr)
If sa1.EOF Then
Response.Write "<br><center><h1>"
Response.Write "Sorry!<p>"
Response.Write "没有找到试题,"
esponse.Write "请重试一次!</center><p>"
Response.Write "<hr></h1>"
Else
i = 0
Response.Write "<h2>"
Response.Write "符合条件的试题相关内容如下:"
Response.Write "</h2>"
While Not sa1.EOF
i = i + 1
Response.Write "第 <i>" & i & "</i>题 题编号:<i>" & sa1("stbh") & "</i><br>"
Response.Write "试题内容:" & sa1("tmnr") & "<br>"
┋ ┋ ┋
Response.Write "答案A:" & sa1("bxda_a") & "<br>"
sa1.MoveNext
WEnd
adocon.Close
End If
End Sub
</script>
<% '"检索试卷"的查询方式源代码
mf="%"
select case request("findfs")
case "sjbh"
sqlstr="SELECT * FROM tbsjxx WHERE " & " sjbh LIKE"
sqlstr=sqlstr & "'" & mf & request("findfsz") & mf & "'order by ksrq DESC"
┋ ┋ ┋
case "lr_date"
sqlstr="SELECT * FROM tbsjxx WHERE " & " lr_date LIKE"
sqlstr=sqlstr & "'" & mf & request("findfsz") & mf & "'order by ksrq DESC"
case else
sqlstr="SELECT * FROM tbsjxx order by ksrq DESC"
end select %>
下面是考试的时间自动控制程序(便于演示只设了60秒钟,实际应用应以系统调出试卷的考试时间为准!):
<SCRIPT language=JavaScript>
<!-- Write by HEKAI for TestTimeContorl
var timerID = null;var timerRunning = false
var stardate = new Date();var startime = gettotalsecond(stardate)
var totaltime = 60; var lasttime;var facetime
function Stepclock(){
// hk made by himself
if(timerRunning)
clearTimeout(timerID)
timerRunning = false }
function startclock(){
Stepclock();showtime() }
function gettotalsecond(getdate){
var hours = getdate.getHours()
var minutes = getdate.getMinutes();var seconds = getdate.getSeconds()
var gettotalsecond = seconds + minutes * 60 + hours * 3600
return(gettotalsecond) }
function showtime(){
var now = new Date();var timeValue = gettotalsecond(now)
document.clock.face.value = timeValue - startime
facetime = document.clock.face.value;lasttime = totaltime - facetime
document.clock.sytime.value = lasttime
timerID = setTimeout("showtime()",1000)
timerRunning = true
if (lasttime == 20){
for(i=1;i<=3;i++){
alert('考试时间只剩下最后20秒!')}}
if (lasttime == 0){
for(i=1;i<=5;i++){
alert('时间完毕!请迅速交卷!!')}}
if (lasttime == -10){
for(i=1;i<=10;i++){
alert('考试时间超过10秒,关闭此窗口!')}}
}//-->
</SCRIPT>
八、后记
此系统从研究设计到投入实际应用历时4个月之余,通过多次细致的测试及鉴定,证明系统完全具有可行性与可扩充性,就最近传来的消息,该系统获得了湖南省科技厅的普遍好评。另外,系统还有待于进一步升级,并将实现试卷的主观题部分和多媒体试卷。因此,仍有大量的工作需要开展。若有不详或不妥之处,请您以应用程序为准以及提出良好的意见与建议。