C++程序设计_图书管理系统的控制台实现

求打赏求收藏求转发!

提供PDF资源

https://download.csdn.net/download/weixin_43781565/12429074

(审核后可供下载)

Peace and love

信控学院专业课实验报告

图书管理系统的控制台实现

目录

一、实验名称..............................................................................................1

二、实验目的..............................................................................................1

三、实验平台..............................................................................................1

四、问题分析..............................................................................................1

①问题描述与需求分析....................................................................... 1

②程序功能抽象................................................................................... 1

五、设计/开发解决方案............................................................................ 1

1.class Data  数据基类.......................................................................... 2

2.class Book 书籍派生类.......................................................................2

3.class Journal 派生期刊类................................................................... 3

4.class Reader 借书人类....................................................................... 3

六、实验结果..............................................................................................8

图 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.};

  1. 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)中派生出来,不仅可以清晰的体现各个类之间的层次 关系,保护了相关的数据成员,而且还有效地节省了代码空间,减少了代码冗余。

 

  1. 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.}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值