C语言课程设计题目三:图书管理系统设计

news2024/11/17 20:23:13

题目三:图书管理系统设计
图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。
主要功能:

  • 新进图书基本信息的输入。
  • 图书基本信息的查询。
  • 对撤销图书信息的删除。
  • 为借书人办理注册。
  • 办理借书手续。
  • 办理还书手续
    要求: 使用二进制文件方式存储数据,系统以菜单方式工作。

图书基本信息的查询
首先展示所有图书信息,再提供两个选项:1,根据图书名称查询图书;2,根据作者查询图书信息

booksManagementSystem.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

#define MAX_BOOKS 100
#define MAX_PEOPLE 100
#define BOOKS_FILE_NAME "books.bin"
#define PEOPLE_FILE_NAME "people.bin"

// 定义图书结构体
typedef struct {
    char name[50];         // 图书名称
    int number;            // 图书编号
    double price;          // 单价
    char author[50];       // 作者
    int status;            // 存在状态:0 表示可借,1 表示已借出
    char borrowerName[50]; // 借书人姓名
    char borrowerGender[10];// 借书人性别
    int borrowerID;        // 借书人学号
} Book;

// 定义借书人结构体
typedef struct {
    char name[50];     // 姓名
    char gender[10];   // 性别
    int studentID;     // 学号
} Person;

// 打印图书信息
void printBook(Book book);
// 打印借书人信息
void printPerson(Person person);
// 添加新图书的基本信息
void addBook(Book* books, int* count);
// 查询图书信息
void searchBook(Book* books, int count);
// 按书名查询图书信息
void searchBookByName(Book* books, int count);
// 按作者查询图书信息
void searchBookByAuthor(Book* books, int count);
// 删除指定编号的图书信息
void deleteBookByNumber(Book* books, int* count);
// 注册借书人信息
void registerBorrower(Person* people, int* count);
// 办理借书手续
void borrowBook(Book* books, int count, Person* people, int peopleCount);
// 办理还书手续
void returnBook(Book* books, int count);
// 查看所有借书人信息
void viewBorrowers(Person* people, int count);
// 将图书信息保存到文件
void saveBooksToFile(Book* books, int count);
// 从文件加载图书信息
void loadBooksFromFile(Book* books, int* count);
// 将借书人信息保存到文件
void savePeopleToFile(Person* people, int count);
// 从文件加载借书人信息
void loadPeopleFromFile(Person* people, int* count);

//菜单
void menu();

booksManagementSystem.c

#include"booksManagementSystem.h"

// 打印图书信息
void printBook(Book book) {
    printf("图书名称: %s\n", book.name);
    printf("图书编号: %d\n", book.number);
    printf("单价: %.2f\n", book.price);
    printf("作者: %s\n", book.author);
    if (book.status == 0) {
        printf("状态: 可借\n");
    }
    else {
        printf("状态: 已借出\n");
        printf("借书人姓名: %s\n", book.borrowerName);
        printf("借书人性别: %s\n", book.borrowerGender);
        printf("借书人学号: %d\n", book.borrowerID);
    }
    printf("\n");
}
// 打印借书人信息
void printPerson(Person person) {
    printf("姓名: %s\n", person.name);
    printf("性别: %s\n", person.gender);
    printf("学号: %d\n", person.studentID);
    printf("\n");
}
// 添加新图书的基本信息
void addBook(Book* books, int* count) {
    if (*count >= MAX_BOOKS) {
        printf("已达到最大容量,无法添加更多图书。\n");
        return;
    }
    Book* book = &books[*count];

    printf("请输入图书名称: ");
    scanf("%s", book->name);

    printf("请输入图书编号: ");
    scanf("%d", &book->number);

    printf("请输入单价: ");
    scanf("%lf", &book->price);

    printf("请输入作者: ");
    scanf("%s", book->author);

    book->status = 0; // 默认可借
    book->borrowerName[0] = '\0';
    book->borrowerGender[0] = '\0';
    book->borrowerID = 0;

    (*count)++;
    printf("图书信息录入成功\n");
}
// 查询图书信息
void searchBook(Book* books, int count) {
    printf("\n所有图书信息:\n");
    for (int i = 0; i < count; i++) {
        printBook(books[i]);
    }

    int choice;
    printf("\n请选择查询方式 (1-2):\n");
    printf("1. 根据图书名称查询\n");
    printf("2. 根据作者查询\n");
    printf("按其他为无效选择,返回上级菜单。\n");
    printf("请选择 (1-2): ");
    scanf("%d", &choice);

    switch (choice) {
    case 1:
        searchBookByName(books, count);
        break;
    case 2:
        searchBookByAuthor(books, count);
        break;
    default:
        printf("无效的选择,请重新选择。\n");
    }
}
// 按书名查询图书信息
void searchBookByName(Book* books, int count) {
    char name[50];
    printf("请输入书名进行查询: ");
    scanf("%s", name);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (strcmp(books[i].name, name) == 0) {
            printBook(books[i]);
            found = 1;
        }
    }
    if (!found) {
        printf("没有找到符合条件的图书。\n");
    }
}
// 按作者查询图书信息
void searchBookByAuthor(Book* books, int count) {
    char author[50];
    printf("请输入作者进行查询: ");
    scanf("%s", author);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (strcmp(books[i].author, author) == 0) {
            printBook(books[i]);
            found = 1;
        }
    }
    if (!found) {
        printf("没有找到符合条件的图书。\n");
    }
}
// 删除指定编号的图书信息
void deleteBookByNumber(Book* books, int* count) {
    int number;
    printf("请输入要删除的图书编号: ");
    scanf("%d", &number);

    int deleted = 0;
    for (int i = 0; i < *count; i++) {
        if (books[i].number == number) {
            for (int j = i; j < *count - 1; j++) {
                books[j] = books[j + 1];
            }
            (*count)--;
            printf("图书编号 %d 的图书信息已经删除。\n", number);
            deleted = 1;
            break;
        }
    }
    if (!deleted) {
        printf("没有找到符合条件的图书信息。\n");
    }
}
// 注册借书人信息
void registerBorrower(Person* people, int* count) {
    if (*count >= MAX_PEOPLE) {
        printf("已达到最大容量,无法添加更多借书人。\n");
        return;
    }
    Person* person = &people[*count];

    printf("请输入借书人姓名: ");
    scanf("%s", person->name);

    printf("请输入借书人性别: ");
    scanf("%s", person->gender);

    printf("请输入借书人学号: ");
    scanf("%d", &person->studentID);

    (*count)++;
    printf("借书人信息录入成功\n");
}
// 办理借书手续
void borrowBook(Book* books, int count, Person* people, int peopleCount) {
    int number;
    printf("请输入要借的图书编号: ");
    scanf("%d", &number);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (books[i].number == number && books[i].status == 0) {
            printf("请输入借书人学号: ");
            int studentID;
            scanf("%d", &studentID);

            int borrowerFound = 0;
            for (int j = 0; j < peopleCount; j++) {
                if (people[j].studentID == studentID) {
                    strcpy(books[i].borrowerName, people[j].name);
                    strcpy(books[i].borrowerGender, people[j].gender);
                    books[i].borrowerID = studentID;
                    books[i].status = 1;
                    printf("借书成功\n");
                    found = 1;
                    borrowerFound = 1;
                    break;
                }
            }

            if (!borrowerFound) {
                printf("没有找到该借书人信息。\n");
            }

            break;
        }
    }

    if (!found) {
        printf("没有找到符合条件的图书或图书已借出。\n");
    }
}
// 办理还书手续
void returnBook(Book* books, int count) {
    int number;
    printf("请输入要还的图书编号: ");
    scanf("%d", &number);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (books[i].number == number && books[i].status == 1) {
            books[i].status = 0;
            books[i].borrowerName[0] = '\0';
            books[i].borrowerGender[0] = '\0';
            books[i].borrowerID = 0;
            printf("还书成功\n");
            found = 1;
            break;
        }
    }

    if (!found) {
        printf("没有找到符合条件的图书或图书未借出。\n");
    }
}
// 查看所有借书人信息
void viewBorrowers(Person* people, int count) {
    if (count == 0) {
        printf("目前没有借书人信息。\n");
        return;
    }

    printf("借书人信息如下:\n");
    for (int i = 0; i < count; i++) {
        printPerson(people[i]);
    }
}
// 将图书信息保存到文件
void saveBooksToFile(Book* books, int count) {
    FILE* fp = fopen(BOOKS_FILE_NAME, "wb");
    if (fp == NULL) {
        printf("打开文件失败。\n");
        return;
    }

    fwrite(books, sizeof(Book), count, fp);
    fclose(fp);
    printf("图书信息保存成功。\n");
}
// 从文件加载图书信息
void loadBooksFromFile(Book* books, int* count) {
    FILE* fp = fopen(BOOKS_FILE_NAME, "rb");
    if (fp == NULL) {
        printf("打开文件失败。\n");
        return;
    }

    fseek(fp, 0, SEEK_END);
    *count = ftell(fp) / sizeof(Book);
    fseek(fp, 0, SEEK_SET);

    fread(books, sizeof(Book), *count, fp);
    fclose(fp);
    printf("图书信息加载成功。\n");
}
// 将借书人信息保存到文件
void savePeopleToFile(Person* people, int count) {
    FILE* fp = fopen(PEOPLE_FILE_NAME, "wb");
    if (fp == NULL) {
        printf("打开借书人文件失败。\n");
        return;
    }

    fwrite(people, sizeof(Person), count, fp);
    fclose(fp);
    printf("借书人信息保存成功。\n");
}
// 从文件加载借书人信息
void loadPeopleFromFile(Person* people, int* count) {
    FILE* fp = fopen(PEOPLE_FILE_NAME, "rb");
    if (fp == NULL) {
        printf("打开借书人文件失败。\n");
        return;
    }

    fseek(fp, 0, SEEK_END);
    *count = ftell(fp) / sizeof(Person);
    fseek(fp, 0, SEEK_SET);

    fread(people, sizeof(Person), *count, fp);
    fclose(fp);
    printf("借书人信息加载成功。\n");
}

void menu() {
    int choice;
    int bookCount = 0;
    int peopleCount = 0;
    Book books[MAX_BOOKS];
    Person people[MAX_PEOPLE];

    loadBooksFromFile(books, &bookCount);
    loadPeopleFromFile(people, &peopleCount);

    do {
        printf("\n");
        printf("+---------------------------+\n");
        printf("|        图书管理系统       |\n");
        printf("+---------------------------+\n");
        printf("| 1. 新进图书基本信息的输入 |\n");
        printf("| 2. 图书基本信息的查询     |\n");
        printf("| 3. 对撤销图书信息的删除   |\n");
        printf("| 4. 为借书人办理注册       |\n");
        printf("| 5. 办理借书手续           |\n");
        printf("| 6. 办理还书手续           |\n");
        printf("| 7. 查看借书人信息          |\n"); 
        printf("| 8. 保存并退出             |\n");
        printf("+---------------------------+\n");
        printf("请选择操作 (1-8): ");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            addBook(books, &bookCount);
            break;
        case 2:
            searchBook(books, bookCount);
            break;
        case 3:
            deleteBookByNumber(books, &bookCount);
            break;
        case 4:
            registerBorrower(people, &peopleCount);
            break;
        case 5:
            borrowBook(books, bookCount, people, peopleCount);
            break;
        case 6:
            returnBook(books, bookCount);
            break;
        case 7: 
            viewBorrowers(people, peopleCount);
            break;
        case 8:
            saveBooksToFile(books, bookCount);
            savePeopleToFile(people, peopleCount);
            printf("程序退出。\n");
            break;
        default:
            printf("无效的选择,请重新选择。\n");
        }
    } while (choice != 8);
}

test.c

#include"booksManagementSystem.h"

int main() {
    menu();
    return 0;
}

在这里插入图片描述

在这里插入图片描述

删除
在这里插入图片描述
注册,借书,还书
在这里插入图片描述
补充查询借书人信息,即借书人信息的保存和读取
在这里插入图片描述

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

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

相关文章

数据流处理技术与Flink框架

一数据流 数据流定义&#xff1a; 数据流&#xff08;Data Stream&#xff09;是指数据以连续不断的方式到达和处理的序列。在现实世界中&#xff0c;许多数据来源都是以流的形式存在&#xff0c;比如&#xff1a; 1. 用户行为&#xff1a;用户在网站上的点击流、移动应用中…

微软 Win11 RP 226x1.4247(KB5043145)预览版发布!

系统之家于9月25日发出最新报道&#xff0c;微软面向Release Preview频道的用户发布了Win11的KB5043145更新。系统更新后版本号提升为22621.4247和22631.4247。此次更新新增多项功能&#xff0c;例如用户播放媒体时&#xff0c;媒体控件会显示在锁屏中央的下部。以下跟随小编看…

LeetCode2207解题思路

题目描述 字符串中最多数目的子序列 解题思路&#xff1a; 题目要求我们找到在 text 中 找到最多可组成 pattern 的字符串个数&#xff0c;并且允许在 text 的任意位置插入 pattern 中一个字符&#xff0c;也就是说我们只需要考虑 text 中的 pattern 含有的字符即可。例如示例…

【React】组件基础使用

1. react组件 在react中&#xff0c;组件就是首字母大写的函数&#xff0c;内部存放了组件的逻辑、UI&#xff0c;渲染组件只需要把组件当成标签书写。 使用组件有两种方式&#xff1a;自闭和 、成对标签 function App() {// 定义组件function Component() {return <div&…

从入门到入土:计算机视觉CV学习路线图

在当今这个被数据和图像淹没的世界&#xff0c;计算机视觉&#xff08;CV&#xff09;正如一位聪明绝顶的魔术师&#xff0c;能够从无数的图像中提取出有意义的信息。对于那些初入这个领域的新人&#xff0c;学习计算机视觉既是一场冒险&#xff0c;也是一场盛宴。让我作为一位…

安科瑞诚邀您参加2024年CDCE国际数据中心及云计算展

展会邀请 安科瑞&#xff08;Acrel&#xff09;诚挚邀请您和您的公司代表参观我们在2024年CDCE国际数据中心及云计算展上的展位。 安科瑞&#xff08;Acrel&#xff09;是一家集研发、生产、销售和服务于一体的企业&#xff0c;成立于2003年并于2012年在创业板上市&#xff0…

探索机器人快换盘技术的未来之路:智能化与协作的革新

在当今快速发展的科技时代&#xff0c;机器人已成为众多领域不可或缺的得力助手。其中&#xff0c;机器人快换盘技术作为提升机器人灵活性和应用广度的重要技术&#xff0c;正经历着前所未有的变革与创新。下面请随我们一起深入探讨这一技术的未来发展趋势。 一、人工智能&…

建投数据获得安防工程企业设计施工维护能力证书(壹级)

近日&#xff0c;经中国安全防范产品行业协会审核&#xff0c;建投数据顺利获得安防工程企业设计施工维护能力证书&#xff08;壹级&#xff09;。 安防工程企业设计施工维护资质是对企业安防工程设计、施工、维护等领域专业能力的综合认证&#xff0c;是衡量企业规模、工程业绩…

阿里云百炼SFT微调实践

1. 场景识别 用户进行SFT前需要对应用场景进行识别和分析&#xff0c;一般进行模型微调的诉求是希望提升对应业务场景的能力&#xff0c;用户需要明确哪些能力是需要进行重点提升的。 场景划分上来讲&#xff0c;以垂类场景进行划分可分为教育、医疗、金融、法律、电商、旅游、…

IP地址的打卡路径是什么?

众多周知&#xff0c;IP地址使我们浏览网站的“必需品”&#xff0c;他会在我们进行网络活动时起到通关文牒一般的作用。那么&#xff0c;放我们进行网络活动时&#xff0c;我们的“通关文牒”上面会在哪些地点留下痕迹&#xff0c;IP地址的流转路径是什么&#xff1f; 第一关…

2024国庆节有哪些必囤的好物产品?一文了解那些入手不亏的国庆好物

国庆假期即将来临。对于追求品质生活的朋友们来说&#xff0c;这无疑是一个不容错过的购物机会。那么&#xff0c;在这个国庆&#xff0c;哪些好物值得你重点关注呢&#xff1f;我特地整理了一份推荐清单&#xff0c;这些产品不仅经过我的亲身体验&#xff0c;更以其卓越的实用…

建投数据自主研发相关系统获得欧拉操作系统及华为鲲鹏技术认证书

近日&#xff0c;经欧拉生态创新中心和华为技术有限公司测评&#xff0c;建投数据自主研发的投资项目管理系统、全面风险管理信息系统、商业不动产业务系统&#xff0c;完成了基于欧拉操作系统openEuler 22.03、华为鲲鹏Kunpeng 920&#xff08;Taisha 200&#xff09;的兼容性…

快速创建第一个Spring Boot 项目

一、介绍 Spring Boot 是一个开源的 Java 基础框架&#xff0c;它基于 Spring 框架&#xff0c;用于创建独立、生产级别的基于 Spring 的应用程序&#xff0c;你可以“跑起来”&#xff08;run&#xff09;你的 Spring 应用程序。Spring Boot 让基于 Spring 的应用开发变得更容…

Spring Boot 3.x 配置 Spring Doc以及导入postman带图详解

一、pom.xml配置 <!-- API⽂档⽣成&#xff0c;基于swagger3 --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.2</version></dependency>…

【简单介绍】DevOps是什么?

由于 DevOps 方法的广泛采用以及由此产生的快速产品交付和部署&#xff0c;许多部门已采用更敏捷的方法来开发生命周期。在满足市场速度和规模要求的同时&#xff0c;设计安全的软件一直是现代 IT 公司共同面临的问题。结果&#xff0c;超过 52% 的组织因为担心上市速度落后而放…

蛋白家族系列:FGF

成纤维细胞生长因子&#xff08;FGF&#xff09;是一种广谱有丝分裂原&#xff0c;作为多肽配体&#xff0c;可以旁分泌或内分泌方式发挥作用。FGF通过与成纤维细胞生长因子受体&#xff08;FGFR&#xff09;介导的信号轴刺激或维持代谢、组织稳态和发育所需的特定细胞功能。 &…

构建高可用和高防御力的云服务架构第四部分:REDIS(4/5)

本文的目的是深入探讨Redis在构建高可用和高防御力云服务架构中的应用。我们将分析Redis的工作原理、核心特性以及如何通过Redis优化云服务架构的性能和安全性。此外&#xff0c;我们还将提供实际案例和最佳实践&#xff0c;帮助读者更好地理解和应用Redis&#xff0c;以构建更…

双十一好货推荐有哪些?五大双十一种草好物推荐!

现在的双十一显然已经成为了品牌和消费者之间的重要交汇点。在这一天&#xff0c;各大电商平台推出了各种促销活动&#xff0c;让我们有机会买到心仪的商品。那么双十一好货推荐有哪些&#xff1f;为了帮助大家更好地把握这个特殊的购物时机&#xff0c;我们精心准备了五大双十…

如何准备秋招入行游戏开发?

如何准备秋招入行游戏开发? 秋招非常非常重要&#xff01;绝不能轻易错过&#xff01;&#xff01;! 早起的鸟儿有虫吃&#xff0c; 这句话对于企业和应届生双方而言都是适用的。 对于有校招需求的企业而言&#xff0c; 秋招是一年中规模最大的招聘项目之一&#xff0c; …

css-functions伪类选择器系列二

一张图浏览CSS Functions 概述 本文主要讲述CSS的部分伪类选择器第二篇&#xff0c;包括&#xff1a;:nth-child、:nth-last-child、:nth-of-type和:nth-last-of-type。 :nth-child() :nth-child伪类是根据父元素的子元素列表中的索引来选择元素。 语法 :nth-child是以一…