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所示:由在系统中描述学生实体的相关信息有学号,学生姓名,系别,班级,性别,年龄,设计该实体ER图如图图4 实体课程局部ER图2.1.2 系统全局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学生信息表(Student)内容:表2课程信息表(Course)结构:表3课程信息表(Course)内容:表4教师信息表(Teacher)结构:表5教师信息表(teacher)内容:表6教师授课表(Teachercourse)结构:表7教师授课表(Teachercourse)内容:表8学生选课表(Selectcourse)结构:表9学生选课表(Selectcourse)内容:表10学生成绩表(Score)结构:表13学生成绩表(score)内容:表142.4 创建数据库关系图图73.应用软件的实现在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图93)对菜单项“学生情况”设置ID为ID_person,并点击建立类向导,添加单击消息函数响应,添加代码如下:void CMainFrame::Onperson(){// TODO: Add your command handler code hereCGS 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;DataSource=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*FROMStudent",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(theV alue1.vt!=VT_NULL)m_sname=(char*)_bstr_t(theValue1);theValue1=m_pRecordset3->GetCollect("sdept");if(theV alue1.vt!=VT_NULL)m_sdept=(char*)_bstr_t(theValue1);theValue1=m_pRecordset3->GetCollect("sclass");if(theV alue1.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.iV al;}UpdateData(false);}void CGS::OnButton5() //前一条函数:可以浏览数据{// TODO: Add your control notification handler code herem_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 hereUpdateData(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 heretry{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 hereUpdateData(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)上述为学生基本情况的对话框实现代码,课程基本情况、教师授课表情况及学生成绩三个个对话框的各功能实现代码与上述代码相似。