资源描述
- .
XX理工大学 聋人工学院
?C++语言课程设计?
专业:网络工程
年级:2015级一班
XX:志冲
学号:
成绩:
完成日期:20161220
- . 可修编.
目录
第一章 简介1
1.1 设计题目1
1.2 指导教师1
第二章?图书管理系统?设计意义2
2.1 设计容概述2
2.2需求分析2
2.3 设计意义2
第三章总体设计3
3.1 系统运行环境3
3.2 系统构造图3
3.3 系统各模块的功能4
3.4 对象数据构造7
第四章详细设计8
4.1程序源代码8
4.1.1登陆模块8
4.1.2注册模块11
4.1.3主菜单模块13
4.1.4编辑模块17
4.1.5查询模块27
4.1.6浏览模块34
4.1.7设置模块39
4.1.8组合框模块41
4.1.9图书信息模块43
4.1.10 资源文件45
4.2系统测试55
4.2.1登陆对话框55
4.2.2编辑对话框58
4.2.3浏览对话框62
4.2.4查询对话框66
4.2.5设置对话框71
4.2.6退出73
4.2.7测试完毕运行73
4.3问题分析73
第五章结论80
参考文献81
第一章 简介
1.1 设计题目
图书管理系统
1.2 指导教师
第二章?图书管理系统?设计意义
2.1 设计容概述
本课程设计图书管理系统,必修要满足使用方便、操作灵活和数据平安等设计需求。本系统在设计时应满足以下几个目标:
1.采用人机对话的操作方式,界面设计美观友好,操作灵活、方便、快捷、准确数据保存平安可靠。
2.实现对图书信息的管理功能。
3.系统运行稳定、平安可靠。
2.2需求分析
信息技术的飞速开展给图书企业的管理带来了全新的变革.采用图书管理系统对图书企业的经营运作进展全程管理.不仅可以使企业摆脱以往人工管理产生的一系列问题,而且可以提高管理效率、降低管理本钱、增加经济效益。通过管理系统对图书企业的开展进展规划,可以收集大量关键可靠的数据。企业决策层分析这些数据,做出合理决策,及时调整,使之能够更好地遵循市场的销售规律,适应市场的变化,从而让企业能够在剧烈的行业竞争中占据一席之地。
2.3 设计意义
1.有助于加深我们对C++程序设计这门课程的理解,我们在课堂上学的都是根底理论知识,对于如何用程序语言来描述所学知识还是有一定难度。通过课程设计,我们可以真正理解其涵。
2.有利于我们逻辑思维的锻炼,程序设计能直接有效地训练学生的创新思维、培养分析问题、解决问题能力。即使是一个简单的程序,依然需要学生有条不理的构思。
3.有利于培养严谨认真的学习态度,在程序设计过程里,当我们输入程序代码的时候,如果不够认真或细心,那么可能就导致语法错误,从而无法得出运行结果。那么,这个我们反复调试,反复修改的过程,其实也是对我们认真严谨治学的一个锻炼。
第三章 总体设计
3.1 系统运行环境
1.硬件环境
PC机
2.软件环境
操作系统:Windows 10
开发工具:Visual studio 2010
3.2 系统构造图
图书管理系统构造图如图3.1所以。该系统包括:添加、修改、删除、查询、浏览等。
图 3.1 系统的功能模块图
3.3系统各模块的功能
表3.2 主要类介绍
类名
派生自
说明
CtianjinApp
CWinApp
为初始化应用程序Window应用程序基类的派生类
Login
CDialog
用户登录对话框
Register
CDialog
注册对话框
CtianjinDlg
CDialog
主程序界面对话框
sta
CStatic
由于直接用CStatic创立的静态文本控件的样式是默认,但不是理想的效果,故再次继承CStatic,可以重新改变样式。
button
CButton
由于直接用CButton创立的按钮控件的样式是默认,但不是理想的效果,故再次继承CButton,可以重新改变样式。
Explore
CDialog
浏览对话框
box
CboBox
由于直接用CboBox创立的组合框控件的样式是默认,但不是理想的效果,故再次继承CboBox,可以重新改变样式。
entering
CDialog
编辑对话框
EditPrice
CEdit
由于直接用CEdit创立的编辑框的功能还不够,所以再次继承CEdit,可以多加功能-限制输入字符
query
CDialog
查询对话框
Setting
CDialog
设置对话框
About
CDialog
关于对话框
表3.3 主要函数介绍
源文件
函数名称
功能描述
Explore.cpp
OnInitDialog
OpenFile
OnClickedButton1
OnClickedButton2
ExchangeBook
对对话框进展初始化处理
翻开文件函数
响应“升序〞按钮实现排序该图书信息
响应“升序〞按钮实现排序该图书信息
交换各对象的数据
表3.4 主要函数介绍
源文件
函数名称
功能描述
CtianjinDlg.cpp
OnInitDialog
OnPaint
OnQueryDragIcon
OnTimer
UpdateFile
OnExit
OnEnter
OnAbout
OnQuery
OnSetting
OnExplore
对对话框进展初始化处理
对对话框绘制局部应用窗口
系统获取鼠标图标
用于实现定时控制功能
用于实现更新文件来计算收了几本书
响应“退出〞按钮实现退出本程序
响应“编辑〞按钮实现启动编辑对话框
响应“关于〞按钮实现启动关于对话框
响应“查询〞按钮实现启动查询对话框
响应“设置〞按钮实现启动设置对话框
响应“浏览〞按钮实现启动浏览对话框
表3.5 主要函数介绍
源文件
函数名称
功能描述
Entering.cpp
OnInitDialog
OnCtlColor
OnBnClickedOk
Check
Input
OnClose
OnLvnItemchangedList1
OnBnClickedOk2
OnBnClickedOk3
OnLvnColumnclickList1
OnNMClickList1
OnBnClickedButton1
对对话框进展初始化处理
控件窗口函数 用于画出控件菜单处理
添加记录信息
检查输入的容是否为空
输入记录信息
关闭该对话框
某个项已经发生变化
响应“删除〞按钮实现删除该图书信息
响应“修改〞按钮实现修改该图书信息
单击列,用于勾选全部
当鼠标单击列表视图控件时产生
响应“清空〞按钮实现修改该图书信息
表3.6 主要函数介绍
源文件
函数名称
功能描述
query.cpp
OnInitDialog
OnBnClickedRadio1
OnBnClickedRadio2
OnBnClickedRadio3
OnBnClickedRadio4
OnBnClickedRadio5
OnBnClickedButton1
QueryNum
QueryName
QueryAuthor
QueryPress
QueryAny
OpenFile
Tip
insert
OnBnClickedButton2
对对话框进展初始化处理
响应“书号〞按钮实现选择该方式查询
响应“书名〞按钮实现选择该方式查询
响应“作者〞按钮实现选择该方式查询
响应“〞按钮实现选择该方式查询
响应“任何容〞按钮实现选择该方式查询
关闭该对话框
查询书号函数
查询书名函数
查询作者函数
查询函数
查询任何函数
翻开文件
提示用于告诉用户找到了多少本
将已找到的几本书插入在显示上
响应“查询〞按钮实现根据该方式查询
3.4 对象数据构造
每个对象记录着每本书的信息,为了保护数据平安,故把其的这些成员变量声明为private,就是说在类外的话,不能直接调用对象的成员变量名来赋值或者获取其值,这就到达了保护数据,但是在某个时候遇到数据不对可能需要修改,这时就要加成员函数来修改或者获取,而且把成员函数声明为public,由于在类外需要正常调用,故声明为公开。其表如下。
表3.7 主要变量介绍
变量名
类型
功能描述
Name
Num
Author
Press
Time
Price
Char
Char
Char
Char
Char
Double
书名
书号
作者
时间
价格
表3.8 主要函数介绍
源文件
函数名称
功能描述
book.cpp
SetName
SetNum
SetAuthor
SetPress
SetTime
SetPrice
GetName
GetNum
GetAuthor
GetPress
GetTime
GetPrice
设置当前对象的成员变量name的值
设置当前对象的成员变量num的值
设置当前对象的成员变量Author的值
设置当前对象的成员变量Press的值
设置当前对象的成员变量Time的值
设置当前对象的成员变量Price的值
获取当前对象的成员变量name的值
获取当前对象的成员变量Num的值
获取当前对象的成员变量Author的值
获取当前对象的成员变量Press的值
获取当前对象的成员变量Time的值
获取当前对象的成员变量Price的值
第四章 详细设计
4.1程序源代码
4.1.1登陆模块
Login.h
#pragma once
#include"tianjinDlg.h"
#include "afxwin.h"
// Login 对话框
class Login : public CDialog
{
DECLARE_DYNAMIC(Login)
int a;
public:
Login(CWnd* pParent = NULL); // 标准构造函数
virtual ~Login();
// 对话框数据
enum { IDD = IDD_LOGIN };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
CtianjinDlg dlg;
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnClose();
CString user;
CString password;
afx_msg void OnBnClickedOk();
CButton regis;
afx_msg void OnBnClickedButton1();
Login.cpp
#include "stdafx.h"
#include "tianjin.h"
#include "Login.h"
#include "afxdialogex.h"
#include "Register.h"
IMPLEMENT_DYNAMIC(Login, CDialog)
Login::Login(CWnd* pParent /*=NULL*/)
: CDialog(Login::IDD, pParent)
, user(_T(""))
, password(_T(""))
{
}
Login::~Login()
{
}
void Login::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT3, user);
DDX_Text(pDX, IDC_EDIT4, password);
DDX_Control(pDX, IDC_BUTTON1, regis);
}
BEGIN_MESSAGE_MAP(Login, CDialog)
ON_WM_CLOSE()
ON_BN_CLICKED(IDOK, &Login::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &Login::OnBnClickedButton1)
END_MESSAGE_MAP()
BOOL Login::OnInitDialog()
{
CDialog::OnInitDialog();
a=0;//初始化a的值为0 用于判断该值是否退出本程序 当输入密码错误,就使该a的值增加1
CRect r;//矩形的类,数据成员是 矩形左上角的x的坐标,矩形左上角Y的坐标,矩形右下角x的坐标,矩形右下角Y的坐标
CString user;
this->GetClientRect(&r);//是获得窗口的当前的客户区,把各坐标值保存在r对象。
this->MoveWindow(600,300,r.right,r.bottom);//根据上面获得窗口的大小,来调整并且移动。
GetPrivateProfileString("login","user","NULL",user.GetBuffer(20),20,"./setting.ini");
//从setting.ini配置文件中的login节名中获取该user键名的值并保存在user的值,如果找不到该键名,那么保存第三个参
//数的值 即默认的值 表示未注册的账号,反之 找到了该值,表示已经注册了
if(user!="NULL"){//用于判断上面获得的值是否已经注册过 如注册过,那么执行if〔〕后边的语句
regis.EnableWindow(0);//在该函数的参数赋值为0 表示制止指定的控件承受鼠标和键盘的输入 由于该已经注册过的。
regis.SetWindowTextA("已注册");//指定该控件的容设为 〞已注册"用于提示
}
return TRUE;
}
void Login::OnClose()
{
CDialog::OnClose();
}
void Login::OnBnClickedOk()
{
this->UpdateData(1);//将各控件中的数据保存到相应的变量分别为〞user“〞 password“
if(!user.IsEmpty()&&!password.IsEmpty())//检查该各变量的值是否为空,如该值为空,就执行else后边的语句
{
CString user1,password1;//定义两个字符串类变量 用于从配置文件的注册过的用户及密码的值保存在该变量的
GetPrivateProfileString("login","user","NULL",user1.GetBuffer(20),20,"./setting.ini");//从本身程序的当前的setting.ini配置
//文件中的login节名中获取该user键名的值并保存在user1的值,如果找不到该键名,那么保存默认值为〞NULL“
GetPrivateProfileString("login","password","NULL",password1.GetBuffer(20),20,"./setting.ini");//如同上面的方法
if(user==user1&&password==password1)//比照各值是否一致,满足此条件表示该用户名及密码都是正确,可以登陆,即执行if〔〕后边的语句
{
this->ShowWindow(SW_HIDE);//把该对话框的显示方式为隐藏
dlg.DoModal();//启动主窗口的对话框
CDialog::OnOK();
}
else{
a++;//密码错误次数
if(a>3)//如超过3次的错误密码就执行if〔〕后边的语句
{ CDialog::OnCancel();
return;
//调用关闭该对话框的函数
}
CString d;
d.Format("用户名或者密码错误%d次 超过三次错误即将自动退出",a);
MessageBox(d,"登陆提示",MB_OK|MB_ICONWARNING);//用于提示密码错误 以防止令人觉得这程序有问题
}
}
else
MessageBox("用户名或者密码的字符串为空","登陆提示",MB_OK|MB_ICONWARNING);//当该值为空,那么执行该语句 用于提示。
}
void Login::OnBnClickedButton1()
{
Register dialog;//定义注册对话框的对象变量
dialog.DoModal();//启动 注册对话框
}
};
4.1.2注册模块
Register.h
#pragma once
#include "afxwin.h"
// Register 对话框
class Register : public CDialog
{
DECLARE_DYNAMIC(Register)
public:
Register(CWnd* pParent = NULL); // 标准构造函数
virtual ~Register();
// 对话框数据
enum { IDD = IDD_REGISTER };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
CString user;
CString password;
CString password1;
};
Register.cpp
#include "stdafx.h"
#include "tianjin.h"
#include "Register.h"
#include "afxdialogex.h"
// Register 对话框
IMPLEMENT_DYNAMIC(Register, CDialog)
Register::Register(CWnd* pParent /*=NULL*/)
: CDialog(Register::IDD, pParent)
, user(_T(""))
, password(_T(""))
, password1(_T(""))
{
}
Register::~Register()
{
}
void Register::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, user);
DDX_Text(pDX, IDC_EDIT6, password);
DDX_Text(pDX, IDC_EDIT3, password1);
}
BEGIN_MESSAGE_MAP(Register, CDialog)
ON_BN_CLICKED(IDOK, &Register::OnBnClickedOk)
END_MESSAGE_MAP()
void Register::OnBnClickedOk()
{
this->UpdateData();//默认值是TRUE,即从控件传给变量
if(!user.IsEmpty()&&!password.IsEmpty()&&!password1.IsEmpty())//各变量的字符串是否为空,如都不为空,那么执行if〔〕后边的语句继续注册
{
if(password==password1)//新密码与第二次新密码比照下,如相等,那么继续执行注册,反之不继续注册
{if(IDOK==MessageBox("确定要注册该账号吗?","注册提示",MB_OKCANCEL| MB_ICONQUESTION ))//输出提示 是否要确定注册,如点击确认返回值为IDOK
{
WritePrivateProfileString("login","user",user,"./setting.ini");
////向该setting.ini配置文件中的login节名中设置该user键名的值为user的值
WritePrivateProfileString("login","password",password,"./setting.ini");
HWND button; //定义窗口句柄
this->GetParent()->GetDlgItem(IDC_BUTTON1,&button);//获取当前窗口的父窗口句柄〔登陆对话框〕,然后通过父窗口句柄获取指定参数ID为IDC_BUTTON1的子元素的句柄并绑定button窗口句柄
::SetWindowTextA(button,"已注册");//改变指定button窗口句柄的文本容为"已注册"。
::EnableWindow(button,0);//第二个参数的值为0表示制止指定的控件承受鼠标和键盘的输入
MessageBox("已经成功注册该账号:"+user+"!","注册提示",MB_OK| MB_ICONASTERISK );//注册成功输出提示
CDialog::OnCancel();
}}
else
MessageBox("新密码与第二次新密码不一致 请注意输入正确!","密码提示",MB_OK|MB_ICONEXCLAMATION );
}
else
MessageBox("用户名或者密码的字符串为空","注册提示",MB_OK|MB_ICONWARNING);
}
4.1.3主菜单模块
tianjinDlg.h
#pragma once
#include "button.h"
#include "sta.h"
#include"entering.h"
#include"query.h"
#include"Setting.h"
#include"Explore.h"
// CtianjinDlg 对话框
class CtianjinDlg : public CDialogEx
{
// 构造
public:
CtianjinDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_TIANJIN_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
// 实现
protected:
HICON m_hIcon;
CToolBar toolbar;
CStatusBar statusbar;
CImageList toolimag;
CImageList toolhotimag;
button but2;
int a;
int b;
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnTimer(UINT_PTR nIDEvent);
button but1;
void UpdateFile();
sta stat,stat1;
afx_msg void OnExit();
afx_msg void OnEnter();
afx_msg void OnAbout();
protected:
public:
afx_msg void OnQuery();
afx_msg void OnSetting();
afx_msg void OnExplore();
};
tianjinDlg.cpp
#include "stdafx.h"
#include "tianjin.h"
#include "tianjinDlg.h"
#include "afxdialogex.h"
#include"About.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CtianjinDlg::CtianjinDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CtianjinDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CtianjinDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDOK, but1);
DDX_Control(pDX, TIC, stat);
}
BEGIN_MESSAGE_MAP(CtianjinDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_MAND(1006, &CtianjinDlg::OnExit)
ON_MAND(1001, &CtianjinDlg::OnEnter)
ON_MAND(1003, &CtianjinDlg::OnQuery)
ON_MAND(1004, &CtianjinDlg::OnSetting)
ON_MAND(1005, &CtianjinDlg::OnAbout)
ON_MAND(1002, &CtianjinDlg::OnExplore)
END_MESSAGE_MAP()
BOOL CtianjinDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
CBitmap bit[7];
bit[0].LoadBitmapA(IDB_BITMAP1);
bit[1].LoadBitmapA(IDB_BITMAP2);
bit[2].LoadBitmapA(IDB_BITMAP3);
bit[3].LoadBitmapA(IDB_BITMAP4);
bit[4].LoadBitmapA(IDB_BITMAP5);
bit[5].LoadBitmapA(IDB_BITMAP6);
bit[6].LoadBitmapA(IDB_BITMAP8);
toolimag.Create(70,50,ILC_COLOR|ILC_MASK,0,0);
for(int i=0;i<6;i++)
toolimag.Add(&bit[i],ILC_MASK);
toolhotimag.Create(58,60,ILC_COLOR|ILC_MASK,0,0);
toolhotimag.Add(&bit[6],ILC_COLOR16);
toolbar.Create(this);
UINT buttons[6]={1001,1002,1003,1004,1005,1006};
toolbar.SetButtons(buttons,6);
char buttontext[][7]={"编辑","浏览","查询","设置","关于","退出"};
for(int i=0;i<6;i++)
toolbar.SetButtonText(i,buttontext[i]);
toolbar.GetToolBarCtrl().SetImageList(&toolimag);
toolbar.GetToolBarCtrl().SetHotImageList(&toolhotimag);
toolbar.SetSizes(CSize(80,80),CSize(70,50));
toolbar.GetToolBarCtrl().SetStyle(CCS_TOP|TBSTYLE_FLAT);
statusbar.Create(this);
UINT pens[3]={100,101,102};
statusbar.SetIndicators(pens,3);
statusbar.SetPaneText(0," 志冲");
UpdateFile();
statusbar.SetPaneText(2,CTime::GetCurrentTime().Format("%Y:%m:%d:%H:%M:%S"));
for(int i=0;i<3;i++)
statusbar.SetPaneInfo(i,pens[i],SBPS_POPOUT,);
a=10;
b=0;
SetTimer(0,500,NULL);
this->RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
return TRUE; // 除非将焦点设置到控件,否那么返回 TRUE
}
void CtianjinDlg::OnPaint()
{
if (IsIconic())
{
}
else
{ CRect dialogrect;
this->GetClientRect(dialogrect);
CDC pic;
CBitmap pic1;
BITMAP info;
pic1.LoadBitmapA(IDB_BITMAP7);
pic1.GetBitmap(&info);
CPaintDC dc(this);
pic.CreatepatibleDC(&dc);
pic.SelectObject(&pic1);
dc.StretchBlt(0,0,dialogrect.right,dialogrect.bottom,&pic,0,0,info.bmWidth,info.bmHeight,SRCCOPY);
CDialogEx::OnPaint();
}
}
HCURSOR CtianjinDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CtianjinDlg::OnTimer(UINT_PTR nIDEvent)
{CRect dialogrect;
this->GetClientRect(dialogrect);
statusbar.SetPaneText(2,CTime::GetCurrentTime().Format("%Y:%m:%d:%H:%M:%S"));
stat.MoveWindow(a,dialogrect.bottom-402,260,50);
if(a>=dialogrect.right-270)
b=1;
else if(a<=50)
b=0;
if(b==0)
a+=20;
else
a-=20;
CDialogEx::OnTimer(nIDEvent);
}
void CtianjinDlg::OnExit()
{
CDialogEx::OnCancel();
}
void CtianjinDlg::OnEnter()
{entering enter;
enter.DoModal();
UpdateFile();
}
void CtianjinDlg::UpdateFile(){
CFile file("data.txt",CFile::modeRead|CFile::modeNoTruncate|CFile::modeCreate);
CString stat;
stat.Format("已经收录%d本的书",file.GetLength()/95);
file.Close();
statusbar.SetPaneText(1, stat);
}
void CtianjinDlg::OnQuery()
{query quer;
quer.DoModal();
}
void CtianjinDlg::OnSetting()
{Setting set;
set.DoModal();
}
void CtianjinDlg::OnExplore()
{
Explore explore;
explore.DoModal();
}
void CtianjinDlg::OnAbout()
{
About aboutdlg;
aboutdlg.DoModal();
}
4.1.4编辑模块
Entering.h
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
#include "editprice.h"
// entering 对话框
class entering : public CDialog
{
DECLARE_DYNAMIC(entering)
public:
entering(CWnd* pParent = NULL); // 标准构造函数
virtual ~entering();
// 对话框数据
enum { IDD = IDD_ENTERING };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl listctrl;//列表框控件对象
virtual BOOL OnInitDialog();//初始化函数
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//控件窗口函数 用于画出控件
CboBox year,mo,day;
char *name,*num,*autho,*pr,*time,*price;
afx_msg void OnBnClickedOk();
展开阅读全文