// 借书信息 typedef struct Borrow { char username[20]; // 用户名 char bookname[50]; // 书名 char borrowTime[20]; // 借书时间 char returnTime[20]; // 还书时间 float price; // 单价 struct Borrow *next; // 链表指针 } Borrow;完成借书
时间: 2023-10-21 21:05:21 浏览: 69
C/C++语法知识:typedef struct 用法详解
好的,借书函数的实现与添加书籍比较类似。以下是一个简单的借书函数实现:
```c
void borrowBook(User *userHead, Book *bookHead, Borrow *borrowHead) {
char username[20];
printf("请输入用户名:");
scanf("%s", username);
// 查找用户
User *user = userHead->next;
while (user != NULL) {
if (strcmp(user->username, username) == 0) {
break;
}
user = user->next;
}
if (user == NULL) {
printf("用户不存在!\n");
return;
}
if (user->isAdmin) {
printf("管理员不能借书!\n");
return;
}
char bookname[50];
printf("请输入书名:");
scanf("%s", bookname);
// 查找书籍
Book *book = bookHead->next;
while (book != NULL) {
if (strcmp(book->name, bookname) == 0) {
break;
}
book = book->next;
}
if (book == NULL) {
printf("书籍不存在!\n");
return;
}
if (book->count <= 0) {
printf("库存不足!\n");
return;
}
// 更新书籍信息
book->count--;
FILE *fp = fopen("books.dat", "rb+");
if (fp == NULL) {
printf("打开文件失败!\n");
exit(-1);
}
Book tmp;
while (fread(&tmp, sizeof(Book), 1, fp) == 1) {
if (strcmp(tmp.name, bookname) == 0) {
fseek(fp, -sizeof(Book), SEEK_CUR);
fwrite(book, sizeof(Book), 1, fp);
break;
}
}
fclose(fp);
// 添加借书信息
Borrow *newBorrow = (Borrow *)malloc(sizeof(Borrow));
strcpy(newBorrow->username, username);
strcpy(newBorrow->bookname, bookname);
strcpy(newBorrow->borrowTime, "2022-06-01"); // 借书时间暂时写死
strcpy(newBorrow->returnTime, ""); // 还书时间暂时为空
newBorrow->price = book->price;
newBorrow->next = NULL;
Borrow *p = borrowHead;
while (p->next != NULL) {
p = p->next;
}
p->next = newBorrow;
// 将借书信息写入文件
fp = fopen("borrows.dat", "ab");
if (fp == NULL) {
printf("打开文件失败!\n");
exit(-1);
}
fwrite(newBorrow, sizeof(Borrow), 1, fp);
fclose(fp);
printf("借书成功!\n");
}
```
在借书函数中,我们需要先查找用户和书籍,判断用户是否存在、是否是管理员,书籍是否存在、库存是否充足。如果满足借书条件,我们需要更新书籍的库存信息,并添加借书信息到链表和文件中。
当然,这只是一个简单的实现方式,具体的实现还需要根据需求进行调整。例如,借书时间和还书时间可以通过系统获取当前时间来实现。希望这个简单的实现可以对您有所帮助!
阅读全文