学生成绩管理系统VB+SQL(共26页).doc
精选优质文档-倾情为你奉上课 程 设 计 任 务 书题 目 学生成绩管理系统 系 (部) 数理系 专 业 班 级 学生姓名 学 号 12 月 21 日至 12 月 25 日 共 1 周指导教师(签字) 系 主 任(签字) 年 月 日学生成绩管理系统通过完成从用户需求分析、概念结构设计,逻辑结构设计等一系列的数据库设计到上机编程、调试和应用等全过程,进一步理解和掌握教材中的相关内容。一实验要求 (1)先对选定的实验做简单的需求分析;(2)做出数据流图和数据字典;(3)在数据流图和字典的基础上做出E-R图(概念结构设计);(4)在E-R图基础上进行关系模式设计(至少满足3NF)(逻辑结构设计);(5)根据需求分析的各种数据请求得出各种视图以及各种约束、规则、触发器脚本描述;(6)根据第(5)的内容在SQL-SERVER中设计中实例的数据库;(7)用自己熟悉的一门语言进行设计的功能的实现(8)整理前面几步的文档和程序源码,可执行程序,形成最终的实验报告。(9)实验报告的最后写出本次实验完成中遇到的问题及解决方法二需求分析1.功能需求本系统开发的目的,就是通过系统开发,实现课程管理有关工作的计算机化,提高关键环节的处理速度和规范化,并对有关的工作进行集成和重组,通过网络系统实现集中管理、分散操作,提高选课管理工作的质量和效率。通过对学校的选课及成绩管理工作进行实际调查,学生可以自由选择课程、选老师,学生注册的行政班和教学班是游离的,开发工作需要涉及任课教师、学生、管理员(教务工作人员)三种用户。2.学生需求在学校规定的选课期间,学生通过任何一台连接因特网计算机的浏览器就能进行网上选课。学生以用户名和密码进入选课系统。选课系统会根据用户名和密码自动识别所在的系,然后显示出与学生有关的课程列表。系统必须控制某一门课程在学期间只能选一次。在学生选课时能自动进行有关逻辑判断,如:是否选课超过了规定的门数,是否选择了不符合预修条件的课程,是否选择的课程超过此课程最大选择人数,只有符合要求的选择才能选课成功。学生可以更改部分个人信息如密码,电话号码等;学生可以查询已修课程成绩和已选课程信息。3.教师需求任课教师登录后,可以查看自己所教课程的课程表;对于同一学期内有多门课程的教师,需要选择具体课程后,才能查看已选这门课程的学生信息:期末,教师可以上传这些学生的成绩。4.管理员需求系统管理员登录后,可以对学生,教师,课程,教学班级的基本信息进行添加,修改,删除等工作。课程安排是选课的核心,只有按照实际的教学情况安排出每个学期必修和选修的课程,才能保证选课的顺利进行。在每学期,学生选课前,各院系管理员必须在该院系培养方案中录入本学期可以开设的课程和排课安排,对于需要预修条件的课程,需要设置好预修条件。基础部管理员负责公共课的课程开设和排课安排。其中排课及教学班级的安排上要保证同一个教师在同一时间只能上一门课程;同一个教室同一时间也只能开一门课程。三数据分析与建模1.数据流图和数据字典顶层图:数据字典:数据流项目:学生信息=姓名+学号+性别+年龄+专业+总学分成绩单=姓名+课目+成绩数据项条目:数据项名:成绩类型:int长度:4范围:100-0加工条目:处理过程:过程名:学籍管理系统输入:学生信息,考试成绩,学生记录输出:统计表,成绩单数据字典:数据存储:数据存储名:学生记录组成:姓名+学号+性别+年龄+专业+总学分处理过程:处理过程名:录入存储处理输入:学生信息处理要求:如果没有所输入的学生记录,则建立新的学生记录,存储基本情况和课目成绩处理过程名:查询处理输入:学生信息,课程号输出:成绩处理要求:根据学生的学号查询相应的成绩处理过程名:统计处理输入:学生考试成绩输出:平均成绩,排名成绩数据字典:数据流:新生信息=入学时间+姓名+年龄+专业+性别合格单=姓名+专业处理过程:处理过程名:审查输入:学生信息输出:合格单处理要求:根据学生信息判断是否是新生处理过程名:是否是新生输入:合格单输出:新生信息处理要求:根据合格单建立新生信息处理过程名:录入存储学生信息,各科成绩输入:新生信息,考试成绩输出:本次考试成绩数据字典:数据存储:数据存储名:考试成绩组成:姓名+专业+成绩+学号组织方式:一学号为关键字处理过程:处理过程名:有效性检查输入:学号,课程号输出:有效查询处理要求:根据所输入的信息查询有效性处理过程名:成绩查询输入:考试成绩输出:成绩处理要求:根据考试成绩查询成绩处理过程:处理过程名:统计选择输入:学生记录输出:按规定统计成绩处理要求:根据所输入学生记录查询成绩2.E_R图1) 学生实体E-R图2)课程实体E-R图3) 教师实体E-R图4)各实体之间的E-R图3.ER图转换为关系模式:1)学生(XS)(学号(sno),姓名(sname),专业(sdept),性别(ssex),出生日期(sbirth),总学分(all_credit))学生表:主码:学号(sno)函数依赖:sno U.此表中,不存在非主属性对码的部分依赖,传递依赖,以及主属性对码的部分依赖和传递依赖,故满足3NF2)课程(KC)(课程号(cno),课程名(cname),开课学期(term),学时(class_hour),学分(credit))课程表:主码:课程号(cno)函数依赖:cno U此表中不存在非主属性对码的部分依赖,传递依赖,以及主属性对码的部分依赖和传递依赖,故满足3NF3)选课(XS_KC)(学号(sno),课程号(cno),成绩(grade))选课表:主码:(学号,课程号)外码:学号,课程号函数依赖:(sno,cno) U此表中不存在非主属性对码的部分依赖,传递依赖,以及主属性对码的部分依赖和传递依赖,故满足3NF4)教师(TCH)(编号(tno),姓名(tname),性别(tsex),出生日期(tbirth),职称(professional),专业(department))教师表:主码:编号(tno)函数依赖:tno U此表中不存在非主属性对码的部分依赖,传递依赖,以及主属性对码的部分依赖和传递依赖,故满足3NF5)授课(TCH_KC)(教师编号(tno),课程号(cno),上课地点(place))授课表:主码:(教师编号,课程号)外码:教师编号,课程号函数依赖:(tno,cno)U此表中不存在非主属性对码的部分依赖,传递依赖,以及主属性对码的部分依赖和传递依赖,故满足3NF4.逻辑设计结果:数据库表名XS(学生)字段名数据类型含义说明空值情况备注SnoChar(10)学号不能为空主键SnameChar(10)姓名不能为空ssexChar(10)性别可以为空只能取“男”“女”,默认为“男”Sbirthdate出生日期可以空SdeptChar(10)所在专业可以空All_creditInt总学分可以空数据库表名KC(课程)字段名数据类型含义说明空值情况备注CnoChar(10)课程号不能为空主键SnameChar(10)课程名不能为空creditint学分可以空Class_hourInt课时数可以空TermInt开课学期可以空数据库表名TCH(教师)字段名数据类型含义说明空值情况备注tnoChar(10)教师号不能为空主键tnameChar(10)姓名不能为空完全依赖Tno,是uniqueTbirthdate出生日期可以空TsexChar(10)性别可以空只能取“男”“女”,默认为男ProfessionalChar(10)职称可以空DepartmentChar(10)专业可以空数据库表名XS_KC(选课)字段名数据类型含义说明空值情况备注CnoChar(10)课程号不能为空主码 SnoChar(10)学号不能为空主码Gradeint成绩可以空数据库表名TCH_KC(授课)字段名数据类型含义说明空值情况备注TnoChar(10)教师编号不能为空主码 CnoChar(10)课程号不能为空主码PlaceChar(10)授课地点可以空四数据库应用开发与运行 此为主界面,有五个按钮,可进行查询,修改等操作。上图为学生信息查询窗口,可按学号,姓名,专业进行查询下图学生选课信息窗口,双击上图学生信息查询窗口中表格左边,可弹出此窗口显示该学生选课信息。上图为教师信息查询窗口,可按教师编号,姓名,职称部门进行查询,双击表格左部可显示教师授课信息,如下图所示。此为学生信息修改窗口,单击一行,可在上面文本框中显示该生信息,并进行插入,修改,删除等操作。此为学生成绩录入窗口,单击一行可现实该生学号及所选课程,并在成绩文本框中进行添加及修改该课程成绩操作。此为学生选课窗口,单击一行显示该行信息,可进行选课,删除操作五 结果分析、结论与体会 在这次课程设计中,我遇到的困难很多,在解决它们的同时我又学到了很多,受益匪浅,特别是如何分析、建立、开发一个系统。 在一个系统开发的过程中编码不是重要的,重要的是分析系统、建立起系统模型。在分析一个系统前,分析人员必须要对将要开发的系统所涉及到的各方面知识有一个认识,然后将系统的模型建立起来。 在程序编写中,我认识到软件要有简便的界面,良好的程序风格。拥有这些条件,程序的可读性才会好,开发的复杂度才能大大减少,修改代码时更加容易下手。 我认为,所谓友好的界面,就是用户需要的界面,力求简便全面。所以设计一个界面时,开发人员必须要了解用户的想法,从用户的角度去设计,当然,开发不能全听用户的意见,在详细分析了系统后,开发人员可以向用户提出一些修改的意见,在双方多次交流后定出程序所需的功能,以决定界面的实现。 在编码中,良好的编程风格与习惯是提高工作效率的一个重要方面,而且良好的编程风格与习惯也是使软件便于维护的基础。那如何是良好的编程风格与习惯呢?我认为主要是程序的模块化、必要的注释。所谓模块化就是使程序的功能实现分成多个单独的功能模块,而不能在一大段代码中实现多个功能,如果这样做,别的人是非常难读懂你的程序。必要的注释,显而易见是要在程序的编写中加入对程序的说明,原因就是为了别人能读懂你的程序,过一段时间后你自己还能读懂自己的程序。最后说明下这次课程设计给我感受最深的有三点: 1进行管理系统开发这样的工作,要有恒心,要能静下新来做,而不能浮躁。 2要善于同别人交流与合作,善于获取各种有用的资源。 3要真真实实的多查资料,多问,多看。六 参考文献及资料1 学用Visual Basic 编程 潭浩 西安电子科技大学出版社 2 数据库原理 丁宝康 施伯乐著 经济科学出版社 3 SQL Server数据库开发入门与范例解析 夏邦贵著 北京机械工业出版社4 SQL Server 2005应用开发技术指南 彭东著 北京清华大学出版社 5Visual Basic6.0 林陈雷著 人民邮电出版社 6面向对象程序设计系列教材 龚沛曾著 高等教育出版社 7Visual Basic6.0 数据库开发与专业应用 敬 铮著 国防工业出版社 8Visual Basic6.0 数据库程序设计高手 温贤发著 科学出版社七.附录SQL Server 建立五张表VB程序及控件设置Private Sub Command3_Click() '取消Stusno.Text = ""Stusname.Text = ""Stusbirth.Text = ""Stusdept.Text = ""Stuall_credit.Text = ""Stusexm = FalseStusexf = FalseEnd Sub'修改元组Private Sub Stuchange_Click()If Trim(Stusno.Text) = "" Or Trim(Stusname.Text) = "" Or (Stusexm = False And Stusexf = False) ThenMsgBox "加*数据项不能为空,请重新设置", vbOKOnly, "信息提示"Stusno.SetFocusExit SubEnd IfIf Trim(Stusbirth.Text) <> "" ThenIf Not IsDate(Trim(Stusbirth.Text) ThenMsgBox "出生日期输入不正确,请重新输入", vbOKOnly, "信息提示"Stusbirth.SetFocusExit SubEnd IfEnd IfStuADO.Recordset.Fields("学号") = Trim(Stusno.Text)StuADO.Recordset.Fields("姓名") = Trim(Stusname.Text)StuADO.Recordset.Fields("出生日期") = Trim(Stusbirth.Text)StuADO.Recordset.Fields("专业") = Trim(Stusdept.Text)StuADO.Recordset.Fields("总学分") = Trim(Stuall_credit.Text)If Stusexm = True ThenStuADO.Recordset.Fields("性别") = "男"Else: Stusexf = TrueStuADO.Recordset.Fields("性别") = "女"End IfStuADO.Recordset.UpdateEnd Sub'删除元组Private Sub StuDel_Click()ret = MsgBox("是否要删除" + StuADO.Recordset("学号") + "号学生的记录?", vbYesNo, "提示")If ret = vbYes ThenStuADO.Recordset.DeleteEnd IfStuADO.RecordSource = "select sno 学号,sname 姓名,sdept 专业,ssex 性别,sbirth 出生日期,all_credit 总学分 from XS"Command3_ClickStuADO.RefreshEnd Sub'选中一行显示元组Private Sub StuDG_Click()Stusno.Text = StuADO.Recordset("学号")Stusname.Text = StuADO.Recordset("姓名")Stusbirth.Text = StuADO.Recordset("出生日期")Stusdept.Text = StuADO.Recordset("专业")Stuall_credit = StuADO.Recordset("总学分")If Trim(StuADO.Recordset("性别") = "男" ThenStusexm = TrueElseStusexf = TrueEnd IfEnd Sub'插入元组Private Sub Studinsert_Click()If Trim(Stusno.Text) = "" Or Trim(Stusname.Text) = "" Or (Stusexm = False And Stusexf = False) ThenMsgBox "加*数据项不能为空,请重新设置", vbOKOnly, "信息提示"Stusno.SetFocusExit SubEnd IfIf Trim(Stusbirth.Text) <> "" ThenIf Not IsDate(Trim(Stusbirth.Text) ThenMsgBox "出生日期输入不正确,请重新输入", vbOKOnly, "信息提示"Stusbirth.SetFocusExit SubEnd IfEnd IfStuADO.Recordset.AddNewStuADO.Recordset.Fields("学号") = Trim(Stusno.Text)StuADO.Recordset.Fields("姓名") = Trim(Stusname.Text)StuADO.Recordset.Fields("出生日期") = Trim(Stusbirth.Text)StuADO.Recordset.Fields("专业") = Trim(Stusdept.Text)StuADO.Recordset.Fields("总学分") = Trim(Stuall_credit.Text)If Stusexm = True ThenStuADO.Recordset.Fields("性别") = "男"Else: Stusexf = TrueStuADO.Recordset.Fields("性别") = "女"End IfStuADO.Recordset.UpdateEnd Sub'取消Private Sub Stucancel_Click()Stusno.Text = ""Stusname.Text = ""Stucname.Text = ""End Sub'选课Private Sub Stuchoose_Click()StuADOXS.RecordSource = "select * from XS where sno='" + Trim(Stusno.Text) + "'"StuADOXS.RefreshIf Trim(Stusno.Text) = "" Or Trim(Stusname.Text) = "" Or Trim(Stucname.Text) = "" Thenret = MsgBox("输入不正确,请重新输入!", vbYes, "错误!")ElseIf Trim(Stusname.Text) <> Trim(StuADOXS.Recordset("sname") Thenret = MsgBox("输入学号与姓名不匹配,请重新输入!")ElseStuADOXS_KC.RecordSource = "select * from XS_KC"StuADOXS_KC.RefreshStuADOXS_KC.Recordset.AddNewStuADOXS_KC.Recordset.Fields("sno") = Trim(Stusno.Text)StuADOKC.RecordSource = "select * from KC where cname='" + Trim(Stucname.Text) + "'"StuADOKC.RefreshStuADOXS_KC.Recordset.Fields("cno") = StuADOKC.Recordset("cno")StuADOXS_KC.Recordset.UpdateStuADO.RefreshEnd IfEnd Sub'删除元组Private Sub Studelete_Click()ret = MsgBox("是否要删除" + StuADO.Recordset("学号") + "号学生的选课记录?", vbYesNo, "提示")If ret = vbYes ThenStuADOXS_KC.RecordSource = "select * from XS_KC where sno='" + StuADO.Recordset("学号") + "'"StuADOXS_KC.RefreshStuADOXS_KC.Recordset.DeleteEnd IfStuADO.RefreshStucancel_ClickEnd Sub'单击显示元组Private Sub StuDG_Click()Stusno.Text = StuADO.Recordset("学号")Stusname.Text = StuADO.Recordset("姓名")Stucname.Text = StuADO.Recordset("课程名")End SubPrivate Sub Stuadd_Click()If Stugrade.Text = "" Thenret = MsgBox("输入为空,请重新输入", vbYes, "错误提示")ElseStuADOKC.RecordSource = "select * from KC where cname='" + Trim(Stucname.Text) + "'"StuADOKC.RefreshStuADOXS_KC.RecordSource = "select * from XS_KC where cno='" + StuADOKC.Recordset("cno") + "'"StuADOXS_KC.RefreshStuADOXS_KC.Recordset.Fields("sno") = Stusno.TextStuADOXS_KC.Recordset.Fields("cno") = StuADOKC.Recordset("cno")StuADOXS_KC.Recordset.Fields("grade") = Stugrade.TextStuADOXS_KC.Recordset.UpdateStuADO.RecordSource = "select sno 学号,XS_KC.cno 课程号,cname 课程名,grade 成绩 from KC,XS_KC where KC.cno=XS_KC.cno"StuADO.RefreshEnd IfEnd Sub'取消Private Sub Stucancel_Click()Stusno.Text = ""Stucname.Text = ""Stugrade.Text = ""End Sub'删除学生成绩Private Sub Studelete_Click()ret = MsgBox("是否要删除" + Trim(StuADO.Recordset("学号") + "号学生成绩?", vbYesNo, "提示")If ret = vbYes ThenStuADO.Recordset("成绩") = NullEnd IfEnd Sub'单击显示元组Private Sub StuDG_Click()Stusno.Text = StuADO.Recordset("学号")Stucname.Text = StuADO.Recordset("课程名")End Sub'修改学生成绩Private Sub Stusure_Click()If Stugrade.Text = "" Thenret = MsgBox("输入为空,请重新输入", vbYes, "错误提示")ElseStuADOKC.RecordSource = "select * from KC where cname='" + Trim(Stucname.Text) + "'"StuADOKC.RefreshStuADOXS_KC.RecordSource = "select * from XS_KC where cno='" + StuADOKC.Recordset("cno") + "'" + " and sno='" + Trim(Stusno.Text) + "'"StuADOXS_KC.RefreshStuADOXS_KC.Recordset.Fields("grade") = Trim(Stugrade.Text)StuADOXS_KC.Recordset.UpdateStuADO.RecordSource = "select sno 学号,XS_KC.cno 课程号,cname 课程名,grade 成绩 from KC,XS_KC where KC.cno=XS_KC.cno"StuADO.RefreshEnd IfEnd SubPrivate Sub Command1_Click()StuSearch.ShowEnd SubPrivate Sub Command2_Click()AddStu.ShowEnd SubPrivate Sub Command3_Click()AddStuCourse.ShowEnd SubPrivate Sub Command4_Click()AddStuGrade.ShowEnd SubPrivate Sub Command5_Click()TchSearch.ShowEnd SubDim SqlStr As StringPublic Sub MakeSqlStr()SqlStr = ""If Trim(Stusno) <> "" ThenSqlStr = SqlStr + "and sno like'%" + Trim(Stusno.Text) + "%' "End IfIf Trim(Stusname) <> "" ThenSqlStr = SqlStr + "and sname like '%" + Trim(Stusname.Text) + "%'"End IfIf Trim(Stusdept) <> "" ThenSqlStr = SqlStr + "and sdept='" + Trim(Stusdept.Text) + "'"End IfEnd SubPrivate Sub Command1_Click()MakeSqlStrStuADO.RecordSource = "select sno 学号,sname 姓名,sdept 专业,ssex 性别,sbirth 出生日期,all_credit 总学分 from XS where (ssex ='男' or ssex='女')" _& SqlStrStuADO.RefreshEnd SubPrivate Sub StuDG_DblClick()ShowStuKC.StuKCADO.RecordSource = "select sname 姓名,cname 课程名,grade 成绩,credit 学分,term 开课学期,class_hour 课时 from XS,KC,XS_KC" _& " where XS.sno=XS_KC.sno and KC.cno=XS_KC.cno" _& " and XS.sno='" + StuADO.Recordset("学号") + "'"ShowStuKC.StuKCADO.RefreshShowStuKC.ShowStuSearch.Enabled = FalseEnd SubDim SqlStr As StringPublic Sub MakeSqlStr()SqlStr = ""If Trim(Tchtno) <> "" ThenSqlStr = SqlStr + "and tno like '%" + Trim(Tchtno.Text) + "%' "End IfIf Trim(Tchtname) <> "" ThenSqlStr = SqlStr + "and tname like '%" + Trim(Tchtname.Text) + "%'"End IfIf Trim(Tchprofessional) <> "" ThenSqlStr = SqlStr + "and professional like '%" + Trim(Tchprofessional.Text) + "%'"End IfIf Trim(Tchdepartment.Text) <> "" ThenSqlStr = SqlStr + "and department like '%" + Trim(Tchdepartment.Text) + "%'"End IfEnd SubPrivate Sub TchDG_DblClick()ShowTchKC.TchKCADO.RecordSource = "select tname 姓名,cname 课程,credit 学分,place 上课地点 from KC,TCH,TCH_KC where TCH.tno=TCH_KC.tno and KC.cno=TCH_KC.cno" _& " and Tch.tno='" + TchADO.Recordset("教师编号") + "'"ShowTchKC.TchKCADO.RefreshShowTchKC.ShowEnd SubPrivate Sub Tchseek_Click()MakeSqlStrTchADO.RecordSource = "select tno 教师编号,tname 姓名,tsex 性别,tbirth 出生日期,professional 职称,department 部门 from TCH where (tsex ='男' or tsex='女')" _& SqlStrTchADO.RefreshEnd Sub专心-专注-专业