C语言图书管理系统

本代码实现了一个简单的图书管理系统,包含以下功能:

  1. 读取图书信息:从文件 book_storages.txt 读取图书信息,并存储在结构体数组 books[] 中。
  2. 显示图书信息:遍历 books[] 数组,逐个显示图书信息。
  3. 折半查找图书信息:通过序号在 books[] 数组中进行折半查找,找到对应的图书信息并显示。
  4. 借阅图书:输入借阅者的学号、姓名和要借阅的图书序号,将借阅记录存储在结构体数组 records[] 中。
  5. 保存借阅记录:将借阅记录保存到文件 borrow_records.txt 中。

代码实现

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

#define MAX_NUM 1000

struct Book {
    int id;             // 序号
    char name[20];      // 书名
    char author[20];    // 作者
    char publisher[20]; // 出版社
    char type[20];      // 图书类型
    char code[20];      // 图书分类编码
    double price;       // 价格
};

struct BorrowRecord {
    int student_id;
    char student_name[20];
    int book_id;
    char borrow_date[20];
};

int binary_search(struct Book books[], int count, int key) {
    int low = 0, high = count - 1;

    while (low <= high) {
        int mid = (low + high) / 2;
        if (books[mid].id == key) {
            return mid;
        } else if (books[mid].id < key) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    return -1;
}

void display_book(struct Book book) {
    printf('序号:%d\n书名:%s\n作者:%s\n出版社:%s\n图书类型:%s\n图书分类编码:%s\n价格:%.2f\n',
            book.id, book.name, book.author, book.publisher, book.type, book.code, book.price);
}

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

    // 读取图书信息
    FILE *fp = fopen('book_storages.txt', 'r');
    while (fscanf(fp, '%d\n%s\n%s\n%s\n%s\n%s\n%lf', &books[count].id, books[count].name, books[count].author, books[count].publisher, books[count].type, books[count].code, &books[count].price) != EOF) {
        count++;
    }

    fclose(fp);

    struct BorrowRecord records[MAX_NUM];
    int record_count = 0;

    int choice;
    do {
        printf('1. 读取图书信息\n');
		printf('2. 显示图书信息\n');
        printf('3. 折半查找图书信息\n');
        printf('4. 借阅图书\n');
        printf('5. 保存借阅记录\n');
        printf('6. 读取借阅记录\n');
        printf('0. 退出程序\n');
        printf('请输入您的选择:');
        scanf('%d', &choice);

        switch (choice) {
            case 1:
                // 读取图书信息,已在上方实现
                printf('以成功录入\n');
                break;
            case 2: {
                // 显示图书信息
                for (int i = 0; i < count; i++) {
                    display_book(books[i]);
                    printf('---------------------\n');
                }
                break;
            }
            case 3: {
                // 折半查找图书信息
                int key;
                printf('请输入要查找的图书序号:');
                scanf('%d', &key);

                int idx = binary_search(books, count, key);
                if (idx == -1) {
                    printf('未找到序号为%d的图书\n', key);
                } else {
                    display_book(books[idx]);
                }
                break;
            }
            case 4: {
                // 借阅图书
                int student_id, book_id;
                char student_name[20];
                printf('请输入借阅者的学号和姓名:');
                scanf('%d %s', &student_id, student_name);
                printf('请输入要借阅的图书序号:');
                scanf('%d', &book_id);

                int book_idx = binary_search(books, count, book_id);
                if (book_idx == -1) {
                    printf('未找到序号为%d的图书\n', book_id);
                } else {
                    strcpy(records[record_count].student_name, student_name);
                    records[record_count].student_id = student_id;
                    records[record_count].book_id = book_id;
                    strcpy(records[record_count].borrow_date, '2022-01-01');
                    record_count++;
                    printf('借阅成功\n');
                }
                break;
            }
            case 5: {
                // 保存借阅记录
                FILE *fp = fopen('borrow_records.txt', 'w');
                for (int i = 0; i < record_count; i++) {
                    fprintf(fp, '%d %s %d %s\n', records[i].student_id, records[i].student_name, records[i].book_id, records[i].borrow_date);
                }
                fclose(fp);
                printf('借阅记录已保存到文件borrow_records.txt\n');
                break;
            }
            /*case 6: {
                // 读取借阅记录
                FILE *fp = fopen('borrow_records.txt', 'r');
                struct BorrowRecord records[MAX_NUM];
                int count = 0;

                while (fscanf(fp, '%d %s %d %s', &records[count].student_id, records[count].student_name, &records[count].book_id, records[count].borrow_date) != EOF) {
                    count++;
                }

                fclose(fp);

                printf('读取到%d条借阅记录\n', count);
                printf('借阅记录如下:\n');
                for (int i = 0; i < count; i++) {
                    printf('学号:%d\n姓名:%s\n图书序号:%d\n借阅日期:%s\n', records[i].student_id, records[i].student_name, records[i].book_id, records[i].borrow_date);
                }
                break;
            }*/
            case 6: {
                // 显示图书信息
                for (int i = 0; i < count; i++) {
                    display_book(books[i]);
                    printf('---------------------\n');
                }
                break;
            }
            case 0:
                // 退出程序
                printf('程序已退出\n');
                break;
            default:
                printf('无效的选择,请重新输入\n');
                break;
        }
    } while (choice != 0);

    return 0;
}

代码分析

  1. 数据结构

    • struct Book:用于存储图书信息,包含序号、书名、作者、出版社、图书类型、图书分类编码和价格。
    • struct BorrowRecord:用于存储借阅记录,包含学号、姓名、图书序号和借阅日期。
  2. 功能函数

    • binary_search:实现折半查找,用于在 books[] 数组中查找指定序号的图书。
    • display_book:用于显示单个图书的信息。
  3. 主函数

    • 读取图书信息,并存储到 books[] 数组中。
    • 初始化借阅记录数组 records[]
    • 使用 do...while 循环,实现用户交互界面。
    • 通过 switch...case 语句,处理用户的不同选择。
    • case 6 的功能与 case 2 重复,暂时被注释掉。

总结

本代码实现了一个简单的图书管理系统,能够满足基本的图书信息管理和借阅记录保存需求。您可以根据实际需要进行扩展,例如添加还书功能、图书搜索功能等。

优化建议

  1. 错误处理:添加对文件操作错误、输入错误等的处理,提高代码的健壮性。
  2. 数据验证:对用户输入的数据进行验证,确保数据的有效性。
  3. 优化代码结构:将代码模块化,提高代码的可读性和可维护性。
  4. 增加功能:根据实际需求,添加更多的功能,例如图书搜索、还书、统计借阅次数等。

原文地址: https://www.cveoy.top/t/topic/fvPQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录