C++图书管理系统

目录

实现功能                      

用户管理

图书管理

借阅与归还

未归还图书

部分效果图

结构体

Book 结构体

User 结构体

源代码

编译时在连接器命令行加入

完整代码 

    

实现功能                      

  1. 用户管理

    • 添加用户:输入用户ID、用户名和密码,将新用户添加到系统中。
    • 删除用户:根据用户ID删除指定用户。
    • 修改用户:根据用户ID修改用户的用户名和密码。
    • 显示所有用户:列出系统中的所有用户信息。
    • 查找用户:根据用户ID查找并显示用户信息。
  2. 图书管理

    • 添加图书:输入图书ID、书名、作者和出版社,将新图书添加到系统中。
    • 删除图书:根据图书ID删除指定图书。
    • 显示所有图书:列出系统中的所有图书信息。
    • 查找图书:根据图书ID查找并显示图书信息。
  3. 借阅与归还

    • 借阅图书:根据用户ID和图书ID记录借阅操作,并设置图书的到期日期。
    • 归还图书:根据用户ID和图书ID记录归还操作,更新图书的状态。
  4. 未归还图书

    • 列出未归还图书:显示所有未归还的图书信息,包括ID、书名、作者、出版社和到期日期。

部分效果图

结构体

Book 结构体

id: 图书ID

title: 书名

author: 作者

publisher: 出版社

isBorrowed: 是否被借阅

dueDate: 到期日期(tm 结构体)

User 结构体

id: 用户ID

username: 用户名

password: 密码

borrowedBooks: 借阅图书记录(书ID和归还时间的配对)

源代码

编译时在连接器命令行加入

-std=c++11

完整代码 

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <iomanip>using namespace std;// 图书信息
struct Book {string id;string title;string author;string publisher;bool isBorrowed;tm dueDate;
};// 用户信息
struct User {string id;string username;string password;vector<pair<string, tm>> borrowedBooks; // 书ID和归还时间
};// 全局变量
vector<Book> books;
vector<User> users;// 打印日期
void printDate(const tm& date) {cout << (date.tm_year + 1900) << '-' << (date.tm_mon + 1) << '-' << date.tm_mday << ' '<< date.tm_hour << ':' << date.tm_min << ':' << date.tm_sec;
}// 加载用户数据
void loadUsers() {ifstream infile("users.txt");if (!infile) return;User user;string line;while (getline(infile, line)) {istringstream ss(line);ss >> user.id >> user.username >> user.password;users.push_back(user);}
}// 保存用户数据
void saveUsers() {ofstream outfile("users.txt");for (const auto& user : users) {outfile << user.id << ' ' << user.username << ' ' << user.password << '\n';}
}// 加载图书数据
void loadBooks() {ifstream infile("books.txt");if (!infile) return;Book book;string line;while (getline(infile, line)) {istringstream ss(line);ss >> book.id >> book.title >> book.author >> book.publisher >> book.isBorrowed;ss >> book.dueDate.tm_year >> book.dueDate.tm_mon >> book.dueDate.tm_mday>> book.dueDate.tm_hour >> book.dueDate.tm_min >> book.dueDate.tm_sec;book.dueDate.tm_year -= 1900;book.dueDate.tm_mon -= 1;books.push_back(book);}
}// 保存图书数据
void saveBooks() {ofstream outfile("books.txt");for (const auto& book : books) {outfile << book.id << ' ' << book.title << ' ' << book.author << ' ' << book.publisher << ' '<< book.isBorrowed << ' '<< (book.dueDate.tm_year + 1900) << ' '<< (book.dueDate.tm_mon + 1) << ' '<< book.dueDate.tm_mday << ' '<< book.dueDate.tm_hour << ' '<< book.dueDate.tm_min << ' '<< book.dueDate.tm_sec << '\n';}
}// 验证管理员账号密码
bool authenticate() {string username, password;cout << "输入用户名: ";cin >> username;cout << "输入密码: ";cin >> password;return username == "root" && password == "123";
}// 修改管理员密码
void changePassword() {string newPassword;cout << "输入新密码: ";cin >> newPassword;// 在实际应用中,需要保存新密码cout << "密码已更改! (Password changed!)\n";
}// 添加图书
void addBook() {Book book;cout << "输入图书ID: ";cin >> book.id;cout << "输入书名: ";cin.ignore(); // 清除输入缓冲区getline(cin, book.title);cout << "输入作者: ";getline(cin, book.author);cout << "输入出版社: ";getline(cin, book.publisher);book.isBorrowed = false;books.push_back(book);saveBooks();cout << "图书已添加! (Book added!)\n";
}// 删除图书
void deleteBook() {string id;cout << "输入要删除的图书ID: ";cin >> id;auto it = remove_if(books.begin(), books.end(), [&id](const Book& book) { return book.id == id; });if (it != books.end()) {books.erase(it, books.end());saveBooks();cout << "图书已删除! (Book deleted!)\n";} else {cout << "图书未找到! (Book not found!)\n";}
}// 显示所有图书
void displayBooks() {cout << "ID\t书名\t作者\t出版社\t是否被借阅\n";cout << "ID\tTitle\tAuthor\tPublisher\tIs Borrowed\n";for (const auto& book : books) {cout << book.id << '\t' << book.title << '\t' << book.author << '\t' << book.publisher << '\t'<< (book.isBorrowed ? "Yes" : "No") << '\n';}
}// 查找图书
void searchBook() {string id;cout << "输入图书ID: ";cin >> id;auto it = find_if(books.begin(), books.end(), [&id](const Book& book) { return book.id == id; });if (it != books.end()) {const Book& book = *it;cout << "ID: " << book.id << '\n' << "书名: " << book.title << '\n' << "作者: " << book.author << '\n'<< "出版社: " << book.publisher << '\n' << "是否被借阅: " << (book.isBorrowed ? "Yes" : "No") << '\n';cout << "到期日期: ";printDate(book.dueDate);cout << '\n';} else {cout << "图书未找到! (Book not found!)\n";}
}// 添加用户
void addUser() {User user;cout << "输入用户ID: ";cin >> user.id;cout << "输入用户名: ";cin >> user.username;cout << "输入密码: ";cin >> user.password;users.push_back(user);saveUsers();cout << "用户已添加! (User added!)\n";
}// 删除用户
void deleteUser() {string id;cout << "输入要删除的用户ID: ";cin >> id;auto it = remove_if(users.begin(), users.end(), [&id](const User& user) { return user.id == id; });if (it != users.end()) {users.erase(it, users.end());saveUsers();cout << "用户已删除! (User deleted!)\n";} else {cout << "用户未找到! (User not found!)\n";}
}// 修改用户
void modifyUser() {string id;cout << "输入要修改的用户ID: ";cin >> id;auto it = find_if(users.begin(), users.end(), [&id](const User& user) { return user.id == id; });if (it != users.end()) {User& user = *it;cout << "输入新的用户名: ";cin >> user.username;cout << "输入新的密码: ";cin >> user.password;saveUsers();cout << "用户已修改! (User modified!)\n";} else {cout << "用户未找到! (User not found!)\n";}
}// 显示所有用户
void displayUsers() {cout << "ID\t用户名\t密码\n";cout << "ID\tUsername\tPassword\n";for (const auto& user : users) {cout << user.id << '\t' << user.username << '\t' << user.password << '\n';}
}// 查找用户
void searchUser() {string id;cout << "输入用户ID: ";cin >> id;auto it = find_if(users.begin(), users.end(), [&id](const User& user) { return user.id == id; });if (it != users.end()) {const User& user = *it;cout << "ID: " << user.id << '\n' << "用户名: " << user.username << '\n' << "密码: " << user.password << '\n';} else {cout << "用户未找到! (User not found!)\n";}
}// 借阅图书
void borrowBook() {string userId, bookId;cout << "输入用户ID: ";cin >> userId;cout << "输入图书ID: ";cin >> bookId;auto userIt = find_if(users.begin(), users.end(), [&userId](const User& user) { return user.id == userId; });auto bookIt = find_if(books.begin(), books.end(), [&bookId](const Book& book) { return book.id == bookId; });if (userIt != users.end() && bookIt != books.end()) {User& user = *userIt;Book& book = *bookIt;if (!book.isBorrowed) {book.isBorrowed = true;time_t now = time(0);tm* now_tm = localtime(&now);book.dueDate = *now_tm;user.borrowedBooks.push_back(make_pair(bookId, book.dueDate));saveBooks();saveUsers();cout << "图书已借出! (Book borrowed!)\n";} else {cout << "图书已被借出! (Book is already borrowed!)\n";}} else {cout << "用户或图书未找到! (User or book not found!)\n";}
}// 归还图书
void returnBook() {string userId, bookId;cout << "输入用户ID: ";cin >> userId;cout << "输入图书ID: ";cin >> bookId;auto userIt = find_if(users.begin(), users.end(), [&userId](const User& user) { return user.id == userId; });auto bookIt = find_if(books.begin(), books.end(), [&bookId](const Book& book) { return book.id == bookId; });if (userIt != users.end() && bookIt != books.end()) {User& user = *userIt;Book& book = *bookIt;if (book.isBorrowed) {book.isBorrowed = false;auto borrowedBookIt = find_if(user.borrowedBooks.begin(), user.borrowedBooks.end(), [&bookId](const pair<string, tm>& borrowedBook) { return borrowedBook.first == bookId; });if (borrowedBookIt != user.borrowedBooks.end()) {user.borrowedBooks.erase(borrowedBookIt);}saveBooks();saveUsers();cout << "图书已归还! (Book returned!)\n";} else {cout << "图书没有被借出! (Book was not borrowed!)\n";}} else {cout << "用户或图书未找到! (User or book not found!)\n";}
}// 列出逾期图书
void listOverdueBooks() {time_t now = time(0);tm* now_tm = localtime(&now);cout << "ID\t书名\t作者\t出版社\t到期日期\n";cout << "ID\tTitle\tAuthor\tPublisher\tDue Date\n";for (const auto& book : books) {if (book.isBorrowed && difftime(mktime(now_tm), mktime(const_cast<tm*>(&book.dueDate))) > 0) {cout << book.id << '\t' << book.title << '\t' << book.author << '\t' << book.publisher << '\t';printDate(book.dueDate);cout << '\n';}}
}// 主菜单
int main() {check:if (!authenticate()) {cout << "认证失败! (Authentication failed!)\n";goto check;}loadUsers();loadBooks();int choice;do {cout << "1. 添加图书 (Add Book)\n2. 删除图书 (Delete Book)\n3. 显示所有图书 (Display Books)\n"<< "4. 查找图书 (Search Book)\n5. 添加用户 (Add User)\n6. 删除用户 (Delete User)\n"<< "7. 修改用户 (Modify User)\n8. 显示所有用户 (Display Users)\n9. 查找用户 (Search User)\n"<< "10. 借阅图书 (Borrow Book)\n11. 归还图书 (Return Book)\n12. 列出未归还图书 (List Overdue Books)\n"<< "13. 退出 (Exit)\n";cout << "Enter your choice: ";cin >> choice;switch (choice) {case 1: addBook(); break;case 2: deleteBook(); break;case 3: displayBooks(); break;case 4: searchBook(); break;case 5: addUser(); break;case 6: deleteUser(); break;case 7: modifyUser(); break;case 8: displayUsers(); break;case 9: searchUser(); break;case 10: borrowBook(); break;case 11: returnBook(); break;case 12: listOverdueBooks(); break;case 13: break;default: cout << "无效选择! (Invalid choice!)\n"; break;}} while (choice != 13);saveUsers();saveBooks();return 0;
}

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

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

相关文章

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

AI绘画入门实践|Midjourney:使用 --seed 制作情侣头像与漫画

在 Midjourney 中&#xff0c;seed 是指一个种子&#xff0c;用于生成图像时的起点或基础。 使用格式&#xff1a;--seed 获取的seed值 获取 seed 值 使用 seed 生成图像 a cute boys avatar, background with blue sky and white cloud, Ghibli Studio style, Hayao Miyazaki…

智能爬虫管理:定制化数据抓取方案为企业赋能

摘要&#xff1a; 在数据驱动的时代&#xff0c;精准而高效的数据抓取成为企业决策的命脉。本文将探讨如何通过定制化的智能爬虫管理方案&#xff0c;赋能企业实现数据洞察力的飞跃。我们将深入解析定制化数据抓取的核心优势&#xff0c;分享成功案例&#xff0c;并揭秘如何利…

InteliJ IDEA最新2024版下载安装与快速配置激活使用教程+jdk下载配置

第一步&#xff1a;下载ideaIC-2024.1.4 方法1&#xff1a;在线链接 IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com) 选择社区版进行下载 方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1ydS6krUX6eE_AdW4uGV_6w?pwdsbfm 提取…

vue3+g2plot实现词云图

词云图 效果预览: 核心代码: import {WordCloud } from @antv/g2plot;fetch(https://gw.alipayobjects.com/os/antfincdn/jPKbal7r9r/mock.json).then((res) => res.json()).then((data) => {const wordCloud = new WordCloud(container, {data,wordField: x,weigh…

电场、磁场、麦克斯韦方程组

电场和磁场 电场和磁场并不是一个虚拟的概念&#xff0c;而是一种确实存在的物质。法拉第提出了电场和磁场&#xff0c;法拉第认为之所以两个电荷之间有力的作用,是因为有一个电荷会在周围空间产生一种物质,这种物质叫做电场。法拉第提出&#xff1a;电场是由电荷产生的。之后人…

【笔记:3D航路规划算法】二、RRT*

目录 一、RRT*于RRT的不同之处1、路径优化&#xff1a;2、成本计算&#xff1a;3、重连线步骤&#xff1a; 二、图解1、初始化2、路径搜索3、效果展示 3D路径规划是在三维空间中寻找从起点到终点的最短或最优路径的一种技术。它广泛应用于无人机导航、机器人运动规划、虚拟现实…

Docker部署Elasticsearch8.6.0 Kibana8.6.0

&#xff08;1&#xff09;Docker部署Elasticsearch8.5.3&#xff08;失败…&#xff09; 为了匹配springboot3.0.x&#xff0c;安装Elasticsearch:8.5.3 拉取镜像&#xff0c;遇到问题&#xff01; [rootserver01 ~]# docker pull elasticsearch:8.5.3 8.5.3: Pulling from…

Modbus转EtherCAT网关将Modbus协议的数据格式转换为EtherCAT协议

随着工业自动化技术的快速发展&#xff0c;不同通信协议之间的互操作性变得越来越重要。Modbus作为一种广泛使用的串行通信协议&#xff0c;与以太网为基础的EtherCAT协议之间的转换需求日益增长。本文将从网关功能、硬件设计、性能以及应用案例来介绍这款Modbus转EtherCAT网关…

第31篇 计算数据中最长的连续1的个数<一>

Q&#xff1a;如何用Nios II指令计算一个数据中最长的连续1的个数&#xff1f; A&#xff1a;基本原理&#xff1a;所有Nios II指令都是32位长&#xff0c;除了由处理器直接执行的机器指令外&#xff0c;Nios II指令集还包括许多可用于汇编语言的伪指令程序。本实验我们会用…

权限(linux)

权限就是文件权限&#xff08;linux万物皆文件&#xff09; 本文主要涉及文件/文件夹权限 涉及指令&#xff1a; shell&#xff1a; kernal &#xff1a; linux内核 shell &#xff1a; 外壳 shell可以方便交互与操作 bash是一个具体的shell su su 切换用户 su -root 变…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-1

目录 HR企业入驻 HR企业入驻 - 认证流程解析 HR企业入驻 - 查询企业是否存在 HR企业入驻 - 上传企业logo与营业执照 HR企业入驻 - 新企业&#xff08;数据字典与行业tree结构解析&#xff09; 行业tree 行业tree - 创建节点 行业tree - 查询一级分类 行业tree - 查询子分…

普中51单片机:DS1302时钟芯片讲解与应用(十)

文章目录 引言基本特性什么是RAM&#xff1f;什么是涓流充电&#xff1f; 电路图和引脚说明通信协议以及工作流程寄存器控制寄存器日历/时钟寄存器 DS1302读写时序代码演示——数码管显示时分秒 引言 DS1302 是一款广泛使用的实时时钟 (RTC) 芯片&#xff0c;具有低功耗、内置…

多层感知机(神经网络)

目录 一、感知机&#xff08;逻辑回归、二分类&#xff09;定义&#xff1a;二、感知机不能解决XOR问题&#xff1a;三、多层感知机定义&#xff1a;四、训练过程&#xff1a;1.参数维度&#xff1a;2.常用激活函数&#xff1a;2.1Sigmoid激活函数&#xff1a;2.2Tanh激活函数&…

深入分析 Android ContentProvider (三)

文章目录 深入分析 Android ContentProvider (三)ContentProvider 的高级使用和性能优化1. 高级使用场景1.1. 数据分页加载示例&#xff1a;分页加载 1.2. 使用 Loader 实现异步加载示例&#xff1a;使用 CursorLoader 加载数据 1.3. ContentProvider 与权限管理示例&#xff1…

【工具】轻松转换JSON与Markdown表格——自制Obsidian插件

文章目录 一、插件简介二、功能详解三、使用教程四、插件代码五、总结 一、插件简介 JsonMdTableConverter是一款用于Obsidian的插件&#xff0c;它可以帮助用户在JSON格式和Markdown表格之间进行快速转换。这款插件具有以下特点&#xff1a; 轻松识别并转换JSON与Markdown表格…

60个常见的 Linux 指令

1.ssh 登录到计算机主机 ssh -p port usernamehostnameusername&#xff1a; 远程计算机上的用户账户名。 hostname&#xff1a; 远程计算机的 IP 地址或主机名。 -p 选项指定端口号。 2.ls 列出目录内容 ls ls -l # 显示详细列表 ls -a # 显示包括隐藏文件在内的所有内…

【GD32】从零开始学GD32单片机 | 基于SD卡的FatFs文件系统移植(GD32F470ZGT6)

1. 简介 FatFs是一个专门为微处理器设计的通用文件系统&#xff0c;像8051、AVR、PIC、ARM架构的微处理器都能兼容该文件系统。 FatFs文件系统最大的一个优点是它是DOS和Windows兼容的&#xff0c;这意味着你只需要再移植一个USB驱动就可以实现在电脑中访问单片机的储存结构&…

Cookie与Session 实现登录操作

Cookie Cookie 是网络编程中使用最广泛的一项技术&#xff0c;主要用于辨识用户身份。 客户端&#xff08;浏览器&#xff09;与网站服务端通讯的过程如下图所示&#xff1a; 从图中看&#xff0c;服务端既要返回 Cookie 给客户端&#xff0c;也要读取客户端提交的 Cookie。所…

Domainim:一款高效的企业级网络安全扫描工具

关于Domainim Domainim是一款功能强大的企业级网络安全扫描工具&#xff0c;该工具运行效率高&#xff0c;功能完善&#xff0c;可以帮助广大研究人员针对企业或组织网络执行大规模安全扫描任务。 该工具可以快速执行网络安全扫描和域名/子域名网络侦查任务&#xff0c;旨在使…