成绩查询系统论文
发布时间:2010-12-29 16:07:23
发布时间:2010-12-29 16:07:23
成绩查询系统
1、项目概述:
鉴于目前学生不便了解自身成绩以及对成绩查询系统需求的情况,为使能够满足用户需求,及时查询到所需信息,开发一款小型,便捷的学习成绩查询系统。
• 主要功能
• 总体设计
• 接口设计
• 数据结构设计
• 测试分析
• 总结
此系统用SQLserver2000作为后台数据库,用VFP作为前台,用ODBC数据源连接。
2、需求分析:
2.1学生需求分析:
1、输入学号和密码可以查询自己所选的课程以及个人总成绩及排名等情况。
2、可以使用本系统的帮助,了解本系统的详细设计情况。
2.2管理员具体需求分析
1、 管理员可以查询任一学生的选课情况和总体学生成绩排名等情况。
2、可以实现添加学生记录、修改学生记录和删除学生记录,维护学生的基本信息,实现即时更新。
3、可以实现添加学生成绩、修改学生成绩和删除学生成绩,实现成绩的维护操作,并对单科成绩的操作能实现总成绩的及时更新,同时也对学生的成绩排名进行即时更新。
4、可以使用本系统的帮助,了解本系统的详细设计情况。
2.3系统设计思想
1、 系统就满足学校的需求,例如学生信息的录入、查询、更新等。学生录入与排名。
2、 系统就具备数据库维护功能,及时根据用户需求进行数据添加、删除、修改等操作。
2.4系统设计分析
本系统适用于中小学校,其功能主要分为四大类:
用户管理:用于对用户的添加,赋于不同权限及对用户的修改及查询。
成绩管理:用于对成绩的输入、修改、汇总及排名。
学生信息管理:添加,删除,修改学生信息等。
学生成绩统计: 查询学生总分的情况。
本系统性能易于使用,具有较高的扩展性和可维护性。
2.5系统功能分析
权限功能:系统具有动态的权限分配功能,分为学生和管理员。学生仅能查询本人情况且不能修改,管理员可以查询所有学生的情况并能对学生记录和学生成绩进行维护。
查询功能:为权限用户提供查询的功能,可查询允许范围内的所有信息。
维护功能:为管理员提供查询及相应的维护功能。
退出功能:结束并关闭系统。
3、概要设计:
概念模型(E-R图)
实体:学生、课程,成绩,名次
属性:学生的属性有:学号、姓名、性别、班级、年龄
课程的属性有:课程号、课程名,学分
成绩的属性有:课程号、学号、成绩
名次的属性有:学号、姓名、班级、排名、总分
联系:学生与班级的关系是N:1的关系
学生与课程的关系是M:N的关系
E-R图如下:
性别 学号 姓名 年龄 班级 课程名 课程号 学分
成绩
学生 N 选课 M 课程
N N
上课
1 学习
班级 1
名次
班级 学号 姓名 排名 总分
主要功能:
● 运行环境:
●
硬件环境:P II233 PC,内存32MB以上, 硬盘1G以上
软件环境: Windows操作系统、UNIX、LINIX
● 普通用户:
开课情况查询
学生成绩查询
帮助
● 系统管理员:
开课情况查询
学生成绩查询
学生成绩维护
学生记录维护
帮助
● 学生成绩维护
添加成绩记录
修改成绩记录
删除成绩记录
● 学生记录维护
添加学生记录
修改学生记录
删除学生记录
总体设计
系统处理流程
总体结构
4、详细设计:
功能需求与程序关系
外部接口
动态链接库:成绩查询数据库
模块名称:
查询模块
学生信息管理模块
学生成绩管理模块
选课信息管理模块
用户界面
● 开课查询模块
● 学生成绩查询模块
● 学生成绩维护模块
● 学生信息维护模块
开课查询模块
● 模块功能:
查询本学期的开课情况;
学生可以通过该功能能够查询出所报的课程号、课程名、学分;
● 模块输出
输出: 课程号、课程名、学分
● 接口:
由登陆界面中通过选择普通用户界面调查询,通过选择管理员界面调查询、存储分配,录入/修改的数据放在数据库的kc表中
学生成绩查询模块
● 模块描述:
用于成绩查询功能
● 模块功能:
该模块可以让学生通过输入相应的学号通过调用主数据库的数据调出相应的学 号学生及总成绩
● 模块输入:
学号
● 模块输出:
学号、姓名、班级、以及总成绩
流程逻辑图
● 接口:
由登陆界面中通过选择普通用户界面调查询,通过选择管理员界面调查询、存储分配、录入/修改的数据放在数据库的cjcx-jcb表中
测试(出错检测和处理)
1.如果输入的学号不是数字,则弹出“请输入数字”的警告对话框
2.如果输入数据库中不存在的学号,则弹出“学号不存在,请重新输入!”的警告对话框
3.如果输入的学号为负,则弹出“学号不存在,请重新输入!”的警告对话框
4.如果输入的学号为空,则弹出“学号不能为空”的的警告对话框
学生成绩维护模块
● 模块描述:该模块用来成绩维护管理
● 模块功能:该模块有3个功能分别是添加成绩记录。修改成绩记录。删除成绩记录。
● 模块输入:
● a) 添加成绩记录模块:输入学号 课程号 姓名 课程名 性别 成绩 年龄 学分 班级
● b) 修改成绩记录模块和删除成绩记录模块:输入学号
● 模块输出:a) 学生成绩增加成功"
● b)学生成绩修改成功.
● c)学生成绩删除成功
● 成绩维护流程逻辑图原理及出错处理和信息维护的基本相同,此处不赘述(请参看信息维护的相关内容)
● 接口:
由管理员通过管理员界面选择学生成绩维护来调用该模块,存储分配、录入/修改的数据放在数据库的cjpm表中
学生信息维护模块
● 模块描述:学生基本信息维护
● 模块功能:该模块有3个功能小模块分别是:添加学生记录、修改学生记录、删除学生记录。
● 模块输入:
● A)添加学生记录:学号 年龄 姓名 班级 性别
● B)修改学生记录和删除学生记录:输入学号
● 模块输出:相应的操作成功
流程逻辑图
● 接口:
由管理员通过管理员界面选择学生基本信息维护来调用该模块存储分配、录入/修改的数据放在数据库的XSXX表
出错检测和处理
1.添加记录:
a)如果输入学号为空,则弹出“学号不能为空”的的对话框
b)如果输入的学号不是数字,则弹出“请输入数字!”的警告框
c)如果输入的学号,数据库中已经存在了,则弹出“该学号已存在!请重新输入!”
d)其他姓名、年龄、班级等的出错检测与上类似。
数据结构设计
● 物理结构设计
表的定义
Xsxx:
(学号 char(10) ,姓名 char(10),性别 char(4),班级 varchar (20),年龄 int)
kc:
(课程号 char(10),课程名 char(20),学分 int )
xxxx :
(学号 char(10),课程号 char(10),成绩 int )
cjpm :
(学号 char(10),姓名 char(10),班级varchar (20),排名 int,总分 int)
View:
(用户名 char(10),密码 char(10))
表间关系
表间关系(视图)
5、测试分析:
主界面如下所示:
登录模块:
学生登录:
1、如果输入数据库中不存在的学号,则弹出“学号不存在,请重新输入!”的警告对话框
2、如果输入的学号为负,则弹出“学号不存在,请重新输入!”的警告对话框
3、如果输入的学号或密码为空,则弹出“学号或密码不能为空”的的警告对话框
管理员登录:
1、如果输入view表中不存在的用户名,则弹出“用户名不存在,请重新输入!”的警告对话框
2、如果输入的用户名为负,则弹出“用户名不存在,请重新输入!”的警告对话框
3、如果输入的用户名或密码为空,则弹出“用户名或密码不能为空”的的警告对话框
学生登录查询模块:
可以实现对所选课程以及个人总成绩排名的正确查询
管理员登录查询模块:
可以实现对任一学生所选课程以及所有学生总成绩排名的正确查询
管理员学生记录维护模块:
能进行出错处理,并能实现对学生记录维护的及时更新,当删除学生记录时,同时也删除了该学生的相关成绩及排名记录
管理员学生成绩维护模块:
能进行出错处理,并能实现对学生成绩维护的及时更新,同时也能实现排名的及时更新
帮助模块:
帮助模块比较简单,测试没有问题
6、总结:
回顾该系统从选题,到需求分析、设计、编码实现、测试等,论文的撰写,这系列连贯的过程,感想颇多,收获也很多。大致的总结几点,如下:
1. 在开发一个系统时,前期的分析准备工作非常的重要。对于系统的需求要明确,这样才能做到有的放矢。特别是对于系统中数据的存储和重要算法的设计,设计的不好会出现大量的冗余,不仅浪费存储空间,还影响查询效率。
2.在设计的初期,对一个功能模块的设计,要想出两种或两种以上方案,这样可以进行比较,从而获得更佳的设计方案,设计开发过程中一定要吸取经验教训,避免返工。尤其是一些重要算法或功能。在对具体实现功能模块进行编程时,要养成良好的加注释的习惯,这样的话不仅能理清思路,而且可以为以后的调试带来很大的方便。
3. 懂得充分利用网络资源,需求分析中大部分分析结构都是在我阅读专业书籍,网络资料后得出的。
4、在此次开发学生成绩查询系统中,我觉得我最大的收获就是学会了为了做出这个程序,我该如何去寻找有用的资料,在短时期内学到尽量多而且有用的知识和本领。这两周的时间里,我从原来的模糊认识,到现在编出这个程序,中间也遇到了很多困难和挫折。在程序的编写过程中,也出现了很多错误,经过我认真修改,查阅资料,向老师和同学们请教,终于把那些错误都改正过来,最终使程序能够正确的运行。
附录(主要代码):
登录模块代码:
Optiongroup控件代码:
public statusrecord,statusgrade
if thisform.Optiongroup1.option1.value=1
thisform.text1.enabled=.t.
thisform.text2.enabled=.f.
x=.f.
store .F. to statusrecord,statusgrade,statusall,statusperson
else
x=.t.
if thisform.Optiongroup1.option2.value=1
thisform.text1.enabled=.t.
thisform.text2.enabled=.t.
store .T. to statusrecord,statusgrade,statusall,statusperson
endif
endif
“确定”按钮代码:
sele 1
use view EXCL
sele 2
use xsxx
store .T. to you,we
if thisform.Optiongroup1.option1.value==1
s1=alltrim(thisform.text1.value)
if empty(s1)
messagebox("学号不能为空",48,"信息不全")
thisform.text1.value=''
else
sele 2
select xsxx
locate for xsxx.sno=s1
if not found()
messagebox("学号不存在,请重新输入",48,"错误")
else
y=s1
USE
do student\学生成绩管理菜单.mpr
THISFORM.RELEASE
endif
endif
else
if empty(thisform.text1.value) or empty(thisform.text2.value)
messagebox("学号或密码不能为空",48,"信息不全")
thisform.text1.value=''
thisform.text2.value=''
ELSE
USE VIEW
SELE VIEW
cuser=alltrim(thisform.text1.value)
cpassword=alltrim(thisform.text2.value)
locate for view.cjcxuser=cuser
if not found()
messagebox("学号不存在,请重新输入",48,"错误")
else
SELE VIEW
if alltrim(view.cjcxpassword)!=cpassword
messagebox("密码错误,请重新输入","错误")
USE
else
do student\学生成绩管理菜单.mpr
THISFORM.RELEASE
endif
endif
endif
ENDIF
THISFORM.REFRESH
学生课程查询模块:
“确定”按钮代码:
sele 1
use kcxx
sele 2
use xsxx
thisform.list1.clear
if x=.f.
sele 1
select kcxx
scan for sno=y
thisform.list1.additem(cno+"-"+cname+"-"+str(credit))
endscan
thisform.list1.visible=.t.
thisform.refresh
sele 2
select xsxx
locate for sno=y
if found()
thisform.txtsname.value=sname
else
messagebox("学号不存在",48,"提示窗")
use
endif
else
s=ALLTRIM(Thisform.text1.value)
if empty(s)
messagebox("学号不能为空",48,"提示")
else
sele 1
select kcxx
scan for sno=ALLTRIM(Thisform.text1.value)
thisform.list1.additem(cno+"-"+cname+"-"+str(credit))
endscan
USE
thisform.list1.visible=.t.
thisform.refresh
sele 2
select xsxx
locate for sno=s
if found()
thisform.txtsname.value=sname
use
else
messagebox("学号不存在",48,"提示窗")
endif
endif
endif
成绩查询模块:
确定按钮代码:
if empty(thisform.text1.value)
messagebox("学号不能为空",48,"信息不全")
thisform.text1.value=''
else
SELE 1
SELECT CJPM
cx=alltrim(thisform.text1.value)
locate for cx=sno
if not found()
messagebox("学号不正确",48,"信息提示")
else
thisform.refresh
endif
endif
添加学生记录代码:
use
sele 1
use xscj
sele 2
use xsxx
s1=alltrim(thisform.text1.value)
s2=alltrim(thisform.text2.value)
s3=alltrim(thisform.text3.value)
s4=alltrim(thisform.text4.value)
s5=thisform.text6.value
if empty(s1)
messagebox("学号不能为空",48,"提示")
thisform.command1.enabled=.f.
else
if empty(s2)
messagebox("姓名不能为空",48,"提示")
thisform.command1.enabled=.f.
else
if empty(s3)
messagebox("性别不能为空",48,"提示")
thisform.command1.enabled=.f.
else
if not s3="男" and not s3="女"
messagebox("性别不正确",48,"提示")
thisform.command1.enabled=.f.
else
if empty(s4)
messagebox("班级不能为空",48,"提示")
thisform.command1.enabled=.f.
else
if not s4="1" and not s4="2" and not s4="0"
messagebox("班级不存在",48,"提示")
else
if empty(s5)
messagebox("年龄不能为空",48,"提示")
thisform.command1.enabled=.f.
else
if not isdigit(s5)
messagebox("年龄必须为整数",48,"提示")
ELSE
SELE 2
select XSXX
locate for sno=s1
if found()
messagebox("学号已经存在",48,"提示")
thisform.command1.enabled=.f.
thisform.text1.value=""
thisform.text2.value=""
thisform.text3.value=""
thisform.text4.value=""
thisform.text6.value=""
else thisform.command1.enabled=.t.
A=messagebox("确认添加新纪录到学生表",48,"提示")
if A=1
sele 1
go bottom
insert into xscj(sno,sname,ssex,class,sage,sno1,sname1,class1,total);
value(s1,s2,s3,s4,val(s5),s1,s2,s4,0)
use
messagebox("添加成功",48,"提示信息")
else
return
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
use
删除学生记录代码:
sele 1
use xxxx
sele 3
use xscj
s1=alltrim(thisform.text1.value)
if empty(s1)
messagebox("学号不能为空",48,"提示窗")
else
sele 3
select xsCJ
LOCATE FOR sno=s1
IF NOT FOUND()
messagebox("学号不存在,请重新输入",48,"提示窗")
thisform.text1.value=""
thisform.text1.setfocus
use
else
A=messagebox("确认删除学生表以及相关表中的该记录",48,"提示")
if A=1
delete from xxxx;
where sno=s1
delete from xscj;
where sno=s1
messagebox("删除成功",48,"提示信息")
endif
endif
endif
THISFORM.REFRESH
修改学生记录代码:
sele 4
use xsxx
s1=alltrim(thisform.text1.value)
s2=alltrim(thisform.text2.value)
s3=alltrim(thisform.text3.value)
s4=alltrim(thisform.text4.value)
s5=thisform.text5.value
if empty(s2)
messagebox("姓名不能为空",48,"提示")
else
if empty(s3)
messagebox("性别不能为空",48,"提示")
else
if not s3="男" and not s3="女"
messagebox("性别输入不正确",48,"提示")
else
if empty(s4)
messagebox("班级不能为空",48,"提示")
else
if not s4="1" and not s4="2" and not s4="0"
messagebox("班级输入不正确",48,"提示")
else
if empty(s5)
messagebox("年龄不能为空",48,"提示")
else
SELE 4
select xsxx
locate for sno=s1
if found()
A=messagebox("确认修改学生表、成绩表、CJPM表中等记录",48,"提示")
if A=1
update cjpm set sname=s2 where s1=sno
update cjpm set class=s4 where s1=sno
update xsxx set sname=s2 where s1=sno
update xsxx set class=s4 where s1=sno
update xsxx set sage=s5 where s1=sno
update xsxx set ssex=s3 where s1=sno
messagebox("修改成功",48,"提示信息")
thisform.text1.value=""
thisform.text2.value=""
thisform.text3.value=""
thisform.text4.value=""
thisform.text5.value=""
endif
thisform.command1.enabled=.f.
thisform.refresh
endif
endif
endif
endif
endif
endif
endif
thisform.TEXT1.enabled=.T.
thisform.command1.enabled=.f.
添加学生成绩代码:
use
sele 1
use kc
sele 2
use xsxx ALIAS EXCL
sele 4
use cjpm
sele 5
use xxxx
sele 6
use xscj
s1=alltrim(thisform.text1.value)
s2=alltrim(thisform.text2.value)
s3=thisform.text3.value
if empty(s1)
messagebox("学号不能为空",48,"提示窗")
else
if empty(s2)
messagebox("课程号不能为空",48,"提示窗")
else
if empty(s3)
messagebox("成绩不能为空",48,"提示窗")
else
USE XSXX
select xsxx
locate for sno=s1
if not found()
messagebox("学号不存在,请重新输入",48,"提示")
thisform.text1.value=""
thisform.command2.enabled=.f.
use
else
sele 1
LOCATE FOR CNO=S2
if not found()
messagebox("课程号不存在,请重新输入",48,"提示")
thisform.text2.value=""
thisform.command2.enabled=.f.
else
SELE 5
locate for sno=s1 and cno=s2
if found()
messagebox("该学生该课程已存在成绩,不可以添加",48,"提示")
thisform.text2.value=""
thisform.text2.setfocus
ELSE
sele 5
use xxxx
go bottom
insert into xxxx(sno,cno,grade);
value(s1,s2,VAL(s3))
USE
SELE 6
UPDATE XSCJ SET TOTAL=TOTAL+VAL(S3) where sno=s1
messagebox("添加成功",48,"提示")
thisform.text2.value=""
thisform.text3.value=""
thisform.text4.value=""
thisform.text6.value=""
thisform.text5.value=""
thisform.text7.value=""
thisform.text8.value=""
thisform.text9.value=""
thisform.text1.setfocus
thisform.command2.enabled=.f.
endif
endif
endif
endif
endif
endif
thisform.refresh
修改学生成绩:
sele 3
use xxcj
sele 4
use xscj
sele 5
use xxxx
sele 6
USE cjpm
s1=alltrim(thisform.text1.value)
s2=alltrim(thisform.text2.value)
s3=thisform.text3.value
A=messagebox("确认修改成绩表中记录",48,"提示")
if A=1
sele 5
use XXXX
update xxXX set grade=s3 where s1=sno and s2=cno
sum grade for sno=s1 to NM
USE
endif
messagebox("修改成功",48,"提示信息")
thisform.text3.enabled=.f.
thisform.command2.enabled=.f.
thisform.command1.enabled=.f.
thisform.refresh
删除学生成绩代码:
use
sele 1
use XXXX
sele 2
use XSCJ
s1=alltrim(thisform.text1.value)
s2=alltrim(thisform.text2.value)
if empty(s1)
messagebox("学号不能为空",48,"提示")
thisform.command1.enabled=.f.
thisform.text1.setfocus
else
if empty(s2)
messagebox("课程名不能为空",48,"提示")
thisform.command1.enabled=.f.
thisform.text2.setfocus
else
sele 1
USE XXXX
locate for sno=s1
if not found()
messagebox("学号不存在",48,"提示")
thisform.text1.value=""
thisform.command2.enabled=.f.
thisform.text1.setfocus
else
locate for sno=s1 and cno=s2
if not found()
messagebox("该学生此课程未选课或此课程不存在",48,"提示")
Thisform.command1.enabled=.f.
thisform.text2.value=""
thisform.text1.value=""
USE
else
N=grade
A=messagebox("确认删除成绩表该学生该课程成绩记录",48,"提示")
if A=1
sele 1
delete from xxxx;
where sno=s1 and cno=s2
USE
sele 2
select XSCJ
update XSCJ set total=total-N where s1=sno
USE
messagebox("删除成功",48,"提示信息")
endif
thisform.command3.enabled=.t.
thisform.command1.enabled=.F.
endif
endif
endif
endif
thisform.refresh