第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等
- 类的封装 - 数据和操作封装在一起
- 文件持久化 - 数据永久保存
🚀 扩展练习
- 添加图书分类功能
- 实现借阅历史记录
- 添加罚款计算(逾期)
- 多用户权限管理
