C++图书管理系统

news2024/9/22 13:38:49

目录

实现功能                      

用户管理

图书管理

借阅与归还

未归还图书

部分效果图

结构体

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.coloradmin.cn/o/1947874.html

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

相关文章

简单的git分支mergepush权限设定

简单的git分支merge&push权限设定 1. 需求 公司的分支很多&#xff0c;主要的有master分支&#xff0c;很多的业务需求分支&#xff0c;开发测试分支(uat,uat2,sit,sit2)&#xff0c;这些分支当前是谁都可以进行提交&#xff0c;但是如果在分支上直接修改&#xff0c;或者…

3.1、数据结构-线性表

数据结构 数据结构线性结构线性表顺序存储和链式存储区别单链表的插入和删除练习题 栈和队列练习题 串&#xff08;了解&#xff09; 数据结构 数据结构该章节非常重要&#xff0c;上午每年都会考10-12分选择题下午一个大题 什么叫数据结构&#xff1f;我们首先来理解一下什…

如何查找下载安装安卓APK历史版本?

在安卓设备上&#xff0c;有时候我们可能希望安装某个软件的旧版本&#xff0c;可能是因为新版本不兼容、功能改变不符合需求或是其他原因。 安卓系统并不像iOS那样提供直观的历史版本下载界面。 不过&#xff0c;通过一些第三方市场和网站&#xff0c;我们仍然可以找到并安装…

通信原理实验六:实验测验

实验六 实验测验 一&#xff1a;测验内容和要求 测试需要完成以下几个步骤&#xff1a; 配置好以下网络图&#xff1b;占总分10%&#xff08;缺少一个扣一分&#xff09;根据下面图配置好对应的IP和网关以及路由等相关配置&#xff0c;保证设备之间连通正常&#xff1b;占总…

数据结构经典测试题4

1. #include <stdio.h> int main() { char *str[3] {"stra", "strb", "strc"}; char *p str[0]; int i 0; while(i < 3) { printf("%s ",p); i; } return 0; }上述代码运行结果是什么&#xff1f; A: stra strb strc B: s…

前端面试宝典【Javascript篇】【2】

欢迎来到《前端面试宝典》&#xff0c;这里是你通往互联网大厂的专属通道&#xff0c;专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习&#xff0c;无论是一线大厂还是初创企业的面试&#xff0c;都能自信满满地展现你的实力。 核心特色&#xff1a; 独家实战案例…

Flink之重启策略

目录 1、固定延迟重启策略 2、失败率重启策略 3、不重启策略 在设置完 CheckPoint() 检查点机制后&#xff0c;不设置重启策略的话&#xff0c;&#xff0c;可以无限重启程序&#xff0c;那么设置的检查点机制也就没有什么意义了。因此&#xff0c;在生产实践中&#xff0c;…

笔记本检测工具 | 爱回收笔记本质检系统 v1.9.6

软件简介 爱回收笔记本质检系统是一款专为笔记本电脑硬件检测而设计的软件。它以其快速的检测速度、简便的操作流程和直观的检测结果&#xff0c;为用户提供了一种高效、易懂的硬件检测解决方案。 这款软件不仅适用于对电脑硬件有一定了解的用户&#xff0c;也特别适合对硬件…

Sentinel隔离、降级、授权规则详解

文章目录 Feign整合Sentinel线程隔离熔断降级授权规则自定义异常结果 上一期教程讲解了 Sentinel 的限流规则&#xff1a; Sentinel限流规则&#xff0c;这一期主要讲述 Sentinel 的 隔离、降级和授权规则 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还…

【玩转C语言】第五讲--->数组-->一维和多维深度理解

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 引言&#xff1a; 大家好&#xff0c;我是坊钰&#xff0c;为了让大家深入了解C语言&#xff0c;我开创了【玩转C语言系列】&#xff0c;将为大家介绍C语言相关知识…

你还在为文件翻译烦恼吗?试试这四款神器,轻松搞定一切!

现如今的信息传播速度不断得加快&#xff0c;无论是中外交流还是学习&#xff0c;也越来越多小语种出现在我们的工作和生活当中来了&#xff0c;其中不伐一些文件批量的形式&#xff0c;所以今天就具体来探讨一下&#xff0c;关于文件翻译的四款辅助工具&#xff1a; 一、福昕在…

openGauss触发器详解

openGauss 是一款开源关系型数据库管理系统&#xff0c;广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化&#xff0c;数据库管理和操作的自动化需求越来越高。触发器&#xff08;Triggers&#xff09;作为数据库中重要的编程工具&#xff0c;能够极大地简化复杂操…

广州机房服务器搬迁布线方案

友力科技&#xff08;广州&#xff09;有限公司&#xff0c;专业从事数据中心机房建设、改造和搬迁工程。友力科技&#xff08;广州&#xff09;有限公司提供的服务内容包括但不限于&#xff1a;原数据中心设备下架准备、沿途运输、新数据中心上架运行、数据迁移等。 友力科技…

前端面试细节重难点(十二)(已工作|做分享)

1、如何区分在react、vue和js中的是否传递e参数&#xff1f;事件对象e都要通过event作为实参显示传递形参才可接收到吗&#xff1f; 答&#xff1a;&#xff08;1&#xff09;在原生JavaScript中&#xff1a;事件对象e需要通过函数参数显式传递。 &#xff08;2&#xff09;在R…

观测云加入华为云「新加坡云联盟」,引领亚太创新潮流

7月19日&#xff0c;「新加坡云联盟」在华为云新加坡峰会2024上正式宣告成立。这一创新的联合不仅是新加坡乃至整个亚太地区云服务领域的重要里程碑&#xff0c;更是全球数字化转型进程中的关键一步。 观测云作为联盟的首批成员之一&#xff0c;在成立仪式上精彩亮相&#xff0…

探索能源管理体系认证的意义与实施

能源管理体系&#xff08;Energy Management System, EnMS&#xff09;是一个综合性的框架&#xff0c;旨在帮助企业系统地管理能源使用&#xff0c;提升能源效率&#xff0c;实现可持续发展的目标。这个体系包括了企业的组织结构、职责分配、惯例、程序、过程以及资源管理。通…

Linux中为qt添加opencv

一. 安装OpenCV库&#xff1a; 打开终端&#xff0c;输入以下命令安装OpenCV&#xff1a; sudo apt-get update sudo apt-get install libopencv-dev二. 配置Qt项目 在Qt Creator中打开项目&#xff0c;然后编辑.pro文件&#xff0c;添加以下内容&#xff1a; INCLUDEPATH …

2024年必备的9大CRM工具选购指南

本文介绍的工具有&#xff1a;纷享销客、Zoho CRM、八百客、红圈通、简道云、简信CRM、Salesforce、HubSpot CRM、Apptivo。 在选择合适的CRM系统时&#xff0c;许多企业面临着功能繁多、选择困难的痛点。对于中小企业来说&#xff0c;找到一个既能提高客户关系管理效率&#x…

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

GUL图形化界面操作(上部)

目录 AWT Frame对象&#xff1a;创建窗口 ​编辑 该对象相关的属性 设置窗口大小&#xff08;对象.setsize(int,int)&#xff09; 让窗口可以显现出来&#xff08;对象.setVisible(bool)&#xff09; 设置窗口标题&#xff08;对象.setTitle(String)&#xff09; 设置窗…