《试题库管理系统课程设计报告.doc》由会员分享,可在线阅读,更多相关《试题库管理系统课程设计报告.doc(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 兰州商学院陇桥学院 信息工程系课程设计报告设 计 题 目:试题库管理系统 系 别:信息工程系 专 业 (方 向):电子商务 年 级、 班: 学 生 姓 名: 学 生 学 号: 指 导 教 师:王万玉 年 月 日目录一、需求分析1(一)系统调查1(二)数据流图1(三)数据字典2二、概念结构设计4(一)数据模型4(二)局部E-R图4(三)用户,试题,试卷E-R图5(四)总体E-R图6三、逻辑结构设计7(一) 关系模式转化7四、物理结构设计8(一)设计索引10(二)简答题10(三)单选题12(四)多选题14(五)填空题16五、数据库实施和运行18(一)表结构设计18(二) SQL语句的实现20一、
2、需求分析(一)系统调查 对现行的试题库管理业务进行了详细的调查和研究是了解 系统需求和进行系统分析和设计的重要基础工作,因此要对我 们的试题库管理工作进行全面的细致的调查研究。首先与相关 的老师进行了交流和沟通,了解他们对试题库管理的看法,看 看有没有什么新的要求,在这个基础上,结合自身所掌握的知 识水平,量力而行开发相应的试题库管理系统。在调查中我们可以发现,高校的试题库是极其庞大的,如 果没有一个智能的用户需求 要设计一个性能良好的管理系统, 明确用户的应用环境对 系统的要求是首要的和基本的。本系统从以下四个方面对 用户需求进行了分析: (1)用户的需求信息: 出题老师可以看到题目 所属的
3、类型和题目所考察的内容以及试题的分值和 难度等级。当然这个权限也给管理员和系主任。 (2) 用户的处理要求: 管理员可以对试题库进 行插入和删除操作, 出题老师可以凭借自己自定义的 选题要求在试题库中选择自己需求的试题, 这个权限 也对系主任开放。 (3)对系统的适应性、通用性要求:要求系统 不仅能提供一门课程的试题库管理, 还要综合多么学 科进行管理,建立一个高效的试题库管理系统。 (4) 对系统的安全性要求, 要求进入系统必须 进行口令校验。(二)数据流图详细调查之后,结合现行试题库管理模式,为开放本 统而绘出的试题库管理业务流程图:题库系统试卷分析退出题库维护系统随机组卷1、 试题的录入
4、2、 试题的删除3、 试题的查找4、 试题的修改题文库 图1-2流程图(三)数据字典Course科目数据项字段名数据类型约束是否为空说明IDInt主键否题目编号NameVarchar(200)否科目名称DepartmentIdInt外键否系部编号MajorIDInt外键否专业编号SingleProblem单选数据项字段名数据类型约束是否为空说明IDInt主键否题目编号CourseIDInt外键否科目编号TitleVarchar(MAX)否题目内容AnswerAVarchar(500)否选项AAnswerBVarchar(500)否选项BAnswerCVarchar(500)否选项CAnswer
5、DVarchar(500)否选项DAnswerEVarchar(500)是选项EAnswerVarchar(2)否答案DiffIDInt外键否试题难度编号ZJIDInt外键否章节难度编号MultiProblem多选数据项字段名数据类型约束是否为空说明IDInt主键否题目编号CourseIDInt外键否科目编号TitleVarchar(MAX)否题目内容AnswerAVarchar(500)否选项AAnswerBVarchar(500)否选项BAnswerCVarchar(500)否选项CAnswerDVarchar(500)否选项DAnswerEVarchar(500)是选项EAnswerVa
6、rchar(500)否答案FAnswerVarchar(50)否答案DiffIDInt外键否试题难度编号ZJIDInt外键否章节难度编号JiandaProblem简答数据项字段名数据类型约束是否为空说明IDInt主键否试题编号CourseIDInt外键否科目编号TitleVarchar(MAX)否试题题目AnswerAVarchar(MAX)否试卷答案DiffIDInt外键否试题难度编号ZJIDInt外键否所属难度编号JudgeProblem判断数据项字段名数据类型约束是否为空说明IDInt主键否试题编号CourseIDInt外键否科目编号TitleVarchar(MAX)否试题题目Answe
7、rbit否答案DiffIDInt外键否试题难度编号ZJIDInt外键否所属难度编号Paper试卷数据项字段名数据类型约束是否为空说明PaperIDInt主键否试题编号CourseIDInt外键否科目编号PaperNameVarchar(200)否试卷名称PaperStateInt否试卷状态PaperDetail试卷详细数据项字段名数据类型约束是否为空说明IDInt主键否编号PaperIDInt外键否试卷编号TypeVarchar(10)否试卷状态TitleIDInt外键否试卷题目编号MarkInt否试题分值二、概念结构设计(一)数据模型 数据模型包含三种相互关联的信息:数据对象、描述数据对象的
8、属性及数据对象彼此间的相互连接的关系。 1)数据对象 数据对象是对软件必须理解的复合信息的表示。所谓复合信息是指具有一系列不同性质或属性的事物,因此只有单个值的事物(例如宽度)不是数据对象。 2)属性 属性定义了数据对象的性质。属性可以有下述的三种不同的特性之一,也就是说,可以用属性来:为数据对象的实例命名;描述该实例;引用一个数据对象的实例。此外,必须把一个或多个属性定义为“标识符”,即当我们希望找到数据对象的一个实例时,标识符属性成为“关键字”。 3)关系 数据对象彼此之间相互连接的方式称为关系,也称为联系。(二)局部E-R图难易度知识点题型试题图2-1 试题E-R图各题型个数知识点组合题
9、型组合间试卷图2-2试卷E-R图用户类型用户名用户密码图2-3用户E-R图(三)用户,试题,试卷E-R图普通用户管理管理员生成生成维护维护试卷组合试题(四)总体E-R图教师名称教师编号专业号专业号专业名称密码管理教师专业 1 n性别试卷号科目号 邮箱 n题型号试卷教电话教师号出生日期包含 m m包含卷头科目 1科目名称专业号科目号题型号 n n题型章节号提醒名称章节章节名 1包含科目号 n设计题章节号v答案题型号题型难易度题内容分数三、逻辑结构设计(一) 关系模式转化每创建一个数据库将自动生成四种题型几个各个章节的数据表,因为在录入题目的时候要显示书本章节信息以供用户使用。而在数据库里章节的存
10、放是没有规则也即它们的顺序不一定按照真实书本的章节顺序来存储的。但是在显示章节信息的时候必须按照书本的章节顺序来显示。所以分别设置如下的各张表的数据类型:创建“章节”数据表strSQL=CreateTable章节(_&编号intidentityprimarykey, _& 称varchar(50)notnull)objCn.ExecutestrSQLobjCn.CloseSetobjCn=NothingMsgBox 数据库已成功创建!图3-1 创建数据库由于数据库里章节的数量是不定的,故此种数据类型的变量必须是一种长度可变的类型才行。接下来的问题就是把这个变量记录的数据按一定顺序显示到comb
11、obox的控件里了。由于章节的数量还是比较多的,所以我选择了“改进的选择排序”,具体的排序算法代码实现如下:IfcmbChapterThenobjRs.Filter=章节=&cmbChapter.ItemData(cmbChapter.ListIndex)IfobjRs.RecordCount0ThenobjRs.MoveFirstShow_DataElseobjRs.Filter=章节=-99999Show_DataEndIf四、物理结构设计试卷分析的过程中,要考虑到一张试卷里面各个不同题目所在比例与试题库中该类试题占所有试题库中的比例之间的差异问题,所以在分析的过程中在成分不足或者成分超过
12、的情况需要设置提示,整个参数分析代码为:分析章节中的题数分配DimNews,i%,j%,strFilter$,Chapter%(3,2),k%News=Array(判断题,单选题,多选题,填空题)Fori=0To3IfVal(txtScore(i)0AndVal(lblRemain(i)0ThenMsgBoxNews(i)&试题剩余&lblRemain(i)&%未分配,vbCriticaltxtScale(i).SetFocusExitSubEndIfNext检查章节题量分配是否有效IfobjRsChapter.RecordCount=0ThenExitSubFori=0To3IfVal(tx
13、tScore(i)0ThenForj=0TocmbChapter(i).ListCount-1objRsChapter.MoveFirstobjRsChapter.Find名称=&cmbChapter(i).List(j)&strFilter=章节=&objRsChapter!编号SelectCaseiCase0检查判断题题量分配是否有效objRsJudge.Filter=strFilterIfobjRsJudge.RecordCountInt(cmbChapter(i).ItemData(j)*_txtCount(i)/100)ThenMsgBox中只有道试题,小题百分比最多,vbCriti
14、calcmbChapter(i).ListIndex=jExitSubEndIf小题数通过检验,统计各类难度试题数量Fork=0To2objRsJudge.Filter=strFilter&and难度=&kChapter(i,k)=Chapter(i,k)+objRsJudge.RecordCountNextCase1检查单选题题量分配是否有效objRsSingle.Filter=strFilterIfobjRsSingle.RecordCountInt(cmbChapter(i).ItemData(j)*_txtCount(i)/100)ThenMsgBox中只有道试题,小题百分比最多,vb
15、CriticalcmbChapter(i).ListIndex=jExitSubEndIf小题数通过检验,统计各类难度试题数量Fork=0To2objRsSingle.Filter=strFilter&and难度=&kChapter(i,k)=Chapter(i,k)+objRsSingle.RecordCountNextCase2检查多选题题量分配是否有效objRsMore.Filter=strFilterIfobjRsMore.RecordCountInt(cmbChapter(i).ItemData(j)*_txtCount(i)/100)ThenMsgBox中只有道试题,小题百分比最多
16、,vbCriticalcmbChapter(i).ListIndex=jExitSubEndIf小题数通过检验,统计各类难度试题数量Fork=0To2objRsMore.Filter=strFilter&And难度=&kChapter(i,k)=Chapter(i,k)+objRsMore.RecordCountNextCase3检查填空题题量分配是否有效objRsSpace.Filter=strFilterIfobjRsSpace.RecordCountInt(cmbChapter(i).ItemData(j)*_txtCount(i)/100)ThenMsgBox中只有道试题,小题百分比最
17、多,vbCriticalcmbChapter(i).ListIndex=jExitSubEndIf小题数通过检验,统计各类难度试题数量Fork=0To2objRsSpace.Filter=strFilter&and难度=&kChapter(i,k)=Chapter(i,k)+objRsSpace.RecordCountNextEndSelectNextEndIfNext按难度检查题量分配是否合理Fori=0To3检查难度属于“难”的题题量分配是否有效IfChapter(i,0)Int(Val(txtCount(i)*txtLevel0(i)/100)ThenMsgBoxNews(i)&题库中难
18、度属于“难”的题只有道,难度百分比最大可为,vbCriticaltxtLevel0(i).SetFocusExitSubEndIf检查难度属于“一般”的题题量分配是否有效IfChapter(i,1)Int(Val(txtCount(i)*txtLevel1(i)/100)ThenMsgBoxNews(i)&题库中难度属于“一般”的题只有道,难度百分比最大可为,vbCriticaltxtLevel1(i).SetFocusExitSubEndIf检查难度属于“容易”的题题量分配是否有效IfChapter(i,2)Int(Val(txtCount(i)*txtLevel2(i)/100)ThenM
19、sgBoxNews(i)&题库中难度属于“容易”的题只有道,难度百分比最大可为,vbCriticaltxtLevel2(i).SetFocusExitSubEndIfNextMsgBox试卷参数设置正确,可以生成试卷!,vbInformation取消各个记录集的过虑设置objRsSpace.Filter=objRsMore.Filter=objRsSingle.Filter=objRsJudge.Filter=cmdMakePaper.Enabled=TrueExitSub(一)设计索引在自动生成试卷里最主要的一点就是如何生成一个覆盖知道点广且试题不重复的试卷。其中的关键算法在于如何生成一个不
20、重复的随机数序列。同时,为了防止生成时间过长或者说代码编写出错时造成程序运行不停止,需要设置一个时间函数,控制试卷生成时间,本文定义的是30秒,如果超过这个时间将停止生成试卷并提示错误。程序如下:RandomizeTimerDimLevel0%(3),Level1%(3),Level2%(3),i%,n%,strTest$,strAnswer$DimCount%(3),Selected$,Chapter%(),Ok,Abcd,more%,doTimeAsLongdoTime=Timer开始计算生成试题时间Abcd=Array(A,B,C,D)ReDimChapter(3,cmbChapter(
21、0).ListCount-1)计算各类题型的难度小题数Fori=0To3n=Val(txtCount(i)Count(i)=nLevel0%(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)NextFori=0To3cmbChapter(i).ItemData(0)=20cmbChapt
22、er(i).ItemData(1)=30cmbChapter(i).ItemData(2)=30cmbChapter(i).ItemData(3)=20Next计算个章节各类题型的小题数Fori=0To3Forj=0TocmbChapter(0).ListCount-1Chapter(i,j)=Int(cmbChapter(i).ItemData(j)*Val(txtCount(i)/100)Nextn=0Forj=0TocmbChapter(0).ListCount-1n=n+Chapter(i,j)NextIfnVal(txtCount(i)ThenChapter(i,0)=Chapter
23、(i,0)+Val(txtCount(i)-nNext将cmbchapter列表itemdata中的百分比数转换为章节编号Fori=0To3Forj=0TocmbChapter(0).ListCount-1objRsChapter.MoveFirstobjRsChapter.Find”名称=”&cmbChapter(i).List(j)&cmbChapter(i).ItemData(j)=objRsChapter!编号NextNext生成试卷Fori=0To3Selected=SelectCaseiCase0选择判断题strTest=strTest&(二)简答题(共&txtCount(i)_&
24、,每小题&txtAvg(i)&分,共&txtScore(i)&分)&vbCrLfj=1WhileCount(i)0随即产生一个未选择的试题的记录序号DoIfTimer-doTime30ThenMsgBox本次生成判断题花费时间过长,退出重试!,vbCriticalExitSubEndIfn=Int(Rnd*objRsJudge.RecordCount+1)LoopUntilInStr(Selected,#&n)=0Selected=Selected&nobjRsJudge.MoveFirstobjRsJudge.Moven-1SelectCaseobjRsJudge!难度Case0
25、IfLevel0(i)0Then“检查本章试题是否已选够”Forn=0To3IfcmbChapter(i).ItemData(n)=objRsJudge!章节ThenExitForNextIfChapter(i,n)0ThenstrTest=strTest&j&、&objRsJudge!题干&()&vbCrLfstrAnswer=strAnswer&j&、IfobjRsJudge!答案ThenstrAnswer=strAnswer&错误ElsestrAnswer=strAnswer&正确EndIfstrAnswer=strAnswer&vbCrLfj=j+1Chapter(i,n)=Chapter(i,n)-1Level0(i)=Level0(i)-1Count(i)=Count(i)-1IfNotIsNull(objRsJudge!图片)Then_strTest=strTest&本题图片:&objRsJudge!图片EndIfEndIfCase1IfLevel1(i)0Then检查本章试题是否已选够Forn=0To3IfcmbChapter(i).ItemData(n)=objRsJudge!章节ThenExitFor
限制150内