求打赏求收藏求转发!
提供PDF资源
https://download.csdn.net/download/weixin_43781565/12429074
(审核后可供下载)
Peace and love
信控学院专业课实验报告
图书管理系统的控制台实现
目录
①问题描述与需求分析....................................................................... 1
②程序功能抽象................................................................................... 1
五、设计/开发解决方案............................................................................ 1
1.class Data 数据基类.......................................................................... 2
2.class Book 书籍派生类.......................................................................2
3.class Journal 派生期刊类................................................................... 3
4.class Reader 借书人类....................................................................... 3
图 3-2 借书人用户创建与信息显示..................................................8
图 3-3 借书数量超过限制(5 本).........................................................8
图 3-4 借书人当前借阅书籍信息展示..............................................8
七、实验分析及结论................................................................................. 8
一、实验名称 模拟图书管理系统的控制台指令实现 二、实验目的
本次实验旨在主要对前期学习的有关 C++面向对象部分的有关类的继承 (inheritance)相关知识的实践与应用。
在理论方面主要体现了:
1. 提升由面向过程向面向对象的思维转变;
2. 对继承关系的分析和实践应用;
3. 对函数参数列表(parameter list)的实践应用;
4. 加强对对象的创建和成员函数的书写能力; 在实际操作方面,本次试验重点训练了:
1. 继承关系的创建,与相关成员函数之间的调用关系;
2. 函数参数列表的赋值方式;
3. 对字符数组(Character array)的创建和使用; 三、实验平台
IDE :CodeBlocks16.1 (Core:VC++6.0) Language Standard : C++14 四、问题分析
①问题描述与需求分析 在图书馆的日常使用当中,每天都会发生类似"借阅""归还"和"借阅信息管理"
等操作,且随着规模的扩大,每天产生的信息流相当巨大。因此,我们需要利用相关 的软件进行对应信息的管理,"图书管理系统"应运而生。
此次的"图书管理系统",是基于当前学习的有关 C++面向对象中的类的继承 知识基础上构建的,其中需要完成对图书馆运营过程中的部分基础操作进行实现, 并做到对相关信息的查阅和管理。具体包括:
1.对各类书籍进行分类存储,并能做到对书籍进行"增,删,改,查";
2.对借阅人的相关信息进行管理,包括借阅人个人的信息,以及当前所借阅的 书籍,并同时能对人员进行"增,删,改,查"
3.能加入对人员借阅书籍的数量进行一定的限制;
②程序功能抽象 对于图书管理系统在实现部分功能时,通过需求分析可知,我们需要多个类去
管理和存储对应的相关信息,从大体上分为:书籍类(Books)与借阅人类(Reader)。 1.对于类的设计 对于"对各类书籍进行分类存储",我们可以首先设立一个信息量相对较少的
基类数据类(Data),之后利用相关的继承知识,对多个不同书籍种类设置派生类,如 普通书籍类(Books),而对于类似报纸杂志等具有特殊属性的书籍种类,我们可以继 续派生,如派生出的期刊类(Journal),以用来简化相关的代码冗余。
在借阅人类(Reader)中,我们可以实现需求中的有关人员管理的相关功能,例 如"姓名","借书卡号"以及"当前借阅书籍"等相关内容。
2.对于类之间的联系 在相关类设计完成之后,我们应该考虑通过某种机制将两个类即书籍类
(Books)与借阅人类(Reader)关联起来,处于不破坏面向对象的封装性的特点,特别 的使用在 Reader 类中创建 Books 类对象的方式,是两个类中的成员函数和数据成 员进行交互访问。
五、设计/开发解决方案
1
根据需求的分析,首先得到图书管理系统的程序类关系,类图表示如下:
图 2-1
并参考需求分析中的要求,并结合相关内容,确定出上图类中的成员函数和数 据成员,图书管理系统代码片段如下:
备注:已将部分代码数量较少的函数直接写入类中,未在外部进行编写。 1.class Data 数据基类
1.classData //数据基类 2.{
3.public:
4. Data() //初始化数据
5. {
6. strcpy(Name,"");
7. Id=0;
8. }
9. Data(char*name,longid) //设置数据信息 10. {
11. strcpy(Name,name);
12. Id=id; 13. }
14. longGetCode() 15. {
16. returnId; 17. }
18. voidShow() //显示数据信息 19. {
20. cout<<"数据:"<<Name<<'\t'<<Id<<endl; 21. }
22.protected:
23. charName[40]; //名称
24. longId; //ID
25.};
2.class Book 书籍派生类
26.classBook:publicData //派生类:书籍 27.{
2
28.public:
29. Book() //初始化书籍信息
30. {
31. strcpy(Writer,"");
32. strcpy(IndexId,""); 33. }
34. Book(char*writer,char*name,char*index,longid);//增加书籍 35. voidShow()//显示书籍信息
36. {
37. cout<<"书籍:"<<Name<<'\t'<<Writer<<'\t'<<IndexId<<'\t'<<Id<< endl;
38. }
39.private:
40. charWriter[20]; //作者名
41. charIndexId[10]; //索引 42.};
- class Journal 派生期刊类 43.classJournal:publicData //派生类:期刊 44.{
45.public:
46. Journal(); //初始化期刊信息 47. Journal(char*name,intnum,longid); //增加期刊
48. voidShow(); //显示期刊信息 49.private:
50. intNumber; //刊号
51.};
根据相关的需求分析我们可知,通过继承的方式,将普通书籍(Book)与期刊 (Journal)从基类数据类(Data)中派生出来,不仅可以清晰的体现各个类之间的层次 关系,保护了相关的数据成员,而且还有效地节省了代码空间,减少了代码冗余。
- class Reader 借书人类
52.classReader //借书人类 53.{
54.public:
55. Reader();
56. Reader(char*name,longid); 57. ~Reader();
58. voidShow() 59. {
60. cout<<"借书人:\t"<<Name<<'\t'<<Id<<endl; 61. } //显示借书人信息
62. voidShow_Book(); //显示所借书
3
63. | voidShow_Journal(); | /显示所借期刊 |
64. | voidAdd_Book(Bookobj); | /添加所借书 |
65. | voidAdd_Journal(Journalobj); | /添加所借期刊 |
66. | voidDel_Book(Bookobj); | /归还所借书 |
67. | voidDel_Journal(Journalobj); | /归还所借期刊 |
68.private: | ||
69. | charName[20]; | /借书人姓名 |
70. | longId; | /借书证号 |
71. | Book*books; | /所借书籍 |
72. | intCounter_Book; | /已借书数目 |
73. | Journal*journals; | /所借期刊 |
74. | intCounter_Journal; | /已借期刊数目 |
75.}; |
|
|
对于部分实现功能的成员函数,具体代码如下: 1. 增加书籍
1.Book::Book(char*writer,char*name,char*index,longid): 2. Data(name,id)
3.{
4. strcpy(Writer,writer); 5. strcpy(IndexId,index); 6.}
2.增加期刊
1.Journal::Journal(char*name,intnum,longid): 2. Data(name,id)
3.{
4. Number=num; 5.}
3.显示期刊 1.voidJournal::Show() 2.{
3. cout<<"期刊:"<<Name<<'\t'<<Number<<'\t'<<Id<<endl; 4.}
4.初始化借书人
1.Reader::Reader() 2.{
3. strcpy(Name,""); 4. Id=0;
5. books=newBook[5]; 6. Counter_Book=0;
7. journals=newJournal[10];
4
8. Counter_Journal=0;
}
5.设置借书人信息
1.Reader::Reader(char*name,longid) 2.{
3. strcpy(Name,name); 4. Id=id;
5. books=newBook[5]; 6. Counter_Book=0;
7. journals=newJournal[10]; 8. Counter_Journal=0; 9.}
6.展示借阅书籍情况
1.voidReader::Show_Book() 2.{
3. if(Counter_Book==0) 4. {
5. cout<<"书籍已归还!" <<endl; 6. return;
7. }
8. for(inti=0;i<Counter_Book;i++) 9. books[i].Show();
10.}
7.展示借阅期刊情况
1.voidReader::Show_Journal() 2.{
3. if(Counter_Journal==0) 4. {
5. cout<<" 期刊己归还!"<<endl; 6. return;
7. }
8. for(inti=0;i<Counter_Journal;i++) 9. journals[i].Show();
10.}
8.借阅书籍
1.voidReader::Add_Book(Bookobj) 2.{
3. if(Counter_Book<5)
5
4. {
5. books[Counter_Book]=obj;
6. Counter_Book++; 7. }
8. else
9. {
10. cout<<" 您已经借阅5本书籍,请归还后继续借阅!"<<endl;
11. }
12.}
9.归还书籍
1.voidReader::Del_Book(Bookobj) 2.{
3. for(inti=Counter_Book;i>0;i--)
4. if(books[i].GetCode()==obj.GetCode())break;
5. for(intj=i;j<Counter_Book;j++) 6. books[j]=books[j+1];
7. Counter_Book--; 8.}
10.借阅期刊
1.voidReader::Add_Journal(Journalobj) 2.{
3. if(Counter_Journal<5) 4. {
5. journals[Counter_Journal]=obj; 6. Counter_Journal++;
7. }
8. else
9. {
10. cout <<" 您已经借阅5本期刊,请归还后继续借阅!!" <<endl;
11. }
12.}
11.归还期刊
1.voidReader::Del_Journal(Journalobj) 2.{
3. for(inti=Counter_Journal;i>0;i--)
4. if(journals[i].GetCode()==obj.GetCode())break;
6
5. for(intj=i;j<Counter_Journal;j++) 6. journals[j]=journals[j+1];
7. Counter_Journal--; 8.}
12.相关构造,析构函数
1.Journal::Journal():Data() 2.{
3. Number=0; 4.}
5.Reader::~Reader() 6.{
7. deletebooks; 8. deletejournals; 9.}
13.主函数(存放测试用例)
1.intmain() 2.{
3. //增加书籍
4. Journaljournal1("电脑爱好者",11,201901); 5. Journaljournal2("人民日报",12,201912);
6. Bookbook1("沈学东","C++语言面向对象程序设计使用教程", "TP312",1535);
7. Bookbook2("吴柏师","大学物理","TP231",1200);
8. Bookbook3("Peter","离散数学","TP235",1223);
9. Bookbook4("张英平","大话区块链","TP434",2911);
10. Bookbook5("余华","活着","TP164",2931);
11. Bookbook6("编者","马克思主义基本原理","TP112",1001);
12. //增加借书人,并显示信息
13. Readerreader1("朱鑫萌",180601); 14. Readerreader2("孙嘉成",180602); 15. reader1.Show();
16. reader2.Show(); 17. //模拟借书操作
18. reader1.Add_Book(book1); 19. reader1.Add_Book(book2); 20. reader1.Add_Book(book3); 21. reader1.Add_Book(book4); 22. reader1.Add_Book(book5);
7
23. reader1.Add_Book(book6);
24. reader1.Show_Book(); //显示所借书籍 25. reader2.Add_Journal(journal1);
26. reader2.Add_Journal(journal2); 27. reader2.Del_Journal(journal1);
28. reader2.Show_Journal(); //显示所借书籍 29. return0;
30.}
六、实验结果 以下为实验结果截图:
图 3-2 借书人用户创建与信息显示
图 3-3 借书数量超过限制(5 本)
图 3-4 借书人当前借阅书籍信息展示
七、实验分析及结论 在本次图书信息管理系统的试验操作之中,主要训练的是对前期学习的有关
类的继承(inheritance)相关知识的实践与应用.要想准确的使用继承这一功能,我体 会到,对与问题的分析和抽象能力显得尤其重要.比如在本次实验中,最重要的莫 过于对图书馆功能的需求分析和数据类(Data),书籍类(Books)和期刊类(Journal)的 设计的部分,只有对需求分析的足够准确,对问题的抽象足够好,才能准确的描述 出程序中类与类之间的关系,从而准确的使用继承关系.
使用了继承之后的代码,能够很明显的体会到代码空间的减少,是解决代码冗 余的有效解决方案.而在具体使用的时候,我再次复习了有关各种继承关系中成员 函数和数据成员的调用和使用,加深了我对这一部分知识的记忆和理解.
8
总的来说,本次的图书管理系统重点突出的是继承有关的知识,所以对于其他 的成员函数并没有重点关注,但其中还是使用了很多前期学习的比如参数列 表,get 函数的设计,以及构造函数的设置等等.为了简化功能,没有设计功能菜单相 关的函数,可以在后期的项目维护中添加相关的功能.
9
附:程序源代码 1.#include <string.h> 2.#include <iostream> 3.using namespace std;
4.class Data //数据基类 5.{
6.public:
7. Data() //初始化数据
8. {
9. |
| strcpy(Name,""); |
10. |
| Id=0; |
11. | } |
|
12. Data(char *name, long id)//设置数据信息 13. {
14. strcpy(Name,name);
15. Id=id; 16. }
17. long GetCode()
18. {
19. return Id; 20. }
21. void Show()//显示数据信息 22. {
23. cout<<"数据: "<<Name<<'\t'<<Id<<endl; 24. }
25.protected:
26. char Name[40]; //名称 27. long Id; //ID
28.};
29.class Book:public Data //派生类:书籍 30.{
31.public:
32. Book() //初始化书籍信息
33. {
34. strcpy(Writer, "");
35. strcpy(IndexId,""); 36. }
37. Book(char *writer, char *name, char *index, long id); //增加书籍 38. void Show()//显示书籍信息
39. {
40. cout<<"书籍:"<<Name<<'\t'<< Writer<<'\t'<< IndexId <<'\t' << Id
10
<< endl;
41. }
42.private:
43. | char Writer [20]; | //作者名 |
44. | char IndexId [10]; | //索引 |
45.}; |
|
|
46.class Journal:public Data //派生类:期刊 47.{
48.public:
49. Journal(); //初始化期刊信息
50. Journal(char *name,int num,long id); //增加期刊 51. void Show() ; //显示期刊信息
52.private:
53. int Number; //刊号 54.};
55.class Reader//借书人类 56.{
57.public:
58. Reader();
59. Reader(char *name,long id); 60. ~Reader();
61. void Show()
62. {
63. cout<<"借书人:\t"<<Name<<'\t'<<Id<< endl; 64. } //显示借书人信息
65. void Show_Book(); //显示所借书 66. void Show_Journal(); //显示所借期刊
67. void Add_Book(Book obj); //添加所借书 68. void Add_Journal(Journal obj);//添加所借期刊 69. void Del_Book(Book obj);//归还所借书
70. void Del_Journal(Journal obj); //归还所借期刊 71.private:
72. char Name[20]; //借书人姓名 73. long Id; //借书证号
74. Book *books; //所借书籍
75. int Counter_Book; //已借书数目 76. Journal *journals; //所借期刊
11
77. int Counter_Journal; //已借期刊数目 78.};
79.//增加书籍
80.Book::Book(char *writer, char *name, char *index, long id): 81. Data(name, id)
82.{
83. strcpy(Writer, writer); 84. strcpy(IndexId, index); 85.}
86.Journal::Journal():Data () 87.{
88. Number= 0; 89.}
90.//增加期刊
91.Journal::Journal(char *name,int num, long id): 92. Data(name,id)
93.{
94. Number= num; 95.}
96.//显示期刊 97.void Journal::Show () 98.{
99. cout <<"期刊:"<<Name<<'\t'<<Number<<'\t'<<Id<< endl; 100.}
101.//初始化借书人 102.Reader::Reader() 103.{
104. strcpy (Name, ""); 105. Id = 0;
106. books= new Book[5]; 107. Counter_Book = 0;
108. journals= new Journal[10]; 109. Counter_Journal = 0; 110.}
111.//设置借书人信息 112.Reader::Reader(char *name,long id) 113.{
12
114. strcpy(Name, name); 115. Id = id;
116. books = new Book[5]; 117. Counter_Book = 0;
118. journals = new Journal[10]; 119. Counter_Journal = 0; 120.}
121.Reader:: ~Reader() 122.{
123. delete books; 124. delete journals; 125.}
126.//展示借阅书籍情况 127.void Reader::Show_Book() 128.{
129. if (Counter_Book == 0) 130. {
131. cout <<"书籍已归还! "<< endl;
132. return; 133. }
134. for(int i = 0; i<Counter_Book; i++) 135. books[i].Show();
136.}
137.//展示借阅期刊情况 138.void Reader::Show_Journal () 139.{
140. if(Counter_Journal == 0) 141. {
142. cout << " 期刊己归还! " << endl; 143. return;
144. }
145. for(int i = 0; i < Counter_Journal; i++) 146. journals[i].Show();
147.}
148.//借阅书籍
149.void Reader::Add_Book(Book obj) 150.{
151. if(Counter_Book < 5) 152. {
153. books[Counter_Book] = obj;
154. Counter_Book++; 155. }
13
156. else
157. {
158. cout << " 您已经借阅 5 本书籍,请归还后继续借阅! " << endl;
159. }
160.}
161.//归还书籍
162.void Reader::Del_Book(Book obj) 163.{
164. for(int i = Counter_Book; i > 0; i--)
165. if(books[i].GetCode() ==obj.GetCode()) break;
166. for(int j = i; j < Counter_Book; j++) 167. books[j] = books[j+1];
168. Counter_Book-- ; 169.}
170.//借阅期刊
171.void Reader::Add_Journal(Journal obj) 172.{
173. if(Counter_Journal < 5) 174. {
175. journals[Counter_Journal] = obj;
176. Counter_Journal++; 177. }
178. else
179. {
180. cout << " 您已经借阅 5 本期刊,请归还后继续借阅! ! " << endl;
181. }
182.}
183.//归还期刊
184.void Reader::Del_Journal(Journal obj) 185.{
186. for(int i = Counter_Journal; i > 0 ; i --)
187. if(journals [i].GetCode() == obj.GetCode()) break;
188. for(int j = i; j < Counter_Journal; j++) 189. journals[j] = journals[j+1]; 190. Counter_Journal--;
191.}
14
15
192.int main()
193.{
194. //增加书籍
195. Journal journal1("电脑爱好者",11,201901); 196. Journal journal2("人民日报",12,201912);
197. Book book1(" 沈 学 东 ","C++ 语 言 面 向 对 象 程 序 设 计 使 用 教 程 ", "TP312",1535);
198. Book book2("吴柏师","大学物理","TP231", 1200);
199. Book book3("Peter","离散数学","TP235", 1223);
200. Book book4("张英平","大话区块链","TP434", 2911);
201. Book book5("余华","活着","TP164", 2931);
202. Book book6("编者","马克思主义基本原理","TP112", 1001);
203. //增加借书人,并显示信息
204. Reader reader1("朱鑫萌", 180601); 205. Reader reader2("孙嘉成", 180602); 206. reader1.Show();
207. reader2.Show(); 208. //模拟借书操作
209. reader1.Add_Book(book1); 210. reader1.Add_Book(book2); 211. reader1.Add_Book(book3); 212. reader1.Add_Book(book4); 213. reader1.Add_Book(book5); 214. reader1.Add_Book(book6);
215. reader1.Show_Book(); //显示所借书籍 216. reader2.Add_Journal(journal1);
217. reader2.Add_Journal(journal2); 218. reader2.Del_Journal(journal1);
219. reader2.Show_Journal(); //显示所借书籍 220. return 0;
21.}
21.}