C++语言程序设计实践.docx
- 文档编号:29356173
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:20
- 大小:55.06KB
C++语言程序设计实践.docx
《C++语言程序设计实践.docx》由会员分享,可在线阅读,更多相关《C++语言程序设计实践.docx(20页珍藏版)》请在冰豆网上搜索。
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操作系统与VisualC++6.0集成开发环境。
2、知识准备
熟悉WINDOWS操作系统的基本操作。
掌握C++基本知识,主要有类的定义与实现,一些简单操作符重载等。
知道MFC一些通用类的基本属性与方法以及其使用。
能利用VisualC++界面的。
知道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;
第二步filenew,在弹出的对话框中作如图所示的选择与填写,然后点击“OK”;
第三步选择“AnapplicationthansupportsMFC.”,点击“Finish”,点击“OK”;
第四步打开“CBooksApp.cpp”文件,删除语句“CWinApptheApp;”以及函数体“int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])”,添加函数体“voidmain(){}”。
第五步编译运行,程序框架OK;
第六步建立数据结构与算法实现:
a)日期结构,包含有年、月、日,以及减法与小于号的重载
structDate{
intm_year;
intm_moth;
intm_day;
intoperator–(constDate&d)
{
intdays=365*(m_year-a.m_year);
days+=30*(m_moth-d.m_moth)+m_day-d.m_day;
returndays;
}
BOOLoperator<(constDate&d)
{
if(*this-d<0)
returnTRUE;
returnFALSE;
}
};
b)读者结构,包含有姓名、借书证号、性别与类别,小于号的重载
structReader{
CStringm_name;
CStringm_certificateNo;
BOOLm_sex;//1--male,0--female
intm_type;//0--student,1--graduate,2--teacher
BOOLoperator<(Reader&r)
{
if(m_type returnTRUE; if(m_certificateNo returnTRUE; if(m_name returnTRUE; if(m_sex returnTRUE; returnFALSE; } }; c)CBooks类 classCBooks: publicCObject { DECLARE_SERIAL(CBooks) public: 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(); voidSerialize(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() { } voidCBooks: : 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; } } 第七步建立管理图书的类 首先建一个基类 classCManager { CObArraym_list; public: voidAddTail(CBooks*pBook);//在链表尾部放书籍 voidAddHead(CBooks*pBook);//在链表头部放书籍 voidAdd(CBooks*pBook,intindex);//将书籍放到index处 voidDelete(intindex);//删除index处的书籍 voidFit(intindex);//修改index处的书籍 CBooks*GetBook(intindex);//获取index出的书籍 CManager(); virtual~CManager(); virtualintFind(void*para,CobArray&list); virtualvoidDelete(void*para); viraulvoidSort(); voidSerialize(CArchive&ar); friendostream&operator<<(ostream&os,CManager&mg); }; 其实现文件类似于 CManager: : CManager() { } CManager: : ~CManager() { intnum=m_list.GetSize();约束GetSize获取数组中的元素数 for(inti=0;i { CBooks*p=(CBooks*)m_list[i]; deletep; } m_list.RemoveAll();RemoveAll删除数组中所有元素 } voidCManager: : Serialize(CArchive&ar) { m_list.Serialize(ar); } voidCManager: : Delete(void*para) { } voidCManager: : Sort() { } intCManager: : Find(void*para,CobArray&list) { return–1; } …………………… 然后,建管理各种数据的子类。 比如,管理书名的子类应为 CManagerTitle: publicCManager { public: CManager*m_pParent; CManagerTitle(); intFind(void*para,CobArray&list); voidDelete(void*para); voidSort(); } 其实现文件类似于: CManagerTitle: : CManagerTitle(): m_pParent(0){} intCManagerTitle: : Find(void*para,CobArray&list) { if(! m_pParent) return; CString*pStr=(char*)para;char*专门用于指以'\0'为结束的字符串。 inti,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; } } returnvalue; } voidCManagerTitle: : Delete(void*para) { if(! m_pParent) return; CStringpStr=(char*)para; inti=0; while(i { CBooks*p=(CBooks*)m_pParent->m_list[i]; if(p->m_title==pStr) { deletep; m_pParent->m_list.RemoveAt(i);RemoveAt删除指定索引处的数组元素 } else i++; } } voidCManagerTitle: : Sort() { if(! m_pParent) return; inti,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_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。 如果要使用他们只需如下作为 CManagermanager;//这是全局对象,由他保存所有书籍 CManager*pManager;//这是一个操作指针 pManager=newCManagerTitle;//准备管理书名 pManager->m_pParent=&manager;//和全局对象联系起来 pManager->Sort();//manager中的书就按书名排序了 pManager->Delete(“MFC”);//这就删除了manager中书名为“MFC”的所有书籍。 …………………………… 注: 文件的保存与打开类似于 intSave(char*filename,CManager*mg) { CFilefile; if(! file.Open(filename,CFile: : modeWrite|CFile: : modeCreate)) return0; CArchivear(&file,CArchive: : store); Mg->Serialize(ar); return1; } intOpen(char*filename,CManager*mg) { CFilefile; if(! file.Open(filename,CFile: : modRead)) return0; CArchivear(&file,CArchive: : store); Mg->Serialize(ar); return1; } 第八步完成主界面的设计与实现 菜单类 classCMenuA { public: voidShowMain(); voidShowSort(); voidShowFind(); voidShowDelete(); ……………………………….. CMenuA(); virtual~CMenuA(); }; 4、系统测试 首先提供5本书籍的资料供程序启动之用,可以见此五本书的资料用一个文本文件保存,然后每次运行时读入数据。 例如 编号 类别 书名 作者 出版社 单价 出版日期 购书时间 0001 3/TP.1417 编译原理 吕映芝 清华大学出版社 23.50 1998 1 1 2001 1 1 0002 1/TP.646 STL源码剖析 侯捷 华中科技大学出版社 58.80 2002 6 1 2002 10 1 0003 X/TP.12 数值分析 李庆扬 华中科技大学出版社 15.20 1982 7 1 2000 1 12 … … … … … 5、设计报告 要求5000字,所名设计思想,界面使用,关键技术,函数实现等。 五、成绩评定 平时考核20分; 界面通畅30分; 功能齐全30分; 实习报告20分。 六、封底封面模板 程序设计课程设计报告 系(院): 计算机科学学院 专业班级: 姓名: 学号: 指导教师: 设计时间: 2011.12.12-2011.12.23 设计地点: 4#2号机房 (此处目录根据自己情况可以调整改动) 一、课程设计目的3 二、设计任务及要求3 三、需求分析4 四、总体设计4 五、详细设计与实现[含代码和实现界面]7 六、课程设计小结 (最后一页要加上下面的格式) 指导老师意见: 成绩: 教师签名: 年月日 程序设计课程设计安排表 时间: 11年12月12日~11年12月23日 班级: 网络11001-11002,计科11001-11006 地点: 4号楼2号机房人数: 248 上机学时: 40学时 16周 节次 周一 周二 周三 周四 周五 上午 网络 1、2班 网络 1、2班 网络 1、2班 网络 1、2班 网络 1、2班 下午 计科123 计科456 计科123 计科456 计科123 晚上 计科456 计科123 计科456 计科123 计科456 17周 节次 周一 周二 周三 周四 周五 上午 网络 1、2班 网络 1、2班 网络 1、2班 网络 1、2班 网络 1、2班 下午 计科456 计科123 计科456 计科123 计科456 晚上 计科123 计科456 计科123 计科456 计科123 说明: 每一个班安排一名指导教师,一名辅导老师,指导老师负责布置任务、指导编程及编写报告、指导学生熟悉开发环境和辅导学生调试程序,并对学生进行考勤。 最后对学生完成的系统进行现场验收和评定成绩。 网络11001孙庆生詹泽梅 网络11002詹泽梅孙庆生 计科11001包小军雷鸣 计科11002雷鸣白凯 计科11003白凯包小军 计科11004刘兆良周云才 计科11005冯伟刘兆良 计科11006周云才冯伟 其中第一个老师为本班指导老师。 时间上午8: 30-11: 30下午2: 00-5: 00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 语言程序设计 实践