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

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

背景:

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

 题目要求:

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

增加图书

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

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

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

查找图书

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

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

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

删除图书

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

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

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

显示图书

1.输入:无。

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

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

归还图书

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

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

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

借阅图书

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

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

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

退出系统

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

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

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

5. 安全性

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

开始

  |

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

  |       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 还是书名

  |       根据选择执行删除操作

  |       回到主菜单

  |

  |---退出程序

  |

结束

代码如下:

#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;
}

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拉普拉斯逆变换

https://www.bilibili.com/video/BV17i4y1475Y?p21&vd_source2e6b4ba548ec9462b2f9633ff700e9b9 CV 17 陈永平教授关于拉普拉斯逆变换的式子的推导 最关键的两步 想到取一个合适的contour L R L_R LR​部分是实部 γ \gamma γ要大于所有极点的实部,这样就可以搞一个大…

2.1 tmux和vim

文章目录 前言概述tmuxvim总结 前言 开始学习的时间是 2024.7.6 ,13&#xff1a;47 概述 最好多使用&#xff0c;练成条件反射式的 直接使用终端的工具&#xff0c;可以连接到服务器&#xff0c;不需要使用本地的软件 tmux 这个主要有两个功能&#xff0c;第一个功能是分…

uni-app组件 子组件onLoad、onReady事件无效

文章目录 导文解决方法 导文 突然发现在项目中&#xff0c;组件 子组件的onLoad、onReady事件无效 打印也出不来值 怎么处理呢&#xff1f; 解决方法 mounted() {console.log(onLoad, this.dateList);//有效// this.checkinDetails()},onReady() {console.log(onReady, this.da…

TensorCore 指令与汇编编程

TensorCore 指令是 NVIDIA 在其 GPU&#xff08;图形处理单元&#xff09;中引入的一种特殊硬件指令&#xff0c;用于加速深度学习计算&#xff0c;特别是矩阵乘法和卷积操作。TensorCore 指令专为处理深度学习的张量运算而设计&#xff0c;能够在单个时钟周期内执行大量的计算…

leetcode力扣_贪心思想

455.分发饼干&#xff08;easy-自己想得出来并写好&#xff09; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺…

机器学习——岭回归

1、岭回归与线性回归的区别 岭回归&#xff08;Ridge Regression&#xff09;和线性回归&#xff08;Linear Regression&#xff09;都是用于回归分析的统计方法&#xff0c;但它们在处理方式和应用场景上有一些关键的区别&#xff1a; a)基本概念 线性回归&#xff1a;目标是…

网易游戏员工怒怼丁磊上热搜:每天员工陪你演戏点赞有意思吗

【头部财经】近日&#xff0c;网易游戏一员工在内部群怒怼丁磊的聊天记录曝光&#xff0c;引发网友关注。据头部财经了解&#xff0c;该员工名叫石佳煊&#xff0c;是网易游戏的游戏开发工程师&#xff0c;毕业于华盛顿大学&#xff0c;已在网易工作四年多。 截图显示&#xf…

提高论文发表机会:Nature Communications 最新研究教你如何巧妙回复审稿意见

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 对于科研搬砖人来说&#xff0c;在论文投稿过程中&#xff0c;如何有效回复审稿意见才能得到审稿人的认可&#xff0c;一直是一个让人困惑又带点玄学的问题。 但是&#xff0c…

docker push 推送镜像到阿里云仓库

1.登陆阿里云 镜像服务&#xff0c;跟着指引操作就行 创建个人实例&#xff0c;创建命名空间、镜像仓库&#xff0c;绑定代码源头 2.将镜像推送到Registry $ docker login --username*** registry.cn-beijing.aliyuncs.com $ docker tag [ImageId] registry.cn-beijing.aliy…

白嫖A100-interLM大模型部署试用活动,亲测有效-2.Git

申明 以下部分内容来源于活动教学文档&#xff1a; Docs git 安装 是一个开源的分布式版本控制系统&#xff0c;被广泛用于软件协同开发。程序员的必备基础工具。 常用的 Git 操作 git init 初始化一个新的 Git 仓库&#xff0c;在当前目录创建一个 .git 隐藏文件夹来跟踪…

Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;&#x1f427;Linux高级管理专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️…

策略为王股票软件源代码-----如何修改为自己软件62----资讯菜单修改-----举例---------调用同花顺F10资讯------

//char szInfoF10[] "http://www.f10.com.cn/ggzx/ggzl.asp?zqdm%s"; char szInfoF10[] "http://basic.10jqka.com.cn/601899/"; // MENUITEM "F10资讯(&F)", ID_INFO_F10 MENUITEM &…

14-26 剑和侠客 – 预训练模型三部曲3 – 机器人时代来临

概述 在第 1 部分和第 2 部分中&#xff0c;我们讨论了适用于文本和图像任务的预训练模型&#xff0c;并探索了当今常用的模型。我们分析了这些模型的架构以及如何将它们用于特定任务。实现 AGI 所需的两个主要支柱是语言理解和机器的视觉能力。有许多任务与这两种能力有关。 …

Unity中使用VectorGraphics插件时,VectorUtils.RenderSpriteToTexture2D方法返回结果错误的解决方法

Unity中使用VectorGraphics插件时&#xff0c;如果使用VectorUtils.BuildSprite方法创建Sprite&#xff0c;那么得到的Sprite往往是一个三角网格数比较多的Sprite&#xff0c;如果想要得到使用贴图只有两个三角面的方形Sprite&#xff0c;可以使用该插件提供的VectorUtils.Rend…

基于顺序表的通讯录实现

一、前言 基于已经学过的顺序表&#xff0c;可以实现一个简单的通讯录。 二、通讯录相关头文件 //Contact.h #pragma once#define NAME_MAX 20 #define TEL_MAX 20 #define ADDR_MAX 20 #define GENDER_MAX 20typedef struct PersonInfo {char name[NAME_MAX];char gender[G…

统一视频接入平台LntonCVS视频监控平台具体功能介绍

LntonCVS视频监控平台是一款基于H5技术开发的安防视频监控解决方案&#xff0c;专为全球范围内不同品牌、协议及设备类型的监控产品设计。该平台提供了统一接入管理&#xff0c;支持标准的H5播放接口&#xff0c;使其他应用平台能够快速集成视频功能。无论开发环境、操作系统或…

适用于Mac和Windows的最佳iPhone恢复软件

本文将指导您选择一款出色的iPhone数据恢复软件来检索您的宝贵数据。 市场上有许多所谓的iPhone恢复程序。各种程序很难选择并选择其中之一。一旦您做出了错误的选择&#xff0c;您的数据就会有风险。 最好的iPhone数据恢复软件应包含以下功能。 1.安全可靠。 2.恢复成功率高…

NoSQL 之 Redis 配置与常用命令

一、关系型数据库与非关系型数据库 1、数据库概述 &#xff08;1&#xff09;关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记 录。 SQL 语句&#xff08;标准数据查询语言&am…

2024年地理信息技术与应用技能大赛·决赛(2024年地理信息技术与应用能力水平考试·中级)

目录 1 请将所有数据的空间参考统一。&#xff08;2分&#xff09; 1.1 题目要求 1.2 详细解析 2 制作台风轨迹图。&#xff08;10分&#xff09; 2.1 题目要求 2.2 详细解析 3 分析台风影响城市&#xff0c;并将结果以独立专题图的形式展示。&#xff08;13分&#xff…

实例演示kafka stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…