C语言图书管理系统

一,开发环境

  1. 操作系统:windows10, windows11, linux, mac等。
  2. 开发工具:Qt, vscode, visual studio等
  3. 开发语言:c

二,功能需求

在这里插入图片描述

1. 图书信息管理:

这个功能的主要任务是保存和管理图书的所有信息。这应该包括:

  • 添加新书:输入新书的信息,包括书名、作者、出版社、ISBN、库存数量等,并将其添加到数据库中。
  • 修改书籍信息:如果书籍的某些信息需要更改(例如库存数量或作者信息),应能够找到特定的书籍并修改其信息。
  • 删除书籍:如果某本书不再被库存,应能够从数据库中完全删除该书的所有信息。

2. 图书查询功能:

这个功能应该让用户根据各种不同的信息查找书籍。这可以包括:

  • 书名查询:输入书名,返回所有与之匹配的书籍。
  • 作者查询:输入作者的名字,返回所有该作者的书籍。
  • 出版社查询:输入出版社的名字,返回所有由该出版社出版的书籍。
  • ISBN查询:输入ISBN号,返回对应的书籍。

三,功能设计

1. 主菜单

当用户启动程序时,他们将首先看到主菜单。主菜单将包括以下选项:
欢迎来到图书管理系统!请选择一个操作:

1. 添加新书
2. 修改书籍信息
3. 删除书籍
4. 查询书籍
5. 退出程序
请输入你的选择(1-5):
  • 用户可以通过输入数字选择一个操作。

2. 添加新书

当用户选择添加新书时,他们将需要输入书的详细信息。例如:

请输入书的详细信息:
书名:
作者:
出版社:
ISBN:
库存数量:

程序将根据用户输入的信息创建一个新的书籍记录,并将其添加到文件中。

3. 修改书籍信息

当用户选择修改书籍信息时,他们首先需要通过某种方式找到要修改的书。例如,程序可以让他们输入书名或ISBN来找到书。然后,他们可以选择要修改的信息,并输入新的值。例如:

请输入要修改的书的ISBN:
请输入要修改的信息(书名、作者、出版社、ISBN、库存数量):
请输入新的值:

程序将更新文件中的对应记录。

4. 删除书籍

当用户选择删除书籍时,他们同样需要先找到要删除的书,然后程序将删除对应的记录。例如:

请输入要删除的书的ISBN:
你确定要删除这本书吗?(yes/no):

5. 查询书籍

当用户选择查询书籍时,他们将需要选择查询方式(书名、作者、出版社或ISBN),然后输入查询条件。例如:

请选择查询方式(书名、作者、出版社、ISBN):
请输入查询条件:

程序将在文件中查找匹配的书籍,并显示它们的详细信息。

6. 退出程序

当用户选择退出程序时,程序将结束。

四,代码目录

1. 目录结构

BookManagementSystem/ # 项目根目录
├── CMakeLists.txt # CMake的主配置文件
├── src/ # 源代码目录
│ ├── main.c # 主程序文件
│ ├── book_management.c # 图书管理相关的函数实现
│ └── book_management.h # 图书管理相关的函数声明
├── data/ # 存放数据文件的目录
│ └── books.txt # 存储图书信息的文件
└── build/ # 存放编译结果的目录

2. 生成目录脚本

仅限linux系统使用

#!/bin/bash
# 创建目录结构
mkdir -p BookManagementSystem/src
mkdir -p BookManagementSystem/data
mkdir -p BookManagementSystem/build# 创建CMakeLists.txt文件
cat << EOF > BookManagementSystem/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(BookManagementSystem)# 设置C语言标准
set(CMAKE_C_STANDARD 11)# 添加你的源代码文件
add_executable(BookManagementSystem src/main.c src/book_management.c)# 如果需要链接其他库,使用target_link_libraries
# target_link_libraries(BookManagementSystem your_library)
EOF# 创建空的源代码文件
touch BookManagementSystem/src/main.c
touch BookManagementSystem/src/book_management.c
touch BookManagementSystem/src/book_management.h# 创建存储书籍信息的空文件
touch BookManagementSystem/data/books.txt# 提示
echo "目录结构已创建。请在BookManagementSystem目录下开始你的项目。"

五,源代码

book_management.h

#ifndef BOOK_MANAGEMENT_GUARD__H 
#define BOOK_MANAGEMENT_GUARD__H#include <stdio.h>typedef struct _Book {char title[100];char author[50];char publisher[50];char isbn[14];int quantity;
} Book;int add_new_book(const Book *book);
int delete_book(const char *isbn);
int modify_book(const char *isbn, const Book *book);
int search_books(const char *query, Book *result, int size);
int load_books(Book **books, int *size);
int save_books(const Book *books, int size);#endif

book_management.c

#include "book_management.h"
#include <stdlib.h>
#include <string.h>int add_new_book(const Book *book) {Book *books;int size;load_books(&books, &size);books = realloc(books, (size + 1) * sizeof(Book));books[size] = *book;size++;save_books(books, size);free(books);return 0;
}int load_books(Book **books, int *size) {FILE *file = fopen("../data/books.txt", "r");if (file == NULL) {printf("无法打开文件!\n");return -1;}*books = NULL;*size = 0;Book book;while (fscanf(file, "%[^,],%[^,],%[^,],%[^,],%d\n", book.title, book.author, book.publisher, book.isbn, &book.quantity) != EOF) {*books = realloc(*books, (*size + 1) * sizeof(Book));(*books)[*size] = book;(*size)++;}fclose(file);return 0;
}int modify_book(const char *isbn, const Book *book) {Book *books;int size;load_books(&books, &size);for (int i = 0; i < size; i++) {if (strcmp(books[i].isbn, isbn) == 0) {books[i] = *book;break;}}save_books(books, size);free(books);return 0;
}int delete_book(const char *isbn) {Book *books;int size;load_books(&books, &size);int index = -1;for (int i = 0; i < size; i++) {if (strcmp(books[i].isbn, isbn) == 0) {index = i;break;}}if (index != -1) {for (int i = index; i < size - 1; i++) {books[i] = books[i + 1];}size--;}save_books(books, size);free(books);return 0;
}int search_books(const char *query, Book *result, int size) {Book *books;int books_size;load_books(&books, &books_size);int count = 0;for (int i = 0; i < books_size; i++) {if (strstr(books[i].title, query) != NULL ||strstr(books[i].author, query) != NULL ||strstr(books[i].publisher, query) != NULL ||strstr(books[i].isbn, query) != NULL) {if (count < size) {result[count++] = books[i];} else {break;}}}free(books);return count;
}int save_books(const Book *books, int size) {FILE *file = fopen("../data/books.txt", "w");if (file == NULL) {printf("无法打开文件!\n");return -1;}for (int i = 0; i < size; i++) {fprintf(file, "%s,%s,%s,%s,%d\n",books[i].title,books[i].author,books[i].publisher,books[i].isbn,books[i].quantity);}fclose(file);return 0;
}

main.c

#include "book_management.h"void print_menu() {printf("\n=== 图书管理系统 ===\n");printf("1. 添加图书\n");printf("2. 删除图书\n");printf("3. 修改图书信息\n");printf("4. 查找图书\n");printf("5. 展示所有图书\n");printf("6. 退出\n");printf("===================\n");printf("请选择你的操作: ");
}void add_book() {Book book;printf("请输入书名: ");scanf("%s", book.title);printf("请输入作者名: ");scanf("%s", book.author);printf("请输入出版社: ");scanf("%s", book.publisher);printf("请输入ISBN: ");scanf("%s", book.isbn);printf("请输入库存量: ");scanf("%d", &book.quantity);add_new_book(&book);
}void remove_book() {char isbn[14];printf("请输入你想要删除的图书的ISBN: ");scanf("%s", isbn);delete_book(isbn);
}void update_book() {char isbn[14];printf("请输入你想要修改的图书的ISBN: ");scanf("%s", isbn);Book book;printf("请输入新的书名: ");scanf("%s", book.title);printf("请输入新的作者名: ");scanf("%s", book.author);printf("请输入新的出版社: ");scanf("%s", book.publisher);printf("请输入新的库存量: ");scanf("%d", &book.quantity);modify_book(isbn, &book);
}void find_book() {char query[100];printf("请输入你的查询: ");scanf("%s", query);Book books[10];int size = search_books(query, books, 10);if (size == 0) {printf("未找到相关图书。\n");} else {printf("找到以下图书:\n");for (int i = 0; i < size; i++) {printf("%s by %s, published by %s, ISBN: %s, quantity: %d\n",books[i].title, books[i].author, books[i].publisher, books[i].isbn, books[i].quantity);}}
}void show_all_books() {Book *books;int size;load_books(&books, &size);printf("图书库中的所有图书:\n");for (int i = 0; i < size; i++) {printf("%s by %s, published by %s, ISBN: %s, quantity: %d\n",books[i].title, books[i].author, books[i].publisher, books[i].isbn, books[i].quantity);}free(books);
}int main() {while (1) {print_menu();int option;scanf("%d", &option);switch (option) {case 1:add_book();break;case 2:remove_book();break;case 3:update_book();break;case 4:find_book();break;case 5:show_all_books();break;case 6:printf("谢谢使用,再见!\n");return 0;default:printf("未知选项!\n");break;}}return 0;
}

books.txt

《红楼梦》,曹雪芹,人民文学出版社,9787020002207,10
《西游记》,吴承恩,人民文学出版社,9787020008728,15
《三国演义》,罗贯中,人民文学出版社,9787020008483,12
《水浒传》,施耐庵,人民文学出版社,9787020008728,20
《围城》,钱钟书,人民文学出版社,9787020002207,7
《活着》,余华,作家出版社,9787506365437,10
《平凡的世界》,路遥,人民文学出版社,9787020063155,9
《百年孤独》,加西亚·马尔克斯,南海出版公司,9787544253994,151984,乔治·奥威尔,北京十月文艺出版社,9787530216274,12
《动物农场》,乔治·奥威尔,人民文学出版社,9787020002207,8

六,界面展示

在这里插入图片描述

七,项目资料

项目的资料及代码已整理打包,有需要可取,也可定制开发。后续会分享c,c++,qt,python等语言的更多项目,感谢关注。v:clzicheng

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

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

相关文章

数据库多表查询作业

数据库多表查询作业 创建数据库 插入数据 mysql> insert into student values(901,张老大,男,1985,计算机系,北京市海淀区),-> (902,张老二,男,1986,中文系,北京市昌平市),-> (903,张三,女,1990,中文系,湖南省永州市), -…

opencv实战--角度测量和二维码条形码识别

文章目录 前言一、鼠标点击的角度测量二、二维码条形码识别 前言 一、鼠标点击的角度测量 首先导入一个带有角度的照片 然后下面的代码注册了一个鼠标按下的回调函数&#xff0c; 还有一个点的数列&#xff0c;鼠标事件为按下的时候就记录点&#xff0c;并画出点&#xff0c;…

【软件测试】Git 远程仓库的使用(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 查看远程仓库 想…

SQL性能规范

一、随聊 记录一下吧&#xff0c;2023年7月13日00:11:11&#xff0c;现在的状态真的很&#xff0c;忙&#xff0c;干不完的活&#xff0c;希望巨大的压力&#xff0c;能够让自己快速成长&#xff0c;回想我这一路&#xff0c;21年大专毕业&#xff0c;用一年时间熟悉软件&…

STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066

STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 Proteus仿真小实验&#xff1a; STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器DHT11温度湿度电位器模拟…

golang中的【数组】相关知识点

目录 数组含义数组定义形式数组的声明初始化方式数组变量的类型 arr的特征数组的遍历遍历的用法二数组的值传递数组的引用&取地址 传送二维数组的相关操作定义二维数组初始化遍历 Golang是一种高效的编程语言&#xff0c;具有很多特性和优点&#xff0c;其中之一就是其对数…

RNN、LSTM、Seq2Seq

目录 时间序列表示梯度弥散和梯度爆炸RNN&#xff08;循环神经网络&#xff09;LSTMSeq2SeqELMo 时间序列表示 核心是加入历史信息去预测下一步骤 在NLP中&#xff0c;序列维度一般是这个样子:[b,seq_len,feature_len] b个句子&#xff0c;每个句子seq_len个单词&#xff0c;…

【复习10-12天内容】【我们一起60天准备考研算法面试(大全)-第十四天 14/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

OK3588运行python程序对摄像头数据进行图像处理

OK3588运行python程序读取usb摄像头 硬件连接用工具测试验证摄像头工作正常python 读取usb摄像头并进行图像处理 硬件连接 把usb摄像头插入HOST的usb接口。 在串口终端运行 sudo v4l2-ctl --list-devices 如下图 当前的usb设备是 /dev/video74 用工具测试验证摄像头工作正常…

贪心算法、贪心搜索/采样(greedy search/sampling)、集束搜索(beam search)、随机采样(random sample)

首先需要了解贪心算法&#xff1a; 贪心算法&#xff0c;又名贪婪法&#xff0c;是寻找最优解问题的常用方法&#xff0c;这种方法模式一般将求解过程分成若干个步骤&#xff0c;但每个步骤都应用贪心原则&#xff0c;选取当前状态下最好/最优的选择&#xff08;局部最有利的选…

Android之Intent

意图介绍 一个意图(Intent)对象包含了目标组件、动作、数据、类别、附加数据、标志六个部分。 目标组件 目标组件可以帮助应用发送显式意图调用请求。在创建Intent时&#xff0c;可以通过setComponent方法来设置一个组件&#xff0c;如&#xff1a; //设置组件 intent.setC…

LRU 缓存

题目链接 LRU 缓存 题目描述 注意点 如果插入操作导致关键字数量超过 capacity &#xff0c;则应该 逐出 最久未使用的关键字函数 get 和 put 必须以 O(1) 的平均时间复杂度运行 解答思路 如果想以O(1)的速度进行get&#xff0c;则需要将对应的key、value存到map中如果想…

​ 基于单片机智能温室大棚控制系统

功能介绍 以51单片机作为主控系统&#xff1b; DS18B20温度采集模块检测温度&#xff1b; 光敏电阻和ADC0832组成的光照检测模块&#xff1b; 土壤湿度检测模块检测土壤湿度&#xff1b; CO2检测模块检测CO2浓度&#xff1b; LCD1602显示模块显示测量值、 若温度小于温度最…

【2023江西省研究生数学建模竞赛】第三题 植物的多样性 48页论文及Python代码

【2023江西省研究生数学建模竞赛】第三题 植物的多样性 48页论文及Python代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【2…

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 这两个都是博主在学习Linux操作系统过程中的记录&#xff0c;希望对大家的学习有帮助&#xff01; 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…

【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

一、说明 受限玻尔兹曼机&#xff08;Restricted Boltzmann Machine&#xff0c;RBM&#xff09;是一种基于能量模型的人工神经网络。它只有一个隐层&#xff0c;将输入层和隐层中的每个神经元互相连接&#xff0c;但不同层的神经元之间没有连接。RBM是一种无向的概率图模型&am…

一套完全开源,支持多租户,界面配置单点的后端框架JVS

JVS的多租户体系统 在IT系统中&#xff0c;“租户”&#xff08;tenant&#xff09;通常用于指代一种多租户架构&#xff08;multi-tenancy&#xff09;&#xff0c;它是一种软件架构模式&#xff0c;允许多个用户或组织共享相同的应用程序或系统实例&#xff0c;但彼此之间的…

7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

文章目录 前言一、定义注解annotation二、拦截角色注解1. 在拦截器哪里拦截&#xff1f;2. 如何拦截角色注解&#xff1f;3. 角色如何读取?4. 最后做角色校验 三、应用&#xff1a;给管理员操作接口加注解四、PostMan测试最后 前言 在【7.1】管理员图书录入和修改API&#xf…

JMeter 中 3 种参数值的传递

目录 前言&#xff1a; (一) 从 CSV 文件读取要批量输入的变量 (二) 利用 Cookie 进行值的传递 (三) 利用正则匹配提取上一个接口的返回数据作为下个请求的输入 前言&#xff1a; 在JMeter中&#xff0c;参数值的传递是非常重要的&#xff0c;因为它允许你在测试过程中动态…

右键pdf文件没有打印

问题描述 右键点pdf文件&#xff0c;弹出的菜单找不到打印选项。网上找了很多办法&#xff0c;然并卵啊。还是得靠自己慢慢摸索。 原因分析 新安装的win11系统&#xff0c;pdf文件默认可以用windows自带的edge浏览器打开。但是edge浏览器没有能力提供右键打印功能。 解决办法…