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 50typedef 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; // 设置图书IDlibrary[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,并读取用户输入的图书IDprintf("请输入要查找的图书ID: ");scanf("%d", &id);// 遍历图书馆中的所有图书,查找匹配的图书IDfor (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,并读取用户输入的图书IDprintf("请输入要借阅的图书ID: ");scanf("%d", &id);// 遍历图书馆中的所有图书,查找匹配的图书IDfor (int i = 0; i < bookCount; i++) {if (library[i].id == id && !library[i].borrowed) { // 如果找到未被借出的匹配图书IDlibrary[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,并读取用户输入的图书IDprintf("请输入要归还的图书ID: ");scanf("%d", &id);// 遍历图书馆中的所有图书,查找匹配的图书IDfor (int i = 0; i < bookCount; i++) {if (library[i].id == id && library[i].borrowed) { // 如果找到已借出的匹配图书IDlibrary[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;
}

运行结果:

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

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

相关文章

剖析DeFi交易产品之UniswapV3:交易路由合约

本文首发于公众号&#xff1a;Keegan小钢 SwapRouter 合约封装了面向用户的交易接口&#xff0c;但不再像 UniswapV2Router 一样根据不同交易场景拆分为了那么多函数&#xff0c;UniswapV3 的 SwapRouter 核心就只有 4 个交易函数&#xff1a; exactInputSingle&#xff1a;指…

华为机试HJ34图片整理

华为机试HJ34图片整理 题目&#xff1a; 想法&#xff1a; 将输入的字符串中每个字符都转为ASCII码&#xff0c;再通过快速排序进行排序并输出 input_str input() input_list [int(ord(l)) for l in input_str]def partition(arr, low, high):i low - 1pivot arr[high]f…

matlab 有倾斜的椭圆函数图像绘制

matlab 有倾斜的椭圆函数图像绘制 有倾斜的椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 &#xff08;负向&#xff09;绘制结果 x^2 y^2 - xy 1 &#xff08;正向&#xff09;绘制结果 有倾斜的椭圆函数图像绘制 为了确定椭圆的长轴和短轴的…

【Python】MacBook M系列芯片Anaconda下载Pytorch,并开发一个简单的数字识别代码(附带踩坑记录)

文章目录 配置镜像源下载Pytorch验证使用Pytorch进行数字识别 配置镜像源 Anaconda下载完毕之后&#xff0c;有两种方式下载pytorch&#xff0c;一种是用页面可视化的方式去下载&#xff0c;另一种方式就是直接用命令行工具去下载。 但是由于默认的Anaconda走的是外网&#x…

9 redis,memcached,nginx网络组件

课程目标: 1.网络模块要处理哪些事情 2.reactor是怎么处理这些事情的 3.reactor怎么封装 4.网络模块与业务逻辑的关系 5.怎么优化reactor? io函数 函数调用 都有两个作用:io检测 是否就绪 io操作 1. int clientfd = accept(listenfd, &addr, &len); 检测 全连接队列…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术&#xff0c;允许组件之间进行松耦合通信。通过使用事件监听机制&#xff0c;应用程序的各个组件可以在其他组件不直接引用的情况下&#xff0c;相互发送和接受消息。 需求 在技术派中有这样一个需求&#xff0c;当发布文章或…

简单分享下python多态

目录&#xff1a; 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 二、基础的实例 三、多态的优势与应用场景 四、深入理解 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 多态&#xff08;Polymorphism&…

如何利用算法优化广告效果

效果广告以超过67%的占比&#xff0c;成为了中国互联网广告预算的大头。在BAT、字节等大的媒体平台上&#xff0c;效果广告以CPC实时竞价广告为主。在这种广告产品的投放中&#xff0c;广告主或其代理公司通过针对每个广告点击出价&#xff0c;系统自动把这些点击出价换算成eCP…

【人工智能】-- 智能机器人

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;机器人介绍 &#x1f348;机器人硬件 &#x1f34d;机械结构 &#x1f34d;传感器 &#x1f34d;控…

nginx配置尝试

from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse, FileResponse, HTMLResponse import logging import os from datetime import datetime import uvicorn# 初始化日志 logging.basicConfig(filenamefile_server.lo…

学java的第3天 后端商城小程序工作

1.数据库的大坑 特殊字段名 ’我的图片表中有一个字段是描述我写成desc了&#xff0c;正好是mysql中的关键字 就不能使用了 2.后端编写 2.1可以把请求分开 在商品浏览页中 只显示商品的大致信息 当用户再点击其他按钮时在发出请求 2.2把请求合并 把数据整合到一起 利用ass…

SpringBoot环境集成 sms4j短信聚合

SpringBoot环境集成 sms4j短信聚合 官方文档 前言 在正式使用sms4j短信功能之前&#xff0c;请详细阅读本文档&#xff0c;依照本篇流程进行操作和配给&#xff0c;即可解决大部分问题&#xff0c;如对我们的文档有建议&#xff0c;请联系开发者团队&#xff0c; 我们将根据可…

电脑为什么会提示丢失msvcp140.dll?怎么修复msvcp140.dll文件会靠谱点

电脑为什么会提示丢失msvcp140.dll&#xff1f;其实只要你的msvcp140.dll文件一损坏&#xff0c;然而你的电脑程序需要运用到这个msvcp140.dll文件的时候&#xff0c;就回提示你丢失了msvcp140.dll文件&#xff01;因为没有这个文件&#xff0c;你的很多程序都用不了的。今天我…

电脑录歌用什么软件好?分享电脑录音软件:6款

短视频普遍的今天&#xff0c;越来越多的人喜欢通过电脑进行音乐创作和录制。然而&#xff0c;面对市面上琳琅满目的电脑录音软件&#xff0c;很多人可能会感到困惑&#xff1a;电脑录歌用什么软件好呢&#xff1f;本文将为大家分享六款精选的录音软件&#xff0c;帮助大家找到…

【matlab】分类回归——智能优化算法优化径向基神经网络

目录 径向基&#xff08;Radial Basis Function, RBF&#xff09;神经网络 一、基本概念 二、网络结构 三、工作原理 四、学习算法 五、优点与应用 六、与BP神经网络的比较 智能优化算法 常见的智能优化算法 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#…

品牌推广的核心价值:作用解析与意义探讨!

在激烈的市场竞争环境之下&#xff0c;品牌推广已经成为企业不可缺少的一部分。不仅关乎企业的知名度&#xff0c;对市场份额更是起到了决定性的作用。 作为一名手工酸奶品牌的创始人&#xff0c;目前全国也复制了100多家门店&#xff0c;这篇文章&#xff0c;我将和大家分享品…

浪潮信息携手算力企业为华东产业集群布局提供高质量算力支撑

随着信息技术的飞速发展&#xff0c;算力已成为推动数字经济发展的核心力量。近日&#xff0c;浪潮信息与五家领先的算力运营公司在南京正式签署战略合作协议&#xff0c;共同加速华东地区智算基础设施布局&#xff0c;为区域经济发展注入新动力。 进击的算力 江苏持续加码智算…

【C语言】指针(1):入门理解篇

目录 一、内存和地址 1.1内存 1.2 深入理解计算机编址 二、指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解应用操作符 2.2.1 指针变量 2.2.2 解引用操作符 2.3指针变量的大小 三、指针变量类型的意义 3.1 指针的解引用 3.1指针-整数…

2024 年 6 月区块链游戏研报:Pixels 引发 DAU 波动,行业用户留存率差异显著

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;区块链游戏研究页面 2024 年 6 月&#xff0c;加密货币市场遭遇显著回调&#xff0c;比特币跌幅达 7.3%&#xff0c;以太坊更是下跌了 9.8%。此番波动不可避免地波及区块链游戏领域&#xff0c;导致…

C语言 do while 循环语句练习 中

练习&#xff1a; 4.编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 // 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 //welcome to china!!! //w ! //we !! //wel !!! //.... //welco…