相关内容
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"
……
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
%>
……
<tr><td>
<%=rs("connet")%>
</td></tr>
<% for j=1 to 4
'selename字符变量的值为不同试题各个选项复选框的name值
selename="sele"&cstr(i)&cstr(j)
'sele字符变量的值为不同选项的字段名
sele="sele"&cstr(j)
%>
<tr><td>
<input type="checkbox" name=<%=selename%> value=<%=h(j)%>> <%=rs(sele)%>
</td></tr>
<%
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字段,设计试题表时增加若干考生答案字段,并且用考生信息表中answer_name字段的值命名考生答案字段(即图一中的user1、user2、……字段),这样就可以在考生登陆考试时获取
(图二 考生信息表结构)
answer_name字段的值,在保存答案时,更新试题表中以这一值命名的字段即可。程序代码设计如下:
for i=1 to stsum
strsql="update test set "&answer_name&"='"&answer(i)&"' where type="&type&" and stbh ="&i
db.execute(strsql)
next
……
三、保留答题痕迹
测试页面上保留答题痕迹,既是考生复查试卷的需要,也有利于考后的试卷分析,这是在线测试系统应该具备的基本功能。实现这一功能的基本思路是:在批量显示试题时就从试题表的考生答案字段中取值,并据此确定复选框的状态。
稍作分析可以知道,每道选题的答案都是一个长度不超过4的字符串(前提是每道题均有4个选项),只有先把它分解成单个字符,才能置相应选项前的复选框为已选择状态即checked。具体实现方法是,先把考生答案从数据库读入一维数组,然后再使用mid字符函数分解存储在一维数组中的字符串,并把它们转储到一个两维数组中,最后用if语句确定复选框的状态,这样就可使每道题的四个选项对应于数组的四个元素,整个过程如下图所示。
ACD A C D BD B D …… AD A D …… √ √ √ A选项内容 B选项内容 C选项内容 D选项内容 转为 决定 状态
一维数组 二维数组 复选框的状态
(图三 痕迹保留过程示意图)
对批量显示试题的代码修改后,得到如下程序:
<% '把学生答案存入数组
……
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
answer(i)=(rs(answer_name))
rs.movenext
loop
stsum=i
session("sum")=stsum
'把答案转入到一个两维数组中
for i=1 to stsum
k=len(answer(i))
if k>0 then
for j=1 to k
strda=mid(answer(i),j,1)
if strda="A" then
a(i,1)="A"
end if
if strda="B" then
a(i,2)="B"
end if
if strda="C" then
a(i,3)="C"
end if
if strda="D" then
a(i,4)="D"
end if
next
end if
next
……
%>
……
<%
'修改后的显示试题选项的代码
for j=1 to 4
selename="sele"&cstr(i)&cstr(j)
sele="sx"&cstr(j)
%>
<tr><td>
<% if a(i,j)=h(j) then %>
<input type="checkbox" name=<%=selename%> value=<%=h(j)%> checked> <%=rs(sele)%>
<% else %>
<input type="checkbox" name=<%=selename%> value=<%=h(j)%>> <%=rs(sele)%>
<% end if %>
</td></tr>
<% next
……
四、统计分析
与常规考试相比,在线测试的最大优点是可利用计算机强大的数据处理能力,对测试结果进行快速的统计分析,工作效率极高。试卷分析的重点,一是纵向的成绩统计,主要是计算考生成绩、班级平均分与及格率等,二是横向的试题分析,主要是计算每道题的得分率或正确率,这是老师们最想做又最难做到的事。
要进行试卷分析,需要定义两个一维数组,通过两重循环计算每道题答对的考生数和每个考生答对的试题数,有了这两组数据就可以很方便地进行考试结果进行统计和分析了,另外,用得分率来控制图像的宽度,还可以把横向的试题分析结果直观地显示在页面上。程序代码如下:
<%
……
strsql="select * from test where type="&type
set rs=db.execute(strsql)
i=0
do while not rs.eof
i=i+1
'最多有60个考生可同时在线测试
for j=1 to 60
'userans数组存储试题表中考生答案字段名
userans(j)="user"& cstr(j)
if rs("answer")=rs(userans(j)) then
'统计每道题答对的考生数
tj(i)=tj(i)+1
'统计每个考生答对的试题数
score(j)=score(j)+1
end if
next
rs.movenext
loop
……
for i=1 to stsum
'user_sum为参考考生总数,wid(i)为根据得分率计算出的试题图像宽度
wid(i)=tj(i)/use_sum*200
next
……
<!—显示试题分析图表-->
<table width="75%" border="1" align="center">
<tr>
<td><div align="center">题号</div></td>
<td><div align="center">正确率</div></td></tr>
<%
for i=1 to stsum
%>
<tr>
<td><div align="center"><%=i%></div></td>
<td><img src="image/tjimage.gif" width=<%=wid(i)%> height="10">
<%=wid(i)/2%>%
</td>
</tr>
<% next %>
</table>
……
以上是对ASP在线测试程序设计中四个主要问题的简要分析,在线测试需要解决的问题还有很多,如考生的注册登记、考生人数的统计、主观性试题的显示等等,通过自己的分析与思考都可以找到解决问题的方法。












评论列表