目 录
一、 设计任务………………………………1
二、 系统总体的设计方案…………………4
三、 框图……………………………………6
四、 调试程序的过程………………………6
五、 收获体会………………………………7
六、 意见建议………………………………8
七、 示例截图………………………………8
八、 源代码…………………………………9
九、 主要参考资料………………………18
一、设计任务
a)程序运行时,首先显示主界面如图。单击“单选题”、“多选题”、“判断题”和“填空题”四个按钮之一,程序会打开不同题型的窗口。
b) 单选题窗口打开后显示如图窗体,窗口中显示了题目总数、当前题号、已做题目目数、题目内容和选择项。用户先做题目,再根据自己的判断选择“选择项”中的一个单选框然后使用“前一题”或“后一题”按钮切换到其它题目。同时可使用“查看成绩”,程序会显示本题型共做对多少题。
c)多选题,判断题和填空题使用方法与单选题类似。单击推出按钮可以返回主界面继续做其它类型的题目.
二、系统总体的设计方案
设计一个“考试系统”软件,利用已有的题目数据库,用户根据个人的喜好,自主选择题型进行自测,程序能够自动进行评分。
(单选题与多选题、判断题和填空题代码类似,这里以单选题为例。)
Dim db, rs, r_sum, l
Dim ans() As String, ans1() As String
Function yzts() As Integer
Dim i, s
s = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then s = s + 1
Next i
yzts = s
End Function
Private Sub Command1_Click()
Option1.Value = False
Option2.Value = False
Option3.Value = False
l = l - 1
If l >= 1 Then
rs.MovePrevious
Form2.Option1.Caption=rs.Fields("ans1").Value
Form2.Option2.Caption=rs.Fields("ans2").Value
Form2.Option3.Caption=rs.Fields("ans3").Value
Form2.Label7.Caption=rs.Fields("question").Value
End If
If l <= 1 Then l = 1
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command2_Click()
Option1.Value = False
Option2.Value = False
Option3.Value = False
l = l + 1
If l <= r_sum Then
rs.MoveNext
Form2.Option1.Caption=rs.Fields("ans1").Value
Form2.Option2.Caption=rs.Fields("ans2").Value
Form2.Option3.Caption=rs.Fields("ans3").Valu
Form2.Label7.Caption=rs.Fields("question").Value
End If
If l >= r_sum Then l = r_sum
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command3_Click()
Dim i, k
k = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then
Debug.Print ans(i), ans1(i)
If Mid(ans1(i), Asc(ans(1)) - 64, 1) = "1" Then k = k + 1
End If
Next i
Form2.Label7.Caption = "共做正确" + Str(k) + " 题"
End Sub
Private Sub Command4_Click()
Form2.Hide
Form1.Show
End Sub
Private Sub Form_Load()
Dim i
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("xz3")
r_sum = rs.RecordCount
l = 1
ReDim ans(r_sum)
ReDim ans1(r_sum)
For i = 1 To r_sum
ans(i) = "0"
ans1(i) = rs.Fields("ans").Value
rs.MoveNext
Next i
rs.MoveFirst
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
db.Close
End Sub
Private Sub Option1_Click()
ans(l) = "A"
End Sub
Private Sub Option2_Click()
ans(l) = "B"
End Sub
Private Sub Option3_Click()
ans(l) = "C"
End Sub
三、框图
四、调试程序的过程
a)对.mdb数据库操作及DAO对象的使用方式不够了解,导致程序无法正常运行。(解决方法:对样例程序进行编写调试,并查找相关数据库应用类书籍学习了解使用)
b) 开始编辑时,对整个程序结构设计不完整,边尝试边做,导致出现大量定义变量,程序结构臃肿.(解决方法:对所有变量进行统一重定义,明确其功能及作用域)
c) 由于对各个函数的作用顺序及返回值对相互之间的影响把握不够,导致保存选项,读取选项和查看成绩所调用的函数三者之间相互影响,其功能无法正常实现,(解决方法:列出框图,对程序进行逐语句调试,了解函数相互之间的作用关系及影响,找出正确的调用顺序及调用位置)
d) 初始设计时对判断已做题目并返回已做题目数的函数(wbr)作用要求不完善,导致在程序运行过称中出现异常值(已做题目数超过总题数或变为负值)(解决办法:不断测试了解具体要求,据此对其进行完善)
e) 用于返回以做题目答案的函数在运行过程中无法正常显示相关内容,其调用位置无法准确给出。
f) 再次打开窗体后,无法正常继续答题或修改答案,(由于退出窗体时用于计数的多个模块级变量值仍为上次运行结束时得值)。(解决方法:退出相应窗体时对用于计数的相关变量值清零)
由于对基础知识掌握不够熟练,对某些控件属性了解不全面,故在编写调试过程经常翻阅课本,且经常会出现诸如下标越界,类型不匹配等等大量错误。
五、收获体会
选择题目时对该题目的难度及要求有一定的心理预期,其中有从未听过的.mdb数据库应用和DAO对象,第一次着手开始做便感觉到对自己来说难度相当大。因此便十分重视这件事,经常去图书馆浏览数据库应用的相关书籍,学习如何建立数据连接,合理应用数据库内容。常常利用晚自习等空闲时间去机房进行程序的编写和测试,在此过程中开始对题目的基本框架有了大概的了解。据此,我便开始第一个编写相对较为简单的选择题模块,然后在对其进行增补修改后再移植到其他模块中应用。这样由简到繁最终成功按照要求按时完成了题目。
在编写过称中经常遇到瓶颈问题,这就离不开和室友之间的讨论了,虽然彼此选题不同,但在相互抱怨讨论的过程中,往往可以得到意外地灵感,所以在这次完成题目的过程中我深深的感受到相互讨论的重要性。同时这次课程设计也极大的锻炼了我独自发现并解决问题的能力,这对于今后的学习拥有极大的帮助。同时,能完全独立的通过自己的努力完成这个题目,虽然结果并不是非常完美,但我觉得这依然在一定程度上提高了我的自信心。
总的来说,这次课程设计的完成让我受益匪浅。
六、意见建议
a)希望课程设计上机实习的机会更多,有更多实际操作的机会,有更充足的时间编制完整的程序。
b)我们可以多人分组进行课程设计,增强团队合作能力,使得课程设计更简单容易。
七、示例截图
(以判断题为例)
判断题界面
统计做对题数
八、源代码
a)一
Private Sub Command1_Click()
Form1.Hide
Form2.Show
Form2.Picture1.Cls
Form2.Picture1.Print
Form2.Picture1.Print " "; "单"
Form2.Picture1.Print " "; "项"
Form2.Picture1.Print " "; "选"
Form2.Picture1.Print " "; "择"
Form2.Picture1.Print " "; "题"
Dim db As Database
Dim rs As Recordset
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("xz3")
Form2.Option1.Caption = rs.Fields("ans1").Value
Form2.Option2.Caption = rs.Fields("ans2").Value
Form2.Option3.Caption = rs.Fields("ans3").Value
Form2.Label7.Caption = rs.Fields("question").Value
rs.Close
db.Close
End Sub
Private Sub Command2_Click()
Form1.Hide
Form3.Show
Form3.Picture1.Cls
Form3.Picture1.Print
Form3.Picture1.Print " "; "多"
Form3.Picture1.Print " "; "项"
Form3.Picture1.Print " "; "选"
Form3.Picture1.Print " "; "择"
Form3.Picture1.Print " "; "题"
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("xz4")
Form3.Check1.Caption = rs.Fields("ans1").Value
Form3.Check2.Caption = rs.Fields("ans2").Value
Form3.Check3.Caption = rs.Fields("ans3").Value
Form3.Check4.Caption = rs.Fields("ans4").Value
Form3.Label7.Caption = rs.Fields("question").Value
rs.Close
db.Close
End Sub
Private Sub Command3_Click()
Form1.Hide
Form4.Show
Form4.Picture1.Cls
Form4.Picture1.Print
Form4.Picture1.Print
Form4.Picture1.Print " "; "判"
Form4.Picture1.Print " "; "断"
Form4.Picture1.Print " "; "题"
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("pd")
Form4.Label7.Caption = rs.Fields("question").Value
rs.Close
db.Close
End Sub
Private Sub Command4_Click()
Form1.Hide
Form5.Show
Form5.Picture1.Cls
Form5.Picture1.Print
Form5.Picture1.Print
Form5.Picture1.Print " "; "填"
Form5.Picture1.Print " "; "空"
Form5.Picture1.Print " "; "题"
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("tk")
Form5.Label8.Caption = rs.Fields("question").Value
rs.Close
db.Close
End Sub
Private Sub Command5_Click()
End
End Sub
b)二
Dim db, rs, r_sum, l
Dim ans() As String, ans1() As String
Function yzts() As Integer
Dim i, s
s = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then s = s + 1
Next i
yzts = s
End Function
Private Sub Command1_Click()
Option1.Value = False
Option2.Value = False
Option3.Value = False
l = l - 1
If l >= 1 Then
rs.MovePrevious
Option1.Caption = rs.Fields("ans1").Value
Option2.Caption = rs.Fields("ans2").Value
Option3.Caption = rs.Fields("ans3").Value
Label7.Caption = rs.Fields("question").Value
End If
If l <= 1 Then l = 1
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command2_Click()
Option1.Value = False
Option2.Value = False
Option3.Value = False
l = l + 1
If l <= r_sum Then
rs.MoveNext
Option1.Caption = rs.Fields("ans1").Value
Option2.Caption = rs.Fields("ans2").Value
Option3.Caption = rs.Fields("ans3").Value
Label7.Caption = rs.Fields("question").Value
End If
If l >= r_sum Then l = r_sum
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command3_Click()
Dim i, k
k = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then
Debug.Print ans(i), ans1(i)
If Mid(ans1(i), Asc(ans(1)) - 64, 1) = "1" Then k = k + 1
End If
Next i
s = MsgBox("本类型的题目你共做对了" & k & "个", vbOKOnly + vbInformation, "考试系统")
End Sub
Private Sub Command4_Click()
Form2.Hide
Form1.Show
End Sub
Private Sub Form_Load()
Dim i
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("xz3")
r_sum = rs.RecordCount
l = 1
ReDim ans(r_sum)
ReDim ans1(r_sum)
For i = 1 To r_sum
ans(i) = "0"
ans1(i) = rs.Fields("ans").Value
rs.MoveNext
Next i
rs.MoveFirst
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
db.Close
End Sub
Private Sub Option1_Click()
ans(l) = "A"
End Sub
Private Sub Option2_Click()
ans(l) = "B"
End Sub
Private Sub Option3_Click()
ans(l) = "C"
End Sub
c)三
Dim db, rs, r_sum, l
Dim ans() As String, ans1() As String
Function yzts() As Integer
Dim i, s
s = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then s = s + 1
Next i
yzts = s
End Function
Private Sub Command1_Click()
Check1.Value = 0
Check2.Value = 0
Check3.Value = 0
Check4.Value = 0
l = l - 1
If l >= 1 Then
rs.MovePrevious
Check1.Caption = rs.Fields("ans1").Value
Check2.Caption = rs.Fields("ans2").Value
Check3.Caption = rs.Fields("ans3").Value
Check4.Caption = rs.Fields("ans4").Value
Label7.Caption = rs.Fields("question").Value
End If
If l <= 1 Then l = 1
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command2_Click()
Check1.Value = 0
Check2.Value = 0
Check3.Value = 0
Check4.Value = 0
l = l + 1
If l <= r_sum Then
rs.MoveNext
Check1.Caption = rs.Fields("ans1").Value
Check2.Caption = rs.Fields("ans2").Value
Check3.Caption = rs.Fields("ans3").Value
Check4.Caption = rs.Fields("ans4").Value
Label7.Caption = rs.Fields("question").Value
End If
If l >= r_sum Then l = r_sum
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command3_Click()
Dim i, k
k = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then
Debug.Print ans(i), ans1(i)
If Mid(ans1(i), Asc(ans(1)) - 64, 1) = "1" Then k = k + 1
End If
Next i
s = MsgBox("本类型的题目你共做对了" & k & "个", vbOKOnly + vbInformation, "考试系统")
End Sub
Private Sub Command4_Click()
Form3.Hide
Form1.Show
End Sub
Private Sub Form_Load()
Dim i
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("xz4")
r_sum = rs.RecordCount
l = 1
ReDim ans(r_sum)
ReDim ans1(r_sum)
For i = 1 To r_sum
ans(i) = "0"
ans1(i) = rs.Fields("ans").Value
rs.MoveNext
Next i
rs.MoveFirst
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
db.Close
End Sub
Private Sub Check1_Click()
ans(l) = "A"
End Sub
Private Sub Check2_Click()
ans(l) = "B"
End Sub
Private Sub Check3_Click()
ans(l) = "C"
End Sub
Private Sub Check4_Click()
ans(l) = "D"
End Sub
d)四
Dim db, rs, r_sum, l
Dim ans() As String, ans1() As String
Function yzts() As Integer
Dim i, s
s = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then s = s + 1
Next i
yzts = s
End Function
Private Sub Command1_Click()
Option1.Value = False
Option2.Value = False
l = l - 1
If l >= 1 Then
rs.MovePrevious
Label7.Caption = rs.Fields("question").Value
End If
If l <= 1 Then l = 1
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command2_Click()
Option1.Value = False
Option2.Value = False
l = l + 1
If l <= r_sum Then
rs.MoveNext
Label7.Caption = rs.Fields("question").Value
End If
If l >= r_sum Then l = r_sum
Label2 = Trim(Str(l))
Label5 = Trim(Str(yzts))
End Sub
Private Sub Command3_Click()
Dim i, k
k = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then
Debug.Print ans(i), ans1(i)
If Mid(ans1(i), Asc(ans(1)) - 64, 1) = "1" Then k = k + 1
End If
Next i
s = MsgBox("本类型的题目你共做对了" & k & "个", vbOKOnly + vbInformation, "考试系统")
End Sub
Private Sub Command4_Click()
Form4.Hide
Form1.Show
End Sub
Private Sub Form_Load()
Dim i
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("pd")
r_sum = rs.RecordCount
l = 1
ReDim ans(r_sum)
ReDim ans1(r_sum)
For i = 1 To r_sum
ans(i) = "0"
ans1(i) = rs.Fields("ans").Value
rs.MoveNext
Next i
rs.MoveFirst
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
db.Close
End Sub
Private Sub Option1_Click()
ans(l) = "A"
End Sub
Private Sub Option2_Click()
ans(l) = "B"
End Sub
e)五
Dim db, rs, r_sum, l
Dim ans() As String, ans1() As String
Function yzts() As Integer
Dim i, s
s = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then s = s + 1
Next i
yzts = s
End Function
Private Sub Command1_Click()
Text1.Text = ""
l = l - 1
If l >= 1 Then
rs.MovePrevious
Label8.Caption = rs.Fields("question").Value
End If
If l <= 1 Then l = 1
Label3 = Trim(Str(l))
Label6 = Trim(Str(yzts))
End Sub
Private Sub Command2_Click()
Text1.Text = ""
l = l + 1
If l <= r_sum Then
rs.MoveNext
Label8.Caption = rs.Fields("question").Value
End If
If l >= r_sum Then l = r_sum
Label3 = Trim(Str(l))
Label6 = Trim(Str(yzts))
End Sub
Private Sub Command3_Click()
Dim i, k
k = 0
For i = 1 To UBound(ans)
If ans(i) <> "0" Then
Debug.Print ans(i), ans1(i)
If ans1(i) = Text1.Text Then k = k + 1
End If
Next i
s = MsgBox("本类型的题目你共做对了" & k & "个", vbOKOnly + vbInformation, "考试系统")
End Sub
Private Sub Command4_Click()
Form5.Hide
Form1.Show
End Sub
Private Sub Form_Load()
Dim i
Set db = OpenDatabase(App.Path + "\tiku.mdb", True, True, ";pwd=tiku")
Set rs = db.OpenRecordset("tk")
r_sum = rs.RecordCount
l = 1
ReDim ans(r_sum)
ReDim ans1(r_sum)
For i = 1 To r_sum
ans(i) = "0"
ans1(i) = rs.Fields("ans").Value
rs.MoveNext
Next i
rs.MoveFirst
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
db.Close
End Sub
九、主要参考资料
1、visual basic 课程设计 王栋主编
清华大学出版社
2、visual basic程序设计简明教程 龚培增 陆慰民 杨志强 编
高等教育出版社
3、visual basic 课程设计案例精编 张勇等编著
北京:中国水利水电出版社,2004