还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C++程序设计课程设计——图书管理系统
一、目的与要求学生已学完《C++语言程序设计》课程,并进行了第一次课程设计,学习了如何将有关处理文件的数据结构和操作进行封装,从而掌握了C++语言程序设计中的一些基本知识与方法,且对抽象、封装、继承与多态有了一定的了解为巩固C++有关知识,加强面向对象编程的方法训练,增加学生软件设计能力和动手能力,学习使用现有工具,特设计了这个利用MFC类开发一个小型完整应用程序的题目主要要求如下通过本课程设计,学生应达到以下要求
1、学会在自己的软件工程中利用MFC提供的成熟数据类型(class),这里主要要用的类有,CString,CFile,CArchive,CObject以及CObArray等一些通用类;
2、掌握冒泡法掌握数据类型大小operator或operator的重载,进而利用冒泡法对数据进行排序
3、学习MFC中数据序列化(Serialize)的方法,掌握如何利用MFC提供的数据类型进行数据序列化
二、设计任务题目图书管理系统要求设计一个小型图书管理系统1)数据上要求保存图书的如下几各方面的信息编号(应是图书的唯一标识符)、分类号、书名、作者、出版社(版次)、出版日期、单价、借阅者、借出日期、归还日期借阅者要有,证件编号、姓名、性别、类别(大学生、研究生、教师等)日期数据应包含,年、月、日2)界面上要含有以下主要功能主菜单预览,添加,删除,排序,查找,修改,借书、还书、打印催还书通知,保存,退出等预览选择此菜单,列出所有图书;添加选择此菜单,由用户在系统的提示下输入图书资料,系统根据用户资料添加图书;删除让用户选择按照什么原则删除;排序让用户选择排序的原则,比如按人名排序、按书名排序等;查找由用户给出查找的依据,书名、作者或借阅者等,然后根据用户所给信息进行查找,并列出查找结果;修改利用查找功能将用户要修改的图书显示出来,然后提供一个接口让用户修改数据借书根据书籍编号借书还书打印催还书通知选择此菜单后,用户给出借书最长期限,然后依据不同类型的借阅者分别判断借书期限是否超过,然后列出所有逾期不还者名单以及所借书籍保存利用序列化技术对所有图书进行保存,还要提供文本文件的数据导入导出的功能;退出退出系统
三、设计准备
1、环境准备需要WINDOWS操作系统与VisualC++
6.0集成开发环境
2、知识准备熟悉WINDOWS操作系统的基本操作掌握C++基本知识,主要有类的定义与实现,一些简单操作符重载等知道MFC一些通用类的基本属性与方法以及其使用能利用VisualC++界面的知道C++编译程序的若干调试技术
四、设计指导
1、为什么计算机语言从最开始的二进制码到第一个高级语言的出现,发展到今天经过了半个多世纪,语言已由刚开始的面向机器(ASM),到面向程序员(过程式程序),到面向数据(OD),到面向对象(OO),其表述方式愈来愈接近人们的日常语言与思维方式从数据的表述上,从刚开始的简单数据类型(intcharfloatdouble……),到抽象数据类型(ADT),也就是各种编译程序提供的用户数据类型的定义方式(比如,structclassenumenum……),到范式编程思想(GP)语言千变万化,技术日新月异,但是如果学会了利用已有的成果,掌握了阅读源代码(源码之前,了无秘密)的方法,就可以以最短的时间,获得最高的效益掌握C/C++是计算机科学系学生最重要的基本功一方面要通过不断地学习以及实践提高自己编写代码、算法设计以及软件实现的功力,另一方面,由于历史的沉积,前人又为我们提供了许多宝贵的经验和成果,学会使用前人的成果是一条快速进入科学前沿的捷径,也是当今科技高速发展的一种必经之路学习的最好方法,特别是语言的学习,是实践!有鉴于此,我们设计了这样一个利用MFC为我们提供的一些通用类来实现日常管理中经常需要的一些简单操作总的目的是让同学们通过此次课程设计,提高自己的编程能力和应用能力
2、系统设计系统要求用菜单方式(DOS或WINDOWS均可)提供交互式的应用软件,主要菜单及其功能的详细说明见第2款(设计任务)数据要求1)为图书设计一个类CBooks,要有一个用于保存数据的成员函数和以下的数据唯一标识——书籍编号、书名(CString)、作者(CString)、出版单位、出版日期、单价、购买日期、借阅者、借出日期、还书日期等其中,所有日期要用一个结构,包含年、月、日借阅者的结构中包含姓名、证号、性别与型别(大学生、研究生还是教师)2)为管理图书设计一个类CManager,有唯一的数据成员m_list,存放书籍的一个链,与若干函数,其目的为保存,删除、查找等
3、系统实现概述(控制台应用程序)第一步开启VC;第二步filenew,在弹出的对话框中作如图所示的选择与填写,然后点击“OK”;第三步选择“AnapplicationthansupportsMFC.”,点击“Finish”,点击“OK”;第四步打开“CBooksApp.cpp”文件,删除语句“CWinApptheApp;”以及函数体“int_tmainintargcTCHAR*argv[]TCHAR*envp[]”,添加函数体“voidmain{}”第五步编译运行,程序框架OK;第六步建立数据结构与算法实现a日期结构,包含有年、月、日,以及减法与小于号的重载structDate{intm_year;intm_moth;intm_day;intoperator–constDated{intdays=365*(m_year-a.m_year);days+=30*m_moth-d.m_moth+m_day-d.m_day;returndays;}BOOLoperatorconstDated{if*this-d0returnTRUE;returnFALSE;}};b读者结构,包含有姓名、借书证号、性别与类别,小于号的重载structReader{CStringm_name;CStringm_certificateNo;BOOLm_sex;//1--male0--femaleintm_type;//0--student1--graduate2--teacherBOOLoperatorReaderr{ifm_typer.m_typereturnTRUE;ifm_certificateNor.m_certificateNoreturnTRUE;ifm_namer.m_namereturnTRUE;ifm_sexr.m_sexreturnTRUE;returnFALSE;}};cCBooks类classCBooks:publicCObject{DECLARE_SERIALCBookspublic:CStringm_serialNumber;//编号CStringm_category;//类别CStringm_title;//书名CStringm_auther;//作者CStringm_press;//出版社Datem_publicDate;//出版日期doublem_price;Datem_purchaseDate;//购书时间Readerm_lender;//借阅者Datem_lendDate;//借书日期Datem_returnDate;//还书日期CBooks;virtual~CBooks;voidSerializeCArchivear;};CBooks类具有所需要的数据成员外,需要注意到首先,它是由CObject派生的,CObject是绝大部分MFC类的基类;其次,类中有一个宏DECLARE_SERIALCBooks,其作用就是为了实现文件的序列化与类的动态创建相应的,在此类的实现文件中必定要有宏IMPLEMENT_SERIALCBooksCObject1最后,CBooks应重载CObject虚拟函数SerializeCArchivearCBooks类的实现文件类似于IMPLEMENT_SERIALCBooksCObject1CBooks::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{}voidCBooks::SerializeCArchivear{ifar.IsStoring{arm_serialNumberm_categorym_titlem_autherm_pressm_price;arm_lender.m_namem_lender.m_certificateNom_lender.m_sexm_lender.m_type;arm_publicDate.m_yearm_publicDate.m_mothm_publicDate.m_day;arm_lendDate.m_yearm_lendDate.m_mothm_lendDate.m_day;arm_returnDate.m_yearm_returnDate.m_mothm_returnDate.m_day;arm_purchaseDate.m_yearm_purchaseDate.m_mothm_purchaseDate.m_day;}else{arm_serialNumberm_categorym_titlem_autherm_pressm_price;arm_lender.m_namem_lender.m_certificateNom_lender.m_sexm_lender.m_type;arm_publicDate.m_yearm_publicDate.m_mothm_publicDate.m_day;arm_lendDate.m_yearm_lendDate.m_mothm_lendDate.m_day;arm_returnDate.m_yearm_returnDate.m_mothm_returnDate.m_day;arm_purchaseDate.m_yearm_purchaseDate.m_mothm_purchaseDate.m_day;}}第七步建立管理图书的类首先建一个基类classCManager{CObArraym_list;public:voidAddTailCBooks*pBook;//在链表尾部放书籍voidAddHeadCBooks*pBook;//在链表头部放书籍voidAddCBooks*pBookintindex;//将书籍放到index处voidDeleteintindex;//删除index处的书籍voidFitintindex;//修改index处的书籍CBooks*GetBookintindex;//获取index出的书籍CManager;virtual~CManager;virtualintFindvoid*paraCobArraylist;virtualvoidDeletevoid*para;viraulvoidSort;voidSerializeCArchivear;friendostreamoperatorostreamosCManagermg;};其实现文件类似于CManager::CManager{}CManager::~CManager{intnum=m_list.GetSize;forinti=0;inum;i++{CBooks*p=CBooks*m_list[i];deletep;}m_list.RemoveAll;}voidCManager::SerializeCArchivear{m_list.Serializear;}voidCManager::Deletevoid*para{}voidCManager::Sort{}intCManager::Findvoid*paraCobArraylist{return–1;}……………………然后,建管理各种数据的子类比如,管理书名的子类应为CManagerTitle:publicCManager{public:CManager*m_pParent;CManagerTitle;intFindvoid*paraCobArraylist;voidDeletevoid*para;voidSort;}其实现文件类似于:CManagerTitle::CManagerTitle:m_pParent0{}intCManagerTitle::Findvoid*paraCobArraylist{if!m_pParentreturn;CString*pStr=char*para;intivalue=-1num=m_pParent-m_list.GetSize;fori=0;inum;i++{CBooks*p=CBooks*m_pParent-m_list[i];ifp-m_title==pStr{list.Addp;ifvalue0value=i;}}returnvalue;}voidCManagerTitle::Deletevoid*para{if!m_pParentreturn;CStringpStr=char*para;inti=0;whileim_pParent-m_list.GetSize{CBooks*p=CBooks*m_pParent-m_list[i];ifp-m_title==pStr{deletep;m_pParent-m_list.RemoveAti;}elsei++;}}voidCManagerTitle::Sort{if!m_pParentreturn;intijfori=0;inum;i++{CBooks*b1=CBooks*m_pParent-m_list[i];forj=i+1;jnum;j++{CBooks*b2=CBooks*m_pParent-m_list[j];ifb2-m_titleb1-m_title{m_pParent-m_list.RemoveAti;m_pParent-m_list.InsertAtib2;m_pParent-m_list.RemoveAtj;m_pParent-m_list.InsertAtjb1;b1=b2;}}}}类似的,可以构造管理其他项目的子类,只需要重载基类三个虚函数,FindDeleteSort如果要使用他们只需如下作为CManagermanager;//这是全局对象,由他保存所有书籍CManager*pManager;//这是一个操作指针pManager=newCManagerTitle;//准备管理书名pManager-m_pParent=manager;//和全局对象联系起来pManager-Sort;//manager中的书就按书名排序了pManager-Delete“MFC”;//这就删除了manager中书名为“MFC”的所有书籍……………………………注文件的保存与打开类似于intSavechar*filenameCManager*mg{CFilefile;if!file.OpenfilenameCFile::modeWrite|CFile::modeCreatereturn0;CArchivearfileCArchive::store;Mg-Serializear;return1;}intOpenchar*filenameCManager*mg{CFilefile;if!file.OpenfilenameCFile::modReadreturn0;CArchivearfileCArchive::store;Mg-Serializear;return1;}第八步完成主界面的设计与实现菜单类classCMenuA{public:voidShowMain;voidShowSort;voidShowFind;voidShowDelete;………………………………..CMenuA;virtual~CMenuA;};
4、系统测试首先提供5本书籍的资料供程序启动之用,可以见此五本书的资料用一个文本文件保存,然后每次运行时读入数据例如编号类别书名作者出版社单价出版日期购书时间00013/TP.1417编译原理吕映芝清华大学出版社
23.5019981120011100021/TP.646STL源码剖析侯捷华中科技大学出版社
58.8020026120021010003X/TP.12数值分析李庆扬华中科技大学出版社
15.201982712000112……………。