c++图书管理系统实验报告

上传人:r****d 文档编号:82631294 上传时间:2022-04-29 格式:DOC 页数:30 大小:237.50KB
返回 下载 相关 举报
c++图书管理系统实验报告_第1页
第1页 / 共30页
c++图书管理系统实验报告_第2页
第2页 / 共30页
c++图书管理系统实验报告_第3页
第3页 / 共30页
点击查看更多>>
资源描述
面向对象程序设计项目报告图书管理系统的设计与实现姓 名:黄为涛课 程 名 称: C/C+程序设计指 导 教 师:郭栋梁2016年5月 目录1 程序流程图32 类的设计42.1 Book类41.1.1 字段41.1.2 方法42.2 Interface类51.2.1Mian(vector&theBookList)51.2.2 sell(vector&theBookList)61.2.3 manage(vector&theBookList)81.2.4 92.3 ReadDate类112.3.1 getRowNum()112.3.2 readISBN()122.3.3 saveDate()132.4 ManageBook类142.4.1 addBook()152.4.2 deleteBook()162.4.3 updateBook()172.4.4 searchBook()202.5 Sort类212.5.1 sortAuthor()212.5.2 sortPrice()223 程序操作流程234 项目测试234.1 图书销售244.2 图书管理244.3 图书统计275 附录 本程序所用到的头文件286 参考资料28项目名称 图书管理系统设计黄为涛(燕山大学 信息科学与工程学院)摘 要: 本系统主要为了实现图书的管理如:增删改查及图书的销售和统计功能。主要运用了类的设计编程思想进行设计,并且运用动态数组vector和引用类型参数进行成程序的设计,函数的重载。程序的进行利用交互式利用到if.else,switch,while,for等结构的搭配使用。利用C+中的IO流进行文件的读写操作,从而实现书数据的读入等功能.在程序设计初期通过UML类图进行类的功能设计,从而通过类之间的一系列关系进行整个程序的搭建1 程序流程图开始图书销售图书管理图书统计根据ISBN号查询书籍增删改查按图书价格按出版社按作者按库存量 结束2 类的设计一共设计了5个类Book类:设计图书的属性及行为Interface类:进行界面的设计及操作交互的重要设计,是本程序的主干框架ReadDate类:主要负责程序启动时读取本地数据,程序结束时保存数据的功能Sort类:根据各种数据为图书排序显示接下来将详细介绍这几个类的构成.2.1 Book类 1.1.1 字段设计了author(string),ISBN(string),name(string) ,price(double),pulisher(string),stock(int)共六个成员数据表示图书的作者,ISBN,名称,价格,出版社,库存1.1.2 方法进行了构造函数的重载并且设计了三大类方法,主要包括set类,get类Show类分别进行对图书的数据的设置,获取,显示2.2 Interface类 利用字符进行界面的设计和在该界面下的交互并将其方法都设计成static方法,这样可以在没有对象的时候都可以调用,达到使用方便的效果。其中main()为主界面,manage()为图书管理界面,sell()为图书销售界面,statistics()为图书的统计界面,形参是Book类vector的引用,以 达到对图书数据的直接操作其效果和主要源代码如下:1.2.1Mian(vector&theBookList)printf(_n);printf(|1|2|3|4|n);printf(|n);printf(|图书销售|图书管理|图书统计|退出|n);printf(|程序|n);printf(|n);printf(-n);printf(请按相应的数字进行下一步操作:n);inta;cina;switch(a)case1:Interface:sell(theBookList);break;case2:Interface:manage(theBookList);break;case3:Interface:statistics(theBookList);break;case4:ReadDate:saveDate(theBookList);exit(0);break;default:cout请输入正确数字;break;1.2.2 sell(vector&theBookList)printf(_n);printf(|1|2|0|n);printf(|请输入图书ISBN号码|退出|返回|n);printf(|n);printf(|按回车查询|程序|主菜单|n);printf(-|n);printf(请按相应的数字进行下一步操作:n);inta;cina;switch(a)case1:/这是一套交互代码如果看不懂了就加断点调试一下就很容易知道了couttheISBN;inti;for(i=0;i=theBookList.size()-1;i+)/查询对比ISBNif(theISBN=theBookList.at(i).ISBN)theBookList.at(i).show();/书籍购买loop:coutbooknum;/标记用于goto语句if(booknumtheBookList.at(i).stock)cout您输入的购买数量大于库存数量,请重新输入或放弃:;coutchoice;if(choice=1)gotoloop;elseif(choice=2)gotoloop1;elsecout请输入正确的待选项;gotoloop3; elsenoBuy=false;theBookList.at(i).stock-=booknum;cout购买成功,是否继续购买;coutchoice;if(choice=Y)printf(n);gotoloop;elseif(choice=N)printf(n);gotoloop1;elsecout请输入正确的待选字符;gotoloop2;/theBookList.at(i).while(noBuy);break;/注意该部分代码应该写在for循环之外if(i=theBookList.size()coutyn;if(yn=N)Interface:main(theBookList);if(yn=Y)continue; break;case2:ReadDate:saveDate(theBookList);/退出之前保存数据exit(0);case0:Interface:main(theBookList);break; 1.2.3 manage(vector&theBookList)其中包含了对书籍操作的manage类,具体请参照manage 类ManageBookmanageBook;printf(_n);printf(|1|2|3|4|5|0|n);printf(|添加|查询|修改|删除|退出程序|返回主菜单|n);printf(-n);printf(请按相应的数字进行下一步操作:n);inta;cina;if(a=0)Interface:main(theBookList);elseif(a=1)manageBook.addBook(theBookList);elseif(a=2)manageBook.searchBook(theBookList);elseif(a=3)manageBook.updateBook(theBookList);elseif(a=4)manageBook.deleteBook(theBookList);elseif(a=5)ReadDate:saveDate(theBookList);exit(0);else 1.2.4 statistics(vector&theBookList)其中包括了即将介绍的Sort类,具体请参照sort类printf(_n);printf(|请选择您所需的输出效果:|n);printf(-|-|-|n);printf(|5|0|n);printf(|1按图书价格|退出|返回|n);printf(|2按库存数量|主|n);printf(|3按作者|程序|菜单|n);printf(|4按出版社|n);printf(-|-|-|n);printf(请按相应的数字进行下一步操作:n);inta;cina;switch(a)case0:Interface:main(theBookList);break;case5:ReadDate:saveDate(theBookList);exit(0);case1:Sort:sortPrice(theBookList);break;case2:Sort:sortStock(theBookList);break;case3:Sort:sortAuthor(theBookList);break;case4:Sort:sortPublisher(theBookList);break; 2.3 ReadDate类 本类涉及到文件的读写内容需要用到#include头文件,主要目的是读入和保存数据,读取目标是本地的“.txt”文档,并且自定义数据写入规则为“|ISBN|name|author|publisher|price|stock|”从而实现数据的读取保存同时用到动态数组vector进行数据的动态保存(需要用到头文件#include),接下来将介绍getRowNum(),readISBN(),saveDate()三个函数 备注:因为数据的读取方式大同小异,故只用readDate为例进行介绍。2.3.1 getRowNum()主要用于进行统计图书的数目,用来建立vector数组,调出类的私有成员变量rowNum,而rowNum的值是有该类的构造函数进行设置修改的,故要详细介绍该类的构造函数ReadDate(),其源代码如下:ReadDate:ReadDate()ofstreamfout;ifstreamfin;fstreamf;f.open(path,ios_base:in);/判断是否有该文件if(!f)/cout打开文件失败;fout.open(path);fout|ISBN|name|author|publisher|price|stock|n;fin.open(path,ios_base:in);/仅以读的方式打开文件/统计文本行数,建立动态Book对象数组(用vector建立动态数组)charstr100;rowNum=0;/不要再写为introwNum=0;否则编译器会认为你又新建了一个数据,因为static变量是隐藏的while(fin.getline(str,sizeof(str)rowNum+;f.close();fout.close();fin.close();代码分析:建立文件读写对象并用getline方法进行文件的行数统计2.3.2 readISBN()voidReadDate:readISBN(vector&theBookList)ifstreamfin;ifstreamfin1;ofstreamfout;fin.open(path,ios_base:in);charstr100;fout.open(importent1.txt,ios_base:out);while(fin.getline(str,sizeof(str)/读入一行数据得到字符串信息boolgot=true;/是否找到标记intkeyNum=0;for(inti=0;isizeof(str);i+)doif(stri=|)keyNum+;i+;elsei+; while(keyNum1);/进行数据的转移 while(got)/改一点都不对!注意要用+i,而不是i+(自己体会)if(stri!=|)foutstri;i+;elsegot=false; foutn;fout.close();fin.close();/读入信息fin1.open(importent1.txt,ios_base:in);chardate50;intkey=0;/确定booklist中的书本while(fin1.getline(date,sizeof(date)stringa(date);theBookListkey.ISBN=a;/为每一个book赋值开始喽key+; fin1.close();注意 使用文件读写流后,要将其关闭,否则会造成内存泄漏,同时文件打开的方式也很重要。2.3.3 saveDate()用于保存经过程序操作的数据,并且通过字符进行格式化输出voidReadDate:saveDate(vector&theBookList)ofstreamfout;fout.open(path,ios_base:out);for(inti=0;itheBookList.size();i+)fout|;fouttheBookList.at(i).ISBN;fout|;fouttheBookList.at(i).name;fout|;fouttheBookList.at(i).author;fout|;fouttheBookList.at(i).publisher;fout|;fouttheBookList.at(i).price;fout|;fouttheBookList.at(i).stock;fout|;foutn;fout.close();值的注意的是文件是已ios_base:out进行打开,即先清除原有文本信息然后写入自身的文本信息.2.4 ManageBook类设计了四个函数addBook(),deleteBook(),updateBook(),searchBook()分别进行增删查的功能,其形参均为vector&theBookList2.4.1 addBook()在执行添加书籍时要先进行信息对比,如果图书里有该图书则不添加反之添加。添加完毕后会提醒是否继续,界面比较友好voidManageBook:addBook(vector&theBookList) loop5:BooknewBook;/cout请输入图书信息:n;coutnewISBN;newBook.ISBN=newISBN;/判断书籍是否存在避免重复添加书籍inta;/注意inta的声明位置,一定要在for之外,否则for循环之后a不能保值for(a=0;atheBookList.size();a+)if(newISBN=theBookList.at(a).ISBN)cout图书已存在,不能继续添加n;break;if(a!=theBookList.size()system(pause);else/coutnewName;newBook.name=newName;/coutnewAuthor;newBook.author=newAuthor;/coutnewPublisher;newBook.publisher=newPublisher;/coutnewPrice;newBook.price=newPrice;/coutnewStock;newBook.stock=newStock;cout请确定新加图书信息:nn;newBook.show();printf(n);couttheChoice;if(theChoice=Y)theBookList.push_back(newBook);printf(nn图书已成功添加!是否继续:(Y/N);charhaha;cinhaha;if(haha=Y)gotoloop5;elseif(theChoice=N);elsecout请输入正确的单个字符选择:;gotoloop4; 2.4.2 deleteBook()删除书籍时较添加时比较麻烦,要用到迭代器进行操作进行对比时的实时监控用以进行对应的操作voidManageBook:deleteBook(vector&theBookList)coutsearchISBN;vector:iteratorBookIterator;/声明Book迭代器BookIterator=theBookList.begin();inta;for(a=0;atheBookList.size();a+)if(searchISBN=theBookList.at(a).ISBN)theBookList.at(a).show();couttheChoice;if(theChoice=Y)theBookList.erase(BookIterator);cout您已经成功删除所选书籍n;break;elsebreak;elseBookIterator+; if(a=theBookList.size()cout您要删除的图书不存在n;system(pause);2.4.3 updateBook()数据更新的函数主体部分有if.else if.else语句构成,用以执行用户的多选择操作voidManageBook:updateBook(vector&theBookList)coutsearchName;inta;for(a=0;atheBookList.size();a+)if(searchName=theBookList.at(a).name)theBookList.at(a).show();cout1.价格2.库存3.作者4.出版社n;loop:couttheChoice;if(theChoice=1)coutnewPrice;theBookList.at(a).price=newPrice;cout数据跟新完毕;theBookList.at(a).show();coutchoice;if(choice=Y)gotoloop;elsebreak;elseif(theChoice=2)coutnewStock;theBookList.at(a).stock=newStock;cout数据跟新完毕;theBookList.at(a).show();coutchoice;if(choice=Y)gotoloop;elsebreak;elseif(theChoice=3)coutnewAuthor;theBookList.at(a).author=newAuthor;cout数据跟新完毕;theBookList.at(a).show();coutchoice;if(choice=Y)gotoloop;elsebreak;elseif(theChoice=4)coutnewPublisher;theBookList.at(a).publisher=newPublisher;cout数据跟新完毕;theBookList.at(a).show();coutchoice;if(choice=Y)gotoloop;elsebreak;elsecout请输入正确的选择;gotoloop;if(a=theBookList.size()cout您所查找的图书不存在;system(pause);elsesystem(pause);2.4.4 searchBook()定义了两种搜索模式:即按书名和按ISBN号查询,通过遍历vector数组轻易实现图书数据的搜索,两种实现方法大同小异。voidManageBook:searchBook(vector&theBookList)cout查找方式:1.ISBN2.书名n;loop:couttheChoice; if(theChoice=1)loop6:couthahaISBN;intw;for(w=0;wtheBookList.size();w+)if(theBookList.at(w).ISBN=hahaISBN)theBookList.at(w).show();couthaha;if(haha=Y)gotoloop6;elsebreak;if(w=theBookList.size()cout您要查寻的书籍不存在;system(pause);elseif(theChoice=2)loop7:couthahaName;intw;for(w=0;wtheBookList.size();w+)if(theBookList.at(w).name=hahaName)theBookList.at(w).show();couthaha;if(haha=Y)gotoloop7;elsebreak;if(w=theBookList.size()cout您要查寻的书籍不存在;system(pause); elsecout请输入正确的选项;gotoloop; 2.5 Sort类Sort类的主要有两种方法,对string数据排序(sortAuthor(),sortPublisher())的和对实数类型排序(sortPrice(),sortStock())的。其主要思想为:建立一个新的vector将,原来的数据读入再输出即可下面将介绍sortAuthor()和sortPrice()2.5.1 sortAuthor()voidSort:sortAuthor(vector&theBookList)vectortempAuthor;/清除重复数据tempAuthor.push_back(theBookList.at(0).author);/总是向新的数组中添加第一本书的author信息for(inta=1;atheBookList.size();a+)intb;for(b=0;btempAuthor.size();b+)if(theBookList.at(a).author=tempAuthor.at(b)break;if(b=tempAuthor.size()tempAuthor.push_back(theBookList.at(a).author);/对比数据并输出for(inti=0;itempAuthor.size();i+)for(intj=0;jtheBookList.size();j+)if(tempAuthor.at(i)=theBookList.at(j).author)theBookList.at(j).authorShow();system(pause);2.5.2 sortPrice()要用到#include算法头文件进行sort()排序voidSort:sortPrice(vector&theBookList)vectortempPrice;tempPrice.push_back(theBookList.at(0).price);for(inta=1;atheBookList.size();a+)intb;for(b=0;btempPrice.size();b+)if(theBookList.at(a).price=tempPrice.at(b)break;if(b=tempPrice.size()tempPrice.push_back(theBookList.at(a).price);sort(tempPrice.begin(),tempPrice.end();/排序/对比数据并输出for(inti=0;itempPrice.size();i+)for(intj=0;jtheBookList.size();j+)if(tempPrice.at(i)=theBookList.at(j).price)theBookList.at(j).priceShow();system(pause);3 程序操作流程在main()函数中进行程序的主要操作,并调用各个类中的函数进而实现程序的一步步进行,main()函数中先进行本地文件的读取看,之后用interface进行下一步操作,进而实现各种操作。因功能和类相关,此处便不再冗余intmain()/进行操作前先加载数据文件,创建book对象数组读入数据ReadDaterd;vectorbooklist(rd.getRowNum();/coutReadDate:getRowNum();/测试使用rd.readISBN(booklist);rd.readName(booklist);rd.readAuthor(booklist);rd.readPublisher(booklist);rd.readPrice(booklist);rd.readStock(booklist);/进行操作 booklist0.show();Interface:main(booklist);system(pause);4 项目测试4.1 图书销售4.2 图书管理4.3 图书统计5 附录 本程序所用到的头文件#include#include#include #include #include #include6 参考资料郑莉,董渊,何江舟主编. C+语言程序设计(第四版). 清华大学出版社,2010年7月郑莉,董渊主编. C+语言程序设计学生用书(第4版). 清华大学出版社,2011年6月Stanley B. Lippman等主编;王刚,杨巨峰译. C+ Primer(中文版 第5版). 电子工业出版社,2013年9月Martin Fowler主编;熊节译. 重构-改善既有代码的设计. 人民邮电出版社,2015年8月
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!