现在位置:主页>教学资源> 文章内容

ASP在线测试程序设计的主要问题及实现方法

收藏发布更新日期:2008-10-23 点击:

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字段的值命名考生答案字段(即图一中的user1user2、……字段),这样就可以在考生登陆考试时获取

 

 

 


(图二  考生信息表结构)

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在线测试程序设计中四个主要问题的简要分析,在线测试需要解决的问题还有很多,如考生的注册登记、考生人数的统计、主观性试题的显示等等,通过自己的分析与思考都可以找到解决问题的方法。



所有评论

评论列表

用户名: 新注册) 密码: 匿名评论