• 【小超嵌入式】C++图书管理系统详细分析


    之前实现过学生管理系统今天来看看图书馆管理系统,其相对学生管理系统来说会复杂一些

    一、完整代码

    1. #include <iostream>
    2. #include <string>
    3. #include <vector>
    4. using namespace std;
    5. // 图书结构体
    6. struct Book {
    7. string title;
    8. string author;
    9. int year;
    10. };
    11. // 添加图书函数
    12. void addBook(vector<Book>& books) {
    13. Book newBook;
    14. cout << "请输入图书标题: ";
    15. cin.ignore();
    16. getline(cin, newBook.title);
    17. cout << "请输入图书作者: ";
    18. getline(cin, newBook.author);
    19. cout << "请输入出版年份: ";
    20. cin >> newBook.year;
    21. books.push_back(newBook);
    22. cout << "图书添加成功!" << endl;
    23. }
    24. // 删除图书函数
    25. void deleteBook(vector<Book>& books) {
    26. string title;
    27. cout << "请输入要删除的图书标题: ";
    28. cin.ignore();
    29. getline(cin, title);
    30. for (auto it = books.begin(); it!= books.end(); ++it) {
    31. if (it->title == title) {
    32. books.erase(it);
    33. cout << "图书删除成功!" << endl;
    34. return;
    35. }
    36. }
    37. cout << "未找到该图书,删除失败!" << endl;
    38. }
    39. // 查找图书函数
    40. void searchBook(const vector<Book>& books) {
    41. string title;
    42. cout << "请输入要查找的图书标题: ";
    43. cin.ignore();
    44. getline(cin, title);
    45. for (const auto& book : books) {
    46. if (book.title == title) {
    47. cout << "图书找到!" << endl;
    48. cout << "标题: " << book.title << endl;
    49. cout << "作者: " << book.author << endl;
    50. cout << "出版年份: " << book.year << endl;
    51. return;
    52. }
    53. }
    54. cout << "未找到该图书!" << endl;
    55. }
    56. // 显示所有图书函数
    57. void displayBooks(const vector<Book>& books) {
    58. if (books.empty()) {
    59. cout << "当前没有图书!" << endl;
    60. return;
    61. }
    62. for (const auto& book : books) {
    63. cout << "标题: " << book.title << endl;
    64. cout << "作者: " << book.author << endl;
    65. cout << "出版年份: " << book.year << endl;
    66. cout << "-------------------" << endl;
    67. }
    68. }
    69. int main() {
    70. vector<Book> books;
    71. int choice;
    72. do {
    73. cout << "图书管理系统" << endl;
    74. cout << "1. 添加图书" << endl;
    75. cout << "2. 删除图书" << endl;
    76. cout << "3. 查找图书" << endl;
    77. cout << "4. 显示所有图书" << endl;
    78. cout << "0. 退出" << endl;
    79. cout << "请选择操作: ";
    80. cin >> choice;
    81. switch (choice) {
    82. case 1:
    83. addBook(books);
    84. break;
    85. case 2:
    86. deleteBook(books);
    87. break;
    88. case 3:
    89. searchBook(books);
    90. break;
    91. case 4:
    92. displayBooks(books);
    93. break;
    94. case 0:
    95. cout << "退出系统" << endl;
    96. break;
    97. default:
    98. cout << "无效的选择,请重新输入" << endl;
    99. }
    100. } while (choice!= 0);
    101. return 0;
    102. }

    二、程序逐行分析

    1、基本程序

    1. #include
    2. #include
    3. #include

    这些头文件提供了程序所需的基本功能,包括输入输出流),字符串处理(),以及动态数组()。

    using namespace std;

    这允许我们在后续代码中直接使用std命名空间下的类型和函数,例如coutstring

    1. struct Book {
    2. string title;
    3. string author;
    4. int year;
    5. };

    Book结构体包含三个成员变量:title(标题)、author(作者)和year(出版年份)。

    2、添加新书

    1. void addBook(vector<Book>& books) {
    2. Book newBook;
    3. cout << "请输入图书标题: ";
    4. cin.ignore();
    5. getline(cin, newBook.title);
    6. cout << "请输入图书作者: ";
    7. getline(cin, newBook.author);
    8. cout << "请输入出版年份: ";
    9. cin >> newBook.year;
    10. books.push_back(newBook);
    11. cout << "图书添加成功!" << endl;
    12. }

    定义一个名为 addBook 的函数,向图书馆系统中添加一本新书。下面是该函数的逐行解析:

    1. 函数签名:
      void addBook(vector<Book>& books)
      这行定义了函数 addBook,它接受一个类型为 vector 的引用参数 books。这里的引用参数允许函数直接修改传递给它的图书向量,而不是其副本。
    2. 创建新的图书实例:
       Book newBook;

    这里创建了一个 Book 结构体的新实例 newBook,用于存储即将添加的图书信息。 3. 输入图书标题:

    cout << "请输入图书标题: ";

    输出提示信息要求用户输入图书标题。

    cin.ignore();

    cin.ignore() 被用来忽略输入流中的任何现有字符,这通常用于清理缓冲区,因为在之前的输入操作中可能留下了换行符或其它字符。

    getline(cin, newBook.title);

    使用 getline 函数读取一行输入并将其存储在 newBook.title 中,这样可以读取包含空格的标题。 4. 输入图书作者:

    1. cout << "请输入图书作者: ";
    2. getline(cin, newBook.author);

    类似地,这里请求用户输入图书的作者,并将输入的值赋给 newBook.author。 5. 输入出版年份:

    1. cout << "请输入出版年份: ";
    2. cin >> newBook.year;

    这次使用 cin 直接读取整数输入,并将其赋给 newBook.year。注意,在此之后没有调用 cin.ignore(),因为接下来的操作不需要读取整行输入。 6. 将新图书添加到列表:

    books.push_back(newBook);

    这行代码将新创建的图书 newBook 添加到 books 向量的末尾。 7. 输出确认消息:

    cout << "图书添加成功!" << endl;

    最后,向用户输出一条确认消息,表示图书已成功添加到系统中。

    3、删除图书

    1. void deleteBook(vector<Book>& books) {
    2. string title;
    3. cout << "请输入要删除的图书标题: ";
    4. cin.ignore();
    5. getline(cin, title);
    6. for (auto it = books.begin(); it!= books.end(); ++it) {
    7. if (it->title == title) {
    8. books.erase(it);
    9. cout << "图书删除成功!" << endl;
    10. return;
    11. }
    12. }
    13. cout << "未找到该图书,删除失败!" << endl;
    14. }

    定义一个 deleteBook 函数,从图书馆系统中删除指定标题的图书。以下是函数的逐行解析:

    1. 函数签名:

      void deleteBook(vector<Book>& books)

      这行定义了函数 deleteBook,它接受一个 vector 类型的引用参数 books。通过引用传递,函数可以直接修改原始图书列表。

    2. 获取图书标题:

      1. string title;
      2. cout << "请输入要删除的图书标题: ";

      输出提示信息要求用户输入想要删除的图书标题。

      1. cin.ignore();
      2. getline(cin, title);

      cin.ignore() 清理输入缓冲区,以确保 getline 可以正确读取完整的行输入,即使上一次输入操作以回车结束。然后 getline 读取用户输入的图书标题并存储在变量 title 中。

    3. 遍历图书列表:

      1. for (auto it = books.begin(); it != books.end(); ++it) {
      2. // 循环体
      3. }

      这里使用迭代器 it 来遍历图书列表 books。迭代器从 books.begin() 开始,指向第一个元素,并在每次循环迭代时递增,直到到达 books.end(),即列表的末尾。

    4. 检查并删除图书:

      1. if (it->title == title) {
      2. books.erase(it);
      3. cout << "图书删除成功!" << endl;
      4. return;
      5. }

      在循环体内,比较当前迭代器指向的图书的标题 it->title 是否与用户提供的标题 title 相匹配。如果匹配,使用 books.erase(it) 删除当前迭代器所指的图书。随后输出一条确认消息,并使用 return 立即退出函数,停止进一步的搜索和删除操作。

    5. 如果图书未找到:

      cout << "未找到该图书,删除失败!" << endl;

      如果循环结束后没有找到匹配的图书标题,执行这行代码,输出一条错误消息,告知用户图书未找到,删除操作失败。

    4、查找图书

    1. void searchBook(const vector<Book>& books) {
    2. string title;
    3. cout << "请输入要查找的图书标题: ";
    4. cin.ignore();
    5. getline(cin, title);
    6. for (const auto& book : books) {
    7. if (book.title == title) {
    8. cout << "图书找到!" << endl;
    9. cout << "标题: " << book.title << endl;
    10. cout << "作者: " << book.author << endl;
    11. cout << "出版年份: " << book.year << endl;
    12. return;
    13. }
    14. }
    15. cout << "未找到该图书!" << endl;
    16. }

    定义一个名为 searchBook 的函数,在图书馆系统中查找一本特定的图书。下面是函数的逐行解析:

    1. 函数签名:
      void searchBook(const vector& books)
      这行定义了函数 searchBook,它接受一个 vector 类型的常量引用参数 books。由于不打算修改图书列表,所以使用常量引用,避免不必要的数据复制。
    2. 获取图书标题:
      1. string title;
      2. cout << "请输入要查找的图书标题: ";
      输出提示信息要求用户输入想要查找的图书标题。
      1. cin.ignore();
      2. getline(cin, title);
      cin.ignore() 清理输入缓冲区,确保 getline 能够正确读取用户输入的完整行。getline 读取用户输入的图书标题并存储在变量 title 中。
    3. 遍历图书列表:
      1. for (const auto& book : books) {
      2. // 循环体
      3. }
      这里使用范围基础的 for 循环来遍历图书列表 booksconst auto& book 表示循环中每次迭代都会访问列表中的一个常量引用图书对象。
    4. 检查图书标题:
      1. if (book.title == title) {
      2. // 匹配时的代码块
      3. }
      对于列表中的每一本书,检查其标题 book.title 是否与用户提供的标题 title 相匹配。
    5. 找到图书:
      1. cout << "图书找到!" << endl;
      2. cout << "标题: " << book.title << endl;
      3. cout << "作者: " << book.author << endl;
      4. cout << "出版年份: " << book.year << endl;
      5. return;
      如果找到了匹配的图书,输出一条确认消息,并列出图书的详细信息,包括标题、作者和出版年份。之后,使用 return 语句立即退出函数,不再继续搜索。
    6. 图书未找到:
      cout << "未找到该图书!" << endl;
      如果遍历完所有图书都没有找到匹配的标题,执行这行代码,输出一条错误消息,告诉用户未找到该图书。

    5、显示所有图书

    1. void displayBooks(const vector<Book>& books) {
    2. if (books.empty()) {
    3. cout << "当前没有图书!" << endl;
    4. return;
    5. }
    6. for (const auto& book : books) {
    7. cout << "标题: " << book.title << endl;
    8. cout << "作者: " << book.author << endl;
    9. cout << "出版年份: " << book.year << endl;
    10. cout << "-------------------" << endl;
    11. }
    12. }

    定义一个 displayBooks 函数,其功能是在图书馆系统中显示所有已存在的图书信息。下面是函数的逐行解析:

    1. 函数签名:
      void displayBooks(const vector& books)
      这里定义了 displayBooks 函数,它接受一个 vector 类型的常量引用 books 作为参数。常量引用意味着函数不会修改传入的图书列表,同时避免了不必要的数据拷贝。
    2. 检查图书列表是否为空:
      1. if (books.empty()) {
      2. cout << "当前没有图书!" << endl;
      3. return;
      4. }
      函数首先检查图书列表是否为空。如果列表为空,即 books.empty() 返回 true,则输出一条消息告知用户当前没有图书,随后使用 return 语句提前结束函数执行。
    3. 遍历图书列表并显示信息:
      1. for (const auto& book : books) {
      2. // 显示图书信息的代码
      3. }
      如果图书列表非空,函数将继续执行并使用范围基础的 for 循环遍历列表中的每一本书。const auto& book 表示每次迭代都会访问列表中的一个常量引用图书对象。
    4. 输出图书信息:
      1. cout << "标题: " << book.title << endl;
      2. cout << "作者: " << book.author << endl;
      3. cout << "出版年份: " << book.year << endl;
      4. cout << "-------------------" << endl;
      对于列表中的每一本书,函数会输出其标题、作者和出版年份。每本书的信息展示后,还会输出一行分隔线,以便清晰地区分不同的图书信息。

      6、主程序

      这段代码是整个图书馆管理系统的核心控制部分,定义在 main() 函数中。它提供了用户交互界面,允许用户执行添加、删除、查找图书和显示所有图书等操作。下面是逐行解析:
    5. 初始化图书列表和用户选择变量:
      1. vector books;
      2. int choice;
      创建一个空的 vector 用于存储图书信息,以及一个整型变量 choice 用于存储用户的选择。
    6. 用户交互循环:
      1. do {
      2. // 用户界面和选择处理代码
      3. } while (choice != 0);
      使用 do-while 循环来持续显示菜单并接收用户输入,直到用户选择退出(输入 0)。do-while 循环至少会执行一次,保证用户至少能看到一次菜单。
    7. 显示菜单:
      1. cout << "图书管理系统" << endl;
      2. cout << "1. 添加图书" << endl;
      3. cout << "2. 删除图书" << endl;
      4. cout << "3. 查找图书" << endl;
      5. cout << "4. 显示所有图书" << endl;
      6. cout << "0. 退出" << endl;
      这段代码负责输出菜单,让用户知道可选的操作。
    8. 请求用户输入:
      1. cout << "请选择操作: ";
      2. cin >> choice;
      提示用户输入他们的选择,并使用 cin 读取用户输入的整数值到变量 choice
    9. 根据用户选择调用相应函数:
      1. switch (choice) {
      2. // 案例处理
      3. }
      使用 switch 语句根据用户的选择调用相应的函数。
    10. 案例处理:
      • 添加图书 (case 1):调用 addBook(books); 函数。
      • 删除图书 (case 2):调用 deleteBook(books); 函数。
      • 查找图书 (case 3):调用 searchBook(books); 函数。
      • 显示所有图书 (case 4):调用 displayBooks(books); 函数。
      • 退出 (case 0):输出 “退出系统” 并终止循环。
      • 默认情况 (default):输出 “无效的选择,请重新输入”,让用户知道他们输入了无效的选择。
    11. 控制循环条件:
      } while (choice != 0);
      循环将持续执行,直到用户输入 0,表示退出程序。
    12. 返回值:
      return 0;
      main() 函数最后返回 0,表示程序正常结束。
  • 相关阅读:
    hive 3.1.4部署
    如何隐藏自己的代码(很酷)
    详解 SpringMVC 的 HttpMessageConverter
    多肽标签VSV-G Tag、YTDIEMNRLGK
    【LRUCache】Python缓存装饰器
    【方向盘】JVM除了HotSpot,你还知道哪些?
    【算法100天 | 18】回文链表的多种解法(JAVA实现)
    Java开源工具库使用之Lombok
    汽车电子——产品标准规范汇总和梳理(自动驾驶)
    知识竞赛小程序、知识库小程序如何分享到微信好友、朋友圈
  • 原文地址:https://blog.csdn.net/qq_33738357/article/details/140403905