考试系统程序设计报告Word下载.docx
《考试系统程序设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《考试系统程序设计报告Word下载.docx(34页珍藏版)》请在冰豆网上搜索。
同时可使用“查看成绩”,程序会显示本题型共做对多少题。
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
op1=Option1.Value
op2=Option2.Value
op3=option3.Value
Callwdr(e,op1,op2,op3)‘记录上一题的答案Callwbr(e,op1,op2,op3)‘判断已做题目,显示已做题目数
DimdbobjectAsDAO.Database
DimrecsetAsDAO.Recordset‘定义数据库连接
True,True,"
pwd=tiku"
‘打开数据库,读取记录数据
n=n-1
recset.Moven
Ifrecset.BOFThen‘判断是否已到达首条记录,能否继续读取前一条记录
S=MsgBox("
已是第一题!
"
vbOKOnly+vbInformation,"
考试系统"
)‘如果已到达首记录则弹出消息框提示,并显示第一条记录
recset.MoveFirst
ans3'
n=0
Callrewdr(e,op1,op2,op3)‘调用函数显示已存档题目答案
Option1.Value=op1‘显示已做题目答案
option3.Value=op3
Else‘如果未到达首记录则以前一条记录为当前记录
记录选项1
ans2'
Option1.Value=op1‘显示已做题目答案
Callwer(e,f,g,h,i)‘调用函数显示题目及题号,选项
Callwdr(e,op1,op2,op3)‘调用函数对题目答案进行存档
EndIf
做出选项后(或未做出选择),单击后一题:
PrivateSubC12_Click()
定义变量:
DimkAsInteger,fAsString,gAsString,hAsString,iAsString
记录option1~option3的Value属性值即前一题所作选择
op1=Option1.Value
op2=Option2.Value
Callwdr(e,op1,op2,op3)‘调用函数对上一题所做答案进行存档
{PrivateSubwdr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)‘对题目答案进行存档
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‘显示所有已做题目数
Option1.Value=False‘单选框Value属性值恢复默认值
Option2.Value=False
option3.Value=False
DimdbobjectAsDAO.Database:
‘定义数据连接
‘读取相应数据表
n=n+1
Ifrecset.EOFThen
S=MsgBox("
已是最后一题!
recset.MoveLast
ans1'
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
Option1.Value=op1‘显示已做题目答案
Option2.Value=op2
Else
记录选项3
qno'
记录题号
Callwdr(e,op1,op2,op3)‘调用函数对题目答案进行存档EndIf
PrivateSubC13_Click()‘查看成绩
DimduiAsInteger,{记录答对题目数}deAsInteger,{循环变量}jieguoAsString{用于在消息框中显示结果}
Forde=1Tom
Ifchioce(de)=answer(de)Then
dui=dui+1
EndIf
Next
jieguo="
题!
jieguo=CStr(dui)&
jieguo
您共做对了"
&
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)&
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
PrivateSubwbr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)'
Foro=0Tom
sun3.Caption=p
PrivateSubwdr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)‘对题目答案进行存档
Abs(CInt(op3))
PrivateSubrewdr(eAsInteger,op1AsBoolean,op2AsBoolean,op3AsBoolean)'
显示已存档的题目答案
Ifchioce(e)<
Then
op1=CBool(reop1)
三、测试程序的过程
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
PrivateSubC2_Click()
btwo.Show‘进入多选题答题界面
cthere.Hide‘隐藏其他窗体
aone.Hide
PrivateSubC3_Click()
cthere.Show‘进入填空题答题界面
PrivateSubC4_Click()‘进入判断题答题界面
dfour.Show
PrivateSubC5_Click()‘退出程序
End
(2)模块aone
PrivateSubForm_Load()
PrivateSubC11_Click()‘返回前