VC++学生信息管理系统课程设计报告
- 格式:docx
- 大小:401.22 KB
- 文档页数:27
目录1绪论 (1)1.1项目简介 (1)1.2设计目的 (1)1.3设计内容 (1)2需求分析 (1)2.1数据需求 (1)2.2事务需求 (1)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测试结果及运行界面 (18)8总结 (22)8.1系统实现程度 (22)8.2问题及难点 (22)8.3收获与体会 (22)参考文献 (23)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_FILEstatic char THIS_FILE[] = __FILE__;#endif// CMyAppBEGIN_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_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyApp constructionCMyApp::CMyApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}// The one and only CMyApp objectCMyApp theApp;CDaoDatabase db;//建立全局变量,在其他地方调用时要加extern// CMyApp initializationBOOL 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 _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // 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(NameV 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 paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.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 herem_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(NumV ARCHAR(20),Name V ARCHAR(20),Age V ARCHAR(3),PhoneV 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;//分别将数据库里面读出来的文件转换成CStringm_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_)#defineAFX_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系统实现程度最终的系统完成了哪些功能,与初期设计还有哪些差距或未完成的内容。