您的当前位置:首页正文

数据库课程设计--学生成绩管理系统

2021-08-25 来源:汇智旅游网


数据库原理与应用

课程设计说明书

2008年 12 月 22 日

题目: 学生成绩管理系统

院 系: 专业班级: 学 号: 学生姓名: 指导教师:

1

一 概述

1.1目的与要求

随着科技的发展,基本上所有的具有一定数量数据的机构都开始使用计算机数据库来做管理。几乎所有学校也都已经在使用计算机管理数据的机制,大大减少了学校学生成绩管理的工作量。该课程设计要求设计一个学生成绩的数据库管理系统,数据库中要求包含学生的基本信息,学科基本信息,以及学生所学课程的考试成绩。要方便学生进行成绩查询,通过该课程设计,应该达到把数据库理论知识更加的巩固加深,加强动手能力与实践能力,学以致用,与现实生活中的应用充分的结合起来。

1.2设计环境

① Microsoft SQL Server 2000 ② Microsoft Visual C++ 6.0

二 需求分析

2.1 系统功能要求设计

此系统实现如下系统功能:

(1)使得学生的成绩管理工作更加清晰、条理化、自动化。

(2)通过用户名和密码登录系统,查询课程基本资料,学生所选课程成绩,修改用户密码等功能。 容易地完成学生信息的查询操作。

(3) 设计人机友好界面,功能安排合理,操作使用方便,并且进一步考虑系统在安全性,完整性,并发控制,备份和恢复等方面的功能要求。

2.2 系统模块设计

成绩管理系统大体可以分成二大模块如, 一是学生的基本信息模块,里面应该包含学生的各方面的基本信息;再者便是课程管理模块, 在该模块中应该包含有对学生成绩信息的查询和处理,如平均成绩、最好成绩、最差成绩以及不及格学生的统计等功能模块;再其次还有教师、课程等相关信息的模块;可以得到系统流程图:

登陆失败 用户 验证 2 登陆成退出系统

2.3 数据字典

数据项是数据库的关系中不可再分的数据单位,下表分别列出了数据的名称、数据类型、长度、取值能否为空。利用SQL Server 2000建立“学生选课”数据库,其基本表清单及表结构描述如下: 数据库中用到的表:

数据库表名 Student Course Score

Student基本情况数据表,结构如下: 字段名 Student _sno Student _sn Student _sex Student _dept Student_age Student_address

course数据表,结构如下: 字段名 course_cno course_cname course_hour course_score

score情况数据表,结构如下: 字段名 score_id course_cno student_sno score 字段类型 int char char int 约束控制 not null 外部键 外部键 说明 成绩记录号 课程号 学号 成绩 字段类型 char char int numeric(2,1) 约束控制 主键(primary key) not null not null not null 说明 课程号 课程名称 课时 学分 字段类型 Char char char char char char Not Null Primary key Not Null ‘男’或‘女’ 说明 学号 学生姓名 性别 系别 年龄 地址 关系模式名称 学生 课程 成绩 备注 学生学籍信息表 课程基本信息表 选课成绩信息表

3

三 概念模型设计

由需求分析的结果可知,本系统设计的实体包括:

(1)学生基本信息:学号,姓名,性别,地址,年龄,专业。 (2)课程基本信息: 课程名,课程号,分数,学时,学分。 这些实体间的联系包括:

(1)每位学生可以学习多门课程,每门课程可供多位学生学习。 由上述分析可得到系统的E—R图:

地址 系别 学分 学时 年龄 学号 学生 成绩 选修课程 课程号 姓名 性别 分数 课程名

四 逻辑和物理结构设计

4.1由系统E—R图转化而得到的关系模式如下:

(1)学生(学号,姓名,性别,年龄,地址,系别),其主关键字为学号; (2)课程(课程名,课程号,学时,学分),其中主关键字为课程号;

(3)成绩(课程号,学号,分数)其中主关键字为学号和课程号。可以与学生关系模式合并为:学生(学号,姓名,性别,年龄,地址,系别,成绩,课程号)。

4

4.2 确定关系模型的存取方法

在将概念模型转换成物理模型之后,我们可以对物理模型进行设计,双击物理模型的关系,可以对该关系的名称、注释等信息进行查询。可对该关系的属性列进行设计,可分别设置其名称、码、数据类型以及主码、是否为空等。在实际设计中最常用的存取方法是索引发,使用索引可以大大减少数据的查询时间,在建立索引时应遵循:在经常需要搜索的列上建立索引; 在主关键字上建立索引;在经常用于连接的列上建立索引,即在外键上建立索引;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的等规则。才能充分利用索引的作用避免因索引引起的负面作用。

4.3 确定数据库的存储结构

确定数据库的存储结构主要指确定数据的存放位置和存储结构,包括确定关系、索引、日志、备份等的存储安排及存储结构,以及确定系统存储参数的配置。因为该成绩管理系统的数据量小,,所以我们只用把数据存储在使用的电脑硬盘上,不用作更多的安排。

(1)创建学生基本信息表: create table Student (

学号 varchar(11) not null, 系别 varchar(5) not null, 姓名 varchar(6) not null, 性别 varchar(2) not null, 年龄 char(2) not null, 地址 varchar(20) not null, constraint PK_STUDENT primary key (学号) ) go

execute sp_addextendedproperty 'MS_Description', '学生基本信息描述', 'user', '', 'table', 'StudentsInfo' go

(2)创建课程表: create table Course (

cno varchar(5) not null, cname varchar(10) null, xueshi smallint null, xuefen int null, constraint PK_COURSE primary key (课程号)) go

execute sp_addextendedproperty 'MS_Description',

(3)创建学生与课程的成绩表

create table SC ( sno varchar(11) not null,

cno varchar(5) not null, chengji varchar(4) not null

5

constraint PK_SC primary key (学号, 课程号) ) go

在SC表上创建索引SC_FK与SC2_FK create index SC_FK on SC (学号 ASC) Go

create index SC2_FK on SC (课程号 ASC) go

建立课程号索引

create index TC_FK on TC ( 课程号 ASC )

go

下图显示了学生,课程和成绩三个关系的物理设计其中课程号与学号号分别为关系的主码。

五 数据库的实施与维护

5.1 数据库的实施:

此阶段主要任务包括创建数据库,加载初始数据,数据库试运行,数据库的安全性和完整性控制数据库的备份与恢复,数据库性能的监督分析和改仅,数据库的重组和重构等。首先在数据库中建立一个学生成绩管理系统数据库,然后新建一个数据源。主要代码如下:

#include \"stdafx.h\" #include \"StudentScore.h\" #include \"Course.h\" #ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; // CCourse

IMPLEMENT_DYNAMIC(CCourse, CRecordset) CCourse::CCourse(CDatabase* pdb) {

: CRecordset(pdb)

//{{AFX_FIELD_INIT(CCourse)

6

{ }

//}}AFX_FIELD_INIT m_nDefaultType = snapshot; return _T(\"ODBC;DSN=\");

CString CCourse::GetDefaultConnect()

CString CCourse::GetDefaultSQL() { { }

// CCourse diagnostics

void CCourse::AssertValid() const { {

CRecordset::AssertValid();} CRecordset::Dump(dc);}

void CCourse::Dump(CDumpContext& dc) const // MainFrm.h : interface of the CMainFrame class class CMainFrame : public CFrameWnd {protected: // create from serialization only

CMainFrame();

DECLARE_DYNCREATE(CMainFrame) //{{AFX_FIELD_MAP(CCourse)

pFX->SetFieldType(CFieldExchange::outputColumn); //}}AFX_FIELD_MAP return _T(\"\");}

void CCourse::DoFieldExchange(CFieldExchange* pFX)

// Attributes public: // Operations public: // Overrides

// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMainFrame)

virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL

// Implementation public:

virtual ~CMainFrame(); //CStatusBar m_wndStatusBar; //CToolBar m_wndToolBar; protected: // control bar embedded members

// Generated message map functions protected:

//{{AFX_MSG(CMainFrame)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnPassword(); afx_msg void OnUser();

7

};

afx_msg void OnStudent(); afx_msg void OnTeach(); afx_msg void OnTeacher(); afx_msg void OnScore(); afx_msg void OnQueryTeach(); afx_msg void OnQueryScore(); afx_msg void OnCourse(); //}}AFX_MSG

DECLARE_MESSAGE_MAP()

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line. // CScoreAddDlg dialog

CScoreAddDlg::CScoreAddDlg(CWnd* pParent /*=NULL*/) }

void CScoreAddDlg::DoDataExchange(CDataExchange* pDX) { }

BEGIN_MESSAGE_MAP(CScoreAddDlg, CDialog)

//{{AFX_MSG_MAP(CScoreAddDlg) //}}AFX_MSG_MAP

CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CScoreAddDlg)

DDX_Control(pDX, IDC_SCORE_STUDENT, m_cStudent); DDX_Control(pDX, IDC_SCORE_SCORE, m_cScore); DDX_Control(pDX, IDC_SCORE_COURSE, m_cCourse); //}}AFX_DATA_MAP

: CDialog(CScoreAddDlg::IDD, pParent) //}}AFX_DATA_INIT

{/{{AFX_DATA_INIT(CScoreAddDlg)

END_MESSAGE_MAP() void CScoreAddDlg::OnOK() {

CString student,course,score,student_no,course_no; m_cStudent.GetWindowText(student); m_cCourse.GetWindowText(course); else//成绩不为空 {

CString strSQL; //查出该学生的学号

strSQL.Format(\"select * from student where active_status='Y' and student_name='%s'\CRecordset m_recordSet=&m_database;

m_recordSet.Open(CRecordset::forwardOnly,strSQL);

m_cScore.GetWindowText(score);

8

m_recordSet.GetFieldValue(\"student_no\ { }

void CScoreAddDlg::OnCancel() {

CDialog::OnInitDialog(); CRecordset m_recordSet; if(!m_database.IsOpen()) { }

CString strSQL;

strSQL.Format(\"select course_name from course where active_status='Y'\"); for(int i=0;im_recordSet.Close();

strSQL.Format(\"select student_name from student where active_status='Y'\"); for(int j=0;jm_recordSet.Close(); { } return true;

this->SetWindowText(\"成绩窗口\"); CString temp;

m_recordSet.GetFieldValue(\"student_name\m_cStudent.AddString(temp); CString temp;

m_recordSet.GetFieldValue(\"course_name\m_cCourse.AddString(temp); m_database.Open(_T(\"student\")); m_recordSet.m_pDatabase=&m_database;

m_recordSet.Close(); //查出该课程的课程号

m_recordSet.Open(CRecordset::forwardOnly,strSQL); m_recordSet.Close();

strSQL.Format(\"select * from course where active_status='Y' and course_name='%s'\ m_recordSet.GetFieldValue(\"course_no\BOOL CScoreAddDlg::OnInitDialog()

m_recordSet.Open(CRecordset::forwardOnly,strSQL);

m_recordSet.MoveNext();

m_cCourse.SetCurSel(1);

m_recordSet.Open(CRecordset::forwardOnly,strSQL);

m_recordSet.MoveNext();

m_cStudent.SetCurSel(1);

9

}

// TODO: Add extra cleanup here

CDialog::OnCancel();

10

5.2部分操作截图:

下图显示了学生登陆系统进行查询时界面:

成绩查询功能:

下图显示了进行课程查询时界面:

5.3数据库的维护

当试运行数据库合格后,数据库开发设计的工作就基本完成了,接下来就是正式运行中的调试,应为该系统比较简单,数据量小,数据库中几乎不会发生什么大的变化,但是还是需要做好数据的备份,在sqlserver中我们可以利用备份数据库的功能对已经设计好的数据做备份,如果数据库受到破坏或系统故障,我们便可轻松的利用备份文件恢复数据库的数据。当然也可以利用其他各种方法进行数据维护。

六 总结

进一步深入理解数据库设计的整个过程,该学生选课系统的需求分析、数据库概念结构设计有关内容等。掌握使用前台程序设计技术VC和SQL Server结合设计

C /S结构的管理信息系统。综合练习了SQL Server的使用和数据库得管理技术。综合熟悉并练习了SQL语言在编程中的使用。 综合训练编程能力。认识系统,取得系统需求分析,更重要得是在编程方面提高了实现目标代码得能力及调试代码得能力

参考文献

(1)《Visual C++数据库开发经典实例精解》作者:夏邦国 刘凡馨 出版社:机械工业出版社 (2)《SQL SERVER 200管理,开发及应用实例》作者:陈世洪 出版社:人民邮电出版社 (3)《Visual C++程序设计教程》 作者:周鸣扬 于秋生 出版社:机械工业出版社

(4)《数据库原理与应用》 作者:姜代红 出版社:机械工业出版社

(5) S.Sanyal and P.Chattopadhyay.Effect of exponentially distributed deep levels on the current and capacitance of a MIS diode[J].Solid-state electronics,2001,45(2):315-324.

因篇幅问题不能全部显示,请点此查看更多更全内容