数据库原理课程设计题库管理系统.docx
《数据库原理课程设计题库管理系统.docx》由会员分享,可在线阅读,更多相关《数据库原理课程设计题库管理系统.docx(53页珍藏版)》请在冰豆网上搜索。
数据库原理课程设计题库管理系统
摘要
一般情况教师想出一份试卷,要么到庞大的题库里一道一道的把题找出来,或是从几本相关的书里把题一道一道挑出来。
这样即费时又费力,而且很难保证试题的覆盖面和把握好试卷的难度。
正是为了能够帮助教师轻松的出一份高质量的试卷而开发了本系统。
以做一个数据库原理这门课的题库系统为例,为了达到预期的标准本文最终选择了txt文本文件做为本系统的终端输出。
并且实现了以下主要功能试题数据库的创建、不同章节不同难度的试题录入、图片保存、试卷分析、自动生成试卷等功能,多次运行证明本系统运行较为稳定且各项功能运行得比较正确,基本达到了预期的要求。
关键词:
VisualBasic6.0,SQLServer2000,题库管理系统
1系统功能概述
1.1系统功能
系统功能介绍:
1、创建题库:
本系统适合不同科目的老师进行试题的录入,可根据不同的课程名创建不同的试题数据库,且自动生成简答题、单选题、多选题、填空题、难度值四张表。
题库维护系统:
该系统是适合不同课程的老师录入考试试题,本系统包括了题文的录入、题文的查找、题文的删除和修改,章节的设定,分值的设置,试题的难度设置,试卷分析,以及生成试卷的功能。
2、生成卷:
该系统是本软件的主要的功能的体现,不受分值和难易程度的限制,可以人为定义,同时在分析的过程中那判定合理性,并提示最高设置值,让老师更合理地考察不同程度的学生的学习情况。
3、各个试题数据库中主要包含以下实体及其属性:
(1)简答题(旅游团编号、旅游点名称、地理位置、旅游天数,价格,出发日期,返回日期)
(2)单选题(导游编号、导游姓名、性别、联系电话)
(3)多选题(游客编号、游客姓名、性别、年龄、联系电话)
(4)填空题(用户名、密码)
1.2系统结构总图
流程图:
题库系统
试卷分析
题库维护系统
退出
1试题的录入
2试题的删除
3试题的查找
4试题的修改
随机组卷
题文库
结构图:
1.3系统E-R模型
2数据库设计
2.1需求分析
1)设计试题生成功能,试题能分布整个教学内容
2)设计试题的难易程度分析功能
3)具有试题的答案生成功能
4)数据库设计及维护
5)程序的其它选项设置
2.2功能分析
1.每创建一个数据库将自动生成四种题型几个各个章节的数据表,因为在录入题目的时候要显示书本章节信息以供用户使用。
而在数据库里章节的存放是没有规则也即它们的顺序不一定按照真实书本的章节顺序来存储的。
但是在显示章节信息的时候必须按照书本的章节顺序来显示。
所以分别设置如下的各张表的数据类型:
'创建“章节”数据表
strSQL="CreateTable章节("_
&"编号intidentityprimarykey,"_
&"名称varchar(50)notnull)"
objCn.ExecutestrSQL
objCn.Close
SetobjCn=Nothing
MsgBox"数据库已成功创建!
"
由于数据库里章节的数量是不定的,故此种数据类型的变量必须是一种长度可变的类型才行。
接下来的问题就是把这个变量记录的数据按一定顺序显示到combobox的控件里了。
由于章节的数量还是比较多的,所以我选择了“改进的选择排序”,具体的排序算法代码实现如下:
IfcmbChapter<>""Then
objRs.Filter="章节="&cmbChapter.ItemData(cmbChapter.ListIndex)
IfobjRs.RecordCount>0ThenobjRs.MoveFirst
Show_Data
Else
objRs.Filter="章节=-99999"
Show_Data
EndIf
2.试卷分析的过程中,要考虑到一张试卷里面各个不同题目所在比例与试题库中该类试题占所有试题库中的比例之间的差异问题,所以在分析的过程中在成分不足或者成分超过的情况需要设置提示,整个参数分析代码为:
'分析章节中的题数分配
DimNews,i%,j%,strFilter$,Chapter%(3,2),k%
News=Array("判断题","单选题","多选题","填空题")
Fori=0To3
IfVal(txtScore(i))<>0AndVal(lblRemain(i))<>0Then
MsgBoxNews(i)&"试题剩余"&lblRemain(i)&"%未分配",vbCritical
txtScale(i).SetFocus
ExitSub
EndIf
Next
'检查章节题量分配是否有效
IfobjRsChapter.RecordCount<=0ThenExitSub
Fori=0To3
IfVal(txtScore(i))<>0Then
Forj=0TocmbChapter(i).ListCount-1
objRsChapter.MoveFirst
objRsChapter.Find"名称='"&cmbChapter(i).List(j)&"'"
strFilter="章节="&objRsChapter!
编号
SelectCasei
Case0'检查判断题题量分配是否有效
objRsJudge.Filter=strFilter
IfobjRsJudge.RecordCounttxtCount(i)/100)Then
MsgBox"<"&News(i)&"><"&objRsChapter!
名称&">中只有<"_
&objRsJudge.RecordCount&">道试题,小题百分比最多<"_
&Int(objRsJudge.RecordCount/Val(txtCount(i))*100)_
&">",vbCritical
cmbChapter(i).ListIndex=j
ExitSub
EndIf
'小题数通过检验,统计各类难度试题数量
Fork=0To2
objRsJudge.Filter=strFilter&"and难度="&k
Chapter(i,k)=Chapter(i,k)+objRsJudge.RecordCount
Next
Case1'检查单选题题量分配是否有效
objRsSingle.Filter=strFilter
IfobjRsSingle.RecordCounttxtCount(i)/100)Then
MsgBox"<"&News(i)&"><"&objRsChapter!
名称&">中只有<"_
&objRsSingle.RecordCount&">道试题,小题百分比最多<"_
&Int(objRsSingle.RecordCount/Val(txtCount(i))*100)_
&">",vbCritical
cmbChapter(i).ListIndex=j
ExitSub
EndIf
'小题数通过检验,统计各类难度试题数量
Fork=0To2
objRsSingle.Filter=strFilter&"and难度="&k
Chapter(i,k)=Chapter(i,k)+objRsSingle.RecordCount
Next
Case2'检查多选题题量分配是否有效
objRsMore.Filter=strFilter
IfobjRsMore.RecordCounttxtCount(i)/100)Then
MsgBox"<"&News(i)&"><"&objRsChapter!
名称&">中只有<"_
&objRsMore.RecordCount&">道试题,小题百分比最多<"_
&Int(objRsMore.RecordCount/Val(txtCount(i))*100)_
&">",vbCritical
cmbChapter(i).ListIndex=j
ExitSub
EndIf
'小题数通过检验,统计各类难度试题数量
Fork=0To2
objRsMore.Filter=strFilter&"And难度="&k
Chapter(i,k)=Chapter(i,k)+objRsMore.RecordCount
Next
Case3'检查填空题题量分配是否有效
objRsSpace.Filter=strFilter
IfobjRsSpace.RecordCounttxtCount(i)/100)Then
MsgBox"<"&News(i)&"><"&objRsChapter!
名称&">中只有<"_
&objRsSpace.RecordCount&">道试题,小题百分比最多<"_
&Int(objRsSpace.RecordCount/Val(txtCount(i))*100)&">",vbCritical
cmbChapter(i).ListIndex=j
ExitSub
EndIf
'小题数通过检验,统计各类难度试题数量
Fork=0To2
objRsSpace.Filter=strFilter&"and难度="&k
Chapter(i,k)=Chapter(i,k)+objRsSpace.RecordCount
Next
EndSelect
Next
EndIf
Next
'按难度检查题量分配是否合理
Fori=0To3
'检查难度属于“难”的题题量分配是否有效
IfChapter(i,0)MsgBoxNews(i)&"题库中难度属于“难”的题只有<"_
&Chapter(i,0)&">道,难度百分比最大可为<"_
&Int(Chapter(i,0)/Val(txtCount(i))*100)_
&">",vbCritical
txtLevel0(i).SetFocus
ExitSub
EndIf
'检查难度属于“一般”的题题量分配是否有效
IfChapter(i,1)MsgBoxNews(i)&"题库中难度属于“一般”的题只有<"_
&Chapter(i,1)&">道,难度百分比最大可为<"_
&Int(Chapter(i,1)/Val(txtCount(i))*100)_
&">",vbCritical
txtLevel1(i).SetFocus
ExitSub
EndIf
'检查难度属于“容易”的题题量分配是否有效
IfChapter(i,2)MsgBoxNews(i)&"题库中难度属于“容易”的题只有<"_
&Chapter(i,2)&">道,难度百分比最大可为<"_
&Int(Chapter(i,2)/Val(txtCount(i))*100)_
&">",vbCritical
txtLevel2(i).SetFocus
ExitSub
EndIf
Next
MsgBox"试卷参数设置正确,可以生成试卷!
",vbInformation
'取消各个记录集的过虑设置
objRsSpace.Filter=""
objRsMore.Filter=""
objRsSingle.Filter=""
objRsJudge.Filter=""
cmdMakePaper.Enabled=True
ExitSub
3.在自动生成试卷里最主要的一点就是如何生成一个覆盖知道点广且试题不重复的试卷。
其中的关键算法在于如何生成一个不重复的随机数序列。
同时,为了防止生成时间过长或者说代码编写出错时造成程序运行不停止,需要设置一个时间函数,控制试卷生成时间,本文定义的是30秒,如果超过这个时间将停止生成试卷并提示错误。
程序如下:
RandomizeTimer
DimLevel0%(3),Level1%(3),Level2%(3),i%,n%,strTest$,strAnswer$
DimCount%(3),Selected$,Chapter%(),Ok,Abcd,more%,doTimeAsLong
doTime=Timer'开始计算生成试题时间
Abcd=Array("A","B","C","D")
ReDimChapter(3,cmbChapter(0).ListCount-1)
'计算各类题型的难度小题数
Fori=0To3
n=Val(txtCount(i))
Count(i)=n
Level0%(i)=Int(Val(txtLevel0(i))*n/100)
Level1%(i)=Int(Val(txtLevel1(i))*n/100)
Level2%(i)=Int(Val(txtLevel2(i))*n/100)
IfLevel0%(i)+Level1%(i)+Level2%(i)<>nThen_
Level1%(i)=n-Level0%(i)-Level2%(i)
Next
Fori=0To3
cmbChapter(i).ItemData(0)=20
cmbChapter(i).ItemData
(1)=30
cmbChapter(i).ItemData
(2)=30
cmbChapter(i).ItemData(3)=20
Next
'计算个章节各类题型的小题数
Fori=0To3
Forj=0TocmbChapter(0).ListCount-1
Chapter(i,j)=Int(cmbChapter(i).ItemData(j)*Val(txtCount(i))/100)
Next
n=0
Forj=0TocmbChapter(0).ListCount-1
n=n+Chapter(i,j)
Next
Ifn<>Val(txtCount(i))ThenChapter(i,0)=Chapter(i,0)+Val(txtCount(i))-n
Next
'将cmbchapter列表itemdata中的百分比数转换为章节编号
Fori=0To3
Forj=0TocmbChapter(0).ListCount-1
objRsChapter.MoveFirst
objRsChapter.Find"名称='"&cmbChapter(i).List(j)&"'"
cmbChapter(i).ItemData(j)=objRsChapter!
编号
Next
Next
'生成试卷
Fori=0To3
Selected=""
SelectCasei
Case0'选择判断题
strTest=strTest&"一、简答题。
(共"&txtCount(i)_
&",每小题"&txtAvg(i)&"分,共"&txtScore(i)&"分)"&vbCrLf
strAnswer=strAnswer&"一、简答题。
(共"&txtCount(i)_
&",每小题"&txtAvg(i)&"分,共"&txtScore(i)&"分)"&vbCrLf
j=1
WhileCount(i)>0
'随即产生一个未选择的试题的记录序号
Do
IfTimer-doTime>30Then
MsgBox"本次生成判断题花费时间过长,退出重试!
",vbCritical
ExitSub
EndIf
n=Int(Rnd*objRsJudge.RecordCount+1)
LoopUntilInStr(Selected,"#"&n&"#")=0
Selected=Selected&"#"&n&"#"
objRsJudge.MoveFirst
objRsJudge.Moven-1
SelectCaseobjRsJudge!
难度
Case0
IfLevel0(i)>0Then
'检查本章试题是否已选够
Forn=0To3
IfcmbChapter(i).ItemData(n)=objRsJudge!
章节ThenExitFor
Next
IfChapter(i,n)>0Then
strTest=strTest&j&"、"&objRsJudge!
题干&"()"&vbCrLf
strAnswer=strAnswer&j&"、"
'IfobjRsJudge!
答案Then
'strAnswer=strAnswer&"错误"
'Else
'strAnswer=strAnswer&"正确"
'EndIf
strAnswer=strAnswer&vbCrLf
j=j+1
Chapter(i,n)=Chapter(i,n)-1
Level0(i)=Level0(i)-1
Count(i)=Count(i)-1
IfNotIsNull(objRsJudge!
图片)Then_
strTest=strTest&"本题图片:
"&objRsJudge!
图片
EndIf
EndIf
Case1
IfLevel1(i)>0Then
'检查本章试题是否已选够
Forn=0To3
IfcmbChapter(i).ItemData(n)=objRsJudge!
章节ThenExitFor
Next
IfChapter(i,n)>0Then
strTest=strTest&j&"、"&objRsJudge!
题干&"()"&vbCrLf
strAnswer=strAnswer&j&"、"
'IfobjRsJudge!
答案Then
'strAnswer=strAnswer&"错误"
'Else
'strAnswer=strAnswer&"正确"
'EndIf
strAnswer=strAnswer&vbCrLf
j=j+1
Chapter(i,n)=Chapter(i,n)-1
Level1(i)=Level1(i)-1
Count(i)=Count(i)-1
IfNotIsNull(objRsJudge!
图片)Then_
strTest=strTest&"本题图片:
"&objRsJudge!
图片
EndIf
EndIf
Case2
IfLevel2(i)>0Then
'检查本章试题是否已选够
Forn=0To3
IfcmbChapter(i).ItemData(n)=objRsJudge!
章节ThenExitFor
Next
IfChapter(i,n)>0Then
strTest=strTest&j&"、"&objRsJudge!
题干&"()"&vbCrLf
strAnswer=strAnswer&j&"、"
strAnswer=strAnswer&vbCrLf
j=j+1
Chapter(i,n)=Chapter(i,n)-1
Level2(i)=Level2(i)-1
Count(i)=Count(i)-1
IfNotIsNull(objRsJudge!
图片)Then_
strTest=strTest&"本题图片:
"&objRsJudge!
图片
EndIf
EndIf
EndSelect
Wend
Case1'卸载单选题
strTest=strTest&"二、单选题。
(共"&txtCount(i)_
&",每小题"&txtAvg(i)&"分,共"&txtScore(i)&"分)"&vbCrLf
strAnswer=strAnswer&"二、单选题。
(共"&txtCount(i)_
&",每小题"&txtAvg(i)&"分,共"&txtScore(i)&"分)"&vbCrLf
j=1
WhileCount(i)>0
'随即产生一个未选择的试题的记录序号
Do
IfTimer-doTime>30Then
MsgBox"本次生成单选题试题花费时间过长,退出重试!
",vbCritical
ExitSub
EndIf
n=Int(Rnd*objRsSingle.RecordCount+1)
LoopUnt