上机考试系统课程设计报告
一.系统开发背景
计算机上机考试是指通过计算机实现对知识的考核,包括理论知识和上机实际操作技能的考核。与传统的考试相比,它最大限度排除了人为因素的作用,保证了考试的客观性;考生在考试之后,一般就能够得到成绩,使考试具有实时性;而且通过计算机评分,标准一致,具有最佳的可靠性。
现代信息社会中,计算机已经渗透到各行各业,计算机上机考试的范围相信还将继续扩大。著名的TOFEL 考试也采用了计算机上机考试的方式就是一个很好的证明。
二.系统设计
管理系统开发的起点是系统设计,这也是整个系统开发过程中最关键的一步,它决定了开发的成败。系统设计主要包括系统功能分析、系统模块设计以及开发与运行环境的选择等任务。 (一) 系统功能分析
1.考试的前期工作(服务器端管理程序)
考试的前期工作由管理员负责实现。具体来说,至少有两项工作:
(1)题库文件的生成、编辑与维护。一个题量充分且经过精心组织的题库是整个系统的基础,也决定了系统可能考试的题目类型,一般来说,题库包含考试的全部考题以及相应的标准答案。题库的编辑维护是整个上机考试中工作量最大、任务最艰巨的工作。
(2)考生信息的确认。即考生的合法性验证,确定考生的考试资格,一般将考生信息存放在一个考生表中。
2.考试过程中的工作(客户端管理程序) 在考生考试过程中,主要经过以下几步:
(1)考生开始考试时,首先输入自己的相关信息,经与管理员的考生信息文件对照无误后,才可以进入系统。
(2)生成试卷可以在考生调题过程中随机生成,试题生成过程中要用到题库文件。有时为了节省考生等待时间,也可以由管理员在确认考生信息后生成。每个考生生成的试卷通常有一个或多个文件保存。
(3)考生在经过合法登录、调题后,在给定的考试界面下调用试题的有关文件答题。这时通常有时间限定。
(4)考生在答题过程中,由于误操作非正常退出考试系统,或计算机突然掉电,系统应及时将考生所答题目进行保护。当考生再次进入考试系统后,应在上次答题的基础上继续答题,也就是实现考试的二次登录。
(5)评分系统对考生所做的考题进行评判,评分的结果至关重要。从这种意义上说,评分算法是整个考试系统成败的关键所在,是整个上机考试系统的核心。评分系统牵涉面非常广,可能涉及所有文件。评分的依据是考生的答题信息,评分的结果将记入相关文件。本系统是将学生的成绩写入到学生信息文件中。
(6)最后,对成绩进行汇总处理后,可以实时或批量输出考生的成绩。 (二)系统模块设计
根据系统功能分析和计算机上机考试系统的特点,将系统功能模块设计如图1所示。
图1 上机考试系统的功能模块结构图
注意:由于篇幅受限,本章主要讲述考试系统(客户端管理程序)的设计与开发,关于系统管理模块(服务器端管理程序),读者可自行开发。 (三) 开发与运行环境的选择
开发与运行环境的选择会影响到数据库设计,本例的计算机上机考试系统开发与运行环境选择如下:
开发环境:Windows98/2000/XP 开发工具:Visual Basic 6.0
数据库管理系统:SQL Server 2000
数据库服务器:SQL Server 2000桌面引擎 (四)系统实现过程分析
在实现过程中,首先需要根据系统功能分析设计出需要的数据库,包括各个数据表和数据表关系图的详细结构。
在实现各个功能模块时,应采用先模块后系统集成的方式,即各个系统功能模块分别独立设计和调试,在创建系统主窗体时才将各个功能模块通过主窗体集成到一起,最后进行系统整体设计和调试。
三.数据库的设计
在SQL SERVER企业管理器中,创建一个数据库SJKS ,数据库中包括以下几个表: 1.Admin 表
该表用于存放管理员的用户信息,表结构如表2所示。每个用户都有惟一的用户名。
表2 Adnim表(管理员信息)表结构
2.Student 表
该表用于存放考生的相关信息,表结构如表3所示。每个学生的学号是惟一的。为了考生便于登录,每个考生的口令与他的学号统一。考生考试完毕,系统会将该考生的考试成绩及考试时间写入到Score 字段和etime 字段中。
表3 Student表(考生信息) 表结构
3.Choose 表
该表用于存放选择题,表结构如表4所示。每道选择题的惟一标识是ID 号。
表4 Choose表(选择题)表结构
4.Fillblank 表
该表用于存放填空题,表结构如表5所示。每道填空题的惟一标识也是ID 号。
表5 Fillblank表(填空题)表结构
5.Sysdata 表
该表用于存放考试系统中的系统参数,包括试题科目、该科目的选择题题量、填空题题量、选择题分值、填空题分值、该科目的考试时间等信息。该表的内容由系统管理员进行设置,该表对考生来说是透明的。
表6 Sysdata表(系统参数)表结构
6.Relogin 表
该表用于存放已经登录的考生信息,表结构如表7所示。该表的作用主要是记录考生是否是二次登录。
表7 Relogin表(二次登录信息)表结构 7.该表用于存放考生的试题答案,表结构如表8所示。该表只是一个模板,在系统中只用它的结构。
表8 Studdata表(考生答题信息)表结构
四.系统实现
本系统对应的工程文件为sjks.vbp ,它包含的所有文件如图2所示。
图2 上机考试系统工程文件
下面介绍工程中各组成部分的实现方法。对于窗体,给出执行功能、设计或运行界面、主要对象的属性和方法。
在该工程中,引用了一些ActiveX 控件等,在设计时选择“工程”菜单中的“引用”选项,从引用列表中选中如下选项:
Visual Basic For Applications
Visual Basic runtime objects and procedures Visual Basic Objects and procedures OLE Automation
Microsoft ActiveX Data Object 2.5 Library
再选择“工程”菜单中的“部件”选项,从控件列表中选中如下选项: Microsoft Windows Common Controls 6.0(SP4) (一)sjks.bas 公共模块
本工程包含一个公共模块sjks.Bas ,其中包含了一些全局变量和过程(被本工程的其他窗体调用),代码如下:
Public cs As Connection
Public rsc, rsstud, rslogin As Recordset
Public ssno As String '当前登录考生的学号 public ssname As String ‘当前登录考生的姓名 public sclass As String '当前登录考生的班级 public skskm As String '当前考试科目的名称 Public cfzh As Integer '选择题的分值 public ffzh As Integer '填空题的分值 public ctl As Integer '选择题的数量 public ftl As Integer '填空题的数量
Public tt As Integer '记录当前考试所用的实际时间 public rett As Integer ‘记录考生二次登录时已用时间
public examtime As Integer '当前登录考生的考试时间(系统规定)
Public Sub turntab(key) ‘利用回车键代替TAB 键 If key = 13 Then SendKeys "{tab}" End If End Sub (二)Welcome 窗体
Welcome 窗体及各控件的属性设置同第11.1.1节相似,在此不再详述。
该窗体是本工程的启动窗体。Welcome 界面卸载后,先显示主界面,再显示登录界面,登录界面采用模式方式显示,即显示在最前面,若考生的身份验证未通过,将不能进入系统。 (三)Login 窗体
Login 窗体实现对考生的身份验证及考试科目的选择。判断考生是否为合法考生。如果是合法考生,则释放该窗体,然后进行抽题,否则,不能进入考试系统。如图3所示。窗体中包含的主要对象及其属性如表9所示。
图3 考生登录界面
表9 考生登录界面各控件的属性设置值
Dim n As Integer ‘记录考生登录的次数 Private Sub Form_Load() Set cs = New Connection
cs.Open "dsn=sjks;uid=sa;pwd=;" ‘与SJKS 数据库建立联系 n = 0
Text1.Text = "" Text2.Text = ""
Dim rskm As Recordset Set rskm = New Recordset
rskm.Open "select * from sysdata", cs, adOpenKeyset,
adLockOptimistic
If rskm.RecordCount > 0 Then ‘填充组合框 Do While Not rskm.EOF
Combo1.AddItem rskm.Fields("考试科目") rskm.MoveNext Loop
Combo1.Text = Combo1.List(0) End If
Set rskm = Nothing End Sub
Private Sub Command1_Click()
Dim sqls As String n = n + 1
If n
Dim rsuser As Recordset Set rsuser = New Recordset
sqls = "select * from student where sno='" _ & Trim(Text1.Text) & "' and password='" _ & Trim(Text2.Text) & "'"
rsuser.Open sqls, cs, adOpenKeyset, adLockOptimistic If rsuser.RecordCount = 0 Then If n = 3 Then
MsgBox "对不起,您无权访问该系统!", 48, "操作提示" Unload Me End End If
MsgBox "输入的学号或口令错,请重新输入!", 32, "操作提示" Text1.Text = "" Text2.Text = "" Text1.SetFocus Exit Sub Else
ssno = rsuser("sno") '取出该考生的学号
ssname = rsuser("sname") '取出该考生的姓名 sclass = rsuser("class") '取出该考生的班级 skskm = Combo1.Text '取出该考生的考试科目 Dim ss As String
ss = "考生信息:" + Chr(13) + Chr(10)
ss = ss + "学号:" + ssno + Chr(13) + Chr(10) ss = ss + "姓名:" + ssname + Chr(13) + Chr(10) ss = ss + "班级:" + sclass + Chr(13) + Chr(10) ss = ss + "考试科目:" + skskm + Chr(13) + Chr(10) ss = ss + "身份验证正确吗(是/否) ?"
yn = MsgBox(ss, 4 + 32 + 256, "操作提示") If yn = VbNo Then Unload Me End End If Unload Me
chti.Show 1 ‘开始进行抽题 End If
Set rsuser = Nothing End If End Sub
Private Sub Command2_Click() Unload Me End End Sub
Private Sub Form_KeyPress(KeyAscii As Integer) turntab (KeyAscii) End Sub
(四) Chti 窗体(抽题界面)
当考生正确登录后,马上进行试题的抽取,即生成考生的试题。在抽取试题时,要做到随机抽取。窗体的的设计如图4所示,窗体中各主要对象及其属性设置如表10所示。
图4 抽题界面
表10 抽题界面各控件的属性设置值
抽题界面的程序代码如下:
Private Sub Timer1_Timer() Dim temp As Recordset Dim rstemp As Recordset Set rstemp = New Recordset
rstemp.Open "select * from sysdata where 考试科目='" & skskm & "'", cs, adOpenKeyset, adLockReadOnly
cfzh = rstemp("选择题分值")
ffzh = rstemp("填空题分值") ctl = rstemp("选择题数量") ftl = rstemp("填空题数量") examtime = rstemp("考试时间") Set rslogin = New Recordset
' 判断该用户是否登录过,且非正常退出。
rslogin.Open "select * from relogin where sno='" & ssno & "'", cs, adOpenKeyset, adLockOptimistic
If rslogin.RecordCount = 0 Then '不是二次登录 Dim sqls1, sqls2 As String
sqls1 = "select * into c" & ssno & " from choose" sqls2 = "delete from c" & ssno
cs.Execute sqls1 '复制choose 表内容
cs.Execute sqls2 '删除表中记录, 形成一个空表
sqls1 = "select * into f" & ssno & " from fillblank" sqls2 = "delete from f" & ssno
cs.Execute sqls1 '复制fillblank 表内容 cs.Execute sqls2 '删除表中记录, 形成一个空表
sqls1 = "select * into s" & ssno & " from studdata" sqls2 = "delete from s" & ssno
cs.Execute sqls1 '生成学生答题库
cs.Execute sqls2 '删除表中记录, 形成一个空表
sqls1 = "insert into relogin values('" & ssno & "'," &0& ")" cs.Execute sqls1 '将考生信息在RELOGIN 表中登记 Set rslogin = New Recordset
rslogin.Open "select * from relogin where sno='" & ssno & "'", cs, adOpenKeyset, adLockOptimistic
' 从选择题库中抽取题
Set rstemp = New Recordset
rstemp.Open "select * from choose where subject='" & skskm & "'", cs, adOpenKeyset, adLockReadOnly '选择题表
Set rsc = New Recordset
rsc.Open "c" & ssno, cs, adOpenKeyset, adLockOptimistic '选择题答题表
Set rsstud = New Recordset
rsstud.Open "s" & ssno, cs, adOpenKeyset, adLockOptimistic '学生答题表
i = 1
Do While i
idtemp = Int(Rnd * rstemp.RecordCount + 1)
'temp 表用于判断选择题答题表中是否已存在生成的随机题号
Set temp = New Recordset temp.Open "select * from c" & ssno & " where id=" & idtemp, cs, adOpenKeyset, adLockOptimistic
If temp.RecordCount = 0 Then ' 若没有,则开始抽题
rstemp.MoveFirst
rstemp.Find "ID=" & idtemp '到选择题库中查找抽到的题 If rstemp.EOF = False Then
'选择题库中添加试题 rsc.AddNew
rsc("id") = rstemp("id")
rsc("subject") = rstemp("subject") rsc("content") = rstemp("content") rsc("optiona") = rstemp("optiona") rsc("optionb") = rstemp("optionb") rsc("optionc") = rstemp("optionc") rsc("optiond") = rstemp("optiond") rsc("answer") = rstemp("answer") rsc.Update '往学生答题表添加记录 rsstud.AddNew rsstud("id") = i
rsstud("tx") = "选择题" rsstud("fzh") = cfzh
rsstud("answer") = rstemp("answer") rsstud("gmark") = 0 rsstud.Update i = i + 1 End If End If Loop
'对抽出的选择题重新设置题号 i = 1
Set rsc = New Recordset
rsc.Open "c" & ssno, cs, adOpenKeyset, adLockOptimistic Do While Not rsc.EOF rsc("id") = i
rsc.update rsc.MoveNext i = i + 1 Loop
'抽取填空题
Set rstemp = New Recordset rstemp.Open "select * from fillblank where subject='" & skskm & "'", cs, adOpenKeyset, adLockReadOnly
Set rsc = New Recordset
rsc.Open "f" & ssno, cs, adOpenKeyset, adLockOptimistic i = 1
Do While i
idtemp = Int(Rnd * rstemp.RecordCount + 1) Set temp = New Recordset
temp.Open "select * from f" & ssno & " where id=" & idtemp, cs, adOpenKeyset, adLockOptimistic
If temp.RecordCount = 0 Then rstemp.MoveFirst
rstemp.Find "ID=" & idtemp If rstemp.EOF = False Then
'填空题库中添加试题 rsc.AddNew
rsc("id") = rstemp("id")
rsc("subject") = rstemp("subject") rsc("content") = rstemp("content") rsc("answer") = rstemp("answer") rsc.Update '往学生答题表添加记录 rsstud.AddNew rsstud("id") = i
rsstud("tx") = "填空题" rsstud("fzh") = ffzh
rsstud("answer") = rstemp("answer") rsstud("gmark") = 0 rsstud.Update i = i + 1 End If End If
Loop
'对抽出的填空题重新设置题号 i = 1
Set rsc = New Recordset
rsc.Open "f" & ssno, cs, adOpenKeyset, adLockOptimistic Do While Not rsc.EOF rsc("id") = i rsc.update rsc.MoveNext i = i + 1 Loop
Set rsstud = New Recordset
rsstud.Open "select * from s" & ssno & " order by tx,id", cs, adOpenKeyset, adLockOptimistic
tt = examtime * 60 'tt存放学生考试所需的时间 Else
MsgBox "你是二次登录,请继续完成上次所抽的试题!" rett = rslogin("etime")
tt = examtime * 60 - rett ' 从relogin 表中取出学生已经用过的时间,并求出还剩多少时间
End If
Set temp = Nothing Set rstemp = Nothing Unload Me sm.Show 1 End Sub (五)Sm 窗体(说明界面)
当系统抽完题后,显示考试说明界面,说明界面的显示如图5和图6所示,单击“开始考试并计时”按钮,该窗体被释放,主界面可用,考生开始考试。窗体中各控件的属性设置如表11所示。
图5 说明界面(初次登录) 图6 说明界面(二次登录)
表11 说明界面各控件的属性设置值
说明界面的程序代码如下:
Private Sub Command1_Click() Unload Me
MDImain.Command1.Enabled = True MDImain.Command2.Enabled = True MDImain.Command3.Enabled = True MDImain.Command4.Visible = True
MDImain.Caption = MDImain.Caption + Space(40) + "考生学号:
" & ssno & Space(10) & "姓名:" & ssname & " 班级:" & sclass
MDImain.Timer1.Interval = 60000 '每分钟触发一次 MDImain.Timer1.Enabled = True '计时器开始工作
MDImain.Command4.Caption = "考试时间还剩: " & Int(tt / 60) &
" 分钟"
End Sub
Private Sub Form_Activate()
Text1.BackColor = Command1.BackColor
Call sm '显示考生须知 End Sub
Sub sm() '显示考生须知 Dim ss As String
ss = "考生须知:(请考生仔细阅读)" + vbCrLf
ss = ss + "上机考试共分为两大部分:选择题和填空题。" + vbCrLf
ss = ss + "考试时间为" & examtime & "分钟,你还剩" & Int(tt / 60) & "分钟。" + vbCrLf
ss = ss + "请单击“开始考试并计时”按钮开始考试。" + vbCrLf ss = ss + "并且开始计时。" + Chr(13) + Chr(10) ss = ss + "准备好后开始考试!" + Chr(13) + Chr(10) Text1.Text = ssEnd Sub (六)主界面(MDImain 窗体)
当单击说明界面的“开始考试并计时”按钮后,MDImain 窗体可用,该窗体是一个多文档窗体, 其运行界面如图7所示,单击“选择题”按钮时,开始做选择题;单击“填空题”按钮时,开始做填空题。如果考试时间到,则“选择题”按钮和“填空题”按钮均不可用,只有“交卷”按钮可用。窗体中包含的主要对象及其属性如表12所示。
图7 主界面
表12 主界面各控件的属性设置值
状态栏中各窗格的属性设置如表13所示。
表13 状态栏中各窗格的主要属性设置
主界面的程序代码为:
Private Sub Command1_Click() ‘选择题 cexam.Show 1 End Sub
Private Sub Command2_Click() ‘填空题 fexam.Show 1 End Sub
Private Sub Command3_Click()
Dim cscore, fscore, sumscore, tt1 As Integer tt1 = examtime - tt If tt > 4 Then
aa = MsgBox("注意:交卷后将不能再继续答题,交卷吗?", _ vbYesNo + 32, "警告") If aa = 7 Then Exit Sub End If End If
cscore = 0 fscore = 0 sumscore = 0
Set rsstud = New Recordset
rsstud.Open "s" & ssno, cs, adOpenKeyset, adLockOptimistic
Do While Not rsstud.EOF
If tx = "选择题" Then
If rsstud("answer") = rsstud("studanswer") Then rsstud("gmark") = cfzh End If
cscore =cscore + rsstud("gmark")
Else '填空题中存在多个标准答案的情况
If InStr(rsstud("answer"), rsstud("studanswer")) 0 Then
rsstud("gmark") = ffzh End If
fscore = fscore + rsstud("gmark") End If
rsstud.MoveNext Loop
Dim temp As Recordset Set temp = New Recordset
temp.Open "select * from student where sno='" & ssno & _ "'", cs, adOpenKeyset, adLockOptimistic temp("time") = examtime * 60 - tt temp("score") = cscore + fscore temp.Update
MsgBox "你的考试成绩为:" & temp("score") & "分" cs.Execute "drop table c" & ssno cs.Execute "drop table f" & ssno cs.Execute "drop table s" & ssno
cs.Execute "delete from relogin where sno='" & ssno & "'" Set temp = Nothing Set rsc = Nothing Set rsstud = Nothing Set rslogin = Nothing cs.Close Unload Me welcome.Show End Sub
Private Sub MDIForm_Load() Command1.Enabled = False
Command2.Enabled = False Command3.Enabled = False
MDImain.Command4.Visible = False End Sub
Private Sub Timer1_Timer() tt = tt - 60
rett = examtime * 60 - tt rslogin("etime") = rett rslogin.Update
Command4.Caption = "考试时间还剩: " & Int(tt / 60) & " 分钟" If tt = 5 * 60 Then
MsgBox "考试时间还剩5分钟," + Chr(13) + Chr(10) + "请抓紧时间!", 48, "操作提示"
End If
If tt = 0 Then
Timer1.Enabled = False
MsgBox "时间到,请交卷!" Command1.Enabled = False Command2.Enabled = False Command4.Visible = False Unload cexam '卸载选择题答题窗体 Unload fexam '卸载填空题答题窗体 End If End Sub
(七)Cexam 窗体(选择(单选)题答题界面)
Cexam 窗体的运行界面如图8所示。该界面用四个单选按钮显示每道题的四个选项,考生可单击某个单选按钮来确定该选择题的答案。当某选择题已经做过,再显示此题时,题号的颜色由默认的黑色变成红色,表示该题已经做过,同时,利用四个命令按钮可实现选择题的浏览。填空题也是如此。Cexam 窗体中各对象的属性设置如表14所示。
图8 选择题界面
表14 选择题界面各控件的属性设置值
选择题界面的程序代码如下:
Private Sub Command1_Click() rsc.MoveFirst Call disp Call loca
Command1.Enabled = False Command2.Enabled = False Command3.Enabled = True Command4.Enabled = True End Sub
Private Sub Command2_Click() rsc.MovePrevious If rsc.BOF Then rsc.MoveFirst
Command1.Enabled = False Command2.Enabled = False End If Call disp Call loca
Command3.Enabled = True Command4.Enabled = True End Sub
Private Sub Command3_Click() rsc.MoveNext If rsc.EOF Then rsc.MoveLast
Command3.Enabled = False Command4.Enabled = False End If Call disp Call loca
Command1.Enabled = True Command2.Enabled = True End Sub
Private Sub Command4_Click() rsc.MoveLast
Call disp Call loca
Command1.Enabled = True Command2.Enabled = True Command3.Enabled = False Command4.Enabled = False End Sub
Private Sub Command5_Click() cexam.Hide End Sub
Private Sub Form_Activate() Set rsc = New Recordset
rsc.Open "c" & ssno, cs, adOpenKeyset, adLockOptimistic Label3.Caption = rsc.Fields("id") Call disp Call loca End Sub
Private Sub Form_Load()
Text1.BackColor = cexam.BackColor End Sub
Private Sub Option1_Click() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = "A" rsstud.Update End Sub
Private Sub Option2_Click() Set rsstud = New Recordset
rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic
If rsstud.EOF = False Then rsstud("studanswer") = "B" rsstud.Update
End Sub
Private Sub Option3_Click() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = "C" rsstud.Update End Sub
Private Sub Option4_Click() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = "D" rsstud.Update End Sub
Public Sub loca() ‘该过程用于判断当前题是否做过 Label3.Caption = rsc("id") Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic Select Case rsstud("studanswer") Case "A"
Option1.Value = True
Label3.ForeColor = RGB(255, 0, 0) Case "B"
Label3.ForeColor = RGB(255, 0, 0) Option2.Value = True Case "C"
Label3.ForeColor = RGB(255, 0, 0) Option3.Value = True Case "D"
Label3.ForeColor = RGB(255, 0, 0) Option4.Value = True Case Else
Label3.ForeColor = RGB(0, 0, 0) Option1.Value = False
Option2.Value = False Option3.Value = False Option4.Value = False End Select End Sub
Sub disp()去时 ‘当指针移动时,该过程使窗体中的控件内容与表中一致 Text1.Text = rsc("content")
Label1(0).Caption = rsc("optiona") Label1(1).Caption = rsc("optionb") Label1(2).Caption = rsc("optionc") Label1(3).Caption = rsc("optiond") End Sub
(八) Fexam 窗体(填空题界面)
Fexam 窗体用于考生做填空题,该窗体的运行界面如图9所示。考生将答案填写在文本框中,还可实现试题的浏览。窗体中各对象的属性设置值如表15所示。
图9 填空题界面
表15 填空题界面各控件的属性设置值
填空题界面的程序代码如下:
Private Sub Command1_Click() rsc.MoveFirst Call disp Call loca
Command1.Enabled = False Command2.Enabled = False Command3.Enabled = True Command4.Enabled = True Text2.SetFocus End Sub
Private Sub Command2_Click() rsc.MovePrevious If rsc.BOF Then rsc.MoveFirst
Command1.Enabled = False Command2.Enabled = False End If Call disp Call loca
Command3.Enabled = True Command4.Enabled = True Text2.SetFocus End Sub
Private Sub Command3_Click()
rsc.MoveNext If rsc.EOF Then rsc.MoveLast
Command3.Enabled = False Command4.Enabled = False End If Call disp Call loca
Command1.Enabled = True Command2.Enabled = True Text2.SetFocus End Sub
Private Sub Command4_Click() rsc.MoveLast Call disp Call loca
Command1.Enabled = True Command2.Enabled = True Command3.Enabled = False Command4.Enabled = False Text2.SetFocus End Sub
Private Sub Command5_Click() fexam.Hide End Sub
Private Sub Form_Activate() Set rsc = New Recordset
rsc.Open "f" & ssno, cs, adOpenKeyset, adLockOptimistic Label3.Caption = rsc.Fields("id") Call disp Call loca End Sub
Private Sub Form_Load()
Text1.BackColor = fexam.BackColor
End Sub
Private Sub text2_LostFocus() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='填空题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = Trim(Text2) rsstud.Update End Sub
Public Sub loca()
Label3.Caption = rsc("id") Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='填空题'", cs, adOpenKeyset, adLockOptimistic If rsstud("studanswer") "" Then Label3.ForeColor = RGB(255, 0, 0) Text2 = rsstud("studanswer") Else
Label3.ForeColor = RGB(0, 0, 0) Text2 = "" End If End Sub
Sub disp()
Text1.Text = rsc("content") End Sub
五.系统运行
将本系统联编成Sjks.exe 文件,可以脱离VB 系统单独运行。运行Sjks.exe ,出现如图10所示的界面,等待20秒或单击窗体的任意位置,进入考生登录界面,如图11所示。考生输入学号及口令,选择要考试的科目,单击“确定”按钮,显示考生信息,如图12所示。如果该考生是二次登录,系统会显示提示信息,如图13所示。考生的答题界面与13.4节中图8和图9一样,在此不现详述。
当考生答完题或时间到时,单击“交卷”按钮,系统会显示该考生的考试成绩,如图14和图15所示。
图10 启动界面
图11 登录界面
图12 考生信息提示 图13 二次登录提示
图14 交卷提示 图15 显示考生成绩
上机考试系统课程设计报告
一.系统开发背景
计算机上机考试是指通过计算机实现对知识的考核,包括理论知识和上机实际操作技能的考核。与传统的考试相比,它最大限度排除了人为因素的作用,保证了考试的客观性;考生在考试之后,一般就能够得到成绩,使考试具有实时性;而且通过计算机评分,标准一致,具有最佳的可靠性。
现代信息社会中,计算机已经渗透到各行各业,计算机上机考试的范围相信还将继续扩大。著名的TOFEL 考试也采用了计算机上机考试的方式就是一个很好的证明。
二.系统设计
管理系统开发的起点是系统设计,这也是整个系统开发过程中最关键的一步,它决定了开发的成败。系统设计主要包括系统功能分析、系统模块设计以及开发与运行环境的选择等任务。 (一) 系统功能分析
1.考试的前期工作(服务器端管理程序)
考试的前期工作由管理员负责实现。具体来说,至少有两项工作:
(1)题库文件的生成、编辑与维护。一个题量充分且经过精心组织的题库是整个系统的基础,也决定了系统可能考试的题目类型,一般来说,题库包含考试的全部考题以及相应的标准答案。题库的编辑维护是整个上机考试中工作量最大、任务最艰巨的工作。
(2)考生信息的确认。即考生的合法性验证,确定考生的考试资格,一般将考生信息存放在一个考生表中。
2.考试过程中的工作(客户端管理程序) 在考生考试过程中,主要经过以下几步:
(1)考生开始考试时,首先输入自己的相关信息,经与管理员的考生信息文件对照无误后,才可以进入系统。
(2)生成试卷可以在考生调题过程中随机生成,试题生成过程中要用到题库文件。有时为了节省考生等待时间,也可以由管理员在确认考生信息后生成。每个考生生成的试卷通常有一个或多个文件保存。
(3)考生在经过合法登录、调题后,在给定的考试界面下调用试题的有关文件答题。这时通常有时间限定。
(4)考生在答题过程中,由于误操作非正常退出考试系统,或计算机突然掉电,系统应及时将考生所答题目进行保护。当考生再次进入考试系统后,应在上次答题的基础上继续答题,也就是实现考试的二次登录。
(5)评分系统对考生所做的考题进行评判,评分的结果至关重要。从这种意义上说,评分算法是整个考试系统成败的关键所在,是整个上机考试系统的核心。评分系统牵涉面非常广,可能涉及所有文件。评分的依据是考生的答题信息,评分的结果将记入相关文件。本系统是将学生的成绩写入到学生信息文件中。
(6)最后,对成绩进行汇总处理后,可以实时或批量输出考生的成绩。 (二)系统模块设计
根据系统功能分析和计算机上机考试系统的特点,将系统功能模块设计如图1所示。
图1 上机考试系统的功能模块结构图
注意:由于篇幅受限,本章主要讲述考试系统(客户端管理程序)的设计与开发,关于系统管理模块(服务器端管理程序),读者可自行开发。 (三) 开发与运行环境的选择
开发与运行环境的选择会影响到数据库设计,本例的计算机上机考试系统开发与运行环境选择如下:
开发环境:Windows98/2000/XP 开发工具:Visual Basic 6.0
数据库管理系统:SQL Server 2000
数据库服务器:SQL Server 2000桌面引擎 (四)系统实现过程分析
在实现过程中,首先需要根据系统功能分析设计出需要的数据库,包括各个数据表和数据表关系图的详细结构。
在实现各个功能模块时,应采用先模块后系统集成的方式,即各个系统功能模块分别独立设计和调试,在创建系统主窗体时才将各个功能模块通过主窗体集成到一起,最后进行系统整体设计和调试。
三.数据库的设计
在SQL SERVER企业管理器中,创建一个数据库SJKS ,数据库中包括以下几个表: 1.Admin 表
该表用于存放管理员的用户信息,表结构如表2所示。每个用户都有惟一的用户名。
表2 Adnim表(管理员信息)表结构
2.Student 表
该表用于存放考生的相关信息,表结构如表3所示。每个学生的学号是惟一的。为了考生便于登录,每个考生的口令与他的学号统一。考生考试完毕,系统会将该考生的考试成绩及考试时间写入到Score 字段和etime 字段中。
表3 Student表(考生信息) 表结构
3.Choose 表
该表用于存放选择题,表结构如表4所示。每道选择题的惟一标识是ID 号。
表4 Choose表(选择题)表结构
4.Fillblank 表
该表用于存放填空题,表结构如表5所示。每道填空题的惟一标识也是ID 号。
表5 Fillblank表(填空题)表结构
5.Sysdata 表
该表用于存放考试系统中的系统参数,包括试题科目、该科目的选择题题量、填空题题量、选择题分值、填空题分值、该科目的考试时间等信息。该表的内容由系统管理员进行设置,该表对考生来说是透明的。
表6 Sysdata表(系统参数)表结构
6.Relogin 表
该表用于存放已经登录的考生信息,表结构如表7所示。该表的作用主要是记录考生是否是二次登录。
表7 Relogin表(二次登录信息)表结构 7.该表用于存放考生的试题答案,表结构如表8所示。该表只是一个模板,在系统中只用它的结构。
表8 Studdata表(考生答题信息)表结构
四.系统实现
本系统对应的工程文件为sjks.vbp ,它包含的所有文件如图2所示。
图2 上机考试系统工程文件
下面介绍工程中各组成部分的实现方法。对于窗体,给出执行功能、设计或运行界面、主要对象的属性和方法。
在该工程中,引用了一些ActiveX 控件等,在设计时选择“工程”菜单中的“引用”选项,从引用列表中选中如下选项:
Visual Basic For Applications
Visual Basic runtime objects and procedures Visual Basic Objects and procedures OLE Automation
Microsoft ActiveX Data Object 2.5 Library
再选择“工程”菜单中的“部件”选项,从控件列表中选中如下选项: Microsoft Windows Common Controls 6.0(SP4) (一)sjks.bas 公共模块
本工程包含一个公共模块sjks.Bas ,其中包含了一些全局变量和过程(被本工程的其他窗体调用),代码如下:
Public cs As Connection
Public rsc, rsstud, rslogin As Recordset
Public ssno As String '当前登录考生的学号 public ssname As String ‘当前登录考生的姓名 public sclass As String '当前登录考生的班级 public skskm As String '当前考试科目的名称 Public cfzh As Integer '选择题的分值 public ffzh As Integer '填空题的分值 public ctl As Integer '选择题的数量 public ftl As Integer '填空题的数量
Public tt As Integer '记录当前考试所用的实际时间 public rett As Integer ‘记录考生二次登录时已用时间
public examtime As Integer '当前登录考生的考试时间(系统规定)
Public Sub turntab(key) ‘利用回车键代替TAB 键 If key = 13 Then SendKeys "{tab}" End If End Sub (二)Welcome 窗体
Welcome 窗体及各控件的属性设置同第11.1.1节相似,在此不再详述。
该窗体是本工程的启动窗体。Welcome 界面卸载后,先显示主界面,再显示登录界面,登录界面采用模式方式显示,即显示在最前面,若考生的身份验证未通过,将不能进入系统。 (三)Login 窗体
Login 窗体实现对考生的身份验证及考试科目的选择。判断考生是否为合法考生。如果是合法考生,则释放该窗体,然后进行抽题,否则,不能进入考试系统。如图3所示。窗体中包含的主要对象及其属性如表9所示。
图3 考生登录界面
表9 考生登录界面各控件的属性设置值
Dim n As Integer ‘记录考生登录的次数 Private Sub Form_Load() Set cs = New Connection
cs.Open "dsn=sjks;uid=sa;pwd=;" ‘与SJKS 数据库建立联系 n = 0
Text1.Text = "" Text2.Text = ""
Dim rskm As Recordset Set rskm = New Recordset
rskm.Open "select * from sysdata", cs, adOpenKeyset,
adLockOptimistic
If rskm.RecordCount > 0 Then ‘填充组合框 Do While Not rskm.EOF
Combo1.AddItem rskm.Fields("考试科目") rskm.MoveNext Loop
Combo1.Text = Combo1.List(0) End If
Set rskm = Nothing End Sub
Private Sub Command1_Click()
Dim sqls As String n = n + 1
If n
Dim rsuser As Recordset Set rsuser = New Recordset
sqls = "select * from student where sno='" _ & Trim(Text1.Text) & "' and password='" _ & Trim(Text2.Text) & "'"
rsuser.Open sqls, cs, adOpenKeyset, adLockOptimistic If rsuser.RecordCount = 0 Then If n = 3 Then
MsgBox "对不起,您无权访问该系统!", 48, "操作提示" Unload Me End End If
MsgBox "输入的学号或口令错,请重新输入!", 32, "操作提示" Text1.Text = "" Text2.Text = "" Text1.SetFocus Exit Sub Else
ssno = rsuser("sno") '取出该考生的学号
ssname = rsuser("sname") '取出该考生的姓名 sclass = rsuser("class") '取出该考生的班级 skskm = Combo1.Text '取出该考生的考试科目 Dim ss As String
ss = "考生信息:" + Chr(13) + Chr(10)
ss = ss + "学号:" + ssno + Chr(13) + Chr(10) ss = ss + "姓名:" + ssname + Chr(13) + Chr(10) ss = ss + "班级:" + sclass + Chr(13) + Chr(10) ss = ss + "考试科目:" + skskm + Chr(13) + Chr(10) ss = ss + "身份验证正确吗(是/否) ?"
yn = MsgBox(ss, 4 + 32 + 256, "操作提示") If yn = VbNo Then Unload Me End End If Unload Me
chti.Show 1 ‘开始进行抽题 End If
Set rsuser = Nothing End If End Sub
Private Sub Command2_Click() Unload Me End End Sub
Private Sub Form_KeyPress(KeyAscii As Integer) turntab (KeyAscii) End Sub
(四) Chti 窗体(抽题界面)
当考生正确登录后,马上进行试题的抽取,即生成考生的试题。在抽取试题时,要做到随机抽取。窗体的的设计如图4所示,窗体中各主要对象及其属性设置如表10所示。
图4 抽题界面
表10 抽题界面各控件的属性设置值
抽题界面的程序代码如下:
Private Sub Timer1_Timer() Dim temp As Recordset Dim rstemp As Recordset Set rstemp = New Recordset
rstemp.Open "select * from sysdata where 考试科目='" & skskm & "'", cs, adOpenKeyset, adLockReadOnly
cfzh = rstemp("选择题分值")
ffzh = rstemp("填空题分值") ctl = rstemp("选择题数量") ftl = rstemp("填空题数量") examtime = rstemp("考试时间") Set rslogin = New Recordset
' 判断该用户是否登录过,且非正常退出。
rslogin.Open "select * from relogin where sno='" & ssno & "'", cs, adOpenKeyset, adLockOptimistic
If rslogin.RecordCount = 0 Then '不是二次登录 Dim sqls1, sqls2 As String
sqls1 = "select * into c" & ssno & " from choose" sqls2 = "delete from c" & ssno
cs.Execute sqls1 '复制choose 表内容
cs.Execute sqls2 '删除表中记录, 形成一个空表
sqls1 = "select * into f" & ssno & " from fillblank" sqls2 = "delete from f" & ssno
cs.Execute sqls1 '复制fillblank 表内容 cs.Execute sqls2 '删除表中记录, 形成一个空表
sqls1 = "select * into s" & ssno & " from studdata" sqls2 = "delete from s" & ssno
cs.Execute sqls1 '生成学生答题库
cs.Execute sqls2 '删除表中记录, 形成一个空表
sqls1 = "insert into relogin values('" & ssno & "'," &0& ")" cs.Execute sqls1 '将考生信息在RELOGIN 表中登记 Set rslogin = New Recordset
rslogin.Open "select * from relogin where sno='" & ssno & "'", cs, adOpenKeyset, adLockOptimistic
' 从选择题库中抽取题
Set rstemp = New Recordset
rstemp.Open "select * from choose where subject='" & skskm & "'", cs, adOpenKeyset, adLockReadOnly '选择题表
Set rsc = New Recordset
rsc.Open "c" & ssno, cs, adOpenKeyset, adLockOptimistic '选择题答题表
Set rsstud = New Recordset
rsstud.Open "s" & ssno, cs, adOpenKeyset, adLockOptimistic '学生答题表
i = 1
Do While i
idtemp = Int(Rnd * rstemp.RecordCount + 1)
'temp 表用于判断选择题答题表中是否已存在生成的随机题号
Set temp = New Recordset temp.Open "select * from c" & ssno & " where id=" & idtemp, cs, adOpenKeyset, adLockOptimistic
If temp.RecordCount = 0 Then ' 若没有,则开始抽题
rstemp.MoveFirst
rstemp.Find "ID=" & idtemp '到选择题库中查找抽到的题 If rstemp.EOF = False Then
'选择题库中添加试题 rsc.AddNew
rsc("id") = rstemp("id")
rsc("subject") = rstemp("subject") rsc("content") = rstemp("content") rsc("optiona") = rstemp("optiona") rsc("optionb") = rstemp("optionb") rsc("optionc") = rstemp("optionc") rsc("optiond") = rstemp("optiond") rsc("answer") = rstemp("answer") rsc.Update '往学生答题表添加记录 rsstud.AddNew rsstud("id") = i
rsstud("tx") = "选择题" rsstud("fzh") = cfzh
rsstud("answer") = rstemp("answer") rsstud("gmark") = 0 rsstud.Update i = i + 1 End If End If Loop
'对抽出的选择题重新设置题号 i = 1
Set rsc = New Recordset
rsc.Open "c" & ssno, cs, adOpenKeyset, adLockOptimistic Do While Not rsc.EOF rsc("id") = i
rsc.update rsc.MoveNext i = i + 1 Loop
'抽取填空题
Set rstemp = New Recordset rstemp.Open "select * from fillblank where subject='" & skskm & "'", cs, adOpenKeyset, adLockReadOnly
Set rsc = New Recordset
rsc.Open "f" & ssno, cs, adOpenKeyset, adLockOptimistic i = 1
Do While i
idtemp = Int(Rnd * rstemp.RecordCount + 1) Set temp = New Recordset
temp.Open "select * from f" & ssno & " where id=" & idtemp, cs, adOpenKeyset, adLockOptimistic
If temp.RecordCount = 0 Then rstemp.MoveFirst
rstemp.Find "ID=" & idtemp If rstemp.EOF = False Then
'填空题库中添加试题 rsc.AddNew
rsc("id") = rstemp("id")
rsc("subject") = rstemp("subject") rsc("content") = rstemp("content") rsc("answer") = rstemp("answer") rsc.Update '往学生答题表添加记录 rsstud.AddNew rsstud("id") = i
rsstud("tx") = "填空题" rsstud("fzh") = ffzh
rsstud("answer") = rstemp("answer") rsstud("gmark") = 0 rsstud.Update i = i + 1 End If End If
Loop
'对抽出的填空题重新设置题号 i = 1
Set rsc = New Recordset
rsc.Open "f" & ssno, cs, adOpenKeyset, adLockOptimistic Do While Not rsc.EOF rsc("id") = i rsc.update rsc.MoveNext i = i + 1 Loop
Set rsstud = New Recordset
rsstud.Open "select * from s" & ssno & " order by tx,id", cs, adOpenKeyset, adLockOptimistic
tt = examtime * 60 'tt存放学生考试所需的时间 Else
MsgBox "你是二次登录,请继续完成上次所抽的试题!" rett = rslogin("etime")
tt = examtime * 60 - rett ' 从relogin 表中取出学生已经用过的时间,并求出还剩多少时间
End If
Set temp = Nothing Set rstemp = Nothing Unload Me sm.Show 1 End Sub (五)Sm 窗体(说明界面)
当系统抽完题后,显示考试说明界面,说明界面的显示如图5和图6所示,单击“开始考试并计时”按钮,该窗体被释放,主界面可用,考生开始考试。窗体中各控件的属性设置如表11所示。
图5 说明界面(初次登录) 图6 说明界面(二次登录)
表11 说明界面各控件的属性设置值
说明界面的程序代码如下:
Private Sub Command1_Click() Unload Me
MDImain.Command1.Enabled = True MDImain.Command2.Enabled = True MDImain.Command3.Enabled = True MDImain.Command4.Visible = True
MDImain.Caption = MDImain.Caption + Space(40) + "考生学号:
" & ssno & Space(10) & "姓名:" & ssname & " 班级:" & sclass
MDImain.Timer1.Interval = 60000 '每分钟触发一次 MDImain.Timer1.Enabled = True '计时器开始工作
MDImain.Command4.Caption = "考试时间还剩: " & Int(tt / 60) &
" 分钟"
End Sub
Private Sub Form_Activate()
Text1.BackColor = Command1.BackColor
Call sm '显示考生须知 End Sub
Sub sm() '显示考生须知 Dim ss As String
ss = "考生须知:(请考生仔细阅读)" + vbCrLf
ss = ss + "上机考试共分为两大部分:选择题和填空题。" + vbCrLf
ss = ss + "考试时间为" & examtime & "分钟,你还剩" & Int(tt / 60) & "分钟。" + vbCrLf
ss = ss + "请单击“开始考试并计时”按钮开始考试。" + vbCrLf ss = ss + "并且开始计时。" + Chr(13) + Chr(10) ss = ss + "准备好后开始考试!" + Chr(13) + Chr(10) Text1.Text = ssEnd Sub (六)主界面(MDImain 窗体)
当单击说明界面的“开始考试并计时”按钮后,MDImain 窗体可用,该窗体是一个多文档窗体, 其运行界面如图7所示,单击“选择题”按钮时,开始做选择题;单击“填空题”按钮时,开始做填空题。如果考试时间到,则“选择题”按钮和“填空题”按钮均不可用,只有“交卷”按钮可用。窗体中包含的主要对象及其属性如表12所示。
图7 主界面
表12 主界面各控件的属性设置值
状态栏中各窗格的属性设置如表13所示。
表13 状态栏中各窗格的主要属性设置
主界面的程序代码为:
Private Sub Command1_Click() ‘选择题 cexam.Show 1 End Sub
Private Sub Command2_Click() ‘填空题 fexam.Show 1 End Sub
Private Sub Command3_Click()
Dim cscore, fscore, sumscore, tt1 As Integer tt1 = examtime - tt If tt > 4 Then
aa = MsgBox("注意:交卷后将不能再继续答题,交卷吗?", _ vbYesNo + 32, "警告") If aa = 7 Then Exit Sub End If End If
cscore = 0 fscore = 0 sumscore = 0
Set rsstud = New Recordset
rsstud.Open "s" & ssno, cs, adOpenKeyset, adLockOptimistic
Do While Not rsstud.EOF
If tx = "选择题" Then
If rsstud("answer") = rsstud("studanswer") Then rsstud("gmark") = cfzh End If
cscore =cscore + rsstud("gmark")
Else '填空题中存在多个标准答案的情况
If InStr(rsstud("answer"), rsstud("studanswer")) 0 Then
rsstud("gmark") = ffzh End If
fscore = fscore + rsstud("gmark") End If
rsstud.MoveNext Loop
Dim temp As Recordset Set temp = New Recordset
temp.Open "select * from student where sno='" & ssno & _ "'", cs, adOpenKeyset, adLockOptimistic temp("time") = examtime * 60 - tt temp("score") = cscore + fscore temp.Update
MsgBox "你的考试成绩为:" & temp("score") & "分" cs.Execute "drop table c" & ssno cs.Execute "drop table f" & ssno cs.Execute "drop table s" & ssno
cs.Execute "delete from relogin where sno='" & ssno & "'" Set temp = Nothing Set rsc = Nothing Set rsstud = Nothing Set rslogin = Nothing cs.Close Unload Me welcome.Show End Sub
Private Sub MDIForm_Load() Command1.Enabled = False
Command2.Enabled = False Command3.Enabled = False
MDImain.Command4.Visible = False End Sub
Private Sub Timer1_Timer() tt = tt - 60
rett = examtime * 60 - tt rslogin("etime") = rett rslogin.Update
Command4.Caption = "考试时间还剩: " & Int(tt / 60) & " 分钟" If tt = 5 * 60 Then
MsgBox "考试时间还剩5分钟," + Chr(13) + Chr(10) + "请抓紧时间!", 48, "操作提示"
End If
If tt = 0 Then
Timer1.Enabled = False
MsgBox "时间到,请交卷!" Command1.Enabled = False Command2.Enabled = False Command4.Visible = False Unload cexam '卸载选择题答题窗体 Unload fexam '卸载填空题答题窗体 End If End Sub
(七)Cexam 窗体(选择(单选)题答题界面)
Cexam 窗体的运行界面如图8所示。该界面用四个单选按钮显示每道题的四个选项,考生可单击某个单选按钮来确定该选择题的答案。当某选择题已经做过,再显示此题时,题号的颜色由默认的黑色变成红色,表示该题已经做过,同时,利用四个命令按钮可实现选择题的浏览。填空题也是如此。Cexam 窗体中各对象的属性设置如表14所示。
图8 选择题界面
表14 选择题界面各控件的属性设置值
选择题界面的程序代码如下:
Private Sub Command1_Click() rsc.MoveFirst Call disp Call loca
Command1.Enabled = False Command2.Enabled = False Command3.Enabled = True Command4.Enabled = True End Sub
Private Sub Command2_Click() rsc.MovePrevious If rsc.BOF Then rsc.MoveFirst
Command1.Enabled = False Command2.Enabled = False End If Call disp Call loca
Command3.Enabled = True Command4.Enabled = True End Sub
Private Sub Command3_Click() rsc.MoveNext If rsc.EOF Then rsc.MoveLast
Command3.Enabled = False Command4.Enabled = False End If Call disp Call loca
Command1.Enabled = True Command2.Enabled = True End Sub
Private Sub Command4_Click() rsc.MoveLast
Call disp Call loca
Command1.Enabled = True Command2.Enabled = True Command3.Enabled = False Command4.Enabled = False End Sub
Private Sub Command5_Click() cexam.Hide End Sub
Private Sub Form_Activate() Set rsc = New Recordset
rsc.Open "c" & ssno, cs, adOpenKeyset, adLockOptimistic Label3.Caption = rsc.Fields("id") Call disp Call loca End Sub
Private Sub Form_Load()
Text1.BackColor = cexam.BackColor End Sub
Private Sub Option1_Click() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = "A" rsstud.Update End Sub
Private Sub Option2_Click() Set rsstud = New Recordset
rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic
If rsstud.EOF = False Then rsstud("studanswer") = "B" rsstud.Update
End Sub
Private Sub Option3_Click() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = "C" rsstud.Update End Sub
Private Sub Option4_Click() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = "D" rsstud.Update End Sub
Public Sub loca() ‘该过程用于判断当前题是否做过 Label3.Caption = rsc("id") Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='选择题'", cs, adOpenKeyset, adLockOptimistic Select Case rsstud("studanswer") Case "A"
Option1.Value = True
Label3.ForeColor = RGB(255, 0, 0) Case "B"
Label3.ForeColor = RGB(255, 0, 0) Option2.Value = True Case "C"
Label3.ForeColor = RGB(255, 0, 0) Option3.Value = True Case "D"
Label3.ForeColor = RGB(255, 0, 0) Option4.Value = True Case Else
Label3.ForeColor = RGB(0, 0, 0) Option1.Value = False
Option2.Value = False Option3.Value = False Option4.Value = False End Select End Sub
Sub disp()去时 ‘当指针移动时,该过程使窗体中的控件内容与表中一致 Text1.Text = rsc("content")
Label1(0).Caption = rsc("optiona") Label1(1).Caption = rsc("optionb") Label1(2).Caption = rsc("optionc") Label1(3).Caption = rsc("optiond") End Sub
(八) Fexam 窗体(填空题界面)
Fexam 窗体用于考生做填空题,该窗体的运行界面如图9所示。考生将答案填写在文本框中,还可实现试题的浏览。窗体中各对象的属性设置值如表15所示。
图9 填空题界面
表15 填空题界面各控件的属性设置值
填空题界面的程序代码如下:
Private Sub Command1_Click() rsc.MoveFirst Call disp Call loca
Command1.Enabled = False Command2.Enabled = False Command3.Enabled = True Command4.Enabled = True Text2.SetFocus End Sub
Private Sub Command2_Click() rsc.MovePrevious If rsc.BOF Then rsc.MoveFirst
Command1.Enabled = False Command2.Enabled = False End If Call disp Call loca
Command3.Enabled = True Command4.Enabled = True Text2.SetFocus End Sub
Private Sub Command3_Click()
rsc.MoveNext If rsc.EOF Then rsc.MoveLast
Command3.Enabled = False Command4.Enabled = False End If Call disp Call loca
Command1.Enabled = True Command2.Enabled = True Text2.SetFocus End Sub
Private Sub Command4_Click() rsc.MoveLast Call disp Call loca
Command1.Enabled = True Command2.Enabled = True Command3.Enabled = False Command4.Enabled = False Text2.SetFocus End Sub
Private Sub Command5_Click() fexam.Hide End Sub
Private Sub Form_Activate() Set rsc = New Recordset
rsc.Open "f" & ssno, cs, adOpenKeyset, adLockOptimistic Label3.Caption = rsc.Fields("id") Call disp Call loca End Sub
Private Sub Form_Load()
Text1.BackColor = fexam.BackColor
End Sub
Private Sub text2_LostFocus() Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='填空题'", cs, adOpenKeyset, adLockOptimistic If rsstud.EOF = False Then rsstud("studanswer") = Trim(Text2) rsstud.Update End Sub
Public Sub loca()
Label3.Caption = rsc("id") Set rsstud = New Recordset rsstud.Open "select * from s" & ssno & " where id=" & rsc("id") & " and tx='填空题'", cs, adOpenKeyset, adLockOptimistic If rsstud("studanswer") "" Then Label3.ForeColor = RGB(255, 0, 0) Text2 = rsstud("studanswer") Else
Label3.ForeColor = RGB(0, 0, 0) Text2 = "" End If End Sub
Sub disp()
Text1.Text = rsc("content") End Sub
五.系统运行
将本系统联编成Sjks.exe 文件,可以脱离VB 系统单独运行。运行Sjks.exe ,出现如图10所示的界面,等待20秒或单击窗体的任意位置,进入考生登录界面,如图11所示。考生输入学号及口令,选择要考试的科目,单击“确定”按钮,显示考生信息,如图12所示。如果该考生是二次登录,系统会显示提示信息,如图13所示。考生的答题界面与13.4节中图8和图9一样,在此不现详述。
当考生答完题或时间到时,单击“交卷”按钮,系统会显示该考生的考试成绩,如图14和图15所示。
图10 启动界面
图11 登录界面
图12 考生信息提示 图13 二次登录提示
图14 交卷提示 图15 显示考生成绩