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

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

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

相关文章

(超级详细)如何在Mac OS上的VScode中配置OpenGL环境并编译

文章目录 安装环境下载GLAD与GLFW一、下载GLAD二、下载GLFW 项目结构配置测试程序与项目的编译测试可执行文件HelloGL 安装环境 机器&#xff1a;macbook air 芯片&#xff1a; M1芯片&#xff08;arm64&#xff09; macOS&#xff1a;macOS Ventura 13.4 VScode version&#…

天台玻璃折叠门可实现室内外空间的无缝连接

天玻璃折叠门是指安装在天台上的可折叠开合的玻璃门&#xff0c;可用于将室外空间与室内空间进行隔离或连接。设计天台玻璃折叠门时需要注意以下几点&#xff1a; 1. 结构稳固性&#xff1a;选择坚固、稳定的材料和结构设计&#xff0c;确保门体在风力和其他外力作用下不易摇晃…

HTTP第18讲——HTTP的缓存控制

诞生背景 由于链路漫长&#xff0c;网络时延不可控&#xff0c;浏览器使用 HTTP 获取资源的成本较高。所以&#xff0c;非常有必要把“来之不易”的数据缓存起来&#xff0c;下次再请求的时候尽可能地复用。这样&#xff0c;就可以避免多次请求 - 应答的通信成本&#xff0c;节…

37.RocketMQ之Broker消息存储源码分析

highlight: arduino-light 消息存储文件 rocketMQ的消息持久化在我们在搭建集群时都特意指定的文件存储路径,进入指定的store目录下就可以看到。 下面介绍各文件含义 CommitLog 存储消息的元数据。produce发出的所有消息都会顺序存入到CommitLog文件当中。 CommitLog由多个文件…

哈达玛矩阵乘法

哈达玛矩阵乘法 作者: 赵晓鹏时间限制: 1S章节: 递归与分治 输入说明 : 见问题描述。 输出说明 : 见问题描述。 输入范例 : 1 4 -6 输出范例 : -2 10 #include <iostream> #include <vector> using namespace std; vector<int>res; void cal(int len…

SpringBoot2+Vue2实战(十六)vue集成视频播放组件

修改文件上传大小限制 servlet:multipart:max-file-size: 100MBmax-request-size: 100MB Video.vue <template><div style"padding: 10px"><el-card><div v-for"item in videos" :key"item.id"style"margin: 10px 0…

8266使用巴法云OTA

为了使用方便把OTA封装一下为以下类 #include "ESP8266HTTPUpdate.h"class OTA { private:ESP8266HTTPUpdate httpUpdate;// using HTTPUpdateStartCB std::function<void()>;void OnStartCB(){Serial.println("开始OTA升级");}// using HTTPUpdat…

OpenCV图像金字塔pyrDown下采样

#include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {// Load the original imageMat srcImage

Jina AI 受邀出席 WAIC 2023「科技无障碍」论坛,与行业专家共话 AI 普惠未来

7 月 6 日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;在上海世博中心及世博展览馆开幕&#xff0c;并在浦东张江、徐汇西岸设分会场&#xff0c;同步在闵行等产业集聚区开展同期活动。本届大会由上海市人民政府和国家发改委、工信部、科技部、国家网信办、…

【群智能算法】猎人猎物优化算法 HPO算法【Matlab代码#48】

文章目录 【获取资源请见文章第4节&#xff1a;资源获取】1. 猎人猎物优化算法&#xff08;HPO&#xff09;2. 部分代码展示3. 仿真结果展示4. 资源获取说明 【获取资源请见文章第4节&#xff1a;资源获取】 1. 猎人猎物优化算法&#xff08;HPO&#xff09; 猎人猎物优化算法…

【小沐学C++】libcurl实现HTTP/HTTPS请求

文章目录 1、简介2、下载和编译2.1 下载2.2 编译2.3 使用 3、命令行测试3.1 获取文件头Headers3.2 请求内容Request Content3.3 响应内容Response Content3.4 GET请求3.5 POST请求3.6 其他 4、代码测试3.1 simple.c3.2 url2file.c3.3 simplepost.c3.4 resolve.c3.5 progressfun…

Java语言程序设计试卷6套

目录 Java语言程序设计试卷1 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷2 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷3 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷4 一、单项选择题 二、多项选…

PROFINET转ETHERNET/IP网关西门子通讯协议profinet

大家好&#xff0c;今天我们来聊一款令人兴奋的产品——远创智控YC-PN-EIP&#xff01;它是一款自主研发的 PROFINET 从站功能的通讯网关&#xff0c;可以将 PROFINET网络和ETHERNET/IP 网络连接起来&#xff0c;实现数据传输和交换。但这只是它的基础功能&#xff0c;它还有哪…

HTTP与HTTPS

HTTP与HTTPS介绍 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息&#xff0c;HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息&…

【面试题27】Redis中的connect和pconnect如何使用,有什么区别

文章目录 一、背景二、connect函数三、pconnect函数四、区别和使用场景五、总结 一、背景 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 Redis是一个开…

协议逆向工程(图

协议逆向工程流程图 协议状态机推断的一般示例 状态机方法时间轴

Acwing.859 Kruskal算法求最小生成树(Kruskal算法)

题目 给定一个n个点m条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出impossible。 给定一张边带权的无向图G(V,E)&#xff0c;其中V表示图中点的集合&#xff0c;E表示图中边…

全网首发,Python解决某象滑动还原验证码100%还原

与一般的滑动验证码不同,某象的滑动还原验证码是将图像上下两块分割,然后在随机一块往右移动,将两块拼图移动成完整的图像才算成功,事实上,解决这类验证码比普通的验证码还要简单 数据集: 我随机采集了某象任意张数据集,将其标注好,top和down代表的是原图中上面还是下面…

嵌入式开发之串口通讯

串口通信(Serial Communication)&#xff0c; 是指外设和计算机间&#xff0c;通过数据信号线 、地线、控制线等&#xff0c;按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少&#xff0c;在远距离通信中可以节约通信成本&#xff0c;但其传输速度比并行传输低&…

前后端实现导出导入功能

目录 导出 1.后端代码 &#xff08;1&#xff09;相关依赖 &#xff08;2&#xff09;自定义实体类 &#xff08;3&#xff09;写一个查询方法list &#xff08;4&#xff09;写导出接口 2.前端代码 3.效果示例 导入 1.后端代码 &#xff08;1&#xff09;写导入接口 …