C 语言图书管理系统:二分查找、借阅记录管理
这段代码实现了一个图书管理系统,具有以下功能:
- 定义了两个结构体,分别是
Book(图书信息)和BorrowRecord(借阅记录)。 - 实现了一个二分查找函数
binary_search,用于在图书数组中查找指定序号的图书。 - 实现了一个显示图书信息的函数
display_book,用于打印图书的详细信息。 - 在主函数中,定义了一个图书数组
books和一个借阅记录数组records,以及相应的计数器count和record_count。 - 通过文件操作,从文件中读取图书信息,存储到
books数组中。 - 使用一个
do-while循环,提供了以下功能选项:- 1:读取图书信息(已在文件读取中实现)。
- 2:显示图书信息,逐个打印
books数组中的图书信息。 - 3:折半查找图书信息,通过调用
binary_search函数在books数组中查找指定序号的图书。 - 4:借阅图书,获取借阅者的学号、姓名和要借阅的图书序号,并在
records数组中添加一条借阅记录。 - 5:保存借阅记录,将
records数组中的借阅记录保存到文件中。 - 6:读取借阅记录,从文件中读取借阅记录并打印出来。
- 0:退出程序。
- 循环会一直执行,直到用户选择退出程序(输入 0)。
需要注意的是,代码中存在一个问题:在读取借阅记录的功能中,重新定义了一个与外部变量同名的 records 数组和 count 计数器,导致原来的 records 数组和 record_count 计数器没有被更新。这个问题可以通过删除重新定义的代码来解决。
#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;
}
原文地址: https://www.cveoy.top/t/topic/fvP1 著作权归作者所有。请勿转载和采集!