搜档网
当前位置:搜档网 › 用C做图书管理系统的简易步骤

用C做图书管理系统的简易步骤

用C做图书管理系统的简易步骤
用C做图书管理系统的简易步骤

C++程序设计课程设计

——图书管理系统

一、目的与要求

学生已学完《C++语言程序设计》课程,并进行了第一次课程设计,学习了如何将有关处理文件的数据结构和操作进行封装,从而掌握了C++语言程序设计中的一些基本知识与方法,且对抽象、封装、继承与多态有了一定的了解。为巩固C++有关知识,加强面向对象编程的方法训练,增加学生软件设计能力和动手能力,学习使用现有工具,特设计了这个利用MFC类开发一个小型完整应用程序的题目。主要要求如下:

通过本课程设计,学生应达到以下要求:

1、学会在自己的软件工程中利用MFC提供的成熟数据类型(class),这里主要要用的类有,CString,CFile,CArchive,CObject以及CObArray等一些通用类;

2、掌握冒泡法。掌握数据类型大小(operator < 或operator >)的重载,进而利用冒泡法对数据进行排序。

3、学习MFC中数据序列化(Serialize)的方法,掌握如何利用MFC提供的数据类型进行数据序列化。

二、设计任务

题目:图书管理系统

要求:设计一个小型图书管理系统。

1)数据上要求保存图书的如下几各方面的信息

编号(应是图书的唯一标识符)、分类号、书名、作者、出版社(版次)、出版日期、单价、借阅者、借出日期、归还日期。

借阅者要有,证件编号、姓名、性别、类别(大学生、研究生、教师等)。

日期数据应包含,年、月、日。

2)界面上要含有以下主要功能

主菜单:预览,添加,删除,排序,查找,修改,借书、还书、打印催还书通知,保存,退出等

预览选择此菜单,列出所有图书;

添加选择此菜单,由用户在系统的提示下输入图书资料,系统根据用户资料添加图书;

删除让用户选择按照什么原则删除;

排序让用户选择排序的原则,比如按人名排序、按书名排序等;

查找由用户给出查找的依据,书名、作者或借阅者等,然后根据用户所给信息进行查找,并列出查找结果;

修改利用查找功能将用户要修改的图书显示出来,然后提供一个接口让用户修改数据。

借书根据书籍编号借书

还书

打印催还书通知选择此菜单后,用户给出借书最长期限,然后依据不同类型的借阅者分别判断借书期限是否超过,然后列出所有逾期不还者名单以及所借书籍。

保存利用序列化技术对所有图书进行保存,还要提供文本文件的数据导入导出的功能;

退出退出系统。

三、设计准备

1、环境准备

需要WINDOWS操作系统与Visual C++6.0集成开发环境。

2、知识准备

熟悉WINDOWS操作系统的基本操作。

掌握C++基本知识,主要有类的定义与实现,一些简单操作符重载等。

知道MFC一些通用类的基本属性与方法以及其使用。

能利用Visual C++界面的。

知道C++编译程序的若干调试技术。

四、设计指导

1、为什么

计算机语言从最开始的二进制码到第一个高级语言的出现,发展到今天经过了半个多世纪,语言已由刚开始的面向机器(ASM),到面向程序员(过程式程序),到面向数据(OD),到面向对象(OO),其表述方式愈来愈接近人们的日常语言与思维方式。从数据的表述上,从刚开始的简单数据类型(int, char, float,double, ……),到抽象数据类型(ADT),也就是各种编译程序提供的用户数据类型的定义方式(比如,struct, class, enum, enum……),到范式编程思想(GP)。语言千变万化,技术日新月异,但是如果学会了利用已有的成果,掌握了阅读源代码(源码之前,了无秘密)的方法,就可以以最短的时间,获得最高的效益。

掌握C/C++是计算机科学系学生最重要的基本功。一方面要通过不断地学习以及实践提高自己编写代码、算法设计以及软件实现的功力,另一方面,由于历史的沉积,前人又为我们提供了许多宝贵的经验和成果,学会使用前人的成果是一条快速进入科学前沿的捷径,也是当今科技高速发展的一种必经之路。学习的最好方法,特别是语言的学习,是实践!有鉴于此,我们设计了这样一个利用MFC为我们提供的一些通用类来实现日常管理中经常需要的一些简单操作。总的目的是让同学们通过此次课程设计,提高自己的编程能力和应用能力。

2、系统设计

系统要求用菜单方式(DOS或WINDOWS均可)提供交互式的应用软件,主要菜单及其功能的详细说明见第2款(设计任务)。

数据要求

1)为图书设计一个类(CBooks),要有一个用于保存数据的成员函数和以下的数据

唯一标识——书籍编号、书名(CString)、作者(CString)、出版单位、出版日期、单价、购买日期、借阅者、借出日期、还书日期等。

其中,所有日期要用一个结构,包含年、月、日。借阅者的结构中包含姓名、证号、性别与型别(大学生、研究生还是教师)。

2)为管理图书设计一个类(CManager),有唯一的数据成员(m_list),存放书籍的一个链,

与若干函数,其目的为:保存,删除、查找等。

3、系统实现概述(控制台应用程序)

第一步开启VC;

第二步file new,在弹出的对话框中作如图所示的选择与填写,然后点击“OK”;

第三步选择“An application than supports MFC.”,点击“Finish”,点击“OK”;

第四步打开“CBooksApp.cpp”文件,删除语句“CWinApp theApp;”以及函数体“int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])”,添加函数体“void main(){}”。

第五步编译运行,程序框架OK;

第六步建立数据结构与算法实现:

a) 日期结构,包含有年、月、日,以及减法与小于号的重载

struct Date{

int m_year;

int m_moth;

int m_day;

int operator – (const Date&d)

{

int days=365*(m_year-a. m_year);

days+=30*(m_moth-d.m_moth)+m_day-d.m_day;

return days;

}

BOOL operator <(const Date& d)

{

if(*this-d<0)

return TRUE;

return FALSE;

}

};

b) 读者结构,包含有姓名、借书证号、性别与类别,小于号的重载

struct Reader{

CString m_name;

CString m_certificateNo;

BOOL m_sex;//1--male,0--female

int m_type;//0--student,1--graduate,2--teacher

BOOL operator <(Reader &r)

{

if(m_type

return TRUE;

if(m_certificateNo

return TRUE;

if(m_name

return TRUE;

if(m_sex

return TRUE;

return FALSE;

}

};

c) CBooks类

class CBooks : public CObject

{

DECLARE_SERIAL(CBooks)

public:

CString m_serialNumber;//编号

CString m_category;//类别

CString m_title;//书名

CString m_auther;//作者

CString m_press;//出版社

Date m_publicDate;//出版日期

double m_price;

Date m_purchaseDate;//购书时间

Reader m_lender;//借阅者

Date m_lendDate;//借书日期

Date m_returnDate;//还书日期

CBooks();

virtual ~CBooks();

void Serialize(CArchive&ar);

};

CBooks类具有所需要的数据成员外,需要注意到

首先,它是由CObject派生的,CObject是绝大部分MFC类的基类;

其次,类中有一个宏DECLARE_SERIAL(CBooks),其作用就是为了实现文件的序列化与类的动态创建。相应的,在此类的实现文件中必定要有宏IMPLEMENT_SERIAL(CBooks,CObject,1)。

最后,CBooks应重载CObject虚拟函数Serialize(CArchive&ar)。

CBooks类的实现文件类似于:

IMPLEMENT_SERIAL(CBooks,CObject,1)

CBooks::CBooks()

{

m_price=0.0;

m_lender.m_sex=TRUE;

m_lender.m_type=2;

m_publicDate.m_year=0;

m_publicDate.m_moth=0;

m_publicDate.m_day=0;

m_lendDate.m_year=0;

m_lendDate.m_moth=0;

m_lendDate.m_day=0;

m_returnDate.m_year=0;

m_returnDate.m_moth=0;

m_returnDate.m_day=0;

m_purchaseDate.m_year=0;

m_purchaseDate.m_moth=0;

m_purchaseDate.m_day=0;

}

CBooks::~CBooks()

{

}

void CBooks::Serialize(CArchive&ar)

{

if(ar.IsStoring())

{

ar<

<

ar<

<

ar<

ar<

ar<

ar<

}

else

{

ar>>m_serialNumber>>m_category>>m_title

>>m_auther>>m_press>>m_price;

ar>>m_lender.m_name>>m_lender.m_certificateNo

>>m_lender.m_sex>>m_lender.m_type;

ar>>m_publicDate.m_year>>m_publicDate.m_moth>>m_publicDate.m_day;

ar>>m_lendDate.m_year>>m_lendDate.m_moth>>m_lendDate.m_day;

ar>>m_returnDate.m_year>>m_returnDate.m_moth>>m_returnDate.m_day;

ar>>m_purchaseDate.m_year>>m_purchaseDate.m_moth>>m_purchaseDate.m_day;

}

}

第七步建立管理图书的类

首先建一个基类

class CManager

{

CObArray m_list;

public:

void AddTail(CBooks*pBook);//在链表尾部放书籍

void AddHead(CBooks*pBook); //在链表头部放书籍

void Add(CBooks*pBook,int index);//将书籍放到index处

void Delete(int index);//删除index处的书籍

void Fit(int index);//修改index处的书籍

CBooks* GetBook(int index);//获取index出的书籍

CManager();

virtual ~CManager();

virtual int Find(void*para,CobArray&list);

virtual void Delete (void*para);

viraul void Sort();

void Serialize(CArchive&ar);

friend ostream & operator <<(ostream& os,CManager &mg);

};

其实现文件类似于

CManager::CManager()

{

}

CManager::~CManager()

{

int num=m_list.GetSize();

for(int i=0;i

{

CBooks*p=(CBooks*)m_list[i];

delete p;

}

m_list.RemoveAll();

}

void CManager::Serialize(CArchive&ar)

{

m_list.Serialize(ar);

}

void CManager::Delete (void*para)

{

}

void CManager::Sort()

{

}

int CManager::Find(void*para,CobArray&list)

{

return –1;

}

……………………

然后,建管理各种数据的子类。比如,管理书名的子类应为CManagerTitle:public CManager

{

public:

CManager* m_pParent;

CManagerTitle();

int Find(void*para,CobArray&list);

void Delete (void*para);

void Sort();

}

其实现文件类似于:

CManagerTitle::CManagerTitle():m_pParent(0){}

int CManagerTitle::Find(void*para,CobArray&list)

{

if(!m_pParent)

return;

CString*pStr= (char*)para;

int i,value=-1,num=m_pParent->m_list.GetSize();

for(i=0;i

{

CBooks*p=(CBooks*) m_pParent->m_list[i];

if(p->m_title==pStr)

{

list.Add(p);

if(value<0)

value=i;

}

}

return value;

}

void CManagerTitle::Delete (void*para)

{

if(!m_pParent)

return;

CString pStr= (char*)para;

int i=0;

while(i< m_pParent->m_list.GetSize())

{

CBooks*p=(CBooks*) m_pParent->m_list[i];

if(p->m_title==pStr)

{

delete p;

m_pParent->m_list.RemoveAt(i);

}

else

i++;

}

}

void CManagerTitle::Sort()

{

if(!m_pParent)

return;

int i,j

for(i=0;i

{

CBooks* b1=(CBooks*) m_pParent->m_list[i];

for(j=i+1;j

{

CBooks*b2=(CBooks*) m_pParent->m_list[j];

if(b2->m_titlem_title)

{

m_pParent->m_list.RemoveAt(i);

m_pParent->m_list.InsertAt(i,b2);

m_pParent->m_list.RemoveAt(j);

m_pParent->m_list.InsertAt(j,b1);

b1=b2;

}

}

}

}

类似的,可以构造管理其他项目的子类,只需要重载基类三个虚函数,Find, Delete,Sort。如果要使用他们只需如下作为

CManager manager;//这是全局对象,由他保存所有书籍

CManager*pManager;//这是一个操作指针

pManager=new CManagerTitle;//准备管理书名

pManager->m_pParent=& manager;//和全局对象联系起来

pManager->Sort();//manager中的书就按书名排序了

pManager->Delete(“MFC”);//这就删除了manager中书名为“MFC”的所有书籍。……………………………

注:文件的保存与打开类似于

int Save(char*filename,CManager*mg)

{

CFile file;

if(!file.Open(filename,CFile::modeWrite|CFile::modeCreate))

return 0;

CArchive ar(&file,CArchive::store);

Mg->Serialize(ar);

return 1;

}

int Open(char*filename,CManager*mg)

{

CFile file;

if(!file.Open(filename,CFile::modRead))

return 0;

CArchive ar(&file,CArchive::store);

Mg->Serialize(ar);

return 1;

}

第八步完成主界面的设计与实现

菜单类

class CMenuA

{

public:

void ShowMain();

void ShowSort();

void ShowFind();

void ShowDelete();

………………………………..

CMenuA();

virtual ~CMenuA();

};

4、系统测试

首先提供5本书籍的资料供程序启动之用,可以见此五本书的资料用一个文本文件保存,然后每次运行时读入数据。例如

相关主题