学生成绩管理系统Word文档格式.docx
《学生成绩管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
![学生成绩管理系统Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/3/36ae0e1c-2190-4baf-b8fc-3b49d82fae45/36ae0e1c-2190-4baf-b8fc-3b49d82fae451.gif)
1、所用的数据库是:
sQlite
2、开发的环境是:
QT4
二、需求分析
2.1系统功能要求设计
此系统实现如下系统功能:
(1)使得学生的成绩管理工作更加清晰、条理化、自动化。
(2)通过用户名和密码登录系统,查询课程基本资料,学生所选课程成绩,修改用户密码等功能。
容易地完成学生信息的查询操作。
(3)设计人机友好界面,功能安排合理,操作使用方便,并且进一步考虑系统在安全性,完整性,并发控制,备份和恢复等方面的功能要求。
2.2系统模块设计
成绩管理系统大体可以分成二大模块如,一是学生的基本信息模块,里面应该包含学生的各方面的基本信息;
再者便是课程管理模块,在该模块中应该包含有对学生成绩信息的查询和处理,如平均成绩、最好成绩、最差成绩以及不及格学生的统计等功能模块;
再其次还有教师、课程等相关信息的模块;
可以得到系统流程图:
2.3数据字典
数据项是数据库的关系中不可再分的数据单位,下表分别列出了数据的名称、数据类型、长度、取值能否为空。
利用SQlite建立“学生选课”数据库,其基本表清单及表结构描述如下:
数据库中用到的表:
数据库表名
关系模式名称
备注
Student
学生
学生学籍信息表
Course
课程
课程基本信息表
Score
成绩
选课成绩信息表
Student基本情况数据表,结构如下:
字段名
字段类型
NotNull
说明
Student_sno
Char
Primarykey
学号
Student_sn
char
学生姓名
Student_sex
‘男’或‘女’
性别
Student_dept
系别
Student_age
年龄
Student_address
地址
course数据表,结构如下:
约束控制
course_cno
主键(primarykey)
课程号
course_cname
notnull
课程名称
course_hour
int
课时
course_score
numeric(2,1)
学分
score情况数据表,结构如下:
主键,外部键
student_sno
score
Notnull
三、概念模型设计
由需求分析的结果可知,本系统设计的实体包括:
(1)学生基本信息:
学号,姓名,性别,籍贯,年龄,专业。
(2)课程基本信息:
课程名,课程号,分数,学时,学分。
这些实体间的联系包括:
(1)每位学生可以学习多门课程,每门课程可供多位学生学习。
由上述分析可得到系统的E—R图
四、逻辑和物理结构设计
4.1由系统E—R图转化而得到的关系模式如下:
(1)学生(学号,姓名,性别,年龄,地址,系别),其主关键字为学号;
(2)课程(课程名,课程号,学时,学分),其中主关键字为课程号;
(3)成绩(课程号,学号,分数)其中主关键字为学号和课程号。
可以与学生关系模式合并为:
学生(学号,姓名,性别,年龄,地址,系别,成绩,课程号)。
4.2确定关系模型的存取方法
在将概念模型转换成物理模型之后,我们可以对物理模型进行设计,双击物理模型的关系,可以对该关系的名称、注释等信息进行查询。
可对该关系的属性列进行设计,可分别设置其名称、码、数据类型以及主码、是否为空等。
在实际设计中最常用的存取方法是索引发,使用索引可以大大减少数据的查询时间,在建立索引时应遵循:
在经常需要搜索的列上建立索引;
在主关键字上建立索引;
在经常用于连接的列上建立索引,即在外键上建立索引;
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的等规则。
才能充分利用索引的作用避免因索引引起的负面作用。
4.3确定数据库的存储结构
确定数据库的存储结构主要指确定数据的存放位置和存储结构,包括确定关系、索引、日志、备份等的存储安排及存储结构,以及确定系统存储参数的配置。
因为该成绩管理系统的数据量小,,所以我们只用把数据存储在使用的电脑硬盘上,不用作更多的安排。
(1)创建学生基本信息表:
createtableStudent(
学号varchar(11)notnull,
系别varchar(5)notnull,
姓名varchar(6)notnull,
性别varchar
(2)notnull,
年龄char
(2)notnull,
地址varchar(20)notnull,
constraintPK_STUDENTprimarykey(学号)
)
go
executesp_addextendedproperty'
MS_Description'
'
学生基本信息描述'
user'
'
'
table'
StudentsInfo'
(2)创建课程表:
createtableCourse(
cnovarchar(5)notnull,
cnamevarchar(10)null,
xueshismallintnull,
xuefenintnull,
constraintPK_COURSEprimarykey(课程号))
(3)创建学生与课程的成绩表
createtableSC(snovarchar(11)notnull,
cnovarchar(5)notnull,
chengjivarchar(4)notnull
constraintPK_SCprimarykey(学号,课程号)
在SC表上创建索引SC_FK与SC2_FK
createindexSC_FKonSC(学号ASC)
Go
createindexSC2_FKonSC(课程号ASC)
建立课程号索引
createindexTC_FKonTC(
课程号ASC
五、系统实现
5.1、系统的模块层次结构
5.2、用户登录模块
5.2.1、用户登录界面
5.2.2、用户登录的具体
分析:
当用户填写正确的的用户和密码是就进入选择模块。
以下是按登录时实现的代码。
5.3、学生基本信息模块
5.3.1、学生个人基本信息的界面。
5.3.2、学生基本信息的查找具体实现。
voidStudentxxb:
:
on_pushButton_clicked()
{
QStringstudentno=ui->
lineEdit->
text();
model->
setFilter(QObject:
tr("
sno='
%1'
"
).arg(studentno));
//根据学号进行筛选
select();
//显示结果
ui->
clear();
setFocus();
}
这里面主要运用到:
QT4里面提供API函数来实现的。
如上:
5.3.3、学生基本信息的添加具体实现。
on_pushButton_4_clicked()
introwNum=model->
rowCount();
//获得表的行数
intid=10;
insertRow(rowNum);
//添加一行
setData(model->
index(rowNum,0),id);
5.3.4、学生基本信息的排序具体实现。
这里面主要是通过点击构件(tableView)的水平标题来选择那一列进行排序的。
当点击的时候就会产生一个信号会连接排序的函数的信号。
如;
sortByColumn(int)就是排序的函数。
5.3.5、学生基本信息的删除具体实现。
//删除
on_pushButton_8_clicked()
intcurRow=ui->
tableView->
currentIndex().row();
//获取选中的行
removeRow(curRow);
//删除该行
intok=QMessageBox:
warning(this,tr("
删除当前行!
),tr("
你确定"
删除当前行吗?
),QMessageBox:
Yes,QMessageBox:
No);
if(ok==QMessageBox:
No)
{
revertAll();
//如果不删除,则撤销
}
elsemodel->
submitAll();
//否则提交,在数据库中删除该行
这里面的删除工作也是主要用到QT的API函数来实现的。
5.4、课程基本信息模块
5.4.1、课程基本信息的界面
5.4.2、课程基本信息添加具体实现。
5.4.3、课程基本信息删除具体实现。
5.4.4、课程基本信息排序具体实现。
5.4.5、课程基本信息查找具体实现。
以上的添加,删除,排序,查找的具体实现,方法与在学生基本信息的添加,删除,排序,查找都一样的。
5.5.1、成绩基本信息的界面
图5.5.1(成绩基本信息的界面)
5.5.2、成绩基本信息的添加、删除、排序。
分析:
成绩基本信息的添加、删除、排序用的法与学生基本信息的添加、删除、排序的都一样。
5.5.3、成绩基本信息的查找。
(查找的操作界面)
可以在如上图5.5.1的右边所显示的表格中的姓名,学号进行查找。
//这是查找
voidscore:
on_pushButtonFind_clicked()
QStringcountry;
elseif(ui->
radioButtonsno->
isChecked())////根据学号进行筛选
sno='
elseif((ui->
radioButtonsname->
isChecked()))//根据姓名进行筛选
QSqlQueryquery;
query.exec(QObject:
selectsnofromstudentwheresname='
query.next();
country=query.value(0).toString();
).arg(country));
5.5.3、每个同学的总分和平均分。
代码实现如下:
界面如下所示:
5.5.4、各班的总分和下平均分。
代码和操作的界面如下:
//--计算各班的总成绩,平均成绩,按各班平均成绩进行排序
on_pushButtoClassSumAvg_clicked()
QSqlQueryqurery1;
qurery1.exec("
dropviewifexistsclassAvgSum"
);
createviewclassAvgSumas\
selectstudent.[major]as班级,sum(degree)as总分,avg(degree)as平均分fromscore1,student\
wherestudent.majorin(selectmajorfromstudent)\
andstudent.sno=score1.snogroupbystudent.majororderby平均分desc"
setTable("
classAvgSum"
5.5.5、所有学生的各科平均分。
代码和操作后显示界面如下:
//-所有学生单科平均成绩
on_pushButtonViewall_2_clicked()
QSqlQueryqurery2;
qurery2.exec("
dropviewifexistsAllavg"
createviewAllavgas\
selectameas科目,oas科目编号,avg(degree)as平均分\
fromscore1,course\
whereoin(selectofromscore1)andcourse.[cno]=score1.[cno]\
groupbyo"
model->
Allavg"
5.5.6、总分最高的学生。
//单科成绩最高的学生
on_pushButtonViewall_4_clicked()
QSqlQueryqurery3;
qurery3.exec("
dropviewifexistsdanAllSum"
createviewifnotexistsdanAllSumas\
selectcourse.[cname]as科目,student.[sname]as姓名,student.sno,H.highteras分数\
fromcourse,student,\
(selectscore1.[cno]ashighcno,max(degree)ashighter,snofromscore1groupbyo)asH\
wherestudent.[sno]=H.snoandcourse.[cno]=H.highcno"
hi"
5.5.7、单科成绩最高的学生。
5.5.8、不及格的考生信息。
//不及格的考生信息
on_pushButtonViewall_5_clicked()
QSqlQueryqurery4;
qurery4.exec("
dropviewifexistsfailure"
createviewfailureas\
selectstudent.*,course.[cname]as科目,degreeas成绩\
fromscore1,student,coursewherescore1.degree<
60andstudent.[sno]=score1.sno\
andcourse.[cno]=score1.[cno]"
failure"
5.5.9、学生获奖情况。
//这是获奖情况
QSqlQueryqurery5;
qurery5.exec("
droptableifexistsjl"
createtablejl('
姓名'
'
班级'
平均分'
奖金'
)"
);
insertintojl('
)\
selectstudent.sname,student.[major],avg(degree)asavgdegree,'
10000元(特等奖)'
\
fromscore1,studentwherestudent.sno=score1.sno\
groupbyscore1.snoorderbyavgdegreedesclimit0,1"
8000元(一等奖)'
\
fromscore1,studentwherestudent.sno=score1.snogroupby\
score1.snoorderbyavgdegreedesclimit1,1"
5000元(二等奖)'
groupbyscore1.snoorderbyavgdegreedesclimit2,3"
)\
2000元(三等奖)'
groupbyscore1.snoorderbyavgdegreedesclimit5,5"
jl"
问题1:
通过一个接口去用姓名或学号对在构件(tableview)中显示的数据进行查找。
注意在tableView构件中显示的内容可以不同在表的切换。
怎样实现呢?
答:
可以利用QT4的API函数来实现的。
因为可以通过
//根据学号进行筛选.
如果是通过姓名查找,首先在学生的信息表中通过姓名来查找相对应的学号,再用上面方法来查找。
心得:
对于这个系统设计。
最主要的是对数据库设计。
数据库设计好就可以对后面的高级语言的设计和操作比较容易。
还有要具有良好SQL语言的数据库。