C语言图书馆管理系统(管理员版)

案例:图书馆管理系统(管理员版)

背景:

随着信息技术的发展和普及,传统的图书馆管理方式已经无法满足现代图书馆高效、便捷、智能化的管理需求。传统的手工登记、纸质档案管理不仅耗时耗力,而且容易出现错误,导致图书资源的浪费和读者体验的下降。因此,开发一套高效的图书馆管理系统成为了提升图书馆服务质量和管理水平的迫切需求。

题目要求:

开发一个图书馆管理系统实现以下功能

增加图书

1.输入:管理员输入图书的详细信息。

2.处理:系统验证信息的有效性,并将图书信息存储到数据库中。

3.输出:提示管理员图书添加成功,并在图书列表中显示新增的图书。

查找图书

1.输入:管理员输入查找对应图书的编码和书名即可查找。

2.处理:系统根据条件在数据库中检索匹配的图书。

3.输出:返回查找结果,显示符合条件的图书列表。

删除图书

1.输入:管理员选择要删除的图书编码或者书名。

2.处理:系统确认删除操作,并从数据库中移除该图书的信息。

3.输出:提示删除成功,并更新图书列表。

显示图书

1.输入:无。

2.处理:系统从数据库中读取所有图书信息。

3.输出:显示所有图书的列表。

归还图书

1.输入:管理员选择要借出的图书编码或者书名。

2.处理:系统记录归还信息,更新图书的库存状态。

3.输出:提示归还成功,并更新归还记录。

借阅图书

1.输入:管理员选择要借出的图书编码或者书名。

2.处理:系统记录借阅信息,更新图书的库存状态。

3.输出:提示借阅成功,并更新借阅记录。

退出系统

1.输入:管理员选择退出系统的选项。

2.处理:系统保存当前状态,并关闭所有运行中的进程。

3.输出:显示退出系统的确认信息。

  1. 安全性

对于未能查询到的图书创建异常处理机制来提高系统安全性与稳定性

开始

|

|---程序启动,初始化

| library[] 和 bookCount = 0

|

|---主菜单

|

|---用户选择:

| (1) 添加图书

| (2) 显示所有图书

| (3) 查找图书

| (4) 借阅图书

| (5) 归还图书

| (6) 删除图书

| (7) 退出程序

|

|---添加图书 (addBook):

| 提示用户输入图书信息

| 创建新书籍对象

| library[bookCount] = 新书籍对象

| bookCount++

| 回到主菜单

|

|---显示所有图书 (displayAllBooks):

| 遍历 library[] 并打印图书信息

| 回到主菜单

|

|---查找图书 (findBook):

| 询问用户选择按 ID 还是书名

| 根据选择搜索 library[]

| 显示搜索结果

| 回到主菜单

|

|---借阅图书 (borrowBook):

| 询问用户选择按 ID 还是书名

| 根据选择执行借阅操作

| 回到主菜单

|

|---归还图书 (returnBook):

| 询问用户选择按 ID 还是书名

| 根据选择执行归还操作

| 回到主菜单

|

|--- 删除图书 (deleteBook):

| 询问用户选择按 ID 还是书名

| 根据选择执行删除操作

| 回到主菜单

|

|---退出程序

|

结束

代码如下:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define FILENAME "D:\\Filedemo\\library.txt"
#define MAX_BOOKS 100
#define NAME_LENGTH 50
#define AUTHOR_LENGTH 50

typedef struct {
    int id;
    char title[NAME_LENGTH];
    char author[AUTHOR_LENGTH];
    float price;
    char category[NAME_LENGTH];
    bool borrowed;
} Book;

Book library[MAX_BOOKS];
int bookCount = 0;

// 声明图书馆数组和图书计数变量
Book library[MAX_BOOKS];

// 保存图书信息到文件的函数
void saveBooksToFile() {
    FILE *file = fopen(FILENAME, "wb"); // 打开文件以二进制写入模式
    if (file == NULL) { // 检查文件是否成功打开
        printf("Error opening file for writing.\n");
        return; // 如果打开失败,打印错误信息并返回
    }
    fwrite(library, sizeof(Book), bookCount, file); // 将图书数据写入文件
    fclose(file); // 关闭文件
}

// 从文件加载图书信息的函数
void loadBooksFromFile() {
    FILE *file = fopen(FILENAME, "rb"); // 打开文件以二进制读取模式
    if (file == NULL) { // 检查文件是否成功打开
        printf("No existing library data found.\n");
        return; // 如果没有找到数据,打印信息并返回
    }
    bookCount = fread(library, sizeof(Book), MAX_BOOKS, file); // 从文件读取图书数据
    fclose(file); // 关闭文件
}

// 添加新图书的函数
void addBook() {
    if (bookCount >= MAX_BOOKS) { // 检查是否达到最大图书数量
        printf("抱歉,无法增加图书.\n");
        return; // 如果达到上限,打印信息并返回
    }
    Book newBook; // 创建一个新的图书结构体
    // 获取用户输入的图书信息
    printf("请输入图书书名: ");
    scanf("%s", newBook.title);
    printf("请输入图书作者: ");
    scanf("%s", newBook.author);
    printf("请输入图书价格: ");
    scanf("%f", &newBook.price);
    printf("请输入图书类型: ");
    scanf("%s", newBook.category);
    newBook.borrowed = false; // 默认图书未被借出
    newBook.id = bookCount + 1; // 设置图书ID
    library[bookCount++] = newBook; // 将新图书添加到图书馆数组中
    saveBooksToFile(); // 保存图书信息到文件
    printf("增加图书成功.\n"); // 打印成功信息
}

// 显示所有图书
void displayAllBooks() {
    for (int i = 0; i < bookCount; i++) { // 遍历图书馆中的所有图书
        // 打印每本图书的详细信息,包括ID、书名、作者、价格、类型和借阅状态
        printf("ID: %d, 书名: %s, 作者: %s, 价格: %.2f, 类型: %s, 是否被借: %s\n",
               library[i].id, library[i].title, library[i].author, library[i].price, library[i].category,
               library[i].borrowed ? "是" : "否"); // 使用三元运算符判断图书是否被借出
    }
}

// 查找图书
void findBook() {
    int choice; // 用于存储用户选择的查找方式

    // 提示用户选择查找方式,并读取用户的选择
    printf("请选择查找方式:\n1. 按ID查找\n2. 按书名查找\n");
    scanf("%d", &choice);

    if (choice == 1) { // 如果用户选择按ID查找
        int id; // 用于存储用户输入的图书ID

        // 提示用户输入要查找的图书ID,并读取用户输入的图书ID
        printf("请输入要查找的图书ID: ");
        scanf("%d", &id);

        // 遍历图书馆中的所有图书,查找匹配的图书ID
        for (int i = 0; i < bookCount; i++) {
            if (library[i].id == id) { // 如果找到匹配的图书ID
                // 打印找到的图书的详细信息,包括ID、书名、作者、价格、类型和借阅状态
                printf("找到了图书:\nID: %d, 书名: %s, 作者: %s, 价格: %.2f, 类型: %s, 是否被借: %s\n",
                       library[i].id, library[i].title, library[i].author, library[i].price, library[i].category,
                       library[i].borrowed ? "是" : "否");
                return; // 查找完成,函数返回
            }
        }
        // 如果没有找到匹配的图书ID,打印提示信息
        printf("未找到ID为 %d 的图书。\n", id);
    } else if (choice == 2) { // 如果用户选择按书名查找
        char title[NAME_LENGTH]; // 用于存储用户输入的图书书名

        // 提示用户输入要查找的图书书名,并读取用户输入的图书书名
        printf("请输入要查找的图书书名: ");
        scanf("%s", title);

        // 遍历图书馆中的所有图书,查找匹配的图书书名
        for (int i = 0; i < bookCount; i++) {
            if (strcmp(library[i].title, title) == 0) { // 如果找到匹配的图书书名
                // 打印找到的图书的详细信息,包括ID、书名、作者、价格、类型和借阅状态
                printf("找到了图书:\nID: %d, 书名: %s, 作者: %s, 价格: %.2f, 类型: %s, 是否被借: %s\n",
                       library[i].id, library[i].title, library[i].author, library[i].price, library[i].category,
                       library[i].borrowed ? "是" : "否");
                return; // 查找完成,函数返回
            }
        }
        // 如果没有找到匹配的图书书名,打印提示信息
        printf("未找到书名为 '%s' 的图书。\n", title);
    } else { // 如果用户选择了无效的选项
        // 打印提示信息,告知用户选择无效
        printf("无效的选择,请重新输入。\n");
    }
}

// 借阅图书
void borrowBook() {
    int choice; // 用于存储用户选择的借阅方式

    // 提示用户选择借阅方式,并读取用户的选择
    printf("请选择借阅方式:\n1. 按ID借阅\n2. 按书名借阅\n");
    scanf("%d", &choice);

    if (choice == 1) { // 如果用户选择按ID借阅
        int id; // 用于存储用户输入的图书ID

        // 提示用户输入要借阅的图书ID,并读取用户输入的图书ID
        printf("请输入要借阅的图书ID: ");
        scanf("%d", &id);

        // 遍历图书馆中的所有图书,查找匹配的图书ID
        for (int i = 0; i < bookCount; i++) {
            if (library[i].id == id && !library[i].borrowed) { // 如果找到未被借出的匹配图书ID
                library[i].borrowed = true; // 标记图书为已借出状态
                saveBooksToFile(); // 保存图书信息到文件,以便数据持久化
                printf("借阅图书成功。\n"); // 打印借阅成功的消息
                return; // 借阅完成,函数返回
            }
        }
        // 如果没有找到匹配的图书ID,或者图书已被借出,打印提示信息
        printf("未找到ID为 %d 的图书,或者该图书已被借出,借阅失败。\n", id);
    } else if (choice == 2) { // 如果用户选择按书名借阅
        char title[NAME_LENGTH]; // 用于存储用户输入的图书书名

        // 提示用户输入要借阅的图书书名,并读取用户输入的图书书名
        printf("请输入要借阅的图书书名: ");
        scanf("%s", title);

        // 遍历图书馆中的所有图书,查找匹配的图书书名
        for (int i = 0; i < bookCount; i++) {
            if (strcmp(library[i].title, title) == 0 && !library[i].borrowed) { // 如果找到未被借出的匹配图书书名
                library[i].borrowed = true; // 标记图书为已借出状态
                saveBooksToFile(); // 保存图书信息到文件,以便数据持久化
                printf("借阅图书成功。\n"); // 打印借阅成功的消息
                return; // 借阅完成,函数返回
            }
        }
        // 如果没有找到匹配的图书书名,或者图书已被借出,打印提示信息
        printf("未找到书名为 '%s' 的图书,或者该图书已被借出,借阅失败。\n", title);
    } else { // 如果用户选择了无效的选项
        // 打印提示信息,告知用户选择无效
        printf("无效的选择,请重新输入。\n");
    }
}
// 归还图书的函数
void returnBook() {
    int choice; // 用于存储用户选择的归还方式

    // 提示用户选择归还方式,并读取用户的选择
    printf("请选择归还方式:\n1. 按ID归还\n2. 按书名归还\n");
    scanf("%d", &choice);

    if (choice == 1) { // 如果用户选择按ID归还
        int id; // 用于存储用户输入的图书ID

        // 提示用户输入要归还的图书ID,并读取用户输入的图书ID
        printf("请输入要归还的图书ID: ");
        scanf("%d", &id);

        // 遍历图书馆中的所有图书,查找匹配的图书ID
        for (int i = 0; i < bookCount; i++) {
            if (library[i].id == id && library[i].borrowed) { // 如果找到已借出的匹配图书ID
                library[i].borrowed = false; // 标记图书为未借出状态
                saveBooksToFile(); // 保存图书信息到文件,以便数据持久化
                printf("归还图书成功。\n"); // 打印归还成功的消息
                return; // 归还完成,函数返回
            }
        }
        // 如果没有找到匹配的图书ID,或者图书未被借出,打印提示信息
        printf("未找到ID为 %d 的图书,或者该图书未被借出,归还失败。\n", id);
    } else if (choice == 2) { // 如果用户选择按书名归还
        char title[NAME_LENGTH]; // 用于存储用户输入的图书书名

        // 提示用户输入要归还的图书书名,并读取用户输入的图书书名
        printf("请输入要归还的图书书名: ");
        scanf("%s", title);

        // 遍历图书馆中的所有图书,查找匹配的图书书名
        for (int i = 0; i < bookCount; i++) {
            if (strcmp(library[i].title, title) == 0 && library[i].borrowed) { // 如果找到已借出的匹配图书书名
                library[i].borrowed = false; // 标记图书为未借出状态
                saveBooksToFile(); // 保存图书信息到文件,以便数据持久化
                printf("归还图书成功。\n"); // 打印归还成功的消息
                return; // 归还完成,函数返回
            }
        }
        // 如果没有找到匹配的图书书名,或者图书未被借出,打印提示信息
        printf("未找到书名为 '%s' 的图书,或者该图书未被借出,归还失败。\n", title);
    } else { // 如果用户选择了无效的选项
        // 打印提示信息,告知用户选择无效
        printf("无效的选择,请重新输入。\n");
    }
}
//删除图书
void deleteBook() {
    int choice;
    printf("请选择删除方式:\n1. 按ID删除\n2. 按书名删除\n");
    scanf("%d", &choice);

    if (choice == 1) {
        int id;
        printf("请输入要删除的图书ID: ");
        scanf("%d", &id);
        for (int i = 0; i < bookCount; i++) {
            if (library[i].id == id) {
                // 将找到的图书之后的所有图书向前移动一位
                for (int j = i; j < bookCount - 1; j++) {
                    library[j] = library[j + 1];
                }
                // 更新图书数量
                bookCount--;
                // 保存更改到文件
                saveBooksToFile();
                printf("图书删除成功。\n");
                return;
            }
        }
        printf("未找到ID为 %d 的图书,删除失败。\n", id);
    } else if (choice == 2) {
        char title[NAME_LENGTH];
        printf("请输入要删除的图书书名: ");
        scanf("%s", title);
        for (int i = 0; i < bookCount; i++) {
            if (strcmp(library[i].title, title) == 0) {
                // 将找到的图书之后的所有图书向前移动一位
                for (int j = i; j < bookCount - 1; j++) {
                    library[j] = library[j + 1];
                }
                // 更新图书数量
                bookCount--;
                // 保存更改到文件
                saveBooksToFile();
                printf("图书删除成功。\n");
                return;
            }
        }
        printf("未找到书名为 '%s' 的图书,删除失败。\n", title);
    } else {
        printf("无效的选择,请重新输入。\n");
    }
}
int main() {
    loadBooksFromFile();
    int choice;
    while (1) {
        printf("*************************图书馆管理系统*********************\n");
        printf("1. 增加图书\n");
        printf("2. 展示所有图书\n");
        printf("3. 查找图书\n");
        printf("4. 借阅图书\n");
        printf("5. 归还图书\n");
        printf("6. 删除图书\n");
        printf("7. 退出程序\n");
        printf("请选择操作: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                addBook();
                break;
            case 2:
                displayAllBooks();
                break;
            case 3:
                findBook();
                break;
            case 4:
                borrowBook();
                break;
            case 5:
                returnBook();
                break;
            case 6:
                deleteBook();
                break;
            case 7:
                exit(0);
            default:
                printf("无效的选择,请重新输入。\n");
        }
    }
    return 0;
}

运行结果:

相关推荐
时光の尘7 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-16 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
The_Ticker27 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Elastic 中国社区官方博客33 分钟前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
企鹅侠客37 分钟前
ETCD调优
数据库·etcd
Json_1817901448043 分钟前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库
煎饼小狗1 小时前
Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
数据库·redis·缓存
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
永乐春秋1 小时前
WEB-通用漏洞&SQL注入&CTF&二次&堆叠&DNS带外
数据库·sql