C++ 从入门到精通C++ 从入门到精通
首页
基础教程
进阶教程
实战项目
编程指南
首页
基础教程
进阶教程
实战项目
编程指南
  • 🛠️ 实战项目

    • 🛠️ C++ 实战项目
    • 第23章 - 学生管理系统
    • 第24章 - 通讯录管理系统
    • 第25章 - 图书管理系统
    • 第26章 - 简易银行系统
    • 第27章 - 贪吃蛇游戏

第25章 - 图书管理系统

嗨,朋友!我是长安。

这个项目使用 vector 和 类 实现一个完整的图书管理系统。

🎯 项目功能

  • ✅ 添加图书
  • ✅ 删除图书
  • ✅ 查找图书(按书名/作者/ISBN)
  • ✅ 借书/还书
  • ✅ 显示所有图书
  • ✅ 按不同字段排序
  • ✅ 统计分析
  • ✅ 文件持久化

💡 核心技术

  • vector容器 - 动态管理图书
  • 类和对象 - 面向对象设计
  • 算法 - 排序和查找
  • 文件操作 - 数据持久化

📝 完整代码

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;

// 图书类
class Book {
public:
    string isbn;
    string title;
    string author;
    double price;
    bool isBorrowed;
    
    Book() : isBorrowed(false) {}
    
    Book(string i, string t, string a, double p)
        : isbn(i), title(t), author(a), price(p), isBorrowed(false) {}
    
    void display() const {
        cout << "\n━━━━━━━━━━━━━━━━━━━━━━━━━━" << endl;
        cout << "ISBN:   " << isbn << endl;
        cout << "书名:   " << title << endl;
        cout << "作者:   " << author << endl;
        cout << "价格:   ¥" << price << endl;
        cout << "状态:   " << (isBorrowed ? "已借出" : "在架") << endl;
        cout << "━━━━━━━━━━━━━━━━━━━━━━━━━━" << endl;
    }
};

// 图书管理系统类
class LibrarySystem {
private:
    vector<Book> books;
    const string filename = "library.txt";
    
public:
    LibrarySystem() {
        loadFromFile();
    }
    
    ~LibrarySystem() {
        saveToFile();
    }
    
    // 添加图书
    void addBook() {
        Book book;
        cout << "\n===== 添加图书 =====" << endl;
        cout << "ISBN:";
        cin >> book.isbn;
        cin.ignore();
        
        // 检查是否已存在
        for (auto& b : books) {
            if (b.isbn == book.isbn) {
                cout << "该ISBN已存在!" << endl;
                return;
            }
        }
        
        cout << "书名:";
        getline(cin, book.title);
        cout << "作者:";
        getline(cin, book.author);
        cout << "价格:";
        cin >> book.price;
        
        books.push_back(book);
        cout << "✓ 添加成功!" << endl;
    }
    
    // 删除图书
    void deleteBook() {
        string isbn;
        cout << "\n===== 删除图书 =====" << endl;
        cout << "请输入ISBN:";
        cin >> isbn;
        
        for (auto it = books.begin(); it != books.end(); ++it) {
            if (it->isbn == isbn) {
                books.erase(it);
                cout << "✓ 删除成功!" << endl;
                return;
            }
        }
        
        cout << "✗ 未找到该图书!" << endl;
    }
    
    // 查找图书
    void searchBook() {
        cout << "\n===== 查找图书 =====" << endl;
        cout << "1. 按书名查找" << endl;
        cout << "2. 按作者查找" << endl;
        cout << "3. 按ISBN查找" << endl;
        cout << "请选择:";
        
        int choice;
        cin >> choice;
        cin.ignore();
        
        string keyword;
        cout << "请输入关键词:";
        getline(cin, keyword);
        
        bool found = false;
        for (auto& book : books) {
            bool match = false;
            
            switch (choice) {
                case 1:
                    match = (book.title.find(keyword) != string::npos);
                    break;
                case 2:
                    match = (book.author.find(keyword) != string::npos);
                    break;
                case 3:
                    match = (book.isbn == keyword);
                    break;
            }
            
            if (match) {
                book.display();
                found = true;
            }
        }
        
        if (!found) {
            cout << "✗ 未找到相关图书!" << endl;
        }
    }
    
    // 借书
    void borrowBook() {
        string isbn;
        cout << "\n===== 借书 =====" << endl;
        cout << "请输入ISBN:";
        cin >> isbn;
        
        for (auto& book : books) {
            if (book.isbn == isbn) {
                if (book.isBorrowed) {
                    cout << "✗ 该图书已被借出!" << endl;
                } else {
                    book.isBorrowed = true;
                    cout << "✓ 借书成功!" << endl;
                }
                return;
            }
        }
        
        cout << "✗ 未找到该图书!" << endl;
    }
    
    // 还书
    void returnBook() {
        string isbn;
        cout << "\n===== 还书 =====" << endl;
        cout << "请输入ISBN:";
        cin >> isbn;
        
        for (auto& book : books) {
            if (book.isbn == isbn) {
                if (!book.isBorrowed) {
                    cout << "✗ 该图书未被借出!" << endl;
                } else {
                    book.isBorrowed = false;
                    cout << "✓ 还书成功!" << endl;
                }
                return;
            }
        }
        
        cout << "✗ 未找到该图书!" << endl;
    }
    
    // 显示所有图书
    void displayAll() {
        if (books.empty()) {
            cout << "\n图书馆为空!" << endl;
            return;
        }
        
        cout << "\n===== 图书列表 =====" << endl;
        cout << "共有 " << books.size() << " 本图书\n" << endl;
        
        for (auto& book : books) {
            book.display();
        }
    }
    
    // 排序显示
    void sortAndDisplay() {
        if (books.empty()) {
            cout << "\n图书馆为空!" << endl;
            return;
        }
        
        cout << "\n===== 排序方式 =====" << endl;
        cout << "1. 按书名排序" << endl;
        cout << "2. 按作者排序" << endl;
        cout << "3. 按价格排序" << endl;
        cout << "请选择:";
        
        int choice;
        cin >> choice;
        
        switch (choice) {
            case 1:
                sort(books.begin(), books.end(),
                     [](const Book& a, const Book& b) {
                         return a.title < b.title;
                     });
                break;
            case 2:
                sort(books.begin(), books.end(),
                     [](const Book& a, const Book& b) {
                         return a.author < b.author;
                     });
                break;
            case 3:
                sort(books.begin(), books.end(),
                     [](const Book& a, const Book& b) {
                         return a.price < b.price;
                     });
                break;
        }
        
        displayAll();
    }
    
    // 统计分析
    void statistics() {
        if (books.empty()) {
            cout << "\n图书馆为空!" << endl;
            return;
        }
        
        int totalBooks = books.size();
        int borrowedBooks = count_if(books.begin(), books.end(),
                                     [](const Book& b) { return b.isBorrowed; });
        int availableBooks = totalBooks - borrowedBooks;
        
        double totalPrice = 0;
        for (auto& book : books) {
            totalPrice += book.price;
        }
        
        cout << "\n===== 统计信息 =====" << endl;
        cout << "总图书数:   " << totalBooks << endl;
        cout << "在架图书:   " << availableBooks << endl;
        cout << "已借图书:   " << borrowedBooks << endl;
        cout << "总价值:     ¥" << totalPrice << endl;
        cout << "平均价格:   ¥" << totalPrice / totalBooks << endl;
    }
    
    // 保存到文件
    void saveToFile() {
        ofstream outFile(filename);
        if (!outFile) {
            cout << "无法保存文件!" << endl;
            return;
        }
        
        outFile << books.size() << endl;
        for (auto& book : books) {
            outFile << book.isbn << endl
                    << book.title << endl
                    << book.author << endl
                    << book.price << endl
                    << book.isBorrowed << endl;
        }
        
        outFile.close();
    }
    
    // 从文件加载
    void loadFromFile() {
        ifstream inFile(filename);
        if (!inFile) return;
        
        int count;
        inFile >> count;
        inFile.ignore();
        
        for (int i = 0; i < count; i++) {
            Book book;
            getline(inFile, book.isbn);
            getline(inFile, book.title);
            getline(inFile, book.author);
            inFile >> book.price;
            inFile >> book.isBorrowed;
            inFile.ignore();
            
            books.push_back(book);
        }
        
        inFile.close();
        cout << "✓ 已加载 " << count << " 本图书" << endl;
    }
};

// 显示菜单
void showMenu() {
    cout << "\n╔══════════════════════════╗" << endl;
    cout << "║    图书管理系统          ║" << endl;
    cout << "╠══════════════════════════╣" << endl;
    cout << "║  1. 添加图书             ║" << endl;
    cout << "║  2. 删除图书             ║" << endl;
    cout << "║  3. 查找图书             ║" << endl;
    cout << "║  4. 借书                 ║" << endl;
    cout << "║  5. 还书                 ║" << endl;
    cout << "║  6. 显示所有图书         ║" << endl;
    cout << "║  7. 排序显示             ║" << endl;
    cout << "║  8. 统计分析             ║" << endl;
    cout << "║  0. 退出系统             ║" << endl;
    cout << "╚══════════════════════════╝" << endl;
    cout << "请选择:";
}

int main() {
    LibrarySystem library;
    int choice;
    
    while (true) {
        showMenu();
        cin >> choice;
        
        switch (choice) {
            case 1: library.addBook(); break;
            case 2: library.deleteBook(); break;
            case 3: library.searchBook(); break;
            case 4: library.borrowBook(); break;
            case 5: library.returnBook(); break;
            case 6: library.displayAll(); break;
            case 7: library.sortAndDisplay(); break;
            case 8: library.statistics(); break;
            case 0:
                cout << "\n感谢使用,再见!" << endl;
                return 0;
            default:
                cout << "无效选择!" << endl;
        }
    }
    
    return 0;
}

🎯 知识点总结

  • vector动态管理 - 灵活添加删除图书
  • Lambda表达式 - 自定义排序规则
  • 算法库 - sort、count_if等
  • 类的封装 - 数据和操作封装在一起
  • 文件持久化 - 数据永久保存

🚀 扩展练习

  1. 添加图书分类功能
  2. 实现借阅历史记录
  3. 添加罚款计算(逾期)
  4. 多用户权限管理

➡️ 第26章 - 简易银行系统

最近更新: 2025/12/26 17:25
Contributors: 王长安
Prev
第24章 - 通讯录管理系统
Next
第26章 - 简易银行系统