注册 登录
编程论坛 ASP技术论坛

[求助]现在用asp和access开发一个网上考试系统

liujun1314 发布于 2007-11-17 20:52, 1656 次点击
我现用asp和access开发一个网上考试系统,试题库里有上千条试题记录,我想在用户登陆以后从试题库里随机(难点:随机)调出100道题目,不知道大家有没有高效快捷的方法,主要是如何实现asp代码和sql。试题的id号不一定是连续的,可以实现吗?
网上有现成的代码下载吗或者是参考样本,程序流程呢,不胜感激。
要得非常急!
19 回复
#2
天涯听雨2007-11-17 20:59
select top 100 * from [Tb_News] order by NEWID()

随机出一百条记录 但不能进行翻页
#3
xiuit2007-11-17 21:01
如ID号不是边续的,是不是可以先把ID存成数组,再生成100个不同的随机数来提取数组中的ID值,再去提取数据库中的试题,
#4
liujun13142007-11-17 22:13
回复:(天涯听雨)select top 100 * from [Tb_News] ...

谢谢,但你那是选的前100条记录,不是随机吧,ORDER BY 是排序吧,NWEID()在这不能这样用吧

#5
liujun13142007-11-17 22:15
回复:(xiuit)如ID号不是边续的,是不是可以先把ID存...
可不可以那个例子来说或有源码来解说下啊,我知道这个思想可以吧,但不会呢,
#6
liujun13142007-11-17 22:18
各位兄弟姐妹帮哈撒!
#7
威龙嘉少2007-11-17 22:20
他后边用的是一个随即函数啊,记录是从随即函数里读出来的,不过要写这个函数才可以!
#8
liujun13142007-11-17 22:53
回复:(威龙嘉少)他后边用的是一个随即函数啊,记录...
什么函数啊?可以例说明吗
最好有源码研究哈?
#9
madpbpl2007-11-18 00:35
以下是引用天涯听雨在2007-11-17 20:59:23的发言:
select top 100 * from [Tb_News] order by NEWID()

随机出一百条记录 但不能进行翻页

这个写法是针对sql server数据库
如果是acc
用这个试试
select top 100 * from [Tb_News] order by rnd(id)

#10
hmhz2007-11-18 08:40
这样的随机是不行的,提取出来的虽然没有按顺序提取,也没有重复的,但每次刷新还是那样不变

他要的随机是每次刷新排序都变了,而且1000道题随机提取的中的每道题都照顾到,要不然会产生部分试题永远都没有显示的机会,而且每道题都不能有重复,也就是100道题是绝对唯一的随机数!
#11
liujun13142007-11-18 19:34
回复:(hmhz)这样的随机是不行的,提取出来的虽然没...

那要怎么去写呢,帮哈撒啊,谢谢!

#12
hmhz2007-11-18 21:34

这不是我写的,是我群里的Starry Sky帮你写的,叫我帮他优化的,你试试套用一下看看
[CODE]<%
'该方法得事先知道数据库里题目的总数,a(8)中的8为题目总数
dim n 'n是选取的题目的数量
n=3
set conn=server.CreateObject("adodb.connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("kaoshi.mdb")
set rs=server.CreateObject("adodb.recordset")
sqlstr="select id from test"
rs.open sqlstr,conn,1,1
if not rs.eof then
dim a(8),b(3),ansstr,cnt
cnt=rs.recordcount
ansstr=""
i=0
while not rs.eof
a(i)=rs("id")
i=i+1
rs.movenext
wend
rs.close
randomize()
for i=0 to n-1

c=(rnd()*cnt) mod cnt
if i>0 then
for k=0 to i-1
while b(k)=c
c=(rnd()*cnt) mod cnt
wend
next
end if
b(i)=c
sqlstr="select * from test where id ="& a(c)
rs.open sqlstr,conn,1,1
if not rs.eof then
response.write("问题:"&rs("question")&"&nbsp;&nbsp;A:"&rs("A")&"&nbsp;&nbsp;B:"&rs("B")&"&nbsp;&nbsp;C:"&rs("C")&"&nbsp;&nbsp;D:"&rs("D")&"<br>")
ansstr=ansstr&"|"&rs("ans")
end if
rs.close
next
response.Cookies("answer")=ansstr
'用户答题后,把用户的答案跟cookie中的答案比较,计算出得分,然后再把得分存回数据库
else
response.write("你选的题目数量大于数据库里的题目总数!")
end if
set rs=nothing
conn.close
set conn=nothing
%>[/CODE]

#13
liujun13142007-11-19 08:43
回复:(hmhz)这不是我写的,是我群里的Starry Sky帮...

谢谢!我昨天知道了,
但 ansstr=ansstr&"|"&rs("ans")
不知道什么意思了!

#14
hmhz2007-11-19 09:12

这个是把内容保存到cookie里,然后使用数组读出

[此贴子已经被作者于2007-11-19 9:15:07编辑过]

#15
liujun13142007-11-19 09:18
回复:(hmhz)这不是我写的,是我群里的Starry Sky帮...
不用开始就知道总题吧,可以用rs.recordcount得到啊,
#16
Kettyjin19832007-11-19 14:26

我这里有随即产生考试试题的代码,我研究了很久,有那么一点懂了。
Dim num(),k,i,x,j,ans()
redim num (totalq)
redim ans (totalq)

k = 1
Randomize

For i = 1 To totalq
x = Round(Rnd * totalrec)
'totalrec指的是随即产生多少道替
For j = 1 To k
If num(j) = x Then
i = i - 1
Exit For
End If
Next
If j > k Then
num(k) = x
k = k + 1
End If
Next

#17
关小彤2007-11-19 16:04
我的是用随机函数实现的随即抽题

<%sql="select * from "&papername&" where type='单项选择'"
danxuan=""
tihao1=""
set rs1=conn.execute(sql)
dim i
i=0
do while not rs1.eof
i=i+1
rs1.movenext
loop
count=i '得到单选题总数
randomize
for i=1 to singlecount
temp=int(count*rnd) '对生成随机数进行处理
sql="select * from "&papername&" where type='单项选择'"
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,3,2
rs.move temp%>

[此贴子已经被作者于2007-11-19 16:06:27编辑过]

#18
liujun13142007-11-20 08:37
回复:(hmhz)这不是我写的,是我群里的Starry Sky帮...
这个随机选题有重复的,!黑马!
#19
liujun13142007-11-20 08:38
回复:(Kettyjin1983)我这里有随即产生考试试题的代...
谢谢, !我好好研究哈!
#20
Kettyjin19832007-11-20 14:23

回复:(hmhz)这不是我写的,是我群里的Starry Sky帮...
<%
'该方法得事先知道数据库里题目的总数,a(8)中的8为题目总数
dim n 'n是选取的题目的数量
n=3
set conn=server.CreateObject("adodb.connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("kaoshi.mdb")
set rs=server.CreateObject("adodb.recordset")
sqlstr="select id from test"
rs.open sqlstr,conn,1,1
if not rs.eof then
dim a(8),b(3),ansstr,cnt
cnt=rs.recordcount
ansstr=""
i=0
while not rs.eof
a(i)=rs("id")
i=i+1
rs.movenext
wend
rs.close
randomize()
for i=0 to n-1

c=(rnd()*cnt) mod cnt
if i>0 then
for k=0 to i-1
while b(k)=c
c=(rnd()*cnt) mod cnt
wend
i =i+1'个人觉得加这么一句应该不会有重复了吧。
next
end if
b(i)=c
sqlstr="select * from test where id ="& a(c)
rs.open sqlstr,conn,1,1
if not rs.eof then
response.write("问题:"&rs("question")&"&nbsp;&nbsp;A:"&rs("A")&"&nbsp;&nbsp;B:"&rs("B")&"&nbsp;&nbsp;C:"&rs("C")&"&nbsp;&nbsp;D:"&rs("D")&"<br>")
ansstr=ansstr&"|"&rs("ans")
end if
rs.close
next
response.Cookies("answer")=ansstr
'用户答题后,把用户的答案跟cookie中的答案比较,计算出得分,然后再把得分存回数据库
else
response.write("你选的题目数量大于数据库里的题目总数!")
end if
set rs=nothing
conn.close
set conn=nothing
%>

1