#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define M 50
struct date {
int year;
int month;
int day;
};
struct library {
int book_num; // 图书编号
char book_name[40]; // 图书名称
char author_name[10]; // 作者名称
float book_price; // 图书价格
char publisher[40]; // 出版社
struct date publish_time; // 出版时间
char book_state[2]; // 图书存在状态(0 为在馆,1 为借出)
char reader_name[10]; // 读者姓名
int reader_num; // 读者编号
};
// 函数声明
int input(struct library book[]);
void list(struct library book[], int n);
int Delete_num(struct library book[], int n);
int borrow_book(struct library book[], int n);
int return_book(struct library book[], int n);
int menu();
void saverecord(struct library book[], int n);
int loadrecord(struct library book[]);
int main() {
struct library b[M];
int length;
while (1) {
switch (menu()) {
case 1:
length = input(b);
if (length != -1) {
saverecord(b, length);
}
break;
case 2:
length = loadrecord(b);
list(b, length);
break;
case 3:
length = loadrecord(b);
length = Delete_num(b, length);
saverecord(b, length);
break;
case 4:
length = loadrecord(b);
length = borrow_book(b, length);
saverecord(b, length);
break;
case 5:
length = loadrecord(b);
length = return_book(b, length);
saverecord(b, length);
break;
case 0:
exit(0);
}
}
return 0;
}
int menu() {
int c;
system("mode con:cols=48 lines=30000");
system("color 0B");
printf("\t\t\t\t------------------------\n");
printf("\t\t\t\t+ 图书信息管理系统 +\n");
printf("\t\t\t\t------------------------\n");
printf("\t\t\t\t 1.输入图书信息\n");
printf("\t\t\t\t 2.显示图书信息\n");
printf("\t\t\t\t 3.按图书编号删除图书信息\n");
printf("\t\t\t\t 4.借书\n");
printf("\t\t\t\t 5.还书\n");
printf("\t\t\t\t 0.退出\n");
printf("调试者:24信息管理与信息系统1班-庞佳琪\n");
printf("\t\t\t\t------------------------\n");
do {
printf("\n\t\t\t Enter your choice(0-5):");
if (scanf("%d", &c) != 1) {
while (getchar() != '\n');
continue;
}
} while (c < 0 || c > 5);
return c;
}
int input(struct library book[]) {
int i, n;
system("cls");
printf("\t输入图书的数量:\n");
scanf("%d", &n);
system("cls");
printf("\t开始输入记录:\n");
for (i = 0; i < n; i++) {
printf("\n\t第%d条记录的图书编号:", i + 1);
scanf("%d", &book[i].book_num);
printf("\n\t第%d条记录的图书名称:", i + 1);
scanf("%s", book[i].book_name);
printf("\n\t第%d条记录的图书作者姓名:", i + 1);
scanf("%s", book[i].author_name);
printf("\n\t第%d条记录的图书价格:", i + 1);
scanf("%f", &book[i].book_price);
printf("\n\t第%d条记录的图书出版社:", i + 1);
scanf("%s", book[i].publisher);
printf("\n\t第%d条记录的图书出版时间:", i + 1);
scanf("%d-%d-%d", &book[i].publish_time.year, &book[i].publish_time.month, &book[i].publish_time.day);
// 初始化图书状态、读者信息
strcpy(book[i].book_state, "0");
strcpy(book[i].reader_name, "none");
book[i].reader_num = 0;
}
printf("\t****************************************\n");
printf("\t 已输入成功!\n");
printf("\t****************************************\n");
getchar();
getchar();
system("cls");
return n;
}
void list(struct library book[], int n) {
int i;
system("cls");
printf("图书信息如下:\n");
printf("图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
for (i = 0; i < n; i++) {
printf("%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n",
book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price,
book[i].publisher, book[i].publish_time.year, book[i].publish_time.month,
book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
}
printf("\t\t\t\t press any key enter menu......\n");
getchar();
getchar();
system("cls");
}
int Delete_num(struct library book[], int n) {
int i, j, flag = 0;
int bnum;
system("cls");
printf("请输入想要删除图书的编号:");
scanf("%d", &bnum);
for (i = 0; i < n; i++) {
if (book[i].book_num == bnum) {
flag = 1;
system("cls");
printf("图书馆图书信息如下:\n");
printf("\t图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
printf("\t%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n",
book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price,
book[i].publisher, book[i].publish_time.year, book[i].publish_time.month,
book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
printf("是否要删除此信息?(y/n):");
char ch = getchar();
getchar();
if (ch == 'y' || ch == 'Y') {
for (j = i; j < n - 1; j++) {
book[j] = book[j + 1];
}
n--;
printf("成功删除图书!\n");
}
break;
}
}
if (flag == 0) {
printf("\t\t\t\t查无此书!\n");
}
printf("\t\t\t\t****************************************\n");
printf("\t\t\t\t press any key enter menu......\n");
getchar();
getchar();
system("cls");
return n;
}
int borrow_book(struct library book[], int n) {
int i, flag = 0;
int bnum;
char ch;
system("cls");
printf("请输入想借出图书的编号:");
scanf("%d", &bnum);
for (i = 0; i < n; i++) {
if (book[i].book_num == bnum) {
flag = 1;
system("cls");
printf("图书馆图书信息如下:\n");
printf("图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
printf("%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n",
book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price,
book[i].publisher, book[i].publish_time.year, book[i].publish_time.month,
book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
printf("是否要借出此书?(y/n):");
// 注意:这里要清理缓冲区!
getchar(); // 清理之前的换行符
ch = getchar(); // 读取用户输入的 y/n
if (ch == 'y' || ch == 'Y') {
if (strcmp(book[i].book_state, "1") == 0) {
printf("该书已被借出,无法再次借出!\n");
} else {
strcpy(book[i].book_state, "1");
printf("请输入读者姓名:");
scanf("%s", book[i].reader_name); // 现在会正常执行
printf("请输入读者学号:");
scanf("%d", &book[i].reader_num);
printf("成功借出图书!\n");
}
}
break;
}
}
if (flag == 0) {
printf("查无此书!\n");
}
printf("****************************************\n");
printf("press any key enter menu......\n");
getchar();
getchar();
system("cls");
return n;
}
int return_book(struct library book[], int n) {
int i, flag = 0;
int bnum;
char ch;
system("cls");
printf("请输入归还图书的编号:");
scanf("%d", &bnum);
for (i = 0; i < n; i++) {
if (book[i].book_num == bnum) {
flag = 1;
system("cls");
printf("图书馆图书信息如下:\n");
printf("图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
printf("%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n",
book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price,
book[i].publisher, book[i].publish_time.year, book[i].publish_time.month,
book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
printf("是否要归还此书?(y/n):");
// 清理缓冲区,避免之前的换行符影响
getchar();
ch = getchar();
if (ch == 'y' || ch == 'Y') {
if (strcmp(book[i].book_state, "0") == 0) {
printf("该书未被借出,无需归还!\n");
} else {
strcpy(book[i].book_state, "0");
strcpy(book[i].reader_name, "none");
book[i].reader_num = 0;
printf("成功归还图书!\n");
}
}
break;
}
}
if (flag == 0) {
printf("查无此书!\n");
}
printf("****************************************\n");
printf("press any key enter menu......\n");
getchar();
getchar();
system("cls");
return n;
}
void saverecord(struct library book[], int n) {
FILE *fp;
fp = fopen("library.dat", "wb");
if (fp == NULL) {
printf("can not open file\n");
exit(1);
}
for (int i = 0; i < n; i++) {
fwrite(&book[i], sizeof(struct library), 1, fp);
}
fclose(fp);
}
int loadrecord(struct library book[]) {
FILE *fp;
int n = 0;
fp = fopen("library.dat", "rb");
if (fp == NULL) {
printf("can not open file\n");
exit(0);
}
while (fread(&book[n], sizeof(struct library), 1, fp) == 1 && n < M) {
n++;
}
fclose(fp);
return n;
}