[问题描述] 图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。 [基本要求] (1)每种书的登记内容至少包括书号、书名、著者、现存量和总库存量等5项。 (2)作为演示系统,不必使用文件,全部数据可以都在内存存放。但是由于上述4项基 本业务活动都是通过书号(即关键字)进行的,所以要用B树)对书号建立索引,以 获得高效率。 (3)系统应实现的操作及其功能定义如下: 1)采编入库:新购入一种书,经分类和确定书号之后登记到图书账目中去 在帐中已有,则只将总库存量增加。 2)清除库存:某种书已无保留价值,将它从图书账目中注销。 3)借阅:如果一种书的现存量大于军,则借出一本,登记借阅者的图书证号和归还期 限。 4)归还:注销对借阅者的登记,改变该书的现存量。 5)显示:以凹入表的形式显示B树。这个操作是为了调试和维护的目的而设置的。下列B树的打印格式如下所示:,写出C语言完整代码
时间: 2024-03-05 11:52:43 浏览: 310
以下是一个基本的图书管理系统的C语言代码示例,其中使用了B树来实现对书号的索引:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BOOKS 1000
#define MAX_NAME_LENGTH 50
typedef struct {
int id; // 书号
char name[MAX_NAME_LENGTH]; // 书名
char author[MAX_NAME_LENGTH]; // 著者
int total; // 总库存量
int current; // 现存量
} Book;
typedef struct {
int key; // 书号
int value; // 在books数组中的下标
} Node;
typedef struct {
int n; // 关键字数量
Node nodes[MAX_BOOKS]; // 关键字数组
} BTree;
Book books[MAX_BOOKS]; // 图书数组
int book_count = 0; // 图书数量
BTree btree; // B树
void init_btree() {
btree.n = 0;
}
void insert_btree(int key, int value) {
int i, j;
for (i = 0; i < btree.n; i++) {
if (key < btree.nodes[i].key) {
break;
}
}
for (j = btree.n; j > i; j--) {
btree.nodes[j] = btree.nodes[j - 1];
}
btree.nodes[i].key = key;
btree.nodes[i].value = value;
btree.n++;
}
int search_btree(int key) {
int i;
for (i = 0; i < btree.n; i++) {
if (key == btree.nodes[i].key) {
return btree.nodes[i].value;
}
}
return -1;
}
void remove_btree(int key) {
int i, j;
for (i = 0; i < btree.n; i++) {
if (key == btree.nodes[i].key) {
for (j = i; j < btree.n - 1; j++) {
btree.nodes[j] = btree.nodes[j + 1];
}
btree.n--;
break;
}
}
}
void add_book() {
int id, i, total, found = 0;
char name[MAX_NAME_LENGTH], author[MAX_NAME_LENGTH];
printf("请输入书号、书名、著者和库存量,以空格分隔:");
scanf("%d %s %s %d", &id, name, author, &total);
for (i = 0; i < book_count; i++) {
if (books[i].id == id) {
books[i].total += total;
found = 1;
break;
}
}
if (!found) {
books[book_count].id = id;
strcpy(books[book_count].name, name);
strcpy(books[book_count].author, author);
books[book_count].total = total;
books[book_count].current = total;
insert_btree(id, book_count);
book_count++;
}
}
void remove_book() {
int id, i, j;
printf("请输入要清除库存的书号:");
scanf("%d", &id);
for (i = 0; i < book_count; i++) {
if (books[i].id == id) {
for (j = i; j < book_count - 1; j++) {
books[j] = books[j + 1];
}
book_count--;
remove_btree(id);
break;
}
}
}
void borrow_book() {
int id, i, found = 0;
printf("请输入要借阅的书号:");
scanf("%d", &id);
for (i = 0; i < book_count; i++) {
if (books[i].id == id) {
if (books[i].current > 0) {
books[i].current--;
printf("借阅成功!\n");
found = 1;
} else {
printf("库存不足,无法借阅!\n");
}
break;
}
}
if (!found) {
printf("找不到该书,请重新输入!\n");
}
}
void return_book() {
int id, i;
printf("请输入要归还的书号:");
scanf("%d", &id);
for (i = 0; i < book_count; i++) {
if (books[i].id == id) {
books[i].current++;
printf("归还成功!\n");
break;
}
}
}
void print_btree(BTree tree, int depth) {
int i, j;
for (i = 0; i < tree.n; i++) {
if (i == 0 || tree.nodes[i].key != tree.nodes[i - 1].key) {
printf("\n");
for (j = 0; j < depth; j++) {
printf(" ");
}
printf("%d", tree.nodes[i].key);
}
print_btree(tree, depth + 1);
}
}
void print_books() {
int i;
printf("\n书号\t书名\t著者\t总库存量\t现存量\n");
for (i = 0; i < book_count; i++) {
printf("%d\t%s\t%s\t%d\t\t%d\n", books[i].id, books[i].name, books[i].author, books[i].total, books[i].current);
}
}
int main() {
int choice;
init_btree();
while (1) {
printf("\n请选择操作:\n");
printf("1. 采编入库\n");
printf("2. 清除库存\n");
printf("3. 借阅\n");
printf("4. 归还\n");
printf("5. 显示\n");
printf("6. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
add_book();
break;
case 2:
remove_book();
break;
case 3:
borrow_book();
break;
case 4:
return_book();
break;
case 5:
print_books();
printf("\nB树:");
print_btree(btree, 0);
printf("\n");
break;
case 6:
exit(0);
default:
printf("无效操作,请重新选择!\n");
}
}
return 0;
}
```
需要注意的是,该示例中只实现了最基本的图书管理功能,还有很多可以改进的地方,比如添加图书分类、实现借阅归还日期逾期提醒等。
阅读全文
相关推荐

















