《图书管理课程设计(共20页).doc》由会员分享,可在线阅读,更多相关《图书管理课程设计(共20页).doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上1.需求分析1.1可行性分析因近几年学校对大学生的扩招,相应专业种类的增加,学校对相关于专业方面的图书需求量增大。图书馆对图书的库存量也相应增多。由老式的由图书管理员进行人工对图书入库,借出等操作,工作量相当大,就目前情况来看,图书管理员几乎不可能及时完成工作。所以学校决定开发一个图书信息管理系统,协同图书管理员的工作,这样管理员不必花太多时间用于整理图书,而可以集中精力做其他更重要的图书管理工作。减少管理员的工作负担。学校要求本系统具体能实现的功能要求如下: 图书信息的录入、查询、修改、删除、排序、输出。图书信息可写入文件,也可从文件中读取。1.2 模块分析结合本校
2、的实际情况并经认真分析,为此我将其分成两个模块,由两个类实现:1.2.1 book类。主要封装了图书信息。Book类的数据成员有:bookID(string,图书编号),bookName(string,图书名),publish(Publish,出版社),author(string,图书作者),version(int,图书版本),count(int,图书册数)。1.2.2 Publish类。主要封装了出版社信息。Publish类的数据成员:pTime(string(yyyy-mm-rr),出版时间),address(string,出版社地址),pName(string,出版社名称)1.3输入,输
3、出分析:数据存储方式:数组输入:用户根据自己的需要,选择序号进行操作输出:经系统内部的一系列处理,将最终结果显示给用户 。进入图书系统欢迎界面根据界面序号提示,选择相关操作:1:录入相关图书信息 是否继续操作2:查询相关图书信息 是否继续操作3:修改相关图书信息 是否继续操作4:对相关图书排序 是否继续操作 5:输出所有图书信息 是否继续操作6:退出系统 yes/noyesNo退出系统(yes/no) yesNo退出系统YesNo1.4流程分析本系统的具体流程图如下:2详细设计与实现2.1 UML类图实现本系统主要抽象乘两个类Book 与 Publish。他们之间的关系如下:2.2 编程思想该
4、应用共有五个文件,两个头文件,三个源文件:对Book的具体实现主函数对Publish的具体实现对Book类的声明对Publish类的声明2.3代码实现2.3.1 Book.h 源程序如下#include#include#includepublish.husing namespace std;#ifndef BOOK_H#define BOOK_Hclass Bookprivate:string bookID;/书的编号,不同的书不同的编号string bookName;/书的名称string author;/书的作者string bookType;/书的类型Publish *publish;/
5、声明一个指针类int version;/书的版本号int count ;/该书的册数public:Book();/无参构造函数void set_bookID(string id);/设置书的编号string get_bookID();/获取书的编号void set_bookName(string name);/设置书名string get_bookName();/获取书名void set_author(string author);/设置书作者string get_author();/获取书的作者void set_bookType(string type);/设置书的类型string get_
6、bookType();/获取书的类型void set_publish(Publish &publish);/设置出版社信息Publish get_publish();/获取出版社信息void set_version(int version);/设置书的版本int get_version();/获取书的版本号void set_count(int count);/设置书的册数int get_count();/获取书的册数void addInfo();/录入相关图书信息bool searchInfo(string id);/查找相关图书信息void modifyInfo(string id);/修改
7、相关图书信息 friend void sortInfo(Book book,int n);/对相关图书排序void display();/输出图书信息Book operator =(Book temp);static int bookCount;friend bool isContinue();/声明友原函数,判断是否继续操作;#endif2.3.1 Publish.h 源程序如下#includeusing namespace std;#ifndef PUBLISH_H#define PUBLISH_Hclass Publishprivate:string pTime;string addre
8、ss;string name;public:Publish();/无参构造函数Publish(string time,string add,string name);/带参构造函数 void set_pTime(string time);/设置出版时间string get_pTime();/获取出版时间void set_address(string add);/设置出版社地址string get_address();/获取出版社地址void set_name(string name);/设置出版社名称string get_name();/获取出版社名称;#endif 2.3.3 Book.cp
9、p 的源程序如下 #include#include#include#includepublish.h#includebook.husing namespace std;int Book:bookCount=0;/书的总类数,不同编号的书代表一类Book:Book()bookID=1;bookName=C+编程技术;author=郑立;bookType=IT类;publish=new Publish();/动态分配,后面一定要用delete,否则容易产生内存泄露version=1;count=1;void Book:set_bookID(string id)bookID=id;string Bo
10、ok:get_bookID()return bookID;void Book:set_bookName(string name)bookName=name;string Book:get_bookName()return bookName;void Book:set_author(string auth) author=auth;string Book:get_author()return author;void Book:set_bookType(string type)bookType=type;string Book:get_bookType()return bookType;void
11、Book:set_publish(Publish &pub)publish-set_pTime(pub.get_pTime();publish-set_name(pub.get_name();publish-set_address(pub.get_address();Publish Book:get_publish()return *publish;void Book:set_version(int ver)version=ver;int Book:get_version()return version;void Book:set_count(int coun)count=coun;int B
12、ook:get_count()return count; void Book:display()cout图书编号:bookID图书姓名:bookName 图书作者:;coutauthor 图书类型:bookType 出版时间:get_pTime();cout 出版社地址:get_address() 出版社名称:;coutget_name() 版本号:version 册数:countendl;void Book:addInfo() char choice;cout输入数据按Y,退出按Nchoice;if(choice=Y) string id;string name;string author;
13、string type;string ptime;string pname;string address;Publish publish;int version;int count; cout请输入图书编号:id;set_bookID(id);cout请输入图书名称:name;set_bookName(name);cout请输入图书作者:author;set_author(author); cout请输入图书类型:type;set_bookType(type); cout请输入出版时间:ptime;publish.set_pTime(ptime);cout请输入出版社地址:address;pu
14、blish.set_address(address); cout请输入出版社名称:pname;publish.set_name(pname); cout请输入版本号:version;set_version(version); cout请输入册数:count;set_count(count);coutendl;bookCount+;/总数加1writeFile();readFile();void Book:readFile() ifstream ifile(library.txt,ios_base:in);char line9101;for(int i=0;i9;i+)ifile.getline
15、(linei,100);coutendl;coutlinei; string n=line0; coutn;ifile.close();void Book:writeFile()/创建一个文件输出流对象,采用追加方式ofstream ofile(library.txt,ios_base:app);ofile图书编号:get_bookID()endl;ofile图书名称:get_bookName()endl;ofile图书作者:get_author()endl;ofile图书类型:get_bookType()endl;ofile出版时间:get_pTime()endl;ofile出版地址:get
16、_address()endl;ofile出版社名称:get_name()endl;ofile版本号:get_version()endl;ofile图书册数:get_count()endl;/注意后面的endl,用于对写完一个book后换行,其他位置不行ofile.close();bool Book:searchInfo(string id)bool flag=true;if(get_bookID()=id)flag=true;else flag=false;return flag;void Book:modifyInfo(string id) int choice;/所做的选择 string
17、name,author,type,time,pname,address; int version,count;cout请按序号输入你想修改的项目:endl;cout1:图书姓名 2:图书作者 3:图书类型 4:图书版本 endl;cout5:图书册数 6:出版日期 7:出版社名称 8:出版社地址 choice; if(choice!=0)/当choice=0时表示退出操作if(choice=1) cout请输入新的名称:name;set_bookName(name);else if(choice=2) cout请输入新的作者名:author;set_author(author);else if
18、(choice=3) cout请输入新的图书类型:type;set_bookType(type); else if(choice=4) cout请输入新的版本号:version;set_version(version);else if(choice=5) cout请输入新的册数count;set_count(count);else if(choice=6) cout请输入新的出版时间:time;publish-set_pTime(time);else if(choice=7)cout请输入新的出版名称:pname;publish-set_name(pname);elsecout请输入新的出版社
19、地址:address;publish-set_address(address); void sortInfo(Book book,int n)int flag;Book temp;/临时变量for(int i=0;in-1;i+)/如果前一种书的编号比后一种书的编号大,则flag返回正数flag =booki.get_bookID().compare(booki+1.get_bookID();if(flag)/如果flag为正数,就交换这两种书的位置 temp=booki;booki=booki+1;booki+1=temp;Book Book:operator =(Book temp)/重载
20、=运算符,进行深拷贝set_bookID(temp.get_bookID();set_bookName(temp.get_bookName();set_bookType(temp.get_bookType();set_author(temp.get_author();set_version(temp.get_version();set_count(temp.get_count();set_publish(temp.get_publish();return *this; bool isContinue()char choice;cout是否继续操作(Y/N)?choice;if(choice=Y
21、)return true;else return false;2.3.4 Publish.cpp的源程序#include#include#includepublish.husing namespace std;Publish:Publish()pTime=2008-12-27;address=北京;name=清华大学出版社;Publish:Publish(string time,string add,string name)pTime=time;address=add;name=name;void Publish:set_pTime(string time)pTime=time;string
22、Publish:get_pTime()return pTime;void Publish:set_address(string add)address=add;string Publish:get_address()return address;void Publish:set_name(string nam)name=nam;string Publish:get_name()return name;2.3.5 主函数源程序#include#include#includebook.h#includepublish.husing namespace std;void main() int cho
23、ice; int i; int n;Book *book;/动态创建对象数组cout 欢迎进入图书信息系统! endl; coutn;coutendl;cout=endl;cout请根据序号选择相关操作endl; cout=endl;coutendl;cout 1:录入图书信息!endl;cout 2:查询图书信息!endl;cout 3:修改图书信息!endl;cout 4:对图书排序!endl; cout 5:删除图书信息!endl;cout 6:输出图书信息!endl;cout 7:退出系统!endl;cout=choice;coutendl;while(choice!=0)if(cho
24、ice=1) for(i=0;in;i+)cout第i种书:endl;booki.addInfo();else if(choice=2) string id;coutid;for(i=0;in;i+)if(booki.searchInfo(id)booki.display(); elseif(choice=3) string id;coutid;for(i=0;in;i+)if(booki.get_bookID()=id)booki.modifyInfo(id); else if(choice=4) sortInfo(book,n); else if(choice=5) string id;c
25、outid; for(i=0;in;i+) if(booki.get_bookID()=id) int temp; temp=i; for(int j=i+1;jn;j+) booktemp=bookj; temp=j; n-;/删除了一种数,就减少了一种。 else if(choice=6)for(i=0;in;i+)booki.display(); else exit(1);break; if(isContinue()/选择是否继续操作 coutchoice;else break;/否则退出系统 return ;3.调试与运行3.1主页面运行结果:3.2录入图书信息写入文件如下:在文件夹中
26、多了一个library.txt文件:从文件中读出:3.3查询图书信息3.4修改图书信息当然你可以继续修改,这里就不演示了。3.5对图书排序3.6删除图书3.7输出所有图书信息分析:我们可以看到,第一个图书编号没有,因为我在前面把它删除了,所有的值设置为空,而编号3,与编号1的图书的位置已经变了,因为我在前面对它们排了序。如果编号2没有删除,应该排在最前面。3.8退出系统上面是最终结果,当然在真正的设计过程中是遇到许多问题的,下面我挑几个典型的来分析:3.8.1刚开始我在主函数中使用了以下代码:else if(choice=5) string id;coutid; for(i=0;in;i+)
27、if(booki.get_bookID()=id)booki.deleteInfo();而在book.cpp中的:void Book:deleteInfo()delete this;结果当我进行序号5 操作时,出现以下错误。产生了断言错误。产生错误的原因是,我这里的book数组并不是采用动态分配内存的方式,所以不能用delete 。而 this 是指针类型。我所采用的方法是:将book中的所有数据成员的值设置为空,即在deleteInfo中调用了一个reset函数。但存在一个问题是:尽管book对象中的值为空了,但并为真正从内存中删除。我是用数组来存储本系统的数据的,我开始在为book对象数组
28、分配内存时,犯了一个错误:先看主函数中正确的声明:const int n=3;/书的总类型,声明为常量void main() int choice; int i; /coutn;Book bookn;/动态创建对象数组在看我刚开始的:void main()int n;cinn;Book bookn;我们知道,此时的n是一个变量,是一个为确定的值,有怎么可以为数组分配内存呢?4设计小结与心得:4.1建议:在进行选择操作时,如果你希望执行完一段程序后继续返回到前面的操作,从新选择操作,最好用if else if 。switch语句并不是到处都可以用的。如果用了switch,运行完一段程序后,你会没
29、有继续选择操作的机会,接下来出现 系统将强制你退出系统。比如我主函数中的那段选择程序。我试着使用过switch,就出现以上情况。当我刚开始选择了序号1操作,执行完后没有出现预期的提示我是否继续选择其他序号操作,而是强制退出。4.2还有就是关于指针的问题,能不用指针时就尽量不要用,尽管指针有很多有点,可以让程序的执行效率更搞,但如果你没有那个能耐操纵它,就不要用,不要到时适得其反,造成内存泄露。毕竟我们现在使用的应用系统并不大,用了指针其高效率的有点也体现不出来。4.3如果你觉得用动态分配(new)内存给了你自由发挥的空间,那么建议在使用了new之后,千万别忘了还要使用delete,否则同样会造
30、成内存泄露的问题。如以下错误:程序应用小,可能你不太在意,但如果在大的系统开发中,很可能造成你的整个系统瘫痪,到时不仅仅好是你的程序不能运行,给公司带来的损失你恐怕还赔不起。所以一定要慎重使用new,可以不用new的地方尽量不用new,用了new就一定不要忘了使用delete。参考文献1郑莉,董渊,张瑞丰.C+语言程序设计(第3版)M. 清华大学出版社,2004.2郑莉,董渊.C+语言程序设计案例教程M. 清华大学出版社,2000.致谢在我编写程序的过程中遇到了很多困难,因为有了老师和同学的帮助,使我得以完成这项课程设计,在此,十分感谢我C+程序设计的张英丽老师和我可爱的同学们,感谢他们一直以来对我的悉心指导和帮助。专心-专注-专业