ASP 在线测试程序设计的主要问题及实现方法 江苏省盐城经济开发区学 冯美顺 ASP 在线测试系统充分利用 Browse/Server 结构的特点, 通过网络通信, 使考 试不再受空间与时间的限制,是目前许多学习类网站都具有的功能模块,本文以 多项选择题为例,就 ASP 在线测试程序设计中需要解决的主要问题,谈谈实现的 方法。 一、批量输出试题 批量输出试题,是 ASP 程序设计要解决的首要问题,为方便设计,数据库中 试题表的结构如下图所示。 (图一 试题表结构) 要能在网页上正确显示试题,并能在点击“提交”按钮后方便地把考生答案 存入试题表,要解决的核心问题是如何给出复选框的 name 值,以区别不同试题的 各个选项。很显然,复选框的 name 值不应该也不能是一个个常量字符串,考虑到 库中试题是用循环语句输出的,如果在输出选项前,结合循环变量给一个字符变 量赋值, 并用它做为复选框的 name 值, 就可以达到区别不同试题各个选项的目的, 程序代码设计如下。 <% '把复选框的 value 值赋给 h 数组的四个元素, 以方便在循环语句中引用, stsum 为试题数统计变量 dim h(4),stsum h(1)="A" h(2)="B" h(3)="C" h(4)="D" …… 1 strsql="select * from test where type="&;type&;" order by stbh" set rs=db.execute(strsql) i=0 do while not rs.eof i=i+1 %> ……
<%=rs("connet")%>
<% for j=1 to 4 'selename 字符变量的值为不同试题各个选项复选框的 name 值 selename="sele"&;cstr(i)&;cstr(j) 'sele 字符变量的值为不同选项的字段名 sele="sele"&;cstr(j) %>
value=<%=h(j)%>> <%=rs(sele)%>
<% next rs.movenext loop stsum=i %> …… 二、把考生答案存入数据库 与批量显示试题相似,要通过 Request 对象的 Form 方法获得考生答案,首先 应该重现它的 name 值,其次,由于是多项选择题,每道题的答案要通过字符串的 连接才能得到,最后,为方便把若干不同试题的答案存入数据库中,还要求把考 生答案先存入数组。程序代码设计如下: for i=1 to stsum for j=1 to 4 selename="sele"&;cstr(i)&;cstr(j) answer(i)=answer(i)&;request.form(selename) next next 在获取了考生的答案后,又如何区别考生存储答案呢?这一问题的解决涉及 到数据库中的表设计。 在线测试数据库至少包含两张表, 一是考生信息表 (图二) , 二是试题表,在设计考生信息表时增加 answer_name 字段,设计试题表时增加若 2 干考生答案字段,并且用考生信息表中 answer_name 字段的值命名考生答案字段 (即图一中的 user1、user2、……字段) ,这样就可以在考生登陆考试时获取 (图二 考生信息表结构) answer_name 字段的值,在保存答案时,更新试题表中 以这一值命名的字段即可。 程序代码设计如下: for i=1 to stsum strsql="update test set type="&;type&;" and stbh ="&;i db.execute(strsql) next …… 三、保留答题痕迹 测试页面上保留答题痕迹,既是考生复查试卷的需要,也有利于考后的试卷 分析,这是在线测试系统应该具备的基本功能。实现这一功能的基本思路是:在 批量显示试题时就从试题表的考生答案字段中取值,并据此确定复选框的状态。 稍作分析可以知道,每道选题的答案都是一个长度不超过 4 的字符串(前提 是每道题均有 4 个选项) ,只有先把它分解成单个字符,才能置相应选项前的复选 框为已选择状态即 checked。 具体实现方法是, 先把考生答案从数据库读入一维数 组,然后再使用 mid 字符函数分解存储在一维数组中的字符串,并把它们转储到 一个两维数组中,最后用 if 语句确定复选框的状态,这样就可使每道题的四个选 项对应于数组的四个元素,整个过程如下图所示。 ACD BD …… AD A 转为 "&;answer_name&;"='"&;answer(i)&;"' where A B C D D 决定 状态 √ A 选项内容 B 选项内容 √ C 选项内容 √ D 选