北邮程序设计实践学生管理系统实验报告.docx
- 文档编号:26390359
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:24
- 大小:480.22KB
北邮程序设计实践学生管理系统实验报告.docx
《北邮程序设计实践学生管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《北邮程序设计实践学生管理系统实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
北邮程序设计实践学生管理系统实验报告
程序设计实践
设
计
报
告
课题名称:
基于MFC与Access数据库的学生管理系统
学生姓名:
班级:
2012211109
班内序号:
26
学号:
********70
日期:
2014.5.31
1.
课题概述
1.1课题目标和主要内容
本课题中主要使用的工具MFC,在VS2010平台下进行开发。
通过ADO库连接到笔者电脑中的系统数据库并通过AccessDatabase查看数据库同步与修改情况并演示。
实验内容:
●实现基本的学生管理系统的功能;
●实现程序与Access数据库同步,可以进行信息修改、添加用户等功能;
●基于C++面向对象实现不同类之间的关联调用
实验目标:
●理解MFC应用程序的运行机制;
●掌握使用MFC构建Windows应用程序的基本结构及编程的基本方法;
●理解和掌握MFC应用程序消息处理机制及应用;
●掌握MFC与数据库相连的方法,建立一个简单的学生管理系统。
1.2系统的主要功能
功能描述:
一、学生部分:
可以使用自己的学号及密码登录学生管理系统,并查询自己的成绩。
二、教师部分:
使用账号和密码登录学生管理系统,进行学生成绩查看、录入及修改。
三、管理员部分:
可以查看用户及用户权限,添加用户以及修改用户权限。
2.系统设计
2.1系统总体框架
系统框架图如下:
设计思想:
分为MFC程序部分,连接部分和数据库部分。
根据功能直接操纵对话框添加控件,进而设计相应函数,调用相应类来实现功能;
然后通过调用ADO库中的函数来建立与Access数据库的连接。
2.2系统详细设计
[1]模块划分图及描述
学生功能模块图
教师功能模块图
管理员功能模块图
[2]类关系图及描述
以上这些派生类是这个程序所用到的主要类。
其中,Cstudent2Dlg对应着登录界面对话框的类;
CTeacherDlg对应着教师登录进去所显示的对话框的类;
CStudentDlg对应着学生登录进去所显示的对话框的类;
CAdministratorDlg对应着管理员登录进去所显示的对话框的类;
其他类也分别对应着实现某个功能所显示的对话框的类。
[3]程序流程图及描述
[4]存储结构
MFC中的数据存储在列表控件中,指针类型为LPCSTR;
导出数据库时搜索出来的数据存储类型主要是CString,用来存储各种从数据库中获得的信息
2.3关键算法分析
(1)初始化操作,即连接数据库
[1]算法功能:
实现主界面的初始化工作,建立与数据库的连接
[2]时间、空间复杂度o
(1)
[3]代码分析
BOOLCstudent2Dlg:
:
OnInitDialog()
{
CDialogEx:
:
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
BOOLbNameValid;
CStringstrAboutMenu;
bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:
在此添加额外的初始化代码
try
{
HRESULThr=m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
if(SUCCEEDED(hr))
{
hr=m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=E:
\\MFC\\student2.mdb","","",adModeUnknown);//连接数据库
AfxMessageBox(_T("数据库连接成功"));//显示正确信息
}
}
catch(_com_errore)//捕捉异常
{
AfxMessageBox(_T("数据库不存在"));//显示错误信息
}
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
}
}
分析:
连接数据库ADO最重要的三个对象有三个:
连接对象(Connection)、命令对象(Command)和记录集对象(RecordSet)。
在使用这三个对象的时候,需要定义与之相对应的智能指针,分别为_ConnectionPtr、_CommandPtr、_RecordsetPtr。
HRESULT是一种简单的数据类型,通常被属性和ATL用作返回值。
返回值:
如果成功返回新图像的索引,否则返回-1。
(2)获取登录信息,分析登录权限的算法
[1]时间复杂度、空间复杂度o(n)
[2]代码分析
voidCstudent2Dlg:
:
OnBnClickedOk()
{
//对用户权限表进行连接admin3
m_pRecordset.CreateInstance("ADODB.Recordset");try
{
m_pRecordset->Open("SELECT*FROMadmin3",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);//执行SQL语句,得到记录集
}
catch(_com_error*e)//捕捉异常
{AfxMessageBox(e->ErrorMessage());
}
//获取对话框数据numpass,对账户进行判断登录
UpdateData(TRUE);
if(num==""||pass=="")
{
AfxMessageBox("信息不完整,请重新输入!
");
return;
}
_variant_tvar;//就可以方便的把C++类型变量转换成COM中的变量了。
CStringstrnum,strpass,stradm;
m_pRecordset->MoveFirst();//移到首条记录
while(!
m_pRecordset->adoEOF)
{
var=m_pRecordset->GetCollect("number");//读取数据库admin3的number
if(var.vt!
=VT_NULL)
strnum=(LPCSTR)_bstr_t(var);
if(strnum==num)//如果数据库中某条number与编辑框输入的num相同,则执行完毕
break;
m_pRecordset->MoveNext();//移到下一条记录
}
if(m_pRecordset->adoEOF)
AfxMessageBox("账号错误,请重试");
else
{
var=m_pRecordset->GetCollect("password");//读取数据库中的密码
if(var.vt!
=VT_NULL)
strpass=(LPCSTR)_bstr_t(var);
if(strpass!
=pass)
AfxMessageBox("密码错误,请重试");
else
{
var=m_pRecordset->GetCollect("admin");
if(var.vt!
=VT_NULL)
stradm=(LPCSTR)_bstr_t(var);
//按权限进入不同用户对话框对话框
if(stradm=="student")//读取该同学信息并显示通过这个与student界面相连
{
CStuentDlgdlg;
dlg.SetValue(strnum);//使用对应类的函数去更新显示数据
if(dlg.DoModal()==IDOK)//显示添加人员对话框,并判断是否单击确定按钮如果选择退出
{
AfxMessageBox("亲爱的同学,再见,祝你学习顺心O(∩_∩)O~");
}
}
if(stradm=="teacher")
{
CTeacherDlgdlg;
dlg.SetValue(strnum);
if(dlg.DoModal()==IDOK)//显示添加人员对话框,并判断是否单击确定按钮
{
AfxMessageBox("亲爱的老师,再见,您辛苦了O(∩_∩)O~");
}
}
if(stradm=="administrator")
{
CAdministratorDlgdlg;
if(dlg.DoModal()==IDOK)//显示添加人员对话框,并判断是否单击确定按钮
{
AfxMessageBox("亲爱的管理员,再见O(∩_∩)O~");
}
}
}}
//关闭表格admin3
m_pRecordset->Close();
m_pRecordset=NULL;
//CDialogEx:
:
OnOK();
}
分析:
ADODB是动态数据链接对象Recordset是ADODB的一个子类记录集操作数据库的指针
首先用CString类型的num和pass分别记录从编辑框中获取的用户输入的账号和密码,再分别于数据库中admin3这张表中的账号和密码比对,如果有该条符合条件的记录,则读取数据库中对应那条记录中的admin即权限项,再分别调用与之匹配的类对象,进入到相对应的用户界面当中去。
(3)查看各项信息(以学生权限为例)
[1]时间复杂度、空间复杂度o(n)
[2]代码分析
voidCStuentDlg:
:
OnBnClickedgrade()//如果点查询成绩的话就连到成绩表中
{
//TODO:
在此添加控件通知处理程序代码
try{
HRESULThr=m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
if(SUCCEEDED(hr))
{hr=m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=E:
\\MFC\\student2.mdb","","",adModeUnknown);//连接数据库
//AfxMessageBox(_T("数据库连接成功"));//显示错误信息
}}
catch(_com_errore)//捕捉异常
{
AfxMessageBox(_T("数据库不存在"));//显示错误信息
}
m_pRecordset.CreateInstance("ADODB.Recordset");
try
{
m_pRecordset->Open("SELECT*FROMgrade",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error*e)
{AfxMessageBox(e->ErrorMessage());
};
_variant_tvar;
CStringstrnum;
m_pRecordset->MoveFirst();
//设置列表控件
stulist.InsertColumn(0,"课程名称",LVCFMT_LEFT,100);
stulist.InsertColumn(1,"学分",LVCFMT_LEFT,100);
stulist.InsertColumn(2,"任课教师",LVCFMT_LEFT,100);
stulist.InsertColumn(3,"成绩",LVCFMT_LEFT,80);
stulist.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
stulist.DeleteAllItems();//删除原有数据
intindex=0;
while(!
m_pRecordset->adoEOF)
{
var=m_pRecordset->GetCollect("snumber");
if(var.vt!
=VT_NULL)
strnum=(LPCSTR)_bstr_t(var);
if(strnum==s_num)
{
//向列表控件中插入记录
var=m_pRecordset->GetCollect("course");
if(var.vt!
=VT_NULL)
stulist.InsertItem(index,(LPCSTR)_bstr_t(var));//列表控件插入强制转换成LPCSTR
var=m_pRecordset->GetCollect("学分");
if(var.vt!
=VT_NULL)
stulist.SetItemText(index,1,(LPCSTR)_bstr_t(var));
var=m_pRecordset->GetCollect("任课教师");
if(var.vt!
=VT_NULL)
stulist.SetItemText(index,2,(LPCSTR)_bstr_t(var));
var=m_pRecordset->GetCollect("grade");
if(var.vt!
=VT_NULL)
stulist.SetItemText(index,3,(LPCSTR)_bstr_t(var));
index++;
}
m_pRecordset->MoveNext();
}
//关闭表格grade
m_pRecordset->Close();
m_pRecordset=NULL;
}
分析:
首先连接到数据库,再从数据库中的grade表去读取各项信息。
语句m_pRecordset->Open(“SELECT*FROMgrade”………)
设置一个列表控件来显示各项信息。
并加入While循环,循环读取对应学号的成绩信息。
(4)增加信息(以老师为例)
[1]时间复杂度、空间复杂度o
(1)
[2]代码分析
m_pRecordset.CreateInstance("ADODB.Recordset");
try
{
m_pRecordset->Open("SELECT*FROMgrade",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error*e)
{AfxMessageBox(e->ErrorMessage());}
try
{
m_pRecordset->AddNew();
m_pRecordset->PutCollect("snumber",_variant_t(dlg.m_num));
m_pRecordset->PutCollect("course",_variant_t(dlg.m_course));
m_pRecordset->PutCollect("grade",_variant_t(dlg.m_grade));
m_pRecordset->PutCollect("学分",_variant_t(dlg.m_credit));
m_pRecordset->PutCollect("老师工号",_variant_t(t_number));
m_pRecordset->PutCollect("学生姓名",_variant_t(dlg.m_name));
m_pRecordset->PutCollect("任课教师",_variant_t(t_name));
m_pRecordset->Update();
AfxMessageBox("成绩成功录入~");
}
catch(_com_error*e)
{AfxMessageBox(e->ErrorMessage());}
分析:
主要用m_pRecordset来调用PutCollect函数将数据录入数据库对应表格。
2.4其他
较普遍的使用了类的继承,派生类中调用基类的成员函数,来精简代码。
比如:
学生界面的对话框类CStudentDlg的基类是CDialogEx——MFC系统类;于是在CStudentDlg类中的函数实现相应功能时就可以直接调用CDialog类中的成员函数;
比如在Cstudent2Dlg:
:
OnInitDialog()中直接调用CDialogEx:
:
OnInitDialog()的初始化函数
3.程序运行结果分析
(1)运行,登录界面显示
(2)输入账号密码进行登录
若密码错误,会返回提示信息
(3)教师界面
1、成绩查看
2、成绩录入
3、学生成绩修改,还附带查询功能
4、修改用户密码
(4)学生界面
成绩查询:
(5)管理员界面
1、查看用户及权限
2、添加用户
数据库中成功添加入这一用户
3、修改用户权限,附带查询功能
程序运行时间较短,与数据库连接速度较快
4.总结
4.1课题的难点和关键点
本课题涵盖的知识与技术较广泛,既包括MFC实现基本电话本功能设计的前端界面,又包括前端与数据库的连接与同步。
本课题的难点在于各个类与对话框资源之间的继承,与调用对象关系,例如,如何在主对话框中点击相应按钮,弹出相应对话框,以及如何将弹出的对话框中的信息接收,并在主对话框中显示,前端设计对面向对象的编程能力要求较高。
通过这个程序很好的锻炼了自己面向对象编程的能力。
另外一个难点与关键点是连接数据库与同步的部分,用ADO库连接Access实现MFC学生管理系统程序导出到数据库,并实现同步的数据添加及删除。
4.2本课题的评价
(1)对课题本身的评价:
这个课题很好地体现了MFC编程的特点:
●以层次结构组织
●提供了ADO库,很方便地进行与数据库的连接
●提供了对话框环境下应用程序的框架
●提供了大量的基类便于不同的应用环境进行扩展
●允许自定义和扩展应用程序中的类
(2)自己的完成情况
我的程序实现了学生管理系统的基本功能:
学生部分可以查询自己的成绩以及修改密码;
教师部分可以进行成绩录入、修改以及查看,修改密码等;
管理员部分可以增加用户,修改用户权限等。
由于之前已经做了关于MFC的程序,所以这一次在实现学生管理系统的时候比较好上手,就是刚开始时不知道怎么才能与数据库进行同步连接,特地在网上查找了很多资料,然后逐步摸索,学会了运用ADO库连接数据库的方法。
(3)不足
还未实现同步删除的功能,后期可以添加。
本来还想实现老师可以发邮件给学生通知成绩的功能,但由于对网络编程还不是很了解以及时间比较少,各种函数都写出来了,但是到最后邮件还是未能发送成功。
这个以后在假期的时候我会继续完善这个功能。
4.3心得体会
当初选择这个课题就是因为觉得这个课题几乎涉及到了一个成熟程序产品开发的各个部分。
包括前端的开发,界面的设计;后台数据库的支持,对数据的处理;以及前端后端对数据的同步——同步处理与同步显示。
目前大型程序基本都像这样涉及到了这几个基本部分,通过这个实验可以很好的锻炼自己的能力。
实验完成后发现果然受益匪浅。
通过前端MFC界面的设计,感觉面向对象编程能力和对于C++的理解显著提高;掌握了简单的后台与前端的连接与同步方法,同时加强了对数据库的使用。
通过此次试验感觉对于编程的信心得到了极大地提升,同时查找资料解决问题的能力得到加强,虽然在最困难的时候为了这个程序两天只吃了四顿饭,全部时间都在调试,上网搜索程序报出的错误及上各大网站如CSDN,新浪博客搜索各种技术的实现方法,但全部完成之后感觉努力得到了回报。
在这里衷心感谢老师的指导,也衷心感谢当时那位研究生学长的讲解与提出的宝贵建议,不仅使我在这次课题中完善了程序,也使我在正在做的创新项目中的前端与数据库同步的部分的得到较大启发,受益匪浅。
5.参考文献
[1]谭浩强,丁桂芝.VC++程序设计项目实践.第2版.北京:
清华大学出版社,2010.3
[2]刘锐宁,宋坤.VisualC++从入门到精通.第2版.北京:
清华大学出社,2010.7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 实践 学生 管理 系统 实验 报告