考试系统程序设计报告.docx
- 文档编号:6642001
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:34
- 大小:441.10KB
考试系统程序设计报告.docx
《考试系统程序设计报告.docx》由会员分享,可在线阅读,更多相关《考试系统程序设计报告.docx(34页珍藏版)》请在冰豆网上搜索。
考试系统程序设计报告
Visualbasic课程设计报告
设计题目:
考试系统
设计等级:
学院:
环境与生物工程学院
学号:
912102270155
姓名:
辛文力
指导老师:
冯元
提交时间:
2013-4-19
(一)功能
(二)课程设计的详细设计
(三)测试程序的过程
(四)课程设计总结
(五)附件
一、功能
a)程序运行时,首先显示主界面如图。
单击“单选题”.“多选题”.“判断题”和“填空题”四个按钮之一,程序会打开不同题型的窗口。
b)单选题窗口打开后显示如图窗体,窗口中显示了题目总数.当天题号.已做题目目数.题目内容和选择项。
用户先做题目,再根据自己的判断选择“选择项”中的一个单选框然后使用“前一题”或“后一题”按钮切换到其它题目。
同时可使用“查看成绩”,程序会显示本题型共做对多少题。
c)使用“前一题”或“后一题”按钮切换到其它题目时,若已位于第一题或最后一题,则利用消息框进行提示。
d)多选题,判断题和填空题使用方法与单选题类似。
单击推出按钮可以返回主界面继续做其它类型的题目。
二、课程设计的详细设计
(以单选题为例说明,其他类似)
DimnAsInteger,mAsInteger,l(0To100)AsInteger,eAsInteger,qAsInteger,,jieshuAsInteger
Dimchioce(0To100)AsString,answer(0To100)AsString'保存答案,记录选项.n表示当前记录数,m表示总题目数,e表示题号,jieshu表示已做题目数,chioce数组记录所有做出答案,answer数组表示所有对应题目的答案,l数组用于记录选项计算已做题目数
ØPrivateSubForm_Load()‘加载窗体
DimlAsInteger,itAsInteger,fAsString,gAsString,hAsString,iAsString
Dimop1AsBoolean,op2AsBoolean,op3AsBoolean
DimdbobjectAsDAO.Database
DimrecsetAsDAO.Recordset
Setdb=OpenDatabase("tiku.mdb",True,True,";pwd=tiu")
Setrecset=db.OpenRecordset("select*fromxz3")
recset.MoveLast‘将最后一条记录作为当前记录
m=recset!
qno‘记录总题目数
sun2.Caption=m‘显示总题目数
recset.MoveFirst‘将第一条记录作为当前记录
f=recset!
question'记录问题
g=recset!
ans1'记录选项1
h=recset!
ans2'记录选项2
i=recset!
ans3'记录选项3
e=recset!
qno'记录题号
DoWhileNotrecset.EOF'记录所有答案
answer(it)=recset!
ans
it=it+1
recset.MoveNext
Loop
Callwer(e,f,g,h,i)‘调用函数显示题目及题号,选项
Callrewdr(e,op1,op2,op3)‘调用函数显示已存档的答案
Option1.Value=op1
Option2.Value=op2
0ption3.Value=op3
EndSub
ØPrivateSubC11_Click()‘返回前一题
DimfAsString,gAsString,hAsString,iAsString
Dimop1AsBoolean,op2AsBoolean,op3AsBoolean
op1=Option1.Value
op2=Option2.Value
op3=option3.Value
Callwdr(e,op1,op2,op3)‘记录上一题的答案Callwbr(e,op1,op2,op3)‘判断已做题目,显示已做题目数
DimdbobjectAsDAO.Database
DimrecsetAsDAO.Recordset‘定义数据库连接
Setdb=OpenDatabase("tiku.mdb",True,True,";pwd=tiku")
Setrecset=db.OpenRecordset("select*fromxz3")
‘打开数据库,读取记录数据
n=n-1
recset.Moven
Ifrecset.BOFThen‘判断是否已到达首条记录,能否继续读取前一条记录
S=MsgBox("已是第一题!
",vbOKOnly+vbInformation,"考试系统")‘如果已到达首记录则弹出消息框提示,并显示第一条记录
recset.MoveFirst
f=recset!
question'记录问题
g=recset!
ans1'记录选项1
h=recset!
ans2'记录选项2
i=recset!
ans3'记录选项3
e=recset!
qno'记录题号
n=0
Callrewdr(e,op1,op2,op3)‘调用函数显示已存档题目答案
Option1.Value=op1‘显示已做题目答案
Option2.Value=op2
option3.Value=op3
Else‘如果未到达首记录则以前一条记录为当前记录
f=recset!
question'记录问题
g=recset!
ans1'记录选项1
h=recset!
ans2'记录选项2
i=recset!
ans3'记录选项3
e=recset!
qno'记录题号
Callrewdr(e,op1,op2,op3)‘调用函数显示已存档题目答案
Option1.Value=op1‘显示已做题目答案
Option2.Value=op2
option3.Value=op3
Callwer(e,f,g,h,i)‘调用函数显示题目及题号,选项
Callwdr(e,op1,op2,op3)‘调用函数对题目答案进行存档
EndIf
EndSub
做出选项后(或未做出选择),单击后一题:
ØPrivateSubC12_Click()
定义变量:
DimkAsInteger,fAsString,gAsString,hAsString,iAsString
Dimop1AsBoolean,op2AsBoolean,op3AsBoolean
记录option1~option3的Value属性值即前一题所作选择
op1=Option1.Value
op2=Option2.Value
op3=option3.Value
Callwdr(e,op1,op2,op3)‘调用函数对上一题所做答案进行存档
{PrivateSubwdr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)‘对题目答案进行存档
op1=Option1.Value
op2=Option2.Value
op3=option3.Value
chioce(e)=Abs(CInt(op1))&Abs(CInt(op2))&Abs(CInt(op3))将option1~option3的Value属性值转化为数字并连接为字符串赋值给字符串chioce(e)存档
EndSub}
Callwbr(e,op1,op2,op3)‘调用函数判断已做题目,并显示已做题目数
{PrivateSubwbr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)'判断已做题目,并显示已做题目数
DimoAsInteger,pAsInteger
l(e)=Abs(CInt(op1))+Abs(CInt(op2))+Abs(CInt(op3))
‘通过数据类型转换为数组l(e)赋值,若有选项被选中则其值为1,反之则为0
Foro=0Tom
p=p+l(o)
Next‘将每道题目对应的l(e)值累加则可得到所有已做题目数
sun3.Caption=p‘显示所有已做题目数
EndSub}
Option1.Value=False‘单选框Value属性值恢复默认值
Option2.Value=False
option3.Value=False
DimdbobjectAsDAO.Database:
DimrecsetAsDAO.Recordset
‘定义数据连接
Setdb=OpenDatabase("tiku.mdb",True,True,";pwd=tiku")
Setrecset=db.OpenRecordset("select*fromxz3")
‘读取相应数据表
n=n+1
recset.Moven
Ifrecset.EOFThen
S=MsgBox("已是最后一题!
",vbOKOnly+vbInformation,"考试系统")
recset.MoveLast
f=recset!
question'记录问题
g=recset!
ans1'记录选项1
h=recset!
ans2'记录选项2
i=recset!
ans3'记录选项3
e=recset!
qno'记录题号
n=m–1
Callrewdr(e,op1,op2,op3)调用函数显示已存档的题目答案
{PrivateSubrewdr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)
Dimreop1AsString,reop2AsString,reop3AsString
‘定义字符串变量,记录存档答案中的相应字节
Ifchioce(e)<>""Then若已做答则记录相应位置的值并进行处理以使其可以转化为逻辑型变量
reop1=0-Mid(chioce(e),1,1)
reop2=0-Mid(chioce(e),2,1)
reop3=0-Mid(chioce(e),3,1)
op1=CBool(reop1)将所读取处理后数据转换为逻辑型变量作为返回值返回
op2=CBool(reop2)
op3=CBool(reop3)
Else‘如果未做答,显示默认值
op1=False
op2=False
op3=False
EndIf
EndSub}
Option1.Value=op1‘显示已做题目答案
Option2.Value=op2
option3.Value=op3
Else
f=recset!
question'记录问题
g=recset!
ans1'记录选项1
h=recset!
ans2'记录选项2
i=recset!
ans3'记录选项3
e=recset!
qno'记录题号
Callrewdr(e,op1,op2,op3)调用函数显示已存档的题目答案
Option1.Value=op1‘显示已做题目答案
Option2.Value=op2
option3.Value=op3
Callwer(e,f,g,h,i)‘调用函数显示题目及题号,选项
Callwdr(e,op1,op2,op3)‘调用函数对题目答案进行存档EndIf
EndSub
ØPrivateSubC13_Click()‘查看成绩
DimduiAsInteger,{记录答对题目数}deAsInteger,{循环变量}jieguoAsString{用于在消息框中显示结果}
Forde=1Tom
Ifchioce(de)=answer(de)Then
dui=dui+1
EndIf
Next
jieguo="题!
"
jieguo=CStr(dui)&jieguo
S=MsgBox("您共做对了"&jieguo,vbOKOnly+vbInformation,"考试系统")‘弹出消息框,显示做对题目数
EndSub‘利用for循环将每道题目所作答案与标准答案进行一一比对,并记录答对题目数,用消息框显示出
PrivateSubC14_Click()‘退出单选题窗口,回到主菜单
n=0:
m=0:
e=0:
q=0
Unloadaone
Form1.Show
EndSub
ØPrivateSubwer(eAsInteger,fAsString,gAsString,hAsString,iAsString)'显示选项,题目及当前题号
DimaAsString,bAsString,cAsString
a=Chr(40)&Chr(65)&Chr(41):
b=Chr(40)&Chr(66)&Chr(41):
c=Chr(40)&Chr(67)&Chr(41)
sun1.Caption=e
sun4.Caption=f
Option1.Caption=a&g
Option2.Caption=b&h
option3.Caption=c&i
EndSub
ØPrivateSubwbr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)'判断已做题目,并显示已做题目数
DimoAsInteger,pAsInteger
l(e)=Abs(CInt(op1))+Abs(CInt(op2))+Abs(CInt(op3))
Foro=0Tom
p=p+l(o)
Next
sun3.Caption=p
EndSub
ØPrivateSubwdr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)‘对题目答案进行存档
op1=Option1.Value
op2=Option2.Value
op3=option3.Value
chioce(e)=Abs(CInt(op1))&Abs(CInt(op2))&Abs(CInt(op3))
EndSub
ØPrivateSubrewdr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)'显示已存档的题目答案
Dimreop1AsString,reop2AsString,reop3AsString
Ifchioce(e)<>""Then
reop1=0-Mid(chioce(e),1,1)
reop2=0-Mid(chioce(e),2,1)
reop3=0-Mid(chioce(e),3,1)
op1=CBool(reop1)
op2=CBool(reop2)
op3=CBool(reop3)
Else‘如果未做答,显示默认值
op1=False
op2=False
op3=False
EndIf
EndSub
三、测试程序的过程
i.对.ndb数据库操作及DAO对象的使用方式不够了解,导致程序无法正常运行。
(解决方法:
对样例程序进行编写调试,并查找相关数据库应用类书籍学习了解使用)
ii.开始编辑时,对整个程序结构设计不完整,边尝试边做,导致出现大量定义变量,程序结构臃肿.(解决方法:
对所有变量进行统一重定义,明确其功能及作用域)
iii.由于对各个函数的作用顺序及返回值对相互之间的影响把握不够,导致保存选项,读取选项和查看成绩所调用的函数三者之间相互影响,其功能无法正常实现,(解决方法:
列出框图,对程序进行逐语句调试,了解函数相互之间的作用关系及影响,找出正确的调用顺序及调用位置)
iv.初始设计时对判断已做题目并返回已做题目数的函数(wbr)作用要求不完善,导致在程序运行过称中出现异常值(已做题目数超过总题数或变为负值)(解决办法:
不断测试了解具体要求,据此对其进行完善)
v.用于返回以做题目答案的函数在运行过程中无法正常显示相关内容,其调用位置无法准确给出。
vi.再次打开窗体后,无法正常继续答题或修改答案,(由于退出窗体时用于计数的多个模块级变量值仍为上次运行结束时得值)。
(解决方法:
退出相应窗体时对用于计数的相关变量值清零)
{注:
由于对基础知识掌握不够熟练,对某些控件属性了解不全面,故在编写调试过程经常翻阅课本,且经常会出现诸如下标越界,类型不匹配等等大量错误。
}
四、课程设计总结
选择题目时对该题目的难度及要求有一定的心理预期,其中有从未听过的.mdb数据库应用和DAO对象,第一次着手开始做便感觉到对自己来说难度相当大。
因此便十分重视这件事,经常去图书馆浏览数据库应用的相关书籍,学习如何建立数据连接,合理应用数据库内容。
常常利用晚自习等空闲时间去机房进行程序的编写和测试,在此过程中开始对题目的基本框架有了大概的了解。
据此,我便开始第一个编写相对较为简单的选择题模块,然后在对其进行增补修改后再移植到其他模块中应用。
这样由简到繁最终成功按照要求按时完成了题目。
在编写过称中经常遇到瓶颈问题,这就离不开和室友之间的讨论了,虽然彼此选题不同,但在相互抱怨讨论的过程中,往往可以得到意外地灵感,所以在这次完成题目的过程中我深深的感受到相互讨论的重要性。
同时这次课程设计也极大的锻炼了我独自发现并解决问题的能力,这对于今后的学习拥有极大的帮助。
同时,能完全独立的通过自己的努力完成这个题目,虽然结果并不是非常完美,但我觉得这依然在一定程度上提高了我的自信心。
总的来说,这次课程设计的完成让我受益匪浅。
五、附件
(1)模块form1:
ØPrivateSubC1_Click()
aone.Show‘进入单选题答题界面
btwo.Hide‘隐藏其他窗体
cthere.Hide
dfour.Hide
Form1.Hide
EndSub
ØPrivateSubC2_Click()
btwo.Show‘进入多选题答题界面
cthere.Hide‘隐藏其他窗体
dfour.Hide
aone.Hide
Form1.Hide
EndSub
ØPrivateSubC3_Click()
cthere.Show‘进入填空题答题界面
btwo.Hide‘隐藏其他窗体
dfour.Hide
aone.Hide
Form1.Hide
EndSub
ØPrivateSubC4_Click()‘进入判断题答题界面
dfour.Show
btwo.Hide‘隐藏其他窗体
cthere.Hide
Form1.Hide
aone.Hide
EndSub
ØPrivateSubC5_Click()‘退出程序
End
EndSub
(2)模块aone
DimnAsInteger,mAsInteger,l(0To100)AsInteger,eAsInteger,qAsInteger,,jieshuAsInteger
Dimchioce(0To100)AsString,answer(0To100)AsString'保存答案,记录选项.n表示当前记录数,m表示总题目数,e表示题号,jieshu表示已做题目数,chioce数组记录所有做出答案,answer数组表示所有对应题目的答案,l数组用于记录选项计算已做题目数
ØPrivateSubForm_Load()
DimlAsInteger,itAsInteger,fAsString,gAsString,hAsString,iAsString
Dimop1AsBoolean,op2AsBoolean,op3AsBoolean
DimdbobjectAsDAO.Database
DimrecsetAsDAO.Recordset
Setdb=OpenDatabase("tiku.mdb",True,True,";pwd=tiu")
Setrecset=db.OpenRecordset("select*fromxz3")
recset.MoveLast‘将最后一条记录作为当前记录
m=recset!
qno‘记录总题目数
sun2.Caption=m‘显示总题目数
recset.MoveFirst‘将第一条记录作为当前记录
f=recset!
question'记录问题
g=recset!
ans1'记录选项1
h=recset!
ans2'记录选项2
i=recset!
ans3'记录选项3
e=recset!
qno'记录题号
DoWhileNotrecset.EOF'记录所有答案
answer(it)=recset!
ans
it=it+1
recset.MoveNext
Loop
Callwer(e,f,g,h,i)‘调用函数显示题目及题号,选项
Callrewdr(e,op1,op2,op3)‘调用函数显示已存档的答案
Option1.Value=op1
Option2.Value=op2
0ption3.Value=op3
EndSub
ØPrivateSubC11_Click()‘返回前
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 考试 系统 程序设计 报告