VC++学生信息管理系统课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1绪论 (1)
1.1项目简介 (1)
1.2设计目的 (1)
1.3设计内容 (1)
2需求分析 (1)
2.1数据需求 (1)
2.2事务需求 (2)
3概要设计 (2)
3.1系统的大致流程图 (2)
4详细设计 (2)
4.1系统的流程图 (2)
4.2整体逻辑数据库结构 (3)
4.3涉及算法的思想 (3)
5用户使用说明 (4)
5.1开发运行环境 (4)
5.2数据库的名称及内容 (4)
6关键源程序 (5)
6.1建立工程 (5)
6.2模块1 (5)
6.3模块2 (9)
6.5模块4 (12)
7测试结果及运行界面 (19)
8总结 (23)
8.1系统实现程度 (23)
8.2问题及难点 (23)
8.3收获与体会 (23)
参考文献 (24)
1绪论
1.1项目简介
本系统主要实现学生信息管理功能,为老师与同学提供一个可以快速查找信息的平台。
1.2设计目的
方便老师与同学查看学生信息,提高学生信息管理的效率,节省时间,从而实现学校工作的边界管理。
1.3设计内容
主要包括:用户的登陆于注册,对学生信息的增加删除修改。
2需求分析
2.1数据需求
系统需要处理哪些数据
总体分为用户输入的数据和从数据库中获得的数据。
主要数据类型包括:
CString类型数据、double类型数据、int类型数据和CTime类型数据。
2.2事务需求
用户:登陆、注册,对数据的增删改
3概要设计3.1系统的大致流程图
4详细设计4.1系统的流程图
4.2整体逻辑数据库结构
4.3涉及算法的思想
4.3.1建立数据库
通过ADO建立两个数据库(新建 Microsoft Office Access 应用程序)存放登陆信息和学生信息。
4.3.2数据录入
在新建学生信息数据库中录入学生信息。
4.3.3登录框的设计
4.3.3.1 建立变量Sname,Spsw,通过格式变幻,将CString格式转换成
数据库规定的格式
4.3.3.2 通过compare函数将输入的用户名与密码与数据库比较
4.3.4注册框的设计
先判定输入框里的名字在数据库里不存在,然后将输入的信息替换入数据库
4.3.5添加记录
4.3.
5.1建立一个新的窗口,包含姓名,学号,年龄等基本信息录入框 4.3.5.2用户录入要添加记录信息,如果要添加记录和已有记录不冲突
就会把录入信息添加到新建 Microsoft Office Access 应用程序记录集中。
4.3.6修改记录
对已经录入的学生信息进行修改
4.3.7删除记录将已选中的记录从记录集中去除。
5用户使用说明
5.1开发运行环境
5.1.1设备:
本系统对设备的要求很低,一般的电脑主机都能运行。
运行前安装Visual C++ 6.0。
5.1.2支持软件:
系统支持:Windows 7等。
开发工具:Visual C++ 6.0、Access 2010。
5.2数据库的名称及内容
本系统包含两个数据库,Data和Database数据库,Database数据库中储存的是用户名与密码,Data数据库中储存的是学生的学号、姓名、年龄、联系方式、宿舍。
Data(学生通讯表)
Database(管理登录表)
6关键源程序
6.1建立工程
6.2模块1
先在学生信息管理系统.cpp中添加代码,通过ADO创建登陆数据库// 学生信息管理系统.cpp : Defines the class behaviors for the application. #include "stdafx.h"
#include "学生信息管理系统.h"
#include "学生信息管理系统Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CMyApp
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyApp construction
CMyApp::CMyApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
// The one and only CMyApp object
CMyApp theApp;
CDaoDatabase db;//建立全局变量,在其他地方调用时要加extern
// CMyApp initialization
BOOL CMyApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL #else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
//这里就是程序入口,在这里添加数据库检查代码
CString Filepath="Database.mdb";
CDaoRecordset Dbset(&db);
CFileFind Ffind;//先看看存不存在数据库文件
BOOL flag=Ffind.FindFile(Filepath);
Ffind.Close();
if(!flag)//如果没有就创建
{
CString sqlcmd="CREATE TABLE DataTable(Name
V ARCHAR(20),Psw V ARCHAR(20))";
db.Create(Filepath);
db.Execute(sqlcmd);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
Dbset.AddNew();
Dbset.SetFieldValue("Name",_variant_t("wzh"));
Dbset.SetFieldValue("Psw",_variant_t("123456"));
Dbset.Update();
Dbset.Close();
db.Close();
}//建立数据库文件,设置初始化账号
CMyDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump.
return FALSE;
}
void CMyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
// 给窗体添加背景
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);//取得bmpBackground中图片的信息,放在bitmap所指的指针中
CBitmap* pbmpPri = dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rc.Width(), rc.Height(), &dcMem,0,0,bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
//CDialog::OnPaint();
}
}
进入系统
void CMyDlg::OnButton1()
{
DIALOGLOG tec;
tec.DoModal();
}
退出系统
void CMyDlg::OnButton2()
{
if(IDYES==MessageBox("确定退出?","退出程序",
MB_ICONQUESTION|MB_YESNO ))
DestroyWindow();
}
6.3模块2
登陆
extern CDaoDatabase db;//调用那个全局变量
void DIALOGLOG::Onlogbt()
{
//判断输入筐里的内容和数据库里的内容是否吻合
UpdateData(true);
CDaoRecordset Dbset(&db);
CString Filepath="Database.mdb";
CString Sname,Spsw;
_variant_t varname,varpsw;
db.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
varname=Dbset.GetFieldValue("Name");
varpsw=Dbset.GetFieldValue("Psw");
Sname=(LPCSTR)_bstr_t(varname);
Spsw=(LPCSTR)_bstr_t(varpsw);
Dbset.Close();
db.Close();
if(m_logname.IsEmpty()||m_logpsw.IsEmpty())//如果输入框中存在空输入
{
MessageBox("信息不能为空!");
return;
}
if(pare(m_logname)==0&&pare(m_logpsw)==0)//如果密码和用户与数据库一致
{
MessageBox("登入成功!","温情提示");
DIALOG3 dlg;
dlg.DoModal();
}
else
{
MessageBox("用户名或密码错误!","温情提示");
return;
}
}
注册
void DIALOGLOG::Onlogreg()
{
DIALOGREG dlg;
dlg.DoModal();
}
6.4模块3
取消
void DIALOGREG::OnRegcancle()
{
CDialog::OnCancel();
}
注册
void DIALOGREG::OnRegbt()
{
//让数据库里一直只有一个用户
UpdateData(true);//及时更新数据
CString Filepath="Database.mdb";
CString Sname;
_variant_t varname;
CDaoRecordset Dbset(&db);
db.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
varname=Dbset.GetFieldValue("Name");
Sname=(LPCSTR)_bstr_t(varname);
if(m_regname.IsEmpty()||m_regpsw.IsEmpty())
{
MessageBox("信息不能为空!","温情提示");
return;
}
if(m_regpsw!=m_regpsw1)
{
AfxMessageBox("密码不一致");
return;
}
if(pare(m_regname)!=0)//如果输入框里的名字在数据库里不存在
{
Dbset.Edit();//将新数据代替旧数据
Dbset.SetFieldValue("Name",_variant_t(m_regname));
Dbset.SetFieldValue("Psw",_variant_t(m_regpsw));
Dbset.Update();
MessageBox("用户注册成功!","温情提示");
CDialog::OnOK();
}
else//如果输入的名字和数据库里的一致,这提示存在该用户
{
MessageBox("该用户已存在!","温情提示");
}
Dbset.Close();
db.Close();
}
6.5模块4
初始化窗口
BOOL DIALOG3::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_list.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|L VS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIV ATE|LVS_EX_GRI DLINES);//设置扩展样式
m_list.InsertColumn(0,"学号",LVCFMT_LEFT,100,0);//添加学号项
m_list.InsertColumn(1,"姓名",LVCFMT_LEFT,100,1);//添加姓名项
m_list.InsertColumn(2,"年龄",LVCFMT_LEFT,100,2);//添加年龄项
m_list.InsertColumn(3,"联系方式",LVCFMT_LEFT,200,3);//添加联系方式项
m_list.InsertColumn(4,"宿舍",LVCFMT_LEFT,100,4);//添加宿舍项
readDb();//在初始化函数中,如果没有找到数据库文件就创建,并且在列表中显示出来
return TRUE; // return TRUE unless you set the focus to a control
}
通过ADO创建学生信息数据库
void DIALOG3::readDb()
{
CString Filepath="Data.mdb";//将数据库文件Data.mdb在程序的同一目录下
CFileFind Ffind;//先看看存不存在数据库文件
BOOL flag=Ffind.FindFile(Filepath);
Ffind.Close();
if(!flag)//如果没有,就创建
{
aa.Create(Filepath);
CString sqlcmd="CREATE TABLE DataTable(Num
V ARCHAR(20),Name V ARCHAR(20),Age V ARCHAR(3),Phone
V ARCHAR(20),Home V ARCHAR(20))";//创建内部表,并设置两个属性(姓名,年龄)
aa.Execute(sqlcmd);//执行sql指令
aa.Close();//创建完成一定要关闭,否则出错
MessageBox("数据库已建立成功!","温情提示");
}
_variant_t varnum,varname;
COleVariant varage,varphone,varhome;
CString Sname,Sage,Snum,Sphone,Shome;
int i=0;
aa.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
while(!Dbset.IsEOF())
{
varnum=Dbset.GetFieldValue("Num");
varname=Dbset.GetFieldValue("Name");
varage=Dbset.GetFieldValue("Age");
varphone=Dbset.GetFieldValue("Phone");
varhome=Dbset.GetFieldValue("Home");
Snum=(LPCSTR)_bstr_t(varnum);
Sname=(LPCSTR)_bstr_t(varname);
Sage=(LPCSTR)varage.pbstrVal;
Sphone=(LPCSTR)varphone.pbstrVal;
Shome=(LPCSTR)varhome.pbstrVal;//分别将数据库里面读出来的文件转换成CString
m_list.InsertItem(i,"");
m_list.SetItemText(i,0,Snum);
m_list.SetItemText(i,1,Sname);
m_list.SetItemText(i,2,Sage);
m_list.SetItemText(i,3,Sphone);
m_list.SetItemText(i,4,Shome);
Dbset.MoveNext();//没有就不能循环
i++;
}
Dbset.Close();
aa.Close();
}
与表格相关联
void DIALOG3::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
int pos=m_list.GetSelectionMark();
m_num=m_list.GetItemText(pos,0);
m_name=m_list.GetItemText(pos,1);
m_age=m_list.GetItemText(pos,2);
m_phone=m_list.GetItemText(pos,3);
m_home=m_list.GetItemText(pos,4);
UpdateData(false);
*pResult = 0;
}
新建
void DIALOG3::Onadd()
{
UpdateData(true);
if(m_name.IsEmpty()||m_age.IsEmpty()||m_num.IsEmpty()||m_phone.IsEmpty ()||m_home.IsEmpty())//如果输入框为空,则提示信息
{
MessageBox("信息不能为空!","温情提示");
}
else
{
CString Filepath="Data.mdb";
int i=m_list.GetItemCount();//在列表的队尾添加,所以先获取行数
aa.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
Dbset.AddNew();//在记录集的队尾添加
Dbset.SetFieldValue("Num",_variant_t(m_num));
Dbset.SetFieldValue("Age",atol(m_age));
Dbset.SetFieldValue("Name",_variant_t(m_name));
Dbset.SetFieldValue("Home",atol(m_home));
Dbset.SetFieldValue("Phone",atol(m_phone));//将CString格式转换成数据库规定的格式
Dbset.Update();//及时更新
Dbset.Close();
aa.Close();//并关闭
m_list.InsertItem(i,"");
m_list.SetItemText(i,0,m_num);
m_list.SetItemText(i,1,m_name);//在列表里显示
m_list.SetItemText(i,2,m_age);
m_list.SetItemText(i,3,m_phone);
m_list.SetItemText(i,4,m_home);
}
}
删除
void DIALOG3::Ondel()
{
int pos=m_list.GetSelectionMark();//所选中行的索引号
if(!(pos+1))//如果没有选中从第一行到最后一行,则提示选中先
{
MessageBox("请先选择需要删除的一行!","温情提示");
}
else
{
CString Filepath="Data.mdb";
aa.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
Dbset.Move(pos);//将记录集的指针移动到当前数据的索引处
Dbset.Delete();//删除数据
Dbset.Close();
aa.Close();
m_list.DeleteAllItems();
readDb();//最后两句的作用是刷新列表
}
}
修改
void DIALOG3::Onmodify()
{
UpdateData(true);
int pos=m_list.GetSelectionMark();
if(!(pos+1))
{
MessageBox("请先选择需要修改的行!","温情提示");
}
else
{
CString Filepath="Data.mdb";
aa.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
Dbset.Move(pos);
Dbset.Edit();//将指针移动到所选项后,将数据置于编辑状态
Dbset.SetFieldValue("Num",_variant_t(m_num));
Dbset.SetFieldValue("Name",_variant_t(m_name));
Dbset.SetFieldValue("Age",atol(m_age));
Dbset.SetFieldValue("Phone",atol(m_phone));
Dbset.SetFieldValue("Home",atol(m_home));
Dbset.Update();//修改完以后更新,否则会出错
Dbset.Close();
aa.Close();
m_list.DeleteAllItems();
readDb();
}
}
成员变量信息:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
#if !defined(AFX_STDAFX_H__B7A04679_274E_49A4_BE2C_DE7F27AD144 3__INCLUDED_)
#define
AFX_STDAFX_H__B7A04679_274E_49A4_BE2C_DE7F27AD1443__INCLUD ED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxdao.h>
#include<comdef.h>
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif
// !defined(AFX_STDAFX_H__B7A04679_274E_49A4_BE2C_DE7F27AD1443 __INCLUDED_)
7测试结果及运行界面
进入系统
建立新用户时,若两次输入密码不同会弹出警告
在登录界面中输入错误的用户名或者密码时,弹出警告框
当用户名和密码都正确时,进入主界面
在添加菜单中,输入的数据不能为空,否则弹出警告
当未选择所要删除的记录时,弹出警告框
当为选择所要修改的记录时,弹出警告框
退出程序时,谈出对话框
8总结
8.1系统实现程度
最终的系统完成了哪些功能,与初期设计还有哪些差距或未完成的内容。
系统完成的功能包括:
注册、登录和注册信息修改,学生信息的增加、修改和删除。
未完成的内容:学生信息的查询和相关图表的生成学生成绩的增删改查,以及管理员的更多操作等。
8.2问题及难点
课设过程中遇到的棘手问题及难点所在。
在学习vc++的过程中,有接触到一定的有关MFC的知识,但了解的比较肤浅,也很零散。
但实际操作过程中遇到了很多实际的问题。
对于ADO语言的不熟悉,在调用时函数时,遇到了很大地难度。
在技术上或没用过或没学过,需要边做边学习!如MFC中对各种类和控件的操作还不熟练。
细节问题:头文件包含的顺序。
全局变量问题。
视图切换和切换后的数据更新问题。
ADO数据库的相关操作和数据类型的相关转换问题等
8.3收获与体会
1、通过这次课程设计,对MFC有了更深的认识,对MFC控件有了更深刻理解。
把老师教的一些东西运用到实践中去锻炼了自己的能力。
我C++学了很久,MFC 也看了10多集视频,但就是从没机会亲自动手编一个稍复杂点的程序练练。
一门语言或是一门技术,真正逐渐掌握的过程正是不断联系,不断用的过程。
理论永远代替不了实践。
2、学会了用ADO来操作与创建数据库
3、通过这次课程设计,对数据库知识有了初步的认识。
初步学会了用Access 创建数据库。
学会了表的建立和设置。
为了完善学生信息管理系统的功能我走进图书馆,翻阅了大量关于数据库的资料,并从互联网上学到很多知识。
不能说已经通悟了数据库,但是对数据库中的一些基本知识还是有所了解的。
4、从一开始的选题到现在的设计结束,从在课本上熟悉基本知识到到外面的相关图书中了解其他与设计通讯录有关的知识,我不仅对课本的基本知识有了一定的掌握,还对其他方面的知识有所了解。
让我懂得更多的知识。
在这次课程设计中遇到了很多问题,对亏了同学和老师的帮助得以完成谢谢老师和同学的帮助。
参考文献
《面向对象程序设计基础》,机械工业出版社,赵雷、朱晓旭编著;
《Visual C++教程》,机械工业出版社,丁有和编著;
《Visual C++课程设计案例经编》,中国水利水电出版社,严华峰等编著;《Visual C++程序设计教程与上机指导》,北京大学出版社,高志伟著;《Visual C++数据库系统开发完全手册》,人民邮电出版社,王瑞,于速著《Visual C++程序员成长攻略》,中国水利水电出版社,戴博,周杨等著
《C++ Builder数据库开发经典案例解析》,清华大学出版社,王晟著
《精彩C++ Builder6 程序设计》,科学出版社,吴逸贤著
《C++ Builder应用程序开发实例与技巧》,西安交通大学出版社,曹岩等著《Visual C++教程》北京机械工业出版社。
郑阿奇,丁有和编著.
《Visual C++实用教程(第二版)》.北京电子工业出版社,郑阿奇编著. 《Visual C++ 6.0多媒体开发指南》北京清华大学出版社,李博轩编著.。