#include <fstream>
#include <ctime>
#include <string.h>
#include "Btree.h" //b树的操作函数.
//using namespace std;
typedef struct Book
{ //存放图书信息
int num; //书号
char name[30]; //书名
char author[30]; //作者
int Now_store; //现存量
int Total_store; //总库存
}StructBook;
typedef struct reader
{ //存放读者信息
long int ID; //借阅证号
int num; //所借阅的书的序号
struct tm ReData; //应当还书的日期.借书后一个月要归还.
}StructReader;
void add_bookinfo(int rec,Book &REC,FILE *fp);//改变图书的现存量和总存量.
void input_bookinfo(Book &REC);//输入图书信息.
int load_file(FILE *fp,BTree &T);//读取书库的图书信息,按书号建立B树索引
void reader_info(FILE *fp2);//显示读者的信息
void add_book(FILE *fp,BTree &T);//图书入库.
void return_book(FILE *fp,FILE *fp2,BTree &T);//归还图书。
void borrow_book(FILE *fp,FILE *fp2,BTree &T);//借阅图书
void del_book(FILE *fp,BTree &T);//清除库存.
void search_book1(FILE *fp,BTree T);//按书号精确查找某本书,并显示该书的具体信息
void search_book2(FILE *fp,BTree T);//按书名模糊查找某本书,并显示该书的具体信息
void show_book(FILE *fp);//输出书库中所有图书的信息
void book_info(Book REC);//输出图书的具体信息.
void main_switch(char i,FILE *fp,BTree &,FILE *);//操作选择函数
void menu_name();
/*-----------------------------------------*/
int rec=0; //全局变量,用来表示图书信息在文件中的相对于文件头的位置
void main(void)
{
#ifdef DEBUG_BTREE
display();
#else
int j;
char a[100];
char re_choose[]={"\n选择无效,请重新输入:\n"};
BTree T=NULL;
FILE *fp,*fp2;
#ifdef DEBUG
if((fp=fopen("lib2.dat","rb+"))==NULL)
{
printf("cannot open the file of library data!");
exit(0);
}
if((fp2=fopen("reader2.dat","rb+"))==NULL)
{
printf("cannot open the file of reader data!");
exit(0);
}
#else
if((fp=fopen("lib.dat","rb+"))==NULL)
{
printf("cannot open the file of library data!");
exit(0);
}
if((fp2=fopen("reader.dat","rb+"))==NULL)
{
printf("cannot open the file of reader data!");
exit(0);
}
#endif
rec=load_file(fp,T);//读取之前文件中存放的信息
if(!rec)
{
rec-=rec;
}
system("cls");
while(1)
{
menu_name();
for(j=0;j<100;j++)
{
scanf("%c",&a[j]);
if(a[j]=='\n') break;
} /*功能选择*/
if(a[1]!='\n'){
printf("%s\n",re_choose);
system("pause");
system("cls");
continue;
}
else{
if(a[0]=='0') break;
main_switch(a[0],fp,T,fp2);
}
}//end while
fclose(fp);
fclose(fp2);
#endif
}
/*---------------------------------------------*/
void main_switch(char i,FILE *fp,BTree &T,FILE *fp2)
//操作选择函数
{
char re_choose[]={"\n选择无效,请重新输入...\n"};
switch(i)
{
case '1' ://增加图书到库存里
system("cls");
add_book(fp,T);
system("pause");
system("cls");
getchar();
break;
case '2' ://图书借阅
system("cls");
borrow_book(fp,fp2,T);
system("pause");
system("cls");
getchar();
break;
case '3'://查看读者的借阅情况
system("cls");
printf("\n 以下是读者借阅情况:\n");
reader_info(fp2);
system("pause");
system("cls");
break;
case '4'://从库存里清除没用的图书
system("cls");
del_book(fp,T);
getchar();
system("pause");
system("cls");
break;
case '5' ://归还图书
system("cls");
return_book(fp,fp2,T);
getchar();
system("pause");
system("cls");
break;
case '6'://查看库存里所有图书的信息
system("cls");
printf("\n 以下是库存里所有图书的信息:\n");
show_book(fp);
system("pause");
system("cls");
break;
case '7'://查看某本书的资料
system("cls");
search_book2(fp,T);
getchar();
system("pause");
system("cls");
break;
case '8'://查看某本书的资料
system("cls");
search_book1(fp,T);
getchar();
system("pause");
system("cls");
break;
case '9'://查看B树的状态
system("cls");
show_tree(T,1);
printf("\n\n");
system("pause");
system("cls");
break;
default :
printf("%s",re_choose);
system("pause");
system("cls");
}//end switch
}
void menu_name()
//菜单函数
{
printf(" 图书管理系统\n");
char Input[]={"\t请输入选项所对应的数字: \n"};
printf(" \n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 1、采编入库 2、借阅 3.查看读者信息 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ 4、清除入库 5、归还 6.查看书本信息 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ 7、按书名查找 8、按书号查找 9.显示B树 0.退出 ┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf(" \n\n 请选择要运行的程序(0--9):\n");
}//Menu();
/*---------------------------------------------*/
void add_bookinfo(int rec,Book &REC,FILE *fp)
//改变图书的现存量和总存量.
{
int j=REC.Now_store;//j存放增加的数目
fseek(fp,rec,0);
fread(&REC,sizeof(Book),1,fp);
int k=REC.Total_store;
REC.Now_store+=j;
REC.Total_store+=j;
fseek(fp,rec,0);
fwrite(&REC,sizeof(Book),1,fp);//覆盖原来的图书信息
}
void input_bookinfo(Book &REC)
//输入图书信息.
{
printf("\n采集入库图书的信息");
printf("\n书号:");
scanf("%d%*c",&REC.num);
printf("\n书名:");
gets(REC.name);
printf("\n作者:");
gets(REC.author);
printf("\n入库图书的数量:");
scanf("%d",&REC.Now_store);
}
int load_file(FILE *fp,BTree &T)
//读取书库的图书信息,按书号建立B树索引
{
int rec=0;
int flag=-2; //文件尾端的判断标志,用来防止尾端数据
//重读的情况的发生
Book REC;
StructResult R;
REC.num=flag;
while(!feof(fp))
{
fread(&REC,sizeof(Book),1,fp);
if(flag==REC.num) break;
if(REC.num==-1) {
rec+=sizeof(Book);
continue;
}
R=search_btree(T,REC.num,0);
insert_btree(T,REC.num,R.pt,R.i,rec);
rec+=sizeof(Book);
flag=REC.num;
}
return(rec);
}
void reader_info(FILE *fp2)
{
//显示读者的信息
StructReader person3;
int flag2=0;
int flag3=-2;
int flag1=-2;
person3.ID=flag3;
rewind(fp2);
printf("-------------------------------------------------------------------------------\n");
printf("\t读者的图书证号\t\t书号\t\t还书时间\n");
while(!feof(fp2))
{
fread(&person3,sizeof(StructReader),1,fp2);
//借阅证号和借的图书的编号均相同则表示已到文件尾端,返回.
if((flag3==person3.ID) && (flag1==person3.num))
{
return;
}
if(person3.ID<=-1)
{
flag2+=sizeof(StructReader);
continue;
}
printf("-------------------------------------------------------------------------------\n");
printf("\t\t%d",person3.ID);
printf("\t\t%d\t\t",person3.num);
printf("%d",person3.ReData.tm_year);
printf("-%d",person3.ReData.tm_mon);
printf("-%d\n",person3.ReData.tm_mday);
flag2+=sizeof(StructReader);
flag3=person3.ID;
flag1=person3.num;
}
//空文件时提示没有读者资料.
if(flag2==0)
{
printf("\n对不起,读者不存在.\n");
}
}
void add_book(FILE *fp,B
评论0