• C++ 图书馆管理系统


    此管理系统相比于上一篇用Java实现的功能更多了,结构更加简单了,没有用继承之类的复杂语法。逻辑实现上更加严谨了,但是并没有异常处理,以及文件读取等持久化信息的操作,这些操作需要后续的学习。

    功能概览

     

    Library.h

    BookRecord

    1. #include<vector>
    2. #include<cassert>
    3. #include<string>
    4. #include<iostream>
    5. #include<map>
    6. #include<set>
    7. using namespace std;
    8. // 图书类
    9. class BookRecord
    10. {
    11. public:
    12. BookRecord(string s1, string s2, string s3, string s4, unsigned int n1, unsigned int n2) :
    13. book_title_(s1), book_isbn_(s2), author_(s3), year_published_(s4), number_of_copies_(n1), number_of_copies_available_(n2) {}
    14. ~BookRecord() = default;
    15. void DisplayRecord()const; // 打印
    16. bool loan_out(); // 书籍借出函数
    17. void AddBook(int n) { number_of_copies_ += n; number_of_copies_available_ += n; } // 增添书籍
    18. bool is_available()const { return number_of_copies_available_ > 0; } // 判断是否有余量。
    19. bool deletebook()const { return number_of_copies_ == number_of_copies_available_; } // 删除书籍
    20. void ReturnBook() { ++number_of_copies_available_; } // 归还书籍
    21. const string& isbn()const { return book_isbn_; } // 返回ISBN
    22. const string& name()const { return book_title_; } // 返回名字
    23. private:
    24. string book_title_;
    25. string book_isbn_;
    26. string author_;
    27. string year_published_;
    28. unsigned int number_of_copies_;
    29. unsigned int number_of_copies_available_;
    30. };

    存储图书的基本信息,以及一些对外接口。 

    Borrower

    1. // 借阅人类
    2. class Borrower
    3. {
    4. public:
    5. Borrower(string id, string name, string tele)
    6. :borrower_id_(id), name_(name), telephone_(tele){}
    7. ~Borrower() = default;
    8. const string& id()const { return borrower_id_; }
    9. const string& name()const { return name_; }
    10. void DisplayRecord()const; // 打印函数
    11. void LoanBook(const string& s); // 借书
    12. bool ReturnBook(const string& s); // 还书
    13. bool Logout()const { return book_loaned_ == 0; } // 注销
    14. private:
    15. string borrower_id_;
    16. string name_;
    17. string telephone_;
    18. unsigned int book_loaned_ = 0;
    19. vector<string> book_loaned_titles_ = vector<string>();
    20. };

    借阅人类,存储借阅人的基本信息,其中包括这个人借了哪些书,vector存储那些书籍的书名。 

    Library

    1. // 图书馆类
    2. class Library
    3. {
    4. public:
    5. Library() = default;
    6. ~Library()
    7. {
    8. for (const auto& i : vec_pbook_)
    9. delete i;
    10. for (const auto& i : vec_pborrower_)
    11. delete i;
    12. }
    13. Library(const Library&) = delete;
    14. Library& operator=(const Library&) = delete;
    15. void DisplayAllBook()const; // 打印全部书籍
    16. void DisplayAllBorrower()const; // 打印全部借阅人
    17. void DisplayBook()const; // 打印特定书籍
    18. void DisplayBorrower()const; // 打印特定借阅人
    19. void AddBook(); // 添加书籍
    20. void DeleteBook(); // 删除书籍
    21. void LoanBook(); // 借书
    22. void ReturnBook(); // 还书
    23. void Register(); // 注册
    24. void Logout(); // 注销
    25. private:
    26. vector<Borrower*> vec_pborrower_;
    27. vector<BookRecord*> vec_pbook_;
    28. map<string, Borrower*> map_borrower_; // 书籍的ISBN映射到书籍对象指针
    29. map<string, BookRecord*> map_bookrecord_; // 借阅人id到借阅人对象指针的映射
    30. };

    数据成员有 借阅人对象指针的vector 和 书籍对象指针的vector。这里方便遍历。  还有借阅人id到对象指针的map映射,方便通过id检索此人是否存在,以及对应对象的方法调用。 还有书籍isbn到书籍对象指针的map映射,同样也是方便检索。

    成员函数就是那些功能的实现,都封装在了一个Library类的对象中。main.cpp中可以看到调用。

    Library.cpp

    BookRecord成员函数实现

    1. #include"Library.h"
    2. void BookRecord::DisplayRecord()const
    3. {
    4. auto c1 = book_title_.c_str(), c2 = book_isbn_.c_str(), c3 = author_.c_str(), c4 = year_published_.c_str();
    5. printf("书名:%-10s ISBN:%-15s 作者:%-8s 出版年: %-5s 总数量:%d 余量:%d\n", c1, c2, c3, c4, number_of_copies_, number_of_copies_available_);
    6. }
    7. bool BookRecord::loan_out()
    8. {
    9. if (number_of_copies_available_ > 0)
    10. {
    11. --number_of_copies_available_;
    12. return true;
    13. }
    14. else
    15. {
    16. return false;
    17. }
    18. }

    loan_out 成员函数用于判断此书是否还有余量可以借出,用于LoanBook方法中。用返回值判断是否还有余量。 

    Borrower成员函数实现

    1. void Borrower::DisplayRecord()const
    2. {
    3. auto c1 = borrower_id_.c_str(), c2 = name_.c_str(), c3 = telephone_.c_str();
    4. printf("ID:%-15s 姓名:%-5s 联系方式:%-15s 借阅书籍数量:%d\n", c1, c2, c3, book_loaned_);
    5. if (book_loaned_ != 0)
    6. {
    7. cout << "借阅书籍名称" << ": ";
    8. for (const auto& i : book_loaned_titles_)
    9. cout << i << " ";
    10. cout << endl;
    11. }
    12. }
    13. void Borrower::LoanBook(const string& title)
    14. {
    15. ++book_loaned_;
    16. book_loaned_titles_.push_back(title);
    17. }
    18. bool Borrower::ReturnBook(const string& name)
    19. {
    20. for (auto i = book_loaned_titles_.begin(); i != book_loaned_titles_.end(); ++i)
    21. {
    22. if ((*i) == name)
    23. {
    24. book_loaned_titles_.erase(i);
    25. --book_loaned_;
    26. return true;
    27. }
    28. }
    29. return false;
    30. }

    LoanBook用于辅助Library类的LoanBook的实现。ReturnBook需要将书籍名在对象的vector<string>中删除,还要将借书量减一。 

    Library的打印函数实现

    1. void Library::DisplayAllBook()const
    2. {
    3. if (!vec_pbook_.empty())
    4. for (auto i : vec_pbook_)
    5. i->DisplayRecord();
    6. else
    7. cout << "图书馆暂无书籍" << endl;
    8. }
    9. void Library::DisplayAllBorrower()const
    10. {
    11. if (!vec_pborrower_.empty())
    12. for (auto i : vec_pborrower_)
    13. i->DisplayRecord();
    14. else
    15. cout << "图书馆暂无借阅人" << endl;
    16. }
    17. void Library::DisplayBook()const
    18. {
    19. cout << "请输入书籍名称" << endl;
    20. string name;
    21. cin >> name;
    22. for (const auto& i : vec_pbook_)
    23. if (i->name() == name)
    24. {
    25. i->DisplayRecord();
    26. return;
    27. }
    28. cout <<"错误," << name << "书籍不存在" << endl;
    29. }
    30. void Library::DisplayBorrower()const
    31. {
    32. cout << "请输入借阅人姓名" << endl;
    33. string name;
    34. cin >> name;
    35. for(const auto& i :vec_pborrower_)
    36. if (i->name() == name)
    37. {
    38. i->DisplayRecord();
    39. return;
    40. }
    41. cout << "错误" << name << "借阅人不存在" << endl;
    42. }

    略 

    LoanBook + ReturnBook  借书+还书

    1. void Library::LoanBook()
    2. {
    3. cout << "请输入你的id号码" << endl;
    4. string id;
    5. cin >> id;
    6. if (map_borrower_.find(id) == map_borrower_.end())
    7. {
    8. cout << "错误,你尚未注册,无法借书" << endl;
    9. cout << "是否注册?(Y/N)" << endl;
    10. char input = ' ';
    11. cin >> input;
    12. if (input == 'Y' || input == 'y')
    13. Register();
    14. return;
    15. }
    16. cout << "请输入你想借阅的书籍书名" << endl;
    17. string name;
    18. cin >> name;
    19. for (auto i = vec_pbook_.begin(); i != vec_pbook_.end(); ++i)
    20. {
    21. // 这里用到了vector_pbook
    22. if ((*i)->name() == name)
    23. {
    24. if ((*i)->loan_out())
    25. {
    26. map_borrower_[id]->LoanBook(name);
    27. cout << "借阅成功" << endl;
    28. }
    29. else
    30. cout << "书籍余量为零,借阅失败" << endl;
    31. return;
    32. }
    33. }
    34. cout << name << "书籍不存在" << endl;
    35. }
    36. void Library::ReturnBook()
    37. {
    38. cout << "请输入你的id号码" << endl;
    39. string id;
    40. cin >> id;
    41. if (map_borrower_.find(id) == map_borrower_.end())
    42. {
    43. cout << "错误,你尚未注册,无法归还书籍" << endl;
    44. cout << "是否注册?(Y/N)" << endl;
    45. char input = ' ';
    46. cin >> input;
    47. if (input == 'Y' || input == 'y')
    48. Register();
    49. return;
    50. }
    51. cout << "请输入你要归还书籍的ISBN编号" << endl;
    52. string isbn;
    53. cin >> isbn;
    54. if (map_bookrecord_.find(isbn) == map_bookrecord_.end())
    55. {
    56. cout << "错误,图书馆不存在此书" << endl;
    57. return;
    58. }
    59. auto name = map_bookrecord_[isbn]->name();
    60. if (map_borrower_[id]->ReturnBook(name))
    61. {
    62. map_bookrecord_[isbn]->ReturnBook();
    63. return;
    64. }
    65. else
    66. cout << "错误,检测到你尚未借过此书" << endl;
    67. }

    逻辑较为缜密   借书和还书时,借阅人那里和书籍那里都要处理。 

    AddBook + DeleteBook 添加书籍 删除书籍  这是管理员的功能

    1. void Library::AddBook()
    2. {
    3. string title, isbn, author, published;
    4. unsigned int copies;
    5. cout << "请输入书名,ISBN编号,作者名,出版年,数量。中间以空格隔开" << endl;
    6. cin >> title >> isbn >> author >> published >> copies;
    7. if (map_bookrecord_.find(isbn) == map_bookrecord_.end())
    8. {
    9. BookRecord* p = new BookRecord(title, isbn, author, published, copies, copies);
    10. assert(p);
    11. vec_pbook_.push_back(p);
    12. map_bookrecord_.insert({ p->isbn(),p });
    13. }
    14. else
    15. map_bookrecord_[isbn]->AddBook(copies);
    16. cout << "添加成功" << endl;
    17. }
    18. void Library::DeleteBook()
    19. {
    20. string isbn;
    21. cout << "请输入你要删除的书籍ISBN号码:>" << endl;
    22. cin >> isbn;
    23. if (map_bookrecord_.find(isbn) == map_bookrecord_.end())
    24. {
    25. cout << "错误,该书籍不存在!!!" << endl;
    26. return;
    27. }
    28. else if (map_bookrecord_[isbn]->deletebook() == false)
    29. {
    30. cout << "错误,此书籍尚未全部归还!!!" << endl;
    31. return;
    32. }
    33. auto p = map_bookrecord_[isbn];
    34. map_bookrecord_.erase(isbn);
    35. for (auto i = vec_pbook_.begin(); i != vec_pbook_.end(); ++i)
    36. {
    37. if (*i == p)
    38. {
    39. vec_pbook_.erase(i);
    40. break;
    41. }
    42. }
    43. delete p;
    44. cout << "删除成功" << endl;
    45. }

     vector和map中都要处理信息。不过是书籍的vector和map

    Register + Logout  注册 注销 用于借阅人的操作

    1. void Library::Register()
    2. {
    3. string id;
    4. cout << "请输入一个你自己的id号码" << endl;
    5. do
    6. {
    7. cin >> id;
    8. if (map_borrower_.find(id) != map_borrower_.end())
    9. {
    10. cout << "错误,此id已存在,请重新输入。" << endl;
    11. }
    12. else
    13. break;
    14. } while (true);
    15. string name, tele;
    16. cout << "请输入你的姓名,联系方式" << endl;
    17. cin >> name >> tele;
    18. Borrower* p = new Borrower(id, name, tele);
    19. assert(p);
    20. vec_pborrower_.push_back(p);
    21. map_borrower_.insert({ id,p });
    22. cout << "注册成功" << endl;
    23. }
    24. void Library::Logout()
    25. {
    26. cout << "请输入你的id号码" << endl;
    27. string id;
    28. cin >> id;
    29. if (map_borrower_.find(id) == map_borrower_.end())
    30. {
    31. cout << "错误,你尚未注册" << endl;
    32. cout << "是否注册?(Y/N)" << endl;
    33. char input = ' ';
    34. cin >> input;
    35. if (input == 'Y' || input == 'y')
    36. Register();
    37. return;
    38. }
    39. else if (map_borrower_[id]->Logout() != true)
    40. {
    41. cout << "错误,注销失败,你有书籍尚未归还" << endl;
    42. return;
    43. }
    44. auto p = map_borrower_[id];
    45. for (auto i = vec_pborrower_.begin(); i != vec_pborrower_.end(); ++i)
    46. if (*i == p)
    47. {
    48. vec_pborrower_.erase(i);
    49. break;
    50. }
    51. map_borrower_.erase(id);
    52. delete p;
    53. cout << "注销成功" << endl;
    54. }

    vector和map都要处理。  借阅人的vector和map

    Main.cpp

    1. #include"Library.h"
    2. void menu()
    3. {
    4. cout << " 欢迎进入图书馆 " << endl;
    5. cout << "==========================" << endl;
    6. cout << " 1. 管理员系统 " << endl;
    7. cout << " 2. 借阅人系统 " << endl;
    8. cout << " 0. 退出系统 " << endl;
    9. cout << "==========================" << endl;
    10. }
    11. void MenuOfManager()
    12. {
    13. cout << " 欢迎进入管理员系统 " << endl;
    14. cout << "==============================" << endl;
    15. cout << " 1. 查看全部书籍 " << endl;
    16. cout << " 2. 查看全部借阅人 " << endl;
    17. cout << " 3. 查找指定书籍 " << endl;
    18. cout << " 4. 查找指定借阅人 " << endl;
    19. cout << " 5. 添加书籍 " << endl;
    20. cout << " 6. 删除书籍 " << endl;
    21. cout << " 0. 退出系统 " << endl;
    22. cout << "=============================" << endl;
    23. }
    24. void MenuOfReader()
    25. {
    26. cout << " 欢迎进入借阅人系统 *" << endl;
    27. cout << "==============================" << endl;
    28. cout << " 1. 查看全部书籍 " << endl;
    29. cout << " 2. 查找指定书籍 " << endl;
    30. cout << " 3. 借阅书籍 " << endl;
    31. cout << " 4. 归还书籍 " << endl;
    32. cout << " 5. 注册 " << endl;
    33. cout << " 6. 注销 " << endl;
    34. cout << " 0. 退出系统 " << endl;
    35. cout << "==============================" << endl;
    36. }
    37. void manager(Library& lib)
    38. {
    39. int input = 0;
    40. do
    41. {
    42. MenuOfManager();
    43. printf("请输入你的选择:>");
    44. cin >> input;
    45. switch (input)
    46. {
    47. case 1:
    48. lib.DisplayAllBook();
    49. break;
    50. case 2:
    51. lib.DisplayAllBorrower();
    52. break;
    53. case 3:
    54. lib.DisplayBook();
    55. break;
    56. case 4:
    57. lib.DisplayBorrower();
    58. break;
    59. case 5:
    60. lib.AddBook();
    61. break;
    62. case 6:
    63. lib.DeleteBook();
    64. break;
    65. case 0:
    66. cout << "退出成功" << endl;
    67. break;
    68. default:
    69. cout << "输入错误,请重新输入" << endl;
    70. break;
    71. }
    72. } while (input);
    73. }
    74. void reader(Library& lib)
    75. {
    76. int input = 0;
    77. do
    78. {
    79. MenuOfReader();
    80. printf("请输入你的选择:>");
    81. cin >> input;
    82. switch (input)
    83. {
    84. case 1:
    85. lib.DisplayAllBook();
    86. break;
    87. case 2:
    88. lib.DisplayBook();
    89. break;
    90. case 3:
    91. lib.LoanBook();
    92. break;
    93. case 4:
    94. lib.ReturnBook();
    95. break;
    96. case 5:
    97. lib.Register();
    98. break;
    99. case 6:
    100. lib.Logout();
    101. break;
    102. case 0:
    103. cout << "退出成功" << endl;
    104. break;
    105. default:
    106. cout << "输入错误,请重新输入" << endl;
    107. break;
    108. }
    109. } while (input);
    110. }
    111. void test()
    112. {
    113. Library lib;
    114. // Library lib2 = lib;
    115. // lib2 = lib;
    116. int input = 0;
    117. do
    118. {
    119. menu();
    120. printf("请输入你的选择:>");
    121. cin >> input;
    122. switch (input)
    123. {
    124. case 1:
    125. manager(lib);
    126. break;
    127. case 2:
    128. reader(lib);
    129. break;
    130. case 0:
    131. cout << "退出成功" << endl;
    132. break;
    133. default:
    134. cout << "输入错误,请重新输入" << endl;
    135. break;
    136. }
    137. } while (input);
    138. }
    139. int main()
    140. {
    141. test();
    142. return 0;
    143. }

    有点丑陋了,全是switch case语句。

    综上,就是STL的容器练习,以及类和对象的使用。

  • 相关阅读:
    Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)
    原码 反码 补码
    机器学习和深度学习相关指标和方法
    JS逆向之巨量算数signature与data解密
    【浅学Java】多线程进阶
    UNI APP---Android端原生插件开发实战(一)
    22CCPC威海+思维
    坦克车机器人操作学习总结开始篇
    Redis_07_Redis两种持久化方式
    【MySQL数据库】(一)MySQL 概述
  • 原文地址:https://blog.csdn.net/i777777777777777/article/details/125596265