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

看我的C/C++笔记专栏

序号系统设计题目链接
1职工信息管理系统设计链接
2图书信息管理系统设计链接
3图书管理系统设计链接
4实验设备管理系统设计链接
5西文下拉菜单的设计链接
6学生信息管理系统设计链接
7学生成绩管理系统设计链接
8学生选修课程系统设计课程管理系统
9学生成绩记录簿设计链接
10学生籍贯信息记录簿设计链接
11学生通讯录管理系统设计链接
12职工工作量统计系统设计链接
13销售管理系统设计链接
14成绩管理系统设计链接
15通信录管理系统设计链接
16学生管理系统设计链接
17单项选择题标准化考试系统设计链接
18设计一个简单计算器链接
19编写一万年历系统链接
20模拟时钟转动程序链接
21完整的学生成绩管理系统链接
22数字加一游戏链接
23聊天机器人链接
24音乐小天才链接

题目二:图书信息管理系统设计

图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
设计图书信息管理系统,功能包括:

  1. 系统以菜单方式工作。
  2. 图书信息录入功能(图书信息用文件保存)--输入。
  3. 图书信息浏览功能--输出。
  4. 图书信息查询功能--算法。
    查询方式
    • 按书名查询。
    • 按作者名查询。
  5. 图书信息的删除与修改(可选项)。

bookManagement.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BOOKS 100  // 最大图书数量
#define FILE_NAME "books.txt"  // 文件名

// 定义图书结构体
typedef struct {
    int loginNo;      // 登录号
    char title[100];  // 书名
    char author[100]; // 作者名
    char category[50]; // 分类号
    char publisher[100]; // 出版单位
    char publicationDate[20]; // 出版时间
    double price;     // 价格
} Book;

// 函数声明
void showMenu();
void menu(Book* books, int* count);
void printBook(Book book);
void addBook(Book* books, int* count);
void displayBooks(Book* books, int count);
void searchByTitle(Book* books, int count);
void searchByAuthor(Book* books, int count);
void deleteByTitle(Book* books, int* count);
void deleteByAuthor(Book* books, int* count);
void deleteByLoginNo(Book* books, int* count);
void modifyByLoginNoAndTitle(Book* books, int count);
void saveToFile(Book* books, int count);
void loadFromFile(Book* books, int* count);

bookManagement.c

#include"bookManagement.h"
void showMenu() {
    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("|  9. 保存并退出                   |\n");
    printf("+----------------------------------+ \n");
    printf("请选择操作: ");
}
void menu(Book* books, int* count) {
    int choice;
    loadFromFile(books, count);  // 初始化时从文件加载图书信息
    while (1) {
        showMenu();
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            addBook(books, count);  // 添加图书信息
            break;
        case 2:
            displayBooks(books, *count);  // 显示所有图书信息
            break;
        case 3:
            searchByTitle(books, *count);  // 按书名查询图书信息
            break;
        case 4:
            searchByAuthor(books, *count);  // 按作者名查询图书信息
            break;
        case 5:
            deleteByLoginNo(books, count);  // 按登录号删除图书信息
            break;
        case 6:
            deleteByTitle(books, count);  // 按书名删除图书信息
            break;
        case 7:
            deleteByAuthor(books, count);  // 按作者名删除图书信息
            break;
        case 8:
            modifyByLoginNoAndTitle(books, *count);  // 按登录号书名修改图书信息
            break;
        case 9:
            saveToFile(books, *count);  // 保存图书信息并退出
            return;
        default:
            printf("无效的选择,请重新输入。\n");
        }
    }
}
void printBook(Book book) {
    printf("登录号: %d\n", book.loginNo);
    printf("书名: %s\n", book.title);
    printf("作者名: %s\n", book.author);
    printf("分类号: %s\n", book.category);
    printf("出版单位: %s\n", book.publisher);
    printf("出版时间: %s\n", book.publicationDate);
    printf("价格: %.2f\n", book.price);
    printf("\n");
}
void addBook(Book* books, int* count) {
    if (*count >= MAX_BOOKS) {
        printf("已达到最大容量,无法添加更多图书。\n");
        return;
    }
    Book* book = &books[*count];

    printf("请输入登录号: ");
    scanf("%d", &book->loginNo);

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

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

    printf("请输入分类号: ");
    scanf("%s", book->category);

    printf("请输入出版单位: ");
    scanf("%s", book->publisher);

    printf("请输入出版时间: ");
    scanf("%s", book->publicationDate);

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

    (*count)++;
    printf("图书信息录入成功\n");
}
void displayBooks(Book* books, int count) {
    for (int i = 0; i < count; i++) {
        printBook(books[i]);
    }
}
void searchByTitle(Book* books, int count) {
    char title[100];
    printf("请输入书名进行查询: ");
    scanf("%s", title);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (strcmp(books[i].title, title) == 0) {
            printBook(books[i]);
            found = 1;
        }
    }
    if (!found) {
        printf("没有找到符合条件的图书。\n");
    }
}
void searchByAuthor(Book* books, int count) {
    char author[100];
    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 deleteByTitle(Book* books, int* count) {
    char title[100];
    printf("请输入要删除的书名: ");
    scanf("%s", title);

    int deleted = 0;
    for (int i = 0; i < *count; i++) {
        if (strcmp(books[i].title, title) == 0) {
            for (int j = i; j < *count - 1; j++) {
                books[j] = books[j + 1];
            }
            (*count)--;
            printf("书名 %s 的图书信息已经删除。\n", title);
            deleted = 1;
            break;
        }
    }
    if (!deleted) {
        printf("没有找到符合条件的图书信息。\n");
    }
}
void deleteByAuthor(Book* books, int* count) {
    char author[100];
    printf("请输入要删除的作者名: ");
    scanf("%s", author);

    int deleted = 0;
    int newCount = 0;
    Book tempBooks[MAX_BOOKS];

    for (int i = 0; i < *count; i++) {
        if (strcmp(books[i].author, author) != 0) {
            tempBooks[newCount++] = books[i];
        }
        else {
            printf("作者名 %s 的图书信息已经删除。\n", author);
            deleted = 1;
        }
    }

    if (!deleted) {
        printf("没有找到符合条件的图书信息。\n");
    }

    // 更新书籍数组
    for (int i = 0; i < newCount; i++) {
        books[i] = tempBooks[i];
    }
    *count = newCount;
}
void deleteByLoginNo(Book* books, int* count) {
    int loginNo;
    printf("请输入要删除的登录号: ");
    scanf("%d", &loginNo);

    int newCount = 0;
    int deleted = 0;

    // 创建一个临时数组来存储未被删除的图书信息
    Book tempBooks[MAX_BOOKS];

    for (int i = 0; i < *count; i++) {
        if (books[i].loginNo != loginNo) {
            tempBooks[newCount++] = books[i];
        }
        else {
            deleted = 1;
        }
    }

    // 将未被删除的图书信息复制回原数组
    for (int i = 0; i < newCount; i++) {
        books[i] = tempBooks[i];
    }

    *count = newCount;

    if (deleted) {
        printf("登录号 %d 的所有图书信息已经删除。\n", loginNo);
    }
    else {
        printf("没有找到符合条件的图书信息。\n");
    }
}

void modifyByLoginNoAndTitle(Book* books, int count) {
    int loginNo;
    printf("请输入要修改的登录号: ");
    scanf("%d", &loginNo);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (books[i].loginNo == loginNo) {
            printf("当前信息:\n");
            printBook(books[i]);

            char confirm;
            printf("确认修改此图书信息吗?(y/n): ");
            scanf(" %c", &confirm);

            if (confirm == 'y' || confirm == 'Y') {
                char title[100];
                printf("请输入要修改的书名: ");
                scanf("%s", title);

                int modified = 0;
                for (int j = 0; j < count; j++) {
                    if (books[j].loginNo == loginNo && strcmp(books[j].title, title) == 0) {
                        printf("请输入新的书名: ");
                        scanf("%s", books[j].title);

                        printf("请输入新的作者名: ");
                        scanf("%s", books[j].author);

                        printf("请输入新的分类号: ");
                        scanf("%s", books[j].category);

                        printf("请输入新的出版单位: ");
                        scanf("%s", books[j].publisher);

                        printf("请输入新的出版时间: ");
                        scanf("%s", books[j].publicationDate);

                        printf("请输入新的价格: ");
                        scanf("%lf", &books[j].price);

                        printf("图书信息已更新。\n");
                        modified = 1;
                    }
                }

                if (!modified) {
                    printf("没有找到指定书名的图书信息。\n");
                }

                found = 1;
                break;
            }
            else {
                printf("取消修改。\n");
                break;
            }
        }
    }

    if (!found) {
        printf("没有找到指定登录号的图书信息。\n");
    }
}
void saveToFile(Book* books, int count) {
    FILE* fp = fopen(FILE_NAME, "w");
    if (fp == NULL) {
        printf("无法打开文件 '%s' 进行写入。\n", FILE_NAME);
        return;
    }

    for (int i = 0; i < count; i++) {
        fprintf(fp, "%d,%s,%s,%s,%s,%s,%.2f\n",
            books[i].loginNo,
            books[i].title,
            books[i].author,
            books[i].category,
            books[i].publisher,
            books[i].publicationDate,
            books[i].price);
    }

    fclose(fp);
    printf("图书信息保存成功。\n");
}
void loadFromFile(Book* books, int* count) {
    FILE* fp = fopen(FILE_NAME, "r");
    if (fp == NULL) {
        printf("文件 '%s' 不存在,创建新文件。\n", FILE_NAME);
        fp = fopen(FILE_NAME, "w");
        fclose(fp);
        return;
    }

    *count = 0;
    while (fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%lf",
        &books[*count].loginNo,
        books[*count].title,
        books[*count].author,
        books[*count].category,
        books[*count].publisher,
        books[*count].publicationDate,
        &books[*count].price) != EOF) {
        (*count)++;
    }

    fclose(fp);
    printf("图书信息加载成功。\n");
}

test.c

#include"bookManagement.h"

int main() {
    Book books[MAX_BOOKS];
    int count = 0;

    menu(books, &count);

    return 0;
}

终端测试截图

添加图书
在这里插入图片描述
按下9 保存退出后,再次启动,按下2,浏览,没有问题
在这里插入图片描述
继续添加图书

199,西游记,吴承恩,I242.4,浙江古籍出版社,2010,35.00
199,鲁迅全集,鲁迅,略,略,略,900.00
199,呐喊,鲁迅,略,略,略,56.00
199,三国演义,罗贯中,略,略,略,79.00
89,红楼梦,曹雪芹,略,略,略,89.00
89,水浒传,施耐庵,略,略,略,99.00
19,测试,测试,测试,测试,测试,55.00
19,测试,测试,测试,测试,测试,35.00

根据书名查询图书
在这里插入图片描述
根据作者查询图书
在这里插入图片描述
一次性删除所有该登录号信息

199,西游记,吴承恩,I242.4,浙江古籍出版社,2010,35.00
199,鲁迅全集,鲁迅,略,略,略,900.00
199,呐喊,鲁迅,略,略,略,56.00
199,三国演义,罗贯中,略,略,略,79.00
89,红楼梦,曹雪芹,略,略,略,89.00
89,水浒传,施耐庵,略,略,略,99.00

在这里插入图片描述
没有登录号19的图书
在这里插入图片描述
删除图书

在这里插入图片描述
删除作者的图书
在这里插入图片描述
修改登录号下的图书
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值