资源描述
1. 课程设计的目的与要求
1.1设计目的
设计一个简单的教学管理系统,要求存储学生基本情况、课程基本情况,教师授课情况与学生成绩记录等,提供成绩录入、信息查询等功能以满足日常教学管理需要。对学生的成绩的管理、查询学生的各科成绩的学生成绩管理系统。该系统可以帮助我们更方便的管理学生的成绩,替代了以前的手工操作管理学生的成绩,节约我们珍贵的时间。而且老师和学生可以以不同个的身份登录,获得不同的操作权限,有效的提高教学管理系统的工作效率。
1.2设计要求
(1)软件开发环境:
操作系统:Windows 7;
数据库使用软件:Microsoft Office Access 2003
开发工具: Microsoft Visual C++6.0
(2) 功能需求
按照提供的各表的数据结构和数据创建数据库与表
实现学生基本情况、课程基本情况、教师授课表情况及学生成绩的数据录入与编辑、删除等。
能够按姓名查询教师授课情况。
1.3 系统总体设计的体系结构图
设计系统的体系结构图
见下页
教学管理系统
教师管理系统 学生管理系统
学生基本 课程管
信息管理 理系统
课程基本 学生课程
信息管理 成绩管理
图1. 设计系统的体系结构图
2. 数据库设计
数据库技术是信息资源管理最有效的手段,它是指对于一个给定的应用环境,利用现有的数据库管理系统构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。本系统的数据库是采用Microsoft Office Access 2003设计的。
数据库设计分为6个阶段:需求分析阶段、概念结构设计阶段、逻辑结构设计阶段、数据库物理设计阶段、数据库实施阶段、数据库运行和维护阶段。数据库应用系统经过调试运行后即可投入正式运行。在数据库系统运行过程中,必须不断地对其进行评价、调整与修改。设计一个完善的数据库应用系统不可能一蹴而就,它往往是上述6个阶段的不断反复。
2.1 系统数据库概念结构设计
2.1.1 局部E-R图
将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计。它是整个数据库设计的关键所在。它是现实世界的一个真实模型,表达自然、直观,又易于理解。根据学生成绩管理的需求分析建立局部和全局ER图,如下所示。
(1)局部E—R设计
由在系统中描述课程实体的相关信息有专业号,班级号,设计该实体ER图如图2所示。
课程
课程号
课程名
学 时
图2 实体课程局部ER图
由在系统中描述教师实体的相关信息教师姓名,课程号,授课日期,设计该实体ER图如图3所示:系别
教师
教师姓名
性别
图3 实体教师局部ER图
年龄
学生
学生姓名
学号
系别
班级
性别
由在系统中描述学生实体的相关信息有学号,学生姓名,系别,班级,性别,年龄,设计该实体ER图如图4所示:
图4 实体课程局部ER图
2.1.2 系统全局ER图
学生系别
图8 全局ER图
图8 全局ER图
年龄
图8 全局ER图
图8 全局ER图
成绩
学号
姓名
教师姓名
性别
学生
班级
讲授
教师
选修
教师系别
性别
课程
课程号
学时
课程名
图6 全局ER图
2.2 数据库逻辑设计
根据系统的需要还要全局ER图向关系模型的转换,要遵循以下规则:
(1)一个实体转换为一个关系模型式。实体的属性就是关系的属性,实体的键就是关系的键。如学生实体可以转换为如下关系模式,其中学号为学生关系键。
学生(学号,学生姓名,性别,系别,班级,年龄)
同样课程、教师分别转换为一个关系模式,如下:
课程(课程号,课程名,学时)
教师(教师姓名,教师系别,性别)
(2)一个m:n联系转换为一个关系模式。与该联系相连的各实体的键以及联系本身的属性均转换为关系的属性,而关系的键为各实体键的组合。如在成绩联系是一个m:n联系,可以将它转换为如下关系模式,其中学号与课程号为关系的组合键。
成绩(学号,课程号,成绩)
2.3 创建系统数据库与表
创建数据库的过程实际上就是为数据库设计名称,设计所占用的存储空间和存放文件的位置过程等。使用Microsoft Office Access 2003创建数据库,其中数据库中包含了5个表。
(1) 打开Microsoft Office Access 2003,单击文件—>新建。
(2) 在右边新建文件夹菜单下,选择“空数据库”菜单选项,单击它,系统会显示新建数据库的位置及名称对话框。
(3) 在文件名一栏输入一个数据库名为“JWXT(教学管理系统)”,点击“创建”。
(4) 在出现的对话框下选择“对象”—>“表”—>“使用设计器创建表”,然后输入所需创建的表的列名、数据类型、长度、是否允许为空、默认值、主键。
(5) 然后点击各表名进行数据的添加、修改、删除。
在此系统数据库中设计了6个表,分别是学生信息表(Student)、课程信息表(Course)、 教师信息表(Teacher)、教师授课表(Teachercourse)、学生选课表(Selectcourse)、学生成绩表(Score)。
具体数据定义和内容设计如下面表1——表14所示。
学生信息表(Student)结构:
表1
列名
数据类型
长度
是否允许为空
说明
sno(学号)
文本
5
N
主键
sname(姓名)
文本
10
N
ssex(性别)
文本
2
Y
sdept(系别)
文本
10
N
sclass(班级)
文本
2
N
sage(年龄)
数字
4
Y
学生信息表(Student)内容:
表2
sno
sname
sdept
sclass
ssex
sage
0001
小花
电子系
01
女
19
0002
小华
电子系
01
男
20
0003
小小
电子系
01
男
20
0004
小兰
电子系
02
女
21
0005
小许
电子系
02
男
20
课程信息表(Course)结构:
表3
列名
数据类型
长度
是否允许为空
说明
cno(课程号)
文本
3
N
主键
cname(课程名)
文本
16
N
ctime(学时)
数字
Y
课程信息表(Course)内容:
表4
cno
cname
ctime
001
电路理论
40
002
信号与系统
48
003
工程磁场
56
F01
电机学
72
F02
管理学
32
G01
电子设计自动化
40
G02
日语入门
32
教师信息表(Teacher)结构:
表5
列名
数据类型
长度
是否允许为空
说明
tname(教师姓名)
文本
10
N
主键
tdept(教师系别)
文本
10
Y
tsex(性别)
文本
2
Y
教师信息表(teacher)内容:
表6
tname
tdept
tsex
安大
电力系
男
柴琴
外语系
女
丁小小
电子系
女
董会
电力系
女
董美美
电子系
女
罗华
自动化系
男
杨梅
经管系
女
教师授课表(Teachercourse)结构:
表7
列名
数据类型
长度
是否允许为空
说明
tname(教师姓名)
文本
10
N
主键
cno(课程号)
文本
5
N
主键
time(授课日期)
文本
Y
教师授课表(Teachercourse)内容:
表8
tname
cno
time
安大
003
2014-04-05
柴琴
G02
2014-04-06
丁小小
001
2014-03-01
董会
F01
2014-04-22
董美美
002
2014-04-12
罗华
G01
2014-04-13
杨梅
F02
2014-04-18
学生选课表(Selectcourse)结构:
表9
列名
数据类型
长度
是否允许为空
说明
sno(学号)
char
5
N
主键
cno(课程号)
char
5
N
主键
学生选课表(Selectcourse)内容:
表10
sno
cno
0001
001
0001
G01
0002
002
0002
G02
0003
003
0003
F02
0004
F01
0005
F02
学生成绩表(Score)结构:
表13
列名
数据类型
长度
是否允许为空
说明
sno(学号)
文本
5
N
主键
cno(课程号)
文本
5
N
主键
score(分数)
数字
5,2
Y
学生成绩表(score)内容:
表14
sno
cno
分数
0001
001
98
0001
G01
89
0002
002
87
0002
G02
86
0003
003
90
0003
F02
76
0004
F01
85
0005
F02
93
2.4 创建数据库关系图
图7
3.应用软件的实现
在Microsoft Visual C++6.0 中开发系统的第一步就是创建一个该系统的工程,来编写管理系统中的各种资源和代码。
3.1 创建工程的步骤
(1)打开Microsoft Visual C++6.0 开发环境,在菜单中依次选择“文件”—>“新建”菜单。
(2)在新建对话框窗口选择“工程”菜单下的“MFC AppWizard【exe】”,同时在右边选择存储路径及为工程命名,然后单击“确定”按钮。
(3)在接下来出现的MFC应用程序向导步骤1中创建的应用程序类型选择单文档,语言为中文简体,接下来步骤2~6选择默认设置。
这样,教学管理系统工程就创建完成。
3.2 向单文档窗口添加菜单项
(1) 在菜单栏中依次添加菜单名“学生”和“老师”以区分学生和老师的功能
(2) 在“学生”下添加菜单选项“教师授课情况”,在“教师”下分别添加菜单选项“学生情况”、“课程名基本情况”、“教师授课情况”、“学生成绩”。如图8——图9所示
图8
图9
3) 对菜单项“学生情况”设置ID为ID_person,并点击建立类向导,添加单击消息函数响应,添加代码如下:
void CMainFrame::Onperson()
{
// TODO: Add your command handler code here
CGS m;
m.DoModal();
}
并在该类预定义那添加头函数 #include"GS.h"。“课程名基本情况”、“教师授课情况”、“学生成绩”、“教师授课查询”菜单消息响应添加同上。
3.3 对话框的设计
(1) 对话框界面的设计及实现功能展示
ADO数据连接。在RescoureView下打开Dialog插入几个对话框,然后对各个对话框进行控件设置及界面的设计。界面设计及功能实现,如图10——图14所示。
图10
图11
(2) 对话框与数据库连接的实现
1) 在文件Header File下的stdAfx.h中引入ADO库代码
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
2) 初始化COM环境,创建连接对象
在对话框类加入成员变量:ConnectionPtr m_pConnection1;
并实现初始化,代码如下:
CGS::OnInitDialog()
{
AfxOleInit();
m_pConnection1.CreateInstance(_uuidof(Connection));
m_pConnection1->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=jwxt.mdb","","",adModeUnknown);
3) 打开记录集,初始化对话框
在对话框类加入成员变量:_RecordsetPtr m_pRecordset3;
用ClassWizard给窗口中每个编辑框添加成员变量,本对话框添加了:m_sno,
m_sname, m_sdept, m_sclass, m_ssex ,sage
在对话框初始化函数CGS::OnInitDialog()中添加
{
m_pRecordset3.CreateInstance(_uuidof(Recordset));
m_pRecordset3->Open("SELECT*FROM Student",m_pConnection1.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
4) 对对话框中各个按钮添加消息响应函数即功能实现的代码,学生基本情况对话框各种功能的实现代码如下:
显示函数:
CGS::DispRecord()//在对话框显示数据
{
_variant_t theValue1;
if(!m_pRecordset3->adoEOF)
{
theValue1=m_pRecordset3->GetCollect("sno");
if(theValue1.vt!=VT_NULL)
m_sno=(char*)_bstr_t(theValue1);
theValue1=m_pRecordset3->GetCollect("sname");
if(theValue1.vt!=VT_NULL)
m_sname=(char*)_bstr_t(theValue1);
theValue1=m_pRecordset3->GetCollect("sdept");
if(theValue1.vt!=VT_NULL)
m_sdept=(char*)_bstr_t(theValue1);
theValue1=m_pRecordset3->GetCollect("sclass");
if(theValue1.vt!=VT_NULL)
m_sclass=(char*)_bstr_t(theValue1);
theValue1=m_pRecordset3->GetCollect("ssex");
if(theValue1.vt!=VT_NULL)
m_ssex=(char*)_bstr_t(theValue1);
theValue1=m_pRecordset3->GetCollect("sage");
if(theValue1.vt!=VT_NULL)
m_sage=theValue1.iVal;
}
UpdateData(false);
}
void CGS::OnButton5() //前一条函数:可以浏览数据
{
// TODO: Add your control notification handler code here
m_pRecordset3->MovePrevious();
if(m_pRecordset3->BOF)
m_pRecordset3->MoveFirst();
DispRecord();
}
void CGS::OnButton6() //后一条:可以浏览数据
{
// TODO: Add your control notification handler code here
m_pRecordset3->MoveNext();
if(m_pRecordset3->adoEOF)
m_pRecordset3->MoveLast();
DispRecord();
}
void CGS::OnButton1() //录入函数:在录入数据前先点击录入
{
// TODO: Add your control notification handler code here
RefreshData();
try
{
// 写入各字段值
m_pRecordset3->AddNew();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
}
CGS::RefreshData()//清空函数
{
m_sno="";
m_sname="";
m_sdept="";
m_sclass="";
m_ssex="男";
m_sage=0;
UpdateData(FALSE);
}
void CGS::OnButton4() //保存函数:录入数据后,实现保存数据功能
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_pRecordset3->PutCollect("sno",_bstr_t(m_sno));
m_pRecordset3->PutCollect("sname",_bstr_t(m_sname));
m_pRecordset3->PutCollect("sdept",_bstr_t(m_sdept));
m_pRecordset3->PutCollect("sclass",_bstr_t(m_sclass));
m_pRecordset3->PutCollect("ssex",_bstr_t(m_ssex));
m_pRecordset3->PutCollect("sage",long(m_sage));
m_pRecordset3->Update();
m_pRecordset3->MoveLast();
}
void CGS::OnButton3() //删除函数:删除不要的数据
{
// TODO: Add your control notification handler code here
try
{
AfxMessageBox("删除当前记录");
m_pRecordset3->Delete(adAffectCurrent);
m_pRecordset3->MoveNext();
if(m_pRecordset3->adoEOF)
m_pRecordset3->MoveLast();
DispRecord();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
}
void CGS::OnButton2() //编辑函数:对数据进行更改
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_pRecordset3->PutCollect("sno",_bstr_t(m_sno));
m_pRecordset3->PutCollect("sname",_bstr_t(m_sname));
m_pRecordset3->PutCollect("sdept",_bstr_t(m_sdept));
m_pRecordset3->PutCollect("sclass",_bstr_t(m_sclass));
m_pRecordset3->PutCollect("ssex",_bstr_t(m_ssex));
m_pRecordset3->PutCollect("sage",long(m_sage));
m_pRecordset3->Update();
m_pRecordset3->MoveLast();
}
5) 上述为学生基本情况的对话框实现代码,课程基本情况、教师授课表情况及学生成绩三个个对话框的各功能实现代码与上述代码相似。
6) 对于学生查询教师授课情况主要查询功能实现代码如下:
void tc::OnButton1()
{
// TODO: Add your control notification handler code here
m_pRecordset.CreateInstance(_uuidof(Recordset));
UpdateData(true);
CString strSql;
strSql.Format("SELECT*FROM Teachercourse WHERE tname='%s'",m_tname);
m_pRecordset->Open(strSql.AllocSysString(),m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText);
_variant_t theValue;
if(!m_pRecordset->adoEOF)
{
theValue=m_pRecordset->GetCollect("tname");
if(theValue.vt!=VT_NULL)
m_tname=(char*)_bstr_t(theValue);
theValue=m_pRecordset->GetCollect("cno");
if(theValue.vt!=VT_NULL)
m_cno=(char*)_bstr_t(theValue);
theValue=m_pRecordset->GetCollect("time");
if(theValue.vt!=VT_NULL)
m_time=(char*)_bstr_t(theValue);
}
UpdateData(FALSE);
}
4. 课程设计的心得体会
在本次的课程设计中我负责实现的部分是:
1.按照提供的各表的数据结构和数据创建数据库与表
2.实现学生基本情况、课程基本情况、教师授课表情况及学生成绩的数据录入与编辑、删除等。
3.能够按姓名查询教师授课情况。
以上功能基本实现,由于本人是初次开发软件,在知识、经验方面都存在着不足,因此,设计中必然会存在一些缺陷。但是通过这次的课程设计使我对计算机软件设计与基础这门课程有了更深刻的认识,也让我感受到了计算机软件开发工具功能的强大。这次学习过程由于技术知识与时间的限制,我只是通过基础知识设计了简单的功能,如有机会更深入的学习数据库,我会继续完善它。
课程设计完成了,首先非常感谢学校给我们这次机会,让我们扩大了知识量,弥补了知识的欠缺,进一步完善了自我。衷心的感谢老师在设计过程中对我的问题进行耐心的解答,使我的设计顺利完成。我还要感谢我的同学们,在这一阶段给了我极大的帮助。
5. 参考文献
[1]吕兵 曲宝军等编Visual C++从初学到精通,北京:电子工业出版社,2010-6
展开阅读全文