C++课设:实现图书馆借阅记录系统(支持书籍管理、借阅功能、超期检测提醒)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏介绍:《编程项目实战》

目录

    • 一、系统概述与设计思路
      • 1. 系统核心功能
      • 2. 技术架构设计
    • 二、核心类设计与数据结构
      • 1. 时间系统设计
      • 2. 书籍类设计
      • 3. 借阅记录类
    • 三、时间系统与状态管理
      • 1. 智能时间推进机制
      • 2. 状态转换管理
    • 四、核心功能实现详解
      • 1. 借书功能实现
      • 2. 超期检测与提醒
      • 3. 黑名单管理系统
    • 五、用户界面与交互设计
      • 1. 菜单驱动设计
      • 2. 预设测试数据
    • 六、完整源代码实现
    • 七、总结与扩展思考

在数字化时代,传统的图书馆管理方式已经无法满足现代化需求。今天,我们将通过C++语言,从零开始构建一个功能完整的图书馆借阅记录系统。这个系统不仅能够管理书籍和借阅者信息,还具备智能的超期提醒、黑名单管理等高级功能。无论你是C++初学者还是想要提升项目经验的开发者,这个教程都将为你提供宝贵的实践经验。

一、系统概述与设计思路

1. 系统核心功能

我们的图书馆管理系统包含以下核心模块:

  • 书籍管理:添加书籍、分类查询、状态跟踪
  • 借阅者管理:用户注册、黑名单管理
  • 借阅记录:借书、还书、历史记录查询
  • 智能提醒:超期检测、自动提醒
  • 统计分析:系统数据统计、状态监控

2. 技术架构设计

系统采用面向对象编程思想,将复杂的业务逻辑分解为若干个相互协作的类:

// 核心枚举定义
enum BookStatus { AVAILABLE, BORROWED, RESERVED };
enum BookCategory { FICTION, SCIENCE, HISTORY, TECHNOLOGY, OTHER };

在这里插入图片描述

这种设计不仅提高了代码的可维护性,还为后续功能扩展奠定了坚实基础。

二、核心类设计与数据结构

1. 时间系统设计

系统的时间管理是整个项目的基础,我们设计了一个简单而实用的SimpleTime类:

class SimpleTime {
private:static int currentDay;  // 系统当前天数public:int day;string dateStr;SimpleTime() {day = currentDay;updateDateString();}static void advanceDay() {currentDay++;cout << "系统时间已推进到第" << currentDay << "天\n";}bool isOverdue(int borrowDays) const {return (currentDay - day) > borrowDays;}
};

设计亮点

  • 使用静态变量currentDay统一管理系统时间
  • 提供时间推进功能,便于测试超期场景
  • 封装超期判断逻辑,提高代码复用性

2. 书籍类设计

Book类是系统的核心数据结构之一:

class Book {
public:int bookId;string title;string author;BookCategory category;BookStatus status;Book(int id, const string& t, const string& a, BookCategory cat) : bookId(id), title(t), author(a), category(cat), status(AVAILABLE) {}string getCategoryName() const {switch(category) {case FICTION: return "小说";case SCIENCE: return "科学";case HISTORY: return "历史";case TECHNOLOGY: return "技术";default: return "其他";}}
};

核心特性

  • 自动生成书籍ID,避免重复
  • 状态管理清晰,支持可借、已借出、预留三种状态
  • 分类管理便于检索和统计

3. 借阅记录类

BorrowRecord类实现了完整的借阅生命周期管理:

class BorrowRecord {
public:int recordId;int bookId;int borrowerId;SimpleTime borrowTime;SimpleTime returnTime;bool isReturned;int borrowDays;bool isOverdue() const {return !isReturned && borrowTime.isOverdue(borrowDays);}int getOverdueDays() const {if (!isReturned && isOverdue()) {return borrowTime.getDaysElapsed() - borrowDays;}return 0;}
};

三、时间系统与状态管理

1. 智能时间推进机制

系统实现了灵活的时间管理机制,支持手动推进时间来模拟实际使用场景:

// 初始化静态变量
int SimpleTime::currentDay = 1;void Library::advanceTime() {SimpleTime::advanceDay();
}

这种设计使得我们可以轻松测试各种时间相关的功能,如超期检测、到期提醒等。

2. 状态转换管理

书籍状态在系统中的转换遵循严格的业务规则:

  • AVAILABLEBORROWED:成功借出
  • BORROWEDAVAILABLE:正常归还
  • AVAILABLERESERVED:预留功能(可扩展)

四、核心功能实现详解

1. 借书功能实现

借书功能是系统的核心,需要进行多重验证:

bool Library::borrowBook(int bookId, int borrowerId, int days = 30) {// 查找书籍vector<Book>::iterator bookIt;for (bookIt = books.begin(); bookIt != books.end(); ++bookIt) {if (bookIt->bookId == bookId) break;}if (bookIt == books.end()) {cout << "错误:书籍不存在!\n";return false;}// 查找借阅者vector<Borrower>::iterator borrowerIt;for (borrowerIt = borrowers.begin(); borrowerIt != borrowers.end(); ++borrowerIt) {if (borrowerIt->borrowerId == borrowerId) break;}if (borrowerIt == borrowers.end()) {cout << "错误:借阅者不存在!\n";return false;}// 检查黑名单if (borrowerIt->isBlacklisted) {cout << "错误:借阅者在黑名单中,无法借书!\n";return false;}// 检查书籍状态if (bookIt->status != AVAILABLE) {cout << "错误:书籍不可借!当前状态: " << bookIt->getStatusName() << "\n";return false;}// 创建借阅记录records.push_back(BorrowRecord(nextRecordId++, bookId, borrowerId, days));bookIt->status = BORROWED;cout << "借书成功!记录ID: " << nextRecordId - 1 << "\n";return true;
}

关键验证步骤

  1. 验证书籍存在性
  2. 验证借阅者有效性
  3. 检查黑名单状态
  4. 确认书籍可借状态
  5. 创建借阅记录并更新状态

2. 超期检测与提醒

系统提供智能的超期检测功能:

void Library::checkOverdueBooks() {cout << "\n=== 超期书籍提醒 ===\n";cout << "当前系统时间:第" << SimpleTime::getCurrentDay() << "天\n\n";bool hasOverdue = false;for (vector<BorrowRecord>::iterator it = records.begin(); it != records.end(); ++it) {if (it->isOverdue()) {hasOverdue = true;cout << "超期记录:\n";it->display();// 显示详细信息for (vector<Borrower>::iterator bit = borrowers.begin(); bit != borrowers.end(); ++bit) {if (bit->borrowerId == it->borrowerId) {cout << "借阅者: " << bit->name << " (" << bit->phone << ")\n";break;}}cout << "---\n";}}if (!hasOverdue) {cout << "没有超期的书籍。\n";}
}

3. 黑名单管理系统

为了维护图书馆秩序,系统实现了完整的黑名单管理:

void Library::addToBlacklist(int borrowerId) {for (vector<Borrower>::iterator it = borrowers.begin(); it != borrowers.end(); ++it) {if (it->borrowerId == borrowerId) {it->isBlacklisted = true;cout << "借阅者 " << it->name << " 已加入黑名单。\n";return;}}cout << "错误:借阅者不存在!\n";
}

五、用户界面与交互设计

1. 菜单驱动设计

系统采用清晰的菜单驱动界面,提供直观的操作体验:

void showMenu() {cout << "\n======= 图书馆借阅记录系统 =======\n";cout << "1. 添加书籍\n";cout << "2. 添加借阅者\n";cout << "3. 借书\n";cout << "4. 还书\n";cout << "5. 超期提醒\n";cout << "6. 黑名单管理\n";cout << "7. 分类查询\n";cout << "8. 借阅者历史记录\n";cout << "9. 显示所有书籍\n";cout << "10. 显示所有借阅者\n";cout << "11. 显示所有借阅记录\n";cout << "12. 查询可借书籍\n";cout << "13. 系统统计\n";cout << "14. 时间推进\n";cout << "0. 退出\n";cout << "================================\n";cout << "请选择操作: ";
}

在这里插入图片描述

2. 预设测试数据

为了便于测试和演示,系统在启动时会自动加载测试数据:

// 预设测试数据
library.addBook("C++程序设计", "谭浩强", TECHNOLOGY);
library.addBook("三国演义", "罗贯中", FICTION);
library.addBook("相对论", "爱因斯坦", SCIENCE);
library.addBook("中国通史", "范文澜", HISTORY);
library.addBook("数据结构", "严蔚敏", TECHNOLOGY);library.addBorrower("张三", "13800138000");
library.addBorrower("李四", "13900139000");
library.addBorrower("王五", "13700137000");

六、完整源代码实现

以下是完整的系统实现代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;// 书籍状态枚举
enum BookStatus {AVAILABLE,    // 可借BORROWED,     // 已借出RESERVED      // 预留
};// 书籍类别枚举
enum BookCategory {FICTION,      // 小说SCIENCE,      // 科学HISTORY,      // 历史TECHNOLOGY,   // 技术OTHER         // 其他
};// 简单时间系统(使用天数计数)
class SimpleTime {
private:static int currentDay;  // 系统当前天数public:int day;string dateStr;SimpleTime() {day = currentDay;updateDateString();}SimpleTime(int d) : day(d) {updateDateString();}void updateDateString() {// 简单的日期格式:第X天char buffer[50];sprintf(buffer, "第%d天", day);dateStr = string(buffer);}static void advanceDay() {currentDay++;cout << "系统时间已推进到第" << currentDay << "天\n";}static int getCurrentDay() {return currentDay;}bool isOverdue(int borrowDays) const {return (currentDay - day) > borrowDays;}int getDaysElapsed() const {return currentDay - day;}string toString() const {return dateStr;}
};// 初始化静态变量
int SimpleTime::currentDay = 1;// 书籍类
class Book {
public:int bookId;string title;string author;BookCategory category;BookStatus status;Book(int id, const string& t, const string& a, BookCategory cat) : bookId(id), title(t), author(a), category(cat), status(AVAILABLE) {}string getCategoryName() const {switch(category) {case FICTION: return "小说";case SCIENCE: return "科学";case HISTORY: return "历史";case TECHNOLOGY: return "技术";default: return "其他";}}string getStatusName() const {switch(status) {case AVAILABLE: return "可借";case BORROWED: return "已借出";case RESERVED: return "预留";default: return "未知";}}void display() const {cout << "书籍ID: " << bookId << "\n"<< "书名: " << title << "\n"<< "作者: " << author << "\n"<< "类别: " << getCategoryName() << "\n"<< "状态: " << getStatusName() << "\n";}
};// 借阅者类
class Borrower {
public:int borrowerId;string name;string phone;bool isBlacklisted;Borrower(int id, const string& n, const string& p) : borrowerId(id), name(n), phone(p), isBlacklisted(false) {}void display() const {cout << "借阅者ID: " << borrowerId << "\n"<< "姓名: " << name << "\n"<< "电话: " << phone << "\n"<< "黑名单状态: " << (isBlacklisted ? "是" : "否") << "\n";}
};// 借阅记录类
class BorrowRecord {
public:int recordId;int bookId;int borrowerId;SimpleTime borrowTime;SimpleTime returnTime;bool isReturned;int borrowDays;  // 借阅天数限制BorrowRecord(int rid, int bid, int brid, int days = 30) : recordId(rid), bookId(bid), borrowerId(brid), borrowTime(), isReturned(false), borrowDays(days), returnTime(0) {}bool isOverdue() const {return !isReturned && borrowTime.isOverdue(borrowDays);}void returnBook() {isReturned = true;returnTime = SimpleTime();}int getOverdueDays() const {if (!isReturned && isOverdue()) {return borrowTime.getDaysElapsed() - borrowDays;}return 0;}void display() const {cout << "记录ID: " << recordId << "\n"<< "书籍ID: " << bookId << "\n"<< "借阅者ID: " << borrowerId << "\n"<< "借阅时间: " << borrowTime.toString() << "\n";if (isReturned) {cout << "归还时间: " << returnTime.toString() << "\n";cout << "实际借阅天数: " << (returnTime.day - borrowTime.day) << "天\n";} else {cout << "状态: 未归还\n";cout << "已借阅天数: " << borrowTime.getDaysElapsed() << "天\n";if (isOverdue()) {cout << "*** 已超期 " << getOverdueDays() << " 天 ***\n";}}cout << "借阅期限: " << borrowDays << "天\n";}
};// 图书馆管理系统类
class Library {
private:vector<Book> books;vector<Borrower> borrowers;vector<BorrowRecord> records;int nextBookId;int nextBorrowerId;int nextRecordId;public:Library() : nextBookId(1), nextBorrowerId(1), nextRecordId(1) {}// 添加书籍void addBook(const string& title, const string& author, BookCategory category) {books.push_back(Book(nextBookId++, title, author, category));cout << "书籍添加成功!书籍ID: " << nextBookId - 1 << "\n";}// 添加借阅者void addBorrower(const string& name, const string& phone) {borrowers.push_back(Borrower(nextBorrowerId++, name, phone));cout << "借阅者添加成功!借阅者ID: " << nextBorrowerId - 1 << "\n";}// 借书bool borrowBook(int bookId, int borrowerId, int days = 30) {// 查找书籍vector<Book>::iterator bookIt;for (bookIt = books.begin(); bookIt != books.end(); ++bookIt) {if (bookIt->bookId == bookId) break;}if (bookIt == books.end()) {cout << "错误:书籍不存在!\n";return false;}// 查找借阅者vector<Borrower>::iterator borrowerIt;for (borrowerIt = borrowers.begin(); borrowerIt != borrowers.end(); ++borrowerIt) {if (borrowerIt->borrowerId == borrowerId) break;}if (borrowerIt == borrowers.end()) {cout << "错误:借阅者不存在!\n";return false;}// 检查借阅者是否在黑名单if (borrowerIt->isBlacklisted) {cout << "错误:借阅者在黑名单中,无法借书!\n";return false;}// 检查书籍状态if (bookIt->status != AVAILABLE) {cout << "错误:书籍不可借!当前状态: " << bookIt->getStatusName() << "\n";return false;}// 创建借阅记录records.push_back(BorrowRecord(nextRecordId++, bookId, borrowerId, days));bookIt->status = BORROWED;cout << "借书成功!记录ID: " << nextRecordId - 1 << "\n";cout << "借阅时间: " << SimpleTime::getCurrentDay() << "天,归还期限: " << (SimpleTime::getCurrentDay() + days) << "天\n";return true;}// 还书bool returnBook(int bookId, int borrowerId) {// 查找未归还的借阅记录vector<BorrowRecord>::iterator recordIt;for (recordIt = records.begin(); recordIt != records.end(); ++recordIt) {if (recordIt->bookId == bookId && recordIt->borrowerId == borrowerId && !recordIt->isReturned) {break;}}if (recordIt == records.end()) {cout << "错误:未找到对应的借阅记录!\n";return false;}// 查找书籍vector<Book>::iterator bookIt;for (bookIt = books.begin(); bookIt != books.end(); ++bookIt) {if (bookIt->bookId == bookId) break;}// 归还处理recordIt->returnBook();bookIt->status = AVAILABLE;// 检查是否超期if (recordIt->isOverdue()) {cout << "警告:此书已超期归还!超期 " << recordIt->getOverdueDays() << " 天\n";cout << "建议将借阅者加入监控名单。\n";} else {cout << "正常归还,感谢您按时归还图书!\n";}cout << "还书成功!\n";return true;}// 超期提醒void checkOverdueBooks() {cout << "\n=== 超期书籍提醒 ===\n";cout << "当前系统时间:第" << SimpleTime::getCurrentDay() << "天\n\n";bool hasOverdue = false;for (vector<BorrowRecord>::iterator it = records.begin(); it != records.end(); ++it) {if (it->isOverdue()) {hasOverdue = true;cout << "超期记录:\n";it->display();// 显示借阅者信息for (vector<Borrower>::iterator bit = borrowers.begin(); bit != borrowers.end(); ++bit) {if (bit->borrowerId == it->borrowerId) {cout << "借阅者: " << bit->name << " (" << bit->phone << ")\n";break;}}// 显示书籍信息for (vector<Book>::iterator bkit = books.begin(); bkit != books.end(); ++bkit) {if (bkit->bookId == it->bookId) {cout << "书籍: " << bkit->title << " - " << bkit->author << "\n";break;}}cout << "---\n";}}if (!hasOverdue) {cout << "没有超期的书籍。\n";}}// 黑名单管理void addToBlacklist(int borrowerId) {for (vector<Borrower>::iterator it = borrowers.begin(); it != borrowers.end(); ++it) {if (it->borrowerId == borrowerId) {it->isBlacklisted = true;cout << "借阅者 " << it->name << " 已加入黑名单。\n";return;}}cout << "错误:借阅者不存在!\n";}void removeFromBlacklist(int borrowerId) {for (vector<Borrower>::iterator it = borrowers.begin(); it != borrowers.end(); ++it) {if (it->borrowerId == borrowerId) {it->isBlacklisted = false;cout << "借阅者 " << it->name << " 已从黑名单移除。\n";return;}}cout << "错误:借阅者不存在!\n";}// 显示黑名单void showBlacklist() {cout << "\n=== 黑名单用户 ===\n";bool hasBlacklisted = false;for (vector<Borrower>::iterator it = borrowers.begin(); it != borrowers.end(); ++it) {if (it->isBlacklisted) {hasBlacklisted = true;it->display();cout << "---\n";}}if (!hasBlacklisted) {cout << "黑名单为空。\n";}}// 分类查询void queryBooksByCategory(BookCategory category) {cout << "\n=== 按类别查询书籍 ===\n";bool found = false;for (vector<Book>::iterator it = books.begin(); it != books.end(); ++it) {if (it->category == category) {found = true;it->display();cout << "---\n";}}if (!found) {cout << "该类别下没有书籍。\n";}}// 查询可借书籍void queryAvailableBooks() {cout << "\n=== 可借书籍 ===\n";bool found = false;for (vector<Book>::iterator it = books.begin(); it != books.end(); ++it) {if (it->status == AVAILABLE) {found = true;it->display();cout << "---\n";}}if (!found) {cout << "当前没有可借的书籍。\n";}}// 查询借阅者的借阅记录void queryBorrowerHistory(int borrowerId) {cout << "\n=== 借阅者历史记录 ===\n";bool found = false;for (vector<BorrowRecord>::iterator it = records.begin(); it != records.end(); ++it) {if (it->borrowerId == borrowerId) {found = true;it->display();cout << "---\n";}}if (!found) {cout << "该借阅者没有借阅记录。\n";}}// 系统统计void showStatistics() {cout << "\n=== 系统统计信息 ===\n";cout << "总书籍数量: " << books.size() << "\n";cout << "注册借阅者数量: " << borrowers.size() << "\n";cout << "总借阅记录数: " << records.size() << "\n";int availableBooks = 0, borrowedBooks = 0;for (vector<Book>::iterator it = books.begin(); it != books.end(); ++it) {if (it->status == AVAILABLE) availableBooks++;else if (it->status == BORROWED) borrowedBooks++;}cout << "可借书籍: " << availableBooks << "\n";cout << "已借出书籍: " << borrowedBooks << "\n";int blacklistedUsers = 0;for (vector<Borrower>::iterator it = borrowers.begin(); it != borrowers.end(); ++it) {if (it->isBlacklisted) blacklistedUsers++;}cout << "黑名单用户: " << blacklistedUsers << "\n";int overdueBooks = 0;for (vector<BorrowRecord>::iterator it = records.begin(); it != records.end(); ++it) {if (it->isOverdue()) overdueBooks++;}cout << "超期书籍: " << overdueBooks << "\n";cout << "当前系统时间: 第" << SimpleTime::getCurrentDay() << "天\n";}// 时间推进void advanceTime() {SimpleTime::advanceDay();}// 显示所有书籍void displayAllBooks() {cout << "\n=== 所有书籍 ===\n";if (books.empty()) {cout << "暂无书籍记录。\n";return;}for (vector<Book>::iterator it = books.begin(); it != books.end(); ++it) {it->display();cout << "---\n";}}// 显示所有借阅者void displayAllBorrowers() {cout << "\n=== 所有借阅者 ===\n";if (borrowers.empty()) {cout << "暂无借阅者记录。\n";return;}for (vector<Borrower>::iterator it = borrowers.begin(); it != borrowers.end(); ++it) {it->display();cout << "---\n";}}// 显示所有借阅记录void displayAllRecords() {cout << "\n=== 所有借阅记录 ===\n";if (records.empty()) {cout << "暂无借阅记录。\n";return;}for (vector<BorrowRecord>::iterator it = records.begin(); it != records.end(); ++it) {it->display();cout << "---\n";}}
};// 显示主菜单
void showMenu() {cout << "\n======= 图书馆借阅记录系统 =======\n";cout << "1. 添加书籍\n";cout << "2. 添加借阅者\n";cout << "3. 借书\n";cout << "4. 还书\n";cout << "5. 超期提醒\n";cout << "6. 黑名单管理\n";cout << "7. 分类查询\n";cout << "8. 借阅者历史记录\n";cout << "9. 显示所有书籍\n";cout << "10. 显示所有借阅者\n";cout << "11. 显示所有借阅记录\n";cout << "12. 查询可借书籍\n";cout << "13. 系统统计\n";cout << "14. 时间推进\n";cout << "0. 退出\n";cout << "================================\n";cout << "请选择操作: ";
}// 黑名单管理子菜单
void blacklistMenu(Library& lib) {int choice, borrowerId;cout << "\n=== 黑名单管理 ===\n";cout << "1. 加入黑名单\n";cout << "2. 移出黑名单\n";cout << "3. 查看黑名单\n";cout << "请选择: ";cin >> choice;switch(choice) {case 1:cout << "请输入借阅者ID: ";cin >> borrowerId;lib.addToBlacklist(borrowerId);break;case 2:cout << "请输入借阅者ID: ";cin >> borrowerId;lib.removeFromBlacklist(borrowerId);break;case 3:lib.showBlacklist();break;default:cout << "无效选择!\n";}
}// 分类查询子菜单
void categoryMenu(Library& lib) {int choice;cout << "\n=== 书籍分类查询 ===\n";cout << "1. 小说\n";cout << "2. 科学\n";cout << "3. 历史\n";cout << "4. 技术\n";cout << "5. 其他\n";cout << "请选择类别: ";cin >> choice;BookCategory category;switch(choice) {case 1: category = FICTION; break;case 2: category = SCIENCE; break;case 3: category = HISTORY; break;case 4: category = TECHNOLOGY; break;case 5: category = OTHER; break;default:cout << "无效选择!\n";return;}lib.queryBooksByCategory(category);
}int main() {Library library;int choice;// 预设一些测试数据library.addBook("C++程序设计", "谭浩强", TECHNOLOGY);library.addBook("三国演义", "罗贯中", FICTION);library.addBook("相对论", "爱因斯坦", SCIENCE);library.addBook("中国通史", "范文澜", HISTORY);library.addBook("数据结构", "严蔚敏", TECHNOLOGY);library.addBorrower("张三", "13800138000");library.addBorrower("李四", "13900139000");library.addBorrower("王五", "13700137000");cout << "欢迎使用图书馆借阅记录系统!\n";cout << "已预设测试数据:5本书籍,3个借阅者\n";cout << "当前系统时间:第1天\n";cout << "\n提示:可以使用'时间推进'功能来模拟时间流逝,测试超期功能\n";while (true) {showMenu();cin >> choice;switch (choice) {case 1: {string title, author;int cat;cout << "请输入书名: ";cin.ignore();getline(cin, title);cout << "请输入作者: ";getline(cin, author);cout << "请选择类别 (1-小说 2-科学 3-历史 4-技术 5-其他): ";cin >> cat;BookCategory category;switch(cat) {case 1: category = FICTION; break;case 2: category = SCIENCE; break;case 3: category = HISTORY; break;case 4: category = TECHNOLOGY; break;default: category = OTHER; break;}library.addBook(title, author, category);break;}case 2: {string name, phone;cout << "请输入姓名: ";cin.ignore();getline(cin, name);cout << "请输入电话: ";getline(cin, phone);library.addBorrower(name, phone);break;}case 3: {int bookId, borrowerId, days;cout << "请输入书籍ID: ";cin >> bookId;cout << "请输入借阅者ID: ";cin >> borrowerId;cout << "请输入借阅天数 (默认30天): ";cin >> days;if (days <= 0) days = 30;library.borrowBook(bookId, borrowerId, days);break;}case 4: {int bookId, borrowerId;cout << "请输入书籍ID: ";cin >> bookId;cout << "请输入借阅者ID: ";cin >> borrowerId;library.returnBook(bookId, borrowerId);break;}case 5:library.checkOverdueBooks();break;case 6:blacklistMenu(library);break;case 7:categoryMenu(library);break;case 8: {int borrowerId;cout << "请输入借阅者ID: ";cin >> borrowerId;library.queryBorrowerHistory(borrowerId);break;}case 9:library.displayAllBooks();break;case 10:library.displayAllBorrowers();break;case 11:library.displayAllRecords();break;case 12:library.queryAvailableBooks();break;case 13:library.showStatistics();break;case 14:library.advanceTime();break;case 0:cout << "感谢使用图书馆借阅记录系统!再见!\n";return 0;default:cout << "无效选择,请重新输入!\n";}cout << "\n按回车键继续...";cin.ignore();cin.get();}return 0;
}

七、总结与扩展思考

通过这个图书馆借阅记录系统的实现,我们深入学习了C++面向对象编程的核心概念。系统具有以下技术亮点

核心优势

  • 模块化设计:清晰的类结构,便于维护和扩展
  • 状态管理:完整的书籍状态转换机制
  • 时间系统:灵活的时间推进,支持业务逻辑测试
  • 用户体验:直观的菜单驱动界面

可扩展功能

  1. 数据持久化:添加文件读写功能,实现数据永久保存
  2. 网络功能:支持多用户并发访问
  3. 高级搜索:模糊查询、多条件组合搜索
  4. 报表系统:生成统计报表和图表
  5. 消息通知:短信或邮件提醒功能

这个项目不仅展示了C++的强大功能,更重要的是体现了软件工程思维的重要性。通过合理的架构设计,我们创建了一个既实用又易于维护的系统,为后续的功能扩展奠定了坚实基础。

无论你是C++初学者还是有经验的开发者,这个项目都能为你的编程能力提升提供宝贵的实践经验。现在就开始动手实现你自己的图书馆管理系统吧!

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵和向量范数的区别分析

文章目录 1. 研究对象本质差异2. 运算和作用方式不同3. 应用需求不同4. 数学性质和理论体系不同5. 几何直观不同6. 范数定义区别7. 范数计算方式区别8. 范数几何意义区别9. 范数相容性区别总结 1. 研究对象本质差异 向量本质&#xff1a;向量是具有大小和方向的一维有序数组&a…

HTMLCSS 学习总结

目录 ​​​一、HTML核心概念​​ ​​三大前端技术作用​​ ​​HTML基础结构​​ 开发工具&#xff1a;VS Code 专业配置​​​​安装步骤​​&#xff1a; ​​二、HTML标签大全&#xff08;含表格&#xff09;​​ ​​三、CSS核心技术​​ 1. 三种引入方式对比 2.…

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包

通过Cline使用智能体

文章目录 1、VS Code配置2、Cline使用2.1 工作模式2.2 MCP服务2.3 Cline支持的服务 3、案例一&#xff1a;天气查询项目3.1 需求说明3.2 申请高德API Key3.3 实操&#xff1a;向Cline下达命令 4、案例二&#xff1a;双城天气对比项目4.1 需求说明4.2 实操 Cline是VS Code的插件…

「混合开发」H5与原生App交互流程方案全面解析

目录 内嵌H5调用iOS内的方法 1. 背景 2. 解决方案 2.1 创建WebView 2.2 注册原生方法 2.3 H5调用原生方法 3. 序列图 H5 调用 Android&#xff1a;详细指南 整体流程 每一步的详细说明 步骤1&#xff1a;在Android项目中设置WebView 步骤2&#xff1a;定义JavaScri…

webpack打包vue项目

要在 Vue 项目中使用 Webpack 进行打包&#xff0c;通常有几种不同的方式来设置你的项目。以下是基本步骤&#xff1a; 1. 使用 Vue CLI 创建项目&#xff08;推荐&#xff09; Vue CLI 是官方提供的一个脚手架工具&#xff0c;它内置了对 Webpack 的支持&#xff0c;并且简化…

Linux环境-通过命令查看zookeeper注册的服务

假设前置条件如下&#xff1a; 1.root权限用户名&#xff1a;zookeeper 2.zookeeper所在服务器地址&#xff1a;168.7.3.254&#xff08;非真实ip&#xff09; 3.zookeeper的bin文件路径&#xff1a;/opt/zookeeper/bin 4.确保zookeeper注册中心已启动 查看注册中心服务如下&a…

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…

ArcGIS计算多个栅格数据的平均栅格

3种方法计算多个栅格数据的平均栅格 1->使用“ 栅格计算器”工具 原理就是把多幅影像数据相加&#xff0c;然后除以个数&#xff0c;就能得到平均栅格。 2-> 使用“像元统计数据”工具&#xff0c;如果是ArcGIS pro&#xff0c;则是“像元统计”工具。使用这个工具可以…

Ubantu-Docker配置最新镜像源250605

尝试其他镜像加速器 阿里云镜像加速器&#xff1a;登录阿里云&#xff0c;进入容器镜像服务获取专属加速器地址。毫秒镜像&#xff1a;https://docker.1ms.run。DockerHub镜像加速器&#xff1a;https://docker.xuanyuan.me。Docker Hub 镜像加速服务&#xff1a;https://dock…

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…

Unity网络通信笔记

需求 首先要意识到网络通信面对的是一个怎么样的情景&#xff1a; 服务器会连任意个客户端&#xff0c;任意时刻可能有客户端连入连出&#xff1b;服务端和客户端可能任意时刻给对方发消息&#xff0c;所以双方都要一直准备好接收。但是两端还有别的事要做&#xff0c;通信不…

EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用

一、方案背景​ 随着互联网技术快速发展&#xff0c;视频应用成为主流内容消费方式。用户需求已从高清流畅升级为实时互动&#xff0c;EasyRTC作为高性能实时音视频框架&#xff0c;凭借低延迟、跨平台等特性&#xff0c;有效满足市场对多元化视频服务的需求。 二、EasyRTC技术…

《MLB美职棒》勇士队排名·棒球1号位

亚特兰大勇士队&#xff08;Atlanta Braves&#xff09;是美国职业棒球大联盟&#xff08;MLB&#xff09;中历史最悠久的球队之一&#xff0c;隶属于国家联盟&#xff08;NL&#xff09;东区。 球队基本信息 成立时间&#xff1a;1871年&#xff08;前身为波士顿红袜帽队&…

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…

每日一令:Linux 极简通关指南 - 汇总

专栏列表 &#x1f4bb; 每日一令&#xff1a;Linux 极简通关指南 (25篇) 【基础】每天掌握一个Linux命令 - nsenter&#xff1a;深入容器与命名空间的利器 发布于 2025-06-08 22:27:04【基础】 每天掌握一个Linux命令 - journalctl&#xff1a;系统日志管理的得力助手 发布于…

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术点解析 第一轮&#xff1a;基础概念问题 请解释Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; 程序员JY回答&#xff1a;Spring框架的核心容器是IoC容器&#xff08;控制反转…

渗透测试服务如何全方位评估企业安全状况并揭示潜在缺陷?

渗透测试服务通过模拟攻击行为&#xff0c;对企业整体安全状况进行全方位评估&#xff0c;旨在揭示潜在的安全缺陷并制定相应的修复措施。以下为渗透测试服务报告的核心内容。 测试类型适配 外部渗透测试旨在模仿外部网络攻击者&#xff0c;尝试突破企业网络安全防线&#xf…

SwiftUI 数据绑定与视图更新(@State、@ObservedObject、@EnvironmentObject)

引言 在 SwiftUI 中&#xff0c;界面并不是通过手动刷新来更新的&#xff0c;而是由状态驱动的。当状态发生变化&#xff0c;SwiftUI 会自动识别哪些视图需要重绘&#xff0c;从而保持 UI 与数据的一致性。这种声明式的方式大大简化了界面开发的流程&#xff0c;但也带来一个问…