c语言课程设计图书管理系统

99ANYc3cd6
预计阅读时长 41 分钟
位置: 首页 C语言 正文

项目概述与需求分析

1 项目名称

基于C语言的简易图书管理系统

c语言课程设计图书管理系统
(图片来源网络,侵删)

2 项目目标

设计并实现一个命令行界面的图书管理系统,能够对图书信息进行基本的增、删、改、查操作,并将数据持久化存储在文件中,确保程序关闭后数据不丢失。

3 功能需求分析

系统应具备以下核心功能:

  1. 图书信息录入:能够添加新的图书信息,包括书名、作者、ISBN编号、库存数量等。
  2. 图书信息浏览:能够以列表形式展示所有图书的信息。
  3. 图书信息查询:支持按书名或作者进行模糊查询,并显示查询结果。
  4. 图书信息修改:能够根据ISBN编号查找到特定图书,并修改其信息(如书名、作者、库存等)。
  5. 图书信息删除:能够根据ISBN编号从系统中删除指定的图书。
  6. 数据持久化:系统启动时能从文件中加载图书数据,退出时能将当前所有图书数据保存到文件中。
  7. 用户界面:提供清晰、友好的菜单驱动界面,引导用户进行操作。

功能模块设计

根据需求分析,可以将系统划分为以下几个功能模块:

  1. 主菜单模块:程序的入口,显示所有可用功能选项,并根据用户输入调用相应功能。
  2. 图书信息管理模块
    • addBook():添加图书。
    • displayBooks():浏览所有图书。
    • searchBook():查询图书。
    • modifyBook():修改图书信息。
    • deleteBook():删除图书。
  3. 数据持久化模块
    • saveToFile():将图书数组中的数据写入文件。
    • loadFromFile():从文件中读取数据到图书数组。
  4. 辅助功能模块
    • clearScreen():清屏函数,优化界面显示。
    • pause():暂停函数,让用户看清结果后继续。

数据结构设计

为了存储和管理图书信息,我们需要定义一个结构体 Book 来表示单本图书。

c语言课程设计图书管理系统
(图片来源网络,侵删)
// 图书结构体
typedef struct {
    char title[100];    // 书名
    char author[50];    // 作者
    char isbn[20];      // ISBN编号,作为唯一标识
    int quantity;       // 库存数量
} Book;
// 图书管理系统结构体
typedef struct {
    Book books[MAX_BOOKS]; // 图书数组
    int count;             // 当前图书数量
} Library;
  • Book 结构体:存储单本图书的详细信息。
  • Library 结构体:管理整个图书馆,它包含一个 Book 类型的数组和一个整数 count 用于追踪当前存储的图书数量,使用结构体来封装所有数据,便于管理。
  • MAX_BOOKS:定义一个最大图书容量常量,防止数组越界。

核心代码实现

下面是完整的C语言代码,包含了上述所有功能模块和设计。

library_system.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> // 用于 getch(),Windows平台下可用,Linux/macOS需替换
#define MAX_BOOKS 1000
#define FILENAME "library.dat"
// 图书结构体
typedef struct {
    char title[100];
    char author[50];
    char isbn[20];
    int quantity;
} Book;
// 图书管理系统结构体
typedef struct {
    Book books[MAX_BOOKS];
    int count;
} Library;
// 函数声明
void initLibrary(Library *lib);
void showMenu();
void addBook(Library *lib);
void displayBooks(const Library *lib);
void searchBook(const Library *lib);
void modifyBook(Library *lib);
void deleteBook(Library *lib);
void saveToFile(const Library *lib);
void loadFromFile(Library *lib);
void clearScreen();
void pause();
int main() {
    Library lib;
    initLibrary(&lib);
    loadFromFile(&lib);
    int choice;
    do {
        showMenu();
        printf("请输入您的选择: ");
        scanf("%d", &choice);
        while (getchar() != '\n'); // 清除输入缓冲区
        switch (choice) {
            case 1:
                addBook(&lib);
                break;
            case 2:
                displayBooks(&lib);
                break;
            case 3:
                searchBook(&lib);
                break;
            case 4:
                modifyBook(&lib);
                break;
            case 5:
                deleteBook(&lib);
                break;
            case 0:
                printf("正在保存数据并退出系统...\n");
                saveToFile(&lib);
                pause();
                break;
            default:
                printf("无效的选择,请重新输入!\n");
                pause();
                break;
        }
    } while (choice != 0);
    return 0;
}
// 初始化图书馆
void initLibrary(Library *lib) {
    lib->count = 0;
}
// 显示主菜单
void showMenu() {
    clearScreen();
    printf("========================================\n");
    printf("||          C语言图书管理系统          ||\n");
    printf("========================================\n");
    printf("||  1. 添加图书                       ||\n");
    printf("||  2. 浏览所有图书                   ||\n");
    printf("||  3. 查询图书                       ||\n");
    printf("||  4. 修改图书信息                   ||\n");
    printf("||  5. 删除图书                       ||\n");
    printf("||  0. 退出系统                       ||\n");
    printf("========================================\n");
}
// 添加图书
void addBook(Library *lib) {
    if (lib->count >= MAX_BOOKS) {
        printf("图书馆已满,无法添加更多图书!\n");
        pause();
        return;
    }
    Book newBook;
    printf("请输入书名: ");
    fgets(newBook.title, sizeof(newBook.title), stdin);
    newBook.title[strcspn(newBook.title, "\n")] = 0; // 去掉换行符
    printf("请输入作者: ");
    fgets(newBook.author, sizeof(newBook.author), stdin);
    newBook.author[strcspn(newBook.author, "\n")] = 0;
    printf("请输入ISBN编号: ");
    fgets(newBook.isbn, sizeof(newBook.isbn), stdin);
    newBook.isbn[strcspn(newBook.isbn, "\n")] = 0;
    printf("请输入库存数量: ");
    scanf("%d", &newBook.quantity);
    while (getchar() != '\n'); // 清除输入缓冲区
    // 检查ISBN是否已存在
    for (int i = 0; i < lib->count; i++) {
        if (strcmp(lib->books[i].isbn, newBook.isbn) == 0) {
            printf("错误:该ISBN编号已存在!\n");
            pause();
            return;
        }
    }
    lib->books[lib->count++] = newBook;
    printf("图书添加成功!\n");
    pause();
}
// 浏览所有图书
void displayBooks(const Library *lib) {
    clearScreen();
    if (lib->count == 0) {
        printf("图书馆中暂无图书,\n");
        pause();
        return;
    }
    printf("%-30s %-20s %-15s %s\n", "书名", "作者", "ISBN", "库存");
    printf("------------------------------------------------------------\n");
    for (int i = 0; i < lib->count; i++) {
        printf("%-30s %-20s %-15s %d\n", lib->books[i].title, lib->books[i].author, lib->books[i].isbn, lib->books[i].quantity);
    }
    pause();
}
// 查询图书
void searchBook(const Library *lib) {
    clearScreen();
    if (lib->count == 0) {
        printf("图书馆中暂无图书,\n");
        pause();
        return;
    }
    int option;
    char keyword[100];
    printf("请选择查询方式:\n");
    printf("1. 按书名查询\n");
    printf("2. 按作者查询\n");
    printf("请输入选择: ");
    scanf("%d", &option);
    while (getchar() != '\n'); // 清除输入缓冲区
    printf("请输入查询关键词: ");
    fgets(keyword, sizeof(keyword), stdin);
    keyword[strcspn(keyword, "\n")] = 0;
    printf("\n查询结果:\n");
    printf("%-30s %-20s %-15s %s\n", "书名", "作者", "ISBN", "库存");
    printf("------------------------------------------------------------\n");
    int found = 0;
    for (int i = 0; i < lib->count; i++) {
        if ((option == 1 && strstr(lib->books[i].title, keyword) != NULL) ||
            (option == 2 && strstr(lib->books[i].author, keyword) != NULL)) {
            printf("%-30s %-20s %-15s %d\n", lib->books[i].title, lib->books[i].author, lib->books[i].isbn, lib->books[i].quantity);
            found = 1;
        }
    }
    if (!found) {
        printf("未找到匹配的图书,\n");
    }
    pause();
}
// 修改图书信息
void modifyBook(Library *lib) {
    clearScreen();
    if (lib->count == 0) {
        printf("图书馆中暂无图书,\n");
        pause();
        return;
    }
    char isbn[20];
    printf("请输入要修改的图书ISBN编号: ");
    fgets(isbn, sizeof(isbn), stdin);
    isbn[strcspn(isbn, "\n")] = 0;
    for (int i = 0; i < lib->count; i++) {
        if (strcmp(lib->books[i].isbn, isbn) == 0) {
            printf("找到图书: %s\n", lib->books[i].title);
            printf("请输入新的书名 (留空则不修改): ");
            char newTitle[100];
            fgets(newTitle, sizeof(newTitle), stdin);
            if (strlen(newTitle) > 1) { // 如果输入了内容(包括换行符)
                newTitle[strcspn(newTitle, "\n")] = 0;
                strcpy(lib->books[i].title, newTitle);
            }
            printf("请输入新的作者 (留空则不修改): ");
            char newAuthor[50];
            fgets(newAuthor, sizeof(newAuthor), stdin);
            if (strlen(newAuthor) > 1) {
                newAuthor[strcspn(newAuthor, "\n")] = 0;
                strcpy(lib->books[i].author, newAuthor);
            }
            printf("请输入新的库存数量 (输入-1则不修改): ");
            int newQuantity;
            scanf("%d", &newQuantity);
            while (getchar() != '\n'); // 清除输入缓冲区
            if (newQuantity != -1) {
                lib->books[i].quantity = newQuantity;
            }
            printf("图书信息修改成功!\n");
            pause();
            return;
        }
    }
    printf("未找到该ISBN编号的图书!\n");
    pause();
}
// 删除图书
void deleteBook(Library *lib) {
    clearScreen();
    if (lib->count == 0) {
        printf("图书馆中暂无图书,\n");
        pause();
        return;
    }
    char isbn[20];
    printf("请输入要删除的图书ISBN编号: ");
    fgets(isbn, sizeof(isbn), stdin);
    isbn[strcspn(isbn, "\n")] = 0;
    for (int i = 0; i < lib->count; i++) {
        if (strcmp(lib->books[i].isbn, isbn) == 0) {
            // 将后面的所有元素前移
            for (int j = i; j < lib->count - 1; j++) {
                lib->books[j] = lib->books[j + 1];
            }
            lib->count--;
            printf("图书删除成功!\n");
            pause();
            return;
        }
    }
    printf("未找到该ISBN编号的图书!\n");
    pause();
}
// 保存数据到文件
void saveToFile(const Library *lib) {
    FILE *fp = fopen(FILENAME, "wb");
    if (fp == NULL) {
        perror("无法打开文件进行写入");
        return;
    }
    fwrite(lib, sizeof(Library), 1, fp);
    fclose(fp);
}
// 从文件加载数据
void loadFromFile(Library *lib) {
    FILE *fp = fopen(FILENAME, "rb");
    if (fp == NULL) {
        // 文件不存在是正常情况(第一次运行)
        return;
    }
    fread(lib, sizeof(Library), 1, fp);
    fclose(fp);
}
// 清屏函数 (Windows)
void clearScreen() {
    system("cls");
}
// 暂停函数
void pause() {
    printf("\n按任意键继续...");
    getch(); // Windows
    // Linux/macOS下可以使用: system("read -p ''");
}

编译与运行指南

1 环境准备

  • 编译器:你需要一个C语言编译器,如 GCC (MinGW on Windows), Clang, 或 Visual Studio。
  • 开发环境:任何文本编辑器(如 VS Code, Sublime Text)或集成开发环境(如 Dev-C++, Visual Studio Code, CLion)。

2 编译步骤

  1. 将上述代码保存为 library_system.c 文件。

  2. 打开终端或命令提示符。

  3. 使用GCC进行编译:

    gcc library_system.c -o library_system
    • Linux/macOS用户注意:代码中使用了 conio.hgetch(),这在标准C库中不存在,你需要进行替换:
      • 删除 #include <conio.h>
      • pause() 函数中的 getch() 替换为 system("read -p ''");
      • 或者,你可以使用一个跨平台的 getch() 实现。
  4. 编译成功后,会生成一个可执行文件 library_system.exe (Windows) 或 library_system (Linux/macOS)。

3 运行程序

在终端中,进入可执行文件所在的目录,然后运行:

./library_system

程序启动后,你将看到一个菜单界面,可以根据提示进行操作。


项目扩展与改进建议

这个基础版本已经满足了课程设计的基本要求,如果你想让它更完善,可以考虑以下扩展方向:

  1. 用户认证系统:增加管理员和普通用户两种角色,拥有不同的操作权限。
  2. 借阅与归还功能
    • 增加 Reader (读者) 结构体。
    • 实现 borrowBook()returnBook() 函数。
    • 记录借阅历史。
  3. 数据结构优化:使用链表代替数组,这样可以动态分配内存,避免 MAX_BOOKS 的限制,更灵活地管理图书数量。
  4. 排序功能:增加按书名、作者、入库时间等对图书列表进行排序的功能。
  5. 图形用户界面:使用如 GTK+, QtEasyX (Windows) 等库,将命令行界面升级为图形界面,提升用户体验。
  6. 代码结构优化:将每个功能模块的代码拆分到不同的 .c.h 文件中,实现更好的模块化和代码复用。

希望这份详细的指南能帮助你顺利完成C语言课程设计!祝你成功!

-- 展开阅读全文 --
头像
c语言malloc函数用法
« 上一篇 03-25
c语言switch语句例题
下一篇 » 03-25

相关文章

取消
微信二维码
支付宝二维码

目录[+]