test.asp
<%
' 通过Session对象中的非对象变量Pass来判断是用户是否合法登陆,
' 如没有通过Login.asp进行用户名和口令验证则视为非法用户,将
' 用户引导到Login.asp进行验证
If Session("Pass"
<> 1 Then
Response.Redirect "Login.asp"
End If
s=10 ' 试卷题数
redim a(s, 5)
if not IsArray(Session("[脏话,已过滤]i"
) then
' 使用Connection对象打开数据库文件
Set objConn = Server.CreateObject("ADODB.Connection"
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("Exercise.mdb"
objConn.Open
' 建立Recordset对象并返回表Topic所有记录,每一条记录为一道考试题
strSQL = "SELECT * FROM Topic"
Set objRS = Server.CreateObject("ADODB.Recordset"
objRS.Open strSQL, objConn, 1, 1
zs=objRS.RecordCount
redim t(zs)
objRS.MoveFirst
for each j in t
j=0
next
' 随机抽取题号
Randomize timer
for j=1 to s
k=int(rnd*zs+1)
do while t(k)<>0
k=int(rnd*s+1)
loop
t(k)=1 ' 第k题被选中
next
j=1:i=1
' 循环选取数据集objRS中的部分记录存放到数组中
Do While Not objRS.Eof
if t(j)=1 then
a(i,1)=objRS("Question"
a(i,2)=objRS("A"
a(i,3)=objRS("B"
a(i,4)=objRS("C"
a(i,5)=objRS("D"
i=i+1
end if
j=j+1
objRS.MoveNext
Loop
b=a
For i=1 to s
redim f(4)
for each j in f
j=0
next
For k=1 to 4 ' 这个循环在数组f()中存放随机排列的1、2、3、4
j=Int(rnd*4+1)
Do While f(j)<>0
j=Int(rnd*4+1)
Loop
f(j)=k
if k=1 then f(0)=j ' f(0)中存放的是正确答案的序号
Next
a(i,0)=f(0) ' a(i,0)中存放的是正确答案的序号
For k=2 to 5 ' 重新调整选项顺序
a(i,k)=b(i,f(k-1)+1)
Next
Next
Session("[脏话,已过滤]i"
=a
end if
Session("no"
=1
%>
<HTML>
<HEAD><TITLE>网上考试</TITLE></HEAD>
<FRAMESET rows=125,*>
<FRAME src="Test1.asp">
<FRAME src="Test2.asp" name="Bottom">
</FRAMESET>
</HTML>
test1.asp
<%@ Language=VBScript%>
<HTML>
<HEAD><TITLE>考试答题页面</TITLE></HEAD>
<SCRIPT LANGUAGE=vbscript> ' 这里定义了一个显示剩余时间的子程序
Public m
Sub tick(k)
m=k-1
t1.value = TimeSerial(0,0,m)
if m =0 then exit sub
window.settimeout "tick(m)",1000 '设定Window对象执行函数tick()的定时间隔为1秒
End Sub
</SCRIPT>
</HEAD>
<!--定义Window对象的load事件(加载该网页时)执行函数tick(),
继而引发函数tick()中的window.setTimeout("tick();",1000)
语句,从而使网页能在1秒内刷新一次时间-->
<BODY onload =tick(10*10) bgcolor=LightYellow>
<Center><FONT size=6 face=方正舒体 color= blue>网 上 考 试</FONT><HR>
<FONT size=3 color= blue>考生编号:<%=Session("User"
%></FONT>
剩余时间:<INPUT type=text name=t1 size=10>
</BODY>
</HTML>
test2.asp
<%@ Language=VBScript%>
<HTML>
<HEAD><TITLE>考试答题页面</TITLE></HEAD>
<BODY bgcolor=LightYellow>
<%
s=2 ' 试卷题数
redim a(s, 5)
if not IsArray(Session("[脏话,已过滤]i"
) then
' 使用Connection对象打开数据库文件
Set objConn = Server.CreateObject("ADODB.Connection"
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("Exercise.mdb"
objConn.Open
' 建立Recordset对象并返回表Topic所有记录,每一条记录为一道考试题
strSQL = "SELECT * FROM Topic1"
Set objRS = Server.CreateObject("ADODB.Recordset"
objRS.Open strSQL, objConn, 1, 1
zs=objRS.RecordCount
redim t(zs)
objRS.MoveFirst
for each j in t
j=0
next
' 随机抽取题号
Randomize timer
for j=1 to s
k=int(rnd*zs+1)
do while t(k)<>0
k=int(rnd*s+1)
loop
t(k)=1 ' 第k题被选中
next
j=1:i=1
' 循环选取数据集objRS中的部分记录存放到数组中
Do While Not objRS.Eof
if t(j)=1 then
a(i,1)=objRS("Question"
a(i,2)=objRS("A"
a(i,3)=objRS("B"
a(i,4)=objRS("C"
a(i,5)=objRS("D"
i=i+1
end if
j=j+1
objRS.MoveNext
Loop
b=a
For i=1 to s
redim f(4)
for each j in f
j=0
next
For k=1 to 4 ' 这个循环在数组f()中存放随机排列的1、2、3、4
j=Int(rnd*4+1)
Do While f(j)<>0
j=Int(rnd*4+1)
Loop
f(j)=k
if k=1 then f(0)=j ' f(0)中存放的是正确答案的序号
Next
a(i,0)=f(0) ' a(i,0)中存放的是正确答案的序号
For k=2 to 5 ' 重新调整选项顺序
a(i,k)=b(i,f(k-1)+1)
Next
Next
Session("[脏话,已过滤]i"
=a
end if
' 用临时变量i递增来生成客户端表单中的输入变量Ans1,Ans2,...
for i=1 to s
%>
<FORM action=Result.asp method=post>
<TABLE border=0 cellPadding=1 cellSpacing=1 width=100% bordercolor="#0099FF">
<TR><TD> <%=i & "." & Session("[脏话,已过滤]i"
(i,1)%>
<TR bgcolor="#99CCFF">
<TD><INPUT name=Ans<%=i%> type=radio value="1" checked><%=Session("[脏话,已过滤]i"
(i,2)%>
<TR bgcolor="#CCCCFF">
<TD><INPUT name=Ans<%=i%> type=radio value="2"><%=Session("[脏话,已过滤]i"
(i,3)%>
<TR bgcolor="#99CCFF">
<TD><INPUT name=Ans<%=i%> type=radio value="3"><%=Session("[脏话,已过滤]i"
(i,4)%>
<TR bgcolor="#CCCCFF">
<TD><INPUT name=Ans<%=i%> type=radio value="4"><%=Session("[脏话,已过滤]i"
(i,5)%>
<TR><TD align=Right>
</TABLE>
<% next %>
<INPUT type=submit value=提交>
</FORM>
</BODY>
</HTML>
上面三个文件中要改的问题有以下几个:
1.如何改变题量就是出5题或3题时计算总分如何算?
2.到时间自动交圈的完成?
3.在同一台计算机上注册的人都是出的同一套题,能否让在同一台计算机上每次时入出不同的题?
4.考试的人如果是0分就还能再考能否改一下?
下面是评分
<%@ Language=VBScript %>
<%
'定义变量,对象
Dim Name, Score
Dim Correct, RSCount
Dim objConn, objRS, objRS1
' 通过Session对象获取用户名
Name = Session("User"
Correct = 0
RSCount = 0
If Session("Pass"
<> 1 Then
Response.Redirect "Login.asp"
End If
%>
<HTML>
<HEAD><TITLE>评分页面</TITLE></HEAD>
<BODY bgcolor=LightYellow>
<TABLE align=center>
<TR><TD>正确答案:
<%
s=UBound(Session("[脏话,已过滤]i"
)
' 给出正确答案并评分
' 循环将所有答案进行评分
For i=1 to s
Response.Write Session("[脏话,已过滤]i"
(i,0) & " "
f=Cint(Request.Form(i))
a=Session("[脏话,已过滤]i"
(i,0)
If f = a then
Correct = Correct + 1
End If
Next
' 输出成绩到客户端
Response.Write "<TR><TD>你的答案: "
Score = Int(Correct / s * 100)
For i = 1 To Request.Form.Count
Response.Write Cint(Request.Form(i)) & " "
Next
Response.Write "<P>你的成绩:" & score & " <B>"
If Score < 60 Then Response.Write "<FONT color=red>不及格!</FONT>"
If Score >= 60 And Score < 80 Then Response.Write "<FONT color=blue>及格</FONT>"
If Score >= 80 And Score <= 100 Then Response.Write "<FONT color=blue>优秀!</FONT>"
Response.Write "</B>"
' 记录成绩到数据库
' 使用Connection对象打开数据库文件
Set objConn = Server.CreateObject("ADODB.Connection"
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("Exercise.mdb"
objConn.Open
Set objRS = Server.CreateObject("ADODB.Recordset"
strSQL = "update Student set 成绩=" & score & " where 编号='" & name &"'"
objRS.Open strSQL, objConn, 1, 2
' 释放资源
objConn.Close
Set objRS = Nothing
Set objConn = Nothing
' 有些用户可能会通过浏览器的“返回”按钮回到Test.asp界面,将答案
' 修改后重新提交,因此增加如下逻辑判断是否已经提交过答案,这里的
' Session对象中的Pass变量是否为1代表用户在登陆考试系统后是否按过
' “提交”按钮,如果按过,在Result.asp的最后一条语句Session("Pass"
=0
' 会将Pass变量置0,以示本次测试结束
Session("Pass"
= 0
%>
<TR><TD height=40><A href="Login.asp" TARGET=_parent>返回首页</A>
</TABLE>
</BODY>
</HTML>