毕业设计 上机考试系统 课程设计报告

上机考试系统课程设计报告

一.系统开发背景

计算机上机考试是指通过计算机实现对知识的考核,包括理论知识和上机实际操作技能的考核。与传统的考试相比,它最大限度排除了人为因素的作用,保证了考试的客观性;考生在考试之后,一般就能够得到成绩,使考试具有实时性;而且通过计算机评分,标准一致,具有最佳的可靠性。

现代信息社会中,计算机已经渗透到各行各业,计算机上机考试的范围相信还将继续扩大。著名的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 显示考生成绩


相关文章

  • 中职学校计算机机房管理研究]课题研究报告
  • <中职学校计算机机房管理研究>课题研究报告 何祖猛 执笔 一.项目研究背景和意义 1.研究背景 我校的计算机机房主要承担全校所有班级的<计算机应用基础>和计算机专业班级的计算机基础课程.主干专业课程以及其它专业的计算 ...查看


  • xml教学方案设计说明书
  • <XML基础>教学方案设计说明书 一. 课程培养目标 课时:32学时,理论24学时,实践8学时 学分:2 开课情况:09级计算机科学与技术专业第一次开课,主讲:李兴远,教材选用清华大学孙更新主编的<XML编程与应用教程&g ...查看


  • 课程建设规划模板
  • <C 项目实战>课程建设规划 一."C 项目实战"课在专业建设中的地位和作用 "C 项目实战" 通过项目实战训练,掌握C 语言程序开发环境的使用,学会上机调试程序,善于发现程序中的错误,并 ...查看


  • 计算机考试的一些区别
  • 国内计算机考试的一些区别 目前许多学生说学习计算机为了考等级.考软考.考IT 认证,这都些什么呢?其实就是目前国内的常见的计算机认证的等级考试.软件水平考试.信息处理技术考试. 一.等级考试 1.该考试是什么性质?由什么机构组织实施? 该考 ...查看


  • SQL实验报告总结
  • <数据库系统概论(第四版)> 体 会 学号: 姓名: 班级: 教师: 学 期实 验 总 结 与 心 得 [实验名称] 数据库的创建 [实验内容] 1.新建sql注册表. 2.新建数据库.主数据文件:逻辑文件名为student_d ...查看


  • 计算机操作系统上机实验报告
  • 课程设计(上机实验) 报告 课程名称: 学生姓名: 学 号: 所在学院: 专 业: 指导教师: 年 月 日 课程设计(上机实验)报告填写说明 1.本报告作为指导教师对学生课程设计(上机实验)评分的依据材料之一.此报告应在指导教师指导下,由学 ...查看


  • 课程与教材建设1
  • 1. 掌握硬件的理论知识,并具备一定的硬件维护和设计. 2. 具有平面广告设计.简单动画设计的能力及制作和开发多媒体的能力: 3.熟练掌握软件开发工具的使用 4. 掌握几种程序设计语言.SQL Sever数据库.具有一定的编程能力: 5 具 ...查看


  • [计算机网络基础]课程标准
  • 计算机网络基础 课程标准 <计算机网络基础>课程标准 一.适用对象 计算机应用专业三年制中职学生 二.课程性质 计算机网络是中等职业教育计算机网络技术专业必修的专业基础课程.本课程的主要任务是使学生在掌握计算机操作应用的基础上, ...查看


  • [三维实体造型技术]教学大纲
  • <三维实体造型技术>课程教学大纲 一.课程简介 课程名称:三维实体造型技术 英文名称:3D solid modeling techniques 课程代码:0110188 课程类别:专业选修课 学 分:2 总 学 时:32(上机) ...查看


热门内容