#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;

}

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

// 读取图书信息
FILE *fp = fopen('book_storage.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("0. 退出程序\n");
    printf("请输入您的选择:");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
            // 读取图书信息,已在上方实现
            break;
        case 2: {
            // 折半查找图书信息
            int key;
            printf("请输入要查找的图书序号:");
            scanf("%d", &key);

            int idx = binary_search(books, count, key);
            if (idx == -1) {
                printf("未找到序号为%d的图书\n", key);
            } else {
                printf("序号:%d\n书名:%s\n作者:%s\n出版社:%s\n图书类型:%s\n图书分类编码:%s\n价格:%.2f\n",
                    books[idx].id, books[idx].name, books[idx].author, books[idx].publisher, books[idx].type, books[idx].code, books[idx].price);
            }
            break;
        }
        case 3: {
            // 借阅图书
            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 4: {
            // 保存借阅记录
            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 5: {
            // 读取借阅记录
            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 0:
            // 退出程序
            printf("程序已退出\n");
            break;
        default:
            printf("无效的选择,请重新输入\n");
            break;
    }
} while (choice != 0);

return 0;

} 讲解一下 内容:这是一个图书管理系统的简单实现。

首先定义了两个结构体,Book表示图书的信息,包括序号、书名、作者、出版社、图书类型、图书分类编码和价格等属性;BorrowRecord表示借阅记录,包括借阅者的学号和姓名、借阅的图书序号和借阅日期等属性。

接下来定义了一个binary_search函数,用于在图书数组中进行折半查找。该函数接受一个已排序的图书数组、数组中元素的个数和要查找的图书序号作为参数,返回找到的图书在数组中的下标,如果未找到则返回-1。

在main函数中,首先定义了一个books数组和一个计数器count用于存储图书信息。然后从文件中读取图书信息,将读取到的图书信息存储到books数组中,并递增计数器count。

接下来定义了一个records数组和一个计数器record_count用于存储借阅记录。然后进入一个循环,根据用户输入的选择执行相应的操作。

  • 当选择为1时,无需进行任何操作,因为图书信息已经在之前的步骤中读取并存储到了books数组中。
  • 当选择为2时,会提示用户输入要查找的图书序号,然后调用binary_search函数进行折半查找,并根据查找结果输出相应的信息。
  • 当选择为3时,会提示用户输入借阅者的学号和姓名以及要借阅的图书序号,然后调用binary_search函数查找图书序号对应的图书在books数组中的下标,如果未找到则输出相应的提示信息,否则将借阅记录存储到records数组中,并递增计数器record_count。
  • 当选择为4时,会将借阅记录保存到文件中,文件名为"borrow_records.txt",并输出相应的提示信息。
  • 当选择为5时,会从文件中读取借阅记录,将读取到的借阅记录存储到records数组中,并根据记录的个数输出相应的信息。
  • 当选择为0时,退出程序,并输出相应的提示信息。

在每次循环结束后,会再次提示用户输入选择,直到用户选择退出程序。

这个图书管理系统的功能比较简单,只实现了基本的图书信息的读取和查找、借阅记录的保存和读取等功能。可以根据实际需求进行扩展和改进。

C语言图书管理系统:实现图书信息管理和借阅记录功能

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

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