#include <stdio.h>
#include <windows.h>
typedef struct User_data//用户
{
char ID[20]; //账号
char key[10]; //密码
int flag; //身份
struct User_data *next;
}User;
typedef struct Reader_manage//读者
{
char ID[20];
char name[20];
char address[20];
char phone[15];
int num; //可借书数
int count;//已借书数
struct Reader_manage *next;
}Reader;
typedef struct Book_manage//图书
{
int num;//记录号
int book_num;//书号
char book_name[20];//书名
char artist[20];//作者
char press[20];//出版社
int collect;//藏书量
int lend;//借出量
int p1;//指针1
int p2;//指针2
int p3;//指针3
//struct Book_manage *next;
}Book;
typedef struct title//书名
{
char title[20];
int titleHead;
int length;
}Title;
typedef struct author//作者
{
char author[20];
int authorHead;
int length;
}Author;
typedef struct press//出版社
{
char press[20];
int pressHead;
int length;
}Press;
typedef struct Lend_Return//借还书
{
char ID[20];
int book_num;
char Lend[20];
char Return[20];
char remark[20];
struct Lend_Return *next;
}LR;
//登录系统
void menu_1() //主菜单
{
printf("***************************************\n");
printf("* 欢迎使用图书管理系统 *\n");
printf("* <1>登录 *\n");
printf("* <2>注册 *\n");
printf("* <3>退出 *\n");
printf("***************************************\n");
}
void menu_2()
{
printf("***************************************\n");
printf("* 登录方式 *\n");
printf("* <1>图书管理员登录 *\n");
printf("* <2>系统管理员登录 *\n");
printf("* <3>读者登录 *\n");
printf("***************************************\n");
}
void menu_3() //图书管理员所需菜单
{
printf("***************************************\n");
printf("* <1>用户密码修改 *\n");
printf("* <2>读者管理 *\n");
printf("* <3>图书管理 *\n");
printf("* <4>图书流通管理 *\n");
printf("* <5>退出系统 *\n");
printf("***************************************\n");
}
void menu_4() //系统管理员所需菜单
{
printf("***************************************\n");
printf("* <1>用户管理 *\n");
printf("* <2>图书信息查询 *\n");
printf("* <3>图书汇总统计 *\n");
printf("* <4>退出系统 *\n");
printf("***************************************\n");
}
void menu_5() //普通读者所需菜单
{
printf("***************************************\n");
printf("* <1>用户密码修改 *\n");//用户管理子系统下
printf("* <2>图书信息查询 *\n");//图书管理子系统下
printf("* <3>图书汇总统计 *\n");
printf("* <4>退出系统 *\n");
printf("***************************************\n");
}
void menu_6() //用户管理子系统菜单
{
printf("***************************************\n");
printf("* <1>用户信息输入 *\n");
printf("* <2>用户信息修改 *\n");
printf("* <3>用户信息删除 *\n");
printf("* <4>用户信息显示 *\n");
printf("* <5>用户密码修改 *\n");
printf("* <6>返回主菜单 *\n");
printf("***************************************\n");
}
void menu_7()//读者管理子系统菜单
{
printf("***************************************\n");
printf("* <1>读者信息输入 *\n");
printf("* <2>读者信息修改 *\n");
printf("* <3>读者信息删除 *\n");
printf("* <4>读者信息查询 *\n");
printf("* <5>读者信息显示 *\n");
printf("* <6>返回主菜单 *\n");
printf("***************************************\n");
}
void menu_8()//图书管理子系统菜单
{
printf("***************************************\n");
printf("* <1>图书信息输入 *\n");
printf("* <2>图书信息修改 *\n");
printf("* <3>图书信息查询 *\n");
printf("* <4>图书汇总统计 *\n");
printf("* <5>返回主菜单 *\n");
printf("***************************************\n");
}
void menu_9()//图书信息查询菜单
{
printf("***************************************\n");
printf("* <1>按书号查询 *\n");
printf("* <2>按书名查询 *\n");
printf("* <3>按作者查询 *\n");
printf("* <4>按出版社查询 *\n");
printf("* <5>返回主菜单 *\n");
printf("***************************************\n");
}
void menu_10()
{
printf("***************************************\n");
printf("* <1>借书处理 *\n");
printf("* <2>还书处理 *\n");
printf("* <3>返回主菜单 *\n");
printf("***************************************\n");
}
/********************************函数声明******************************/
void land(); //登录
void Register(); //注册
User* link_1(); //建立链表-用户信息文件
void User_Manage(); //用户管理
void User_Mes_Input(User *head); //用户信息输入
void User_Mes_Change(User *head); //用户信息修改
void User_Mes_Delete(User *head); //用户信息删除
void User_Mes_Show(User *head); //用户信息显示
void User_Key_Change(User *head); //用户密码修改
Reader* link_2();//建立链表-读者信息文件
void Reader_Manage();//读者管理
void Reader_Mes_Input(Reader *head); //读者信息输入
void Reader_Mes_Change(Reader *head); //读者信息修改
void Reader_Mes_Delete(Reader *head); //读者信息删除
void Reader_Mes_Search(Reader *head); //读者信息查询
void Reader_Mes_Show(Reader *head); //读者信息显示
void Book_Manage(int len[],Book b[],Title t[],Author a[],Press p[]);//图书管理
void input(int len[],Book b[],Title t[],Author a[],Press p[]);//将文件信息读到数组中
void output(int len[],Book b[],Title t[],Author a[],Press p[]);//将数组中数据写到外存文件
void mysort(int len[],Book b[]);//插入排序
void Book_Mes_Input(int len[],Book b[],Title t[],Author a[],Press p[]); //图书信息输入
void Book_Mes_Change(int len[],Book b[]); //图书信息修改
void Book_Mes_Search(int len[],Book b[],Title t[],Author a[],Press p[]); //图书信息查询
void Summary(int len[],Book b[],Title t[],Author a[],Press p[]);//汇总统计
LR* link_3();//建立链表-借还书信息文件
void LR_Manage(int len[],Book b[],Title t[],Author a[],Press p[]);//图书流通管理
void Lend(LR *head,int len[],Book b[],Title t[],Author a[],Press p[]);//借书
void Return(LR *head,int len[],Book b[],Title t[],Author a[],Press p[]);//还书
/*******************************登录、注册*****************************/
void land() //登录
{
User *head=link_1();
char ID[20],id[20];
char key[10],key1[10];
int c,x,ch;
int len[4]={0,0,0,0};
Book b[20];
Title t[20];
Author a[20];
Press p[20];
system("cls");
menu_2();
printf("请选择登录方式:");
scanf("%d",&x);
FILE *fp;
if((fp=fopen("D:\\用户信息文件.txt","r"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
int i;
printf("温馨提示:您只有三次登陆机会,三次后系统将自动退出!\n");
for(i=1;i<=3;i++)
{
rewind(fp);
printf("请输入用户名:\n");
scanf("%s",ID);
printf("请输入密码:\n");
scanf("%s",key);
while(!feof(fp))
{
fscanf(fp,"%s%s %d",id,key1,&c);
if(strcmp(ID,id)==0)
{
if(strcmp(key,key1)==0)
{
system("cls");
fclose(fp);
if(x==1&&x==c) //图书管理员
{
while(1)
{
menu_3();
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)
User_Key_Change(head); //用户管理系统-用户信息修改
if(ch==2)
Reader_Manage();//读者管理
if(ch==3)
Book_Manage(len,b,t,a,p);//图书管理
if(ch==4)
LR_Manage(len,b,t,a,p);//图书流通管理
if(ch==5)
return ;
}
}
if(x==2&&x==c) //系统管理员
{
while(1)
{
input(len,b,t,a,p);
menu_4();
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)
User_Manage();//用户管理
if(ch==2)
Book_Mes_Search(len,b,t,a,p);
if(ch==3)
Summary(len,b,t,a,p);
if(ch==4)
return ;
output(len,b,t,a,p);
}
}
if(x==3&&x==c)//普通读者
{
while(1)
{
input(len,b,t,a,p);
menu_5();
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)
User_Key_Change(head); //用户管理系统-用户信息修改
if(ch==2)
Book_Mes_Search(len,b,t,a,p);
if(ch==3)
Summary(len,b,t,a,p);
if(ch==4)
return ;
output(len,b,t,a,p);
}
}
}
}
}
if(i<=2)
printf("账号或密码错误!请重新输入!\n");
else
printf("您已输入三次,系统自动退出!\n");
}
fclose(fp);
}
void Register() //注册
{
User *head=link_1();
char a[20];
char b[10],c[10];
FILE *fp;
User *p=NULL,*q=head,*t=head;
while(q!=NULL)
{
p=q;
q=q->next;
}
q=(User*)malloc(sizeof(User));
q->next=NULL;
printf("开始注册用户:\n");
while(1)
{
printf("请输入用户名:");
scanf("%s",a);
while(t!=NULL)
{
if(strcmp(a,t->ID)==0)
{
printf("该用户已存在,请重新输入账号!\n");
break;
}
t=t->next;
}
if(t==NULL)
{
strcpy(q->ID,a);
while(1)
{
printf("请输入密码:\n");
scanf("%s",b);
printf("请再次输入密码:\n");
scanf("%s",c);
if(strcmp(b,c)==0)
{
strcpy(q->key,c);
printf("请输入用户身份:\n1.图书管理员\n2.系统管理员\n3.普通读者\n");
scanf("%d",&q->flag);
p->next=q;
if((fp=fopen("D:\\用户信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
p=head;
while(p!=NULL)
{
fprintf(fp,"%s %s %d\n",p->ID,p->key,p->flag);
p=p->next;
}
printf("注册成功,请重新登陆!\n");
fclose(fp);
free(p);
free(q);
free(t);
return;
}
else
printf("两次密码输入不一致,请重新输入!\n");
}
}
}
}
//图书管理信息系统
/******************************用户管理子系统*****************************/
User* link_1()
{
FILE *fp;
User *head=NULL,*p=NULL,*t=NULL;
if((fp=fopen("D:\\用户信息文件.txt","r"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
if((p=(User*)malloc(sizeof(User)))==NULL)
exit(0);
fscanf(fp,"%s%s%d\n",p->ID,p->key,&p->flag);
p->next=NULL;
head=p;
while(!feof(fp))
{
t=p;
if((p=(User*)malloc(sizeof(User)))==NULL)
exit(0);
fscanf(fp,"%s%s%d\n",p->ID,p->key,&p->flag);
p->next=NULL;
t->next=p;
}
fclose (fp);
return head;
}
void User_Manage() //用户管理主菜单
{
int ch;
User *head=link_1();
system("cls");
while(1)
{
menu_6();
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)
{
User_Mes_Input(head);
system("cls");
}
if(ch==2)
{
User_Mes_Change(head);
system("cls");
}
if(ch==3)
{
User_Mes_Delete(head);
system("cls");
}
if(ch==4)
User_Mes_Show(head);
if(ch==5)
{
User_Key_Change(head);
system("cls");
}
if(ch==6)
{
system("cls");
break;
}
}
}
void User_Mes_Input(User *head) //用户信息输入
{
char a[20];
char b[10],c[10];
FILE *fp;
User *p=NULL,*q=head,*t=head;
while(q!=NULL)
{
p=q;
q=q->next;
}
q=(User*)malloc(sizeof(User));
q->next=NULL;
while(1)
{
printf("请输入用户名:");
scanf("%s",a);
while(t!=NULL)
{
if(strcmp(a,t->ID)==0)
{
printf("该用户已存在,请重新输入账号!\n");
break;
}
t=t->next;
}
if(t==NULL)
{
strcpy(q->ID,a);
while(1)
{
printf("请输入密码:\n");
scanf("%s",b);
printf("请再次输入密码:\n");
scanf("%s",c);
if(strcmp(b,c)==0)
{
strcpy(q->key,c);
printf("请输入用户身份:\n1.图书管理员\n2.系统管理员\n3.普通读者\n");
scanf("%d",&q->flag);
p->next=q;
if((fp=fopen("D:\\用户信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
p=head;
while(p!=NULL)
{
fprintf(fp,"%s %s %d\n",p->ID,p->key,p->flag);
p=p->next;
}
printf("用户信息输入成功!\n");
fclose(fp);
free(p);
free(q);
free(t);
return;
}
else
printf("密码错误,请重新输入!\n");
}
}
}
}
void User_Mes_Change(User *head) //用户信息修改
{
char id[20];
char b[20];
int ch;
FILE *fp;
User *p=head;
while(1)
{
p=head;
printf("请输入要修改的用户ID:");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(p->ID,id)==0)
{
printf("请输入您要修改的信息:\n1.ID\n2.密码\n3.身份\n");
scanf("%d",&ch);
if(ch==1)
{
printf("请输入修改后的ID:");
scanf("%s",p->ID);
}
if(ch==2)
{
printf("请输入原密码:");
scanf("%s",b);
if(strcmp(b,p->key)==0)
{
printf("请输入修改后密码:");
scanf("%s",p->key);
}
else
{
while(1)
{
printf("原密码错误,请重新输入原密码:");
scanf("%s",b);
if(strcmp(b,p->key)==0)
break;
}
printf("请输入修改后密码:");
scanf("%s",p->key);
}
}
if(ch==3)
{
printf("请输入修改后用户身份:\n1.图书管理员\n2.系统管理员\n3.普通用户\n");
scanf("%d",&p->flag);
}
if((fp=fopen("D:\\用户信息文件.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
p=head;
while(p!=NULL)
{
fprintf(fp,"%s %s %d\n",p->ID,p->key,p->flag);
p=p->next;
}
fclose(fp);
free(p);
printf("修改成功!\n");
return ;
}
p=p->next;
}
printf("该账号不存在!\n");
}
}
void User_Mes_Delete(User *head) //用户信息删除
{
User *p=head,*q=NULL;
char id[20];
int ch;
FILE *fp;
while(1)
{
p=head;
printf("请输入需要删除的用户的ID:");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(id,p->ID)==0)
{
printf("%s %s %d\n",p->ID,p->key,p->flag);
printf("确认删除该用户的信息吗?\n1.确认\n2.取消\n");
scanf("%d",&ch);
if(ch==1)
{
if(p==head)
head=p->next;
else
q->next=p->next;
free(p);
p=head;
if((fp=fopen("D:\\用户信息文件.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
while(p!=NULL)
{
fprintf(fp,"%s %s %d\n",p->ID,p->key,p->flag);
p=p->next;
}
printf("删除成功!\n");
fclose(fp);
free(p);
free(q);
return ;
}
if(ch==2)
{
free(p);
free(q);
return ;
}
}
q=p;
p=p->next;
}
printf("该用户不存在,请重新输入!\n");
}
}
void User_Mes_Show(User *head) //用户信息显示
{
User *p=head;
while(p!=NULL)
{
printf("%-10s%-10s%-5d\n",p->ID,p->key,p->flag);
p=p->next;
}
free(p);
}
void User_Key_Change(User *head) //用户密码修改
{
char a[20];
char b[10],c[10],d[10];
FILE *fp;
User *p=head,*q=NULL;
while(1)
{
p=head;
printf("请输入需要修改的用户名:");
scanf("%s",a);
while(p!=NULL)
{
if(strcmp(a,p->ID)==0)
{
while(1)
{
printf("请输入原密码:");
scanf("%s",b);
if(strcmp(b,p->key)==0)
{
while(1)
{
printf("请输入修改后的密码:");
scanf("%s",c);
printf("请再次输入密码:");
scanf("%s",d);
if(strcmp(c,d)==0)
{
strcpy(p->key,d);
if((fp=fopen("D:\\用户信息文件.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
q=head;
while(q!=NULL)
{
fprintf(fp,"%s %s %d\n",q->ID,q->key,q->flag);
q=q->next;
}
fclose(fp);
free(p);
free(q);
printf("密码修改成功!\n");
return ;
}
else
printf("两次密码不一致,请重新输入!\n");
}
}
else
printf("原密码输入错误,请重新输入!\n");
}
}
p=p->next;
}
printf("该用户不存在,请重新输入!\n");
}
}
/******************************读者管理子系统*****************************/
Reader* link_2()//建立链表-读者信息文件
{
FILE *fp;
Reader *head=NULL,*p=NULL,*t=NULL;
if((fp=fopen("D:\\读者信息文件.txt","r"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
if((p=(Reader*)malloc(sizeof(Reader)))==NULL)
exit(0);
fscanf(fp,"%s%s%s%s%d%d\n",p->ID,p->name,p->address,p->phone,&p->num,&p->count);
p->next=NULL;
head=p;
while(!feof(fp))
{
t=p;
if((p=(Reader*)malloc(sizeof(Reader)))==NULL)
exit(0);
fscanf(fp,"%s%s%s%s%d%d\n",p->ID,p->name,p->address,p->phone,&p->num,&p->count);
p->next=NULL;
t->next=p;
}
return head;
}
void Reader_Manage()//读者管理
{
int ch;
system("cls");
while(1)
{
Reader *head=link_2();
menu_7();
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)
{
Reader_Mes_Input(head);
system("cls");
}
if(ch==2)
{
Reader_Mes_Change(head);
system("cls");
}
if(ch==3)
{
Reader_Mes_Delete(head);
system("cls");
}
if(ch==4)
Reader_Mes_Search(head);
if(ch==5)
Reader_Mes_Show(head);
if(ch==6)
{
system("cls");
break;
}
}
}
void Reader_Mes_Input(Reader *head) //读者信息输入
{
char a[20];
FILE *fp;
Reader *p=NULL,*q=head,*t=head;
while(q!=NULL)
{
p=q;
q=q->next;
}
q=(Reader*)malloc(sizeof(Reader));
q->next=NULL;
while(1)
{
printf("请输入用户名:");
scanf("%s",a);
while(t!=NULL)
{
if(strcmp(a,t->ID)==0)
{
printf("该用户已存在,请重新输入账号!\n");
break;
}
t=t->next;
}
if(t==NULL)
{
strcpy(q->ID,a);
printf("请输入读者名:");
scanf("%s",q->name);
printf("请输入单位名称:");
scanf("%s",q->address);
printf("请输入联系方式:");
scanf("%s",q->phone);
printf("请输入可借书数:");
scanf("%d",&q->num);
printf("请输入已借书数:");
scanf("%d",&q->count);
p->next=q;
if((fp=fopen("D:\\读者信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
p=head;
while(p!=NULL)
{
fprintf(fp,"%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
p=p->next;
}
printf("读者信息输入成功!\n");
free(p);
free(q);
free(t);
fclose(fp);
return;
}
}
}
void Reader_Mes_Change(Reader *head) //读者信息修改
{
Reader *p=head;
char id[20];
int ch;
FILE *fp;
while(1)
{
p=head;
printf("请输入需要修改的读者账号:");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(id,p->ID)==0)
{
printf("请输入需要修改的内容:\n1.账号\n2.姓名\n3.单位地址\n4.手机号码\n5.可借书数\n6.已借书数\n");
scanf("%d",&ch);
if(ch==1)
{
printf("输入修改后的账号:");
scanf("%s",p->ID);
}
if(ch==2)
{
printf("输入修改后的姓名:");
scanf("%s",p->name);
}
if(ch==3)
{
printf("输入修改后的单位地址:");
scanf("%s",p->address);
}
if(ch==4)
{
printf("输入修改后的手机号码:");
scanf("%s",p->phone);
}
if(ch==5)
{
printf("输入修改后的可借书数(5/10):");
scanf("%d",&p->num);
}
if(ch==6)
{
printf("输入修改后的已借书数:");
scanf("%d",&p->count);
}
p=head;
if((fp=fopen("D:\\读者信息文件.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
while(p!=NULL)
{
fprintf(fp,"%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
p=p->next;
}
printf("修改成功!\n");
fclose(fp);
free(p);
return ;
}
p=p->next;
}
printf("该账号不存在,请重新输入!\n");
}
}
void Reader_Mes_Delete(Reader *head) //读者信息删除
{
Reader *p=head,*q=NULL;
char id[20];
int ch;
FILE *fp;
while(1)
{
p=head;
printf("请输入需要删除的读者ID:");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(id,p->ID)==0)
{
printf("%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
printf("确认删除该用户的信息吗?\n1.确认\n2.取消\n");
scanf("%d",&ch);
if(ch==1)
{
if(p==head)
head=p->next;
else
q->next=p->next;
free(p);
p=head;
if((fp=fopen("D:\\读者信息文件.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
while(p!=NULL)
{
fprintf(fp,"%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
p=p->next;
}
printf("删除成功!\n");
free(p);
free(q);
fclose(fp);
return ;
}
if(ch==2)
return ;
}
q=p;
p=p->next;
}
printf("该账号不存在,请重新输入!\n");
}
}
void Reader_Mes_Search(Reader *head) //读者信息查询
{
Reader *p=head;
char id[20],myname[20],myphone[15];
FILE *fp;
int ch;
printf("请输入查询方式:\n1.读者号\n2.读者姓名\n3.手机号码\n");
scanf("%d",&ch);
while(1)
{
if(ch==1)
{
p=head;
printf("请输入需要查询的读者的账号:");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(id,p->ID)==0)
{
printf("已查询,该读者的信息为:\n");
printf("%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
free(p);
return;
}
p=p->next;
}
printf("该读者不存在,请重新输入!\n");
}
if(ch==2)
{
p=head;
printf("请输入需要查询的读者姓名:");
scanf("%s",myname);
while(p!=NULL)
{
if(strcmp(myname,p->name)==0)
{
printf("已查询,该读者的信息为:\n");
printf("%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
free(p);
return;
}
p=p->next;
}
printf("该读者不存在,请重新输入!\n");
}
if(ch==3)
{
p=head;
printf("请输入需要查询的读者手机号码:");
scanf("%s",myphone);
while(p!=NULL)
{
if(strcmp(myphone,p->phone)==0)
{
printf("已查询,该读者的信息为:\n");
printf("%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
free(p);
return;
}
p=p->next;
}
printf("该读者不存在,请重新输入!\n");
}
}
}
void Reader_Mes_Show(Reader *head) //读者信息显示
{
Reader *p=head,*q=NULL;
FILE *fp;
Reader *t;
char myID[20];
char myname[20];
char myaddress[20];
char myphone[15];
int mynum; //可借书数
int mycount;//已借书数
for(p=head;p->next!=NULL;p=p->next)
{
t=p;
for(q=p->next;q!=NULL;q=q->next)
{
if(strcmp(t->name,q->name)>0)
{
t=q;
}
if(p!=t)
{
strcpy(myID,p->ID);
strcpy(myname,p->name);
strcpy(myaddress,p->address);
strcpy(myphone,p->phone);
mynum=p->num;
mycount=p->count;
strcpy(p->ID,t->ID);
strcpy(p->name,t->name);
strcpy(p->address,t->address);
strcpy(p->phone,t->phone);
p->num=t->num;
p->count=t->count;
strcpy(t->ID,myID);
strcpy(t->name,myname);
strcpy(t->address,myaddress);
strcpy(t->phone,myphone);
t->num=mynum;
t->count=mycount;
}
}
}
p=head;
if((fp=fopen("D:\\读者信息文件.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
while(p!=NULL)
{
fprintf(fp,"%s %s %s %s %d %d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
p=p->next;
}
p=head;
while(p!=NULL)
{
printf("%10s%10s%12s%15s%5d%5d\n",p->ID,p->name,p->address,p->phone,p->num,p->count);
p=p->next;
}
fclose(fp);
free(p);
free(q);
free(t);
}
/******************************图书管理子系统*****************************/
void input(int len[],Book b[],Title t[],Author a[],Press p[])//将文件信息读到数组中
{
FILE *fp;
int i;
if((fp=fopen("D:\\图书主文件.txt","r"))==NULL)//读取图书主文件信息
{
printf("文件打开失败!1\n");
exit(0);
}
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%d%d%s%s%s%d%d%d%d%d\n",&b[i].num,&b[i].book_num,b[i].book_name,b[i].artist,b[i].press,&b[i].collect,&b[i].lend,&b[i].p1,&b[i].p2,&b[i].p3);
}
len[0]=i;
fclose(fp);
if((fp=fopen("D:\\书名次关键字索引表.txt","r"))==NULL)//读取书名次关键字索引表
{
printf("文件打开失败!2\n");
exit(0);
}
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s%d%d\n",t[i].title,&t[i].titleHead,&t[i].length);
}
len[1]=i;
fclose(fp);
if((fp=fopen("D:\\作者次关键字索引表.txt","r"))==NULL)//读取作者次关键字索引表
{
printf("文件打开失败!3\n");
exit(0);
}
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s%d%d\n",a[i].author,&a[i].authorHead,&a[i].length);
}
len[2]=i;
fclose(fp);
if((fp=fopen("D:\\出版社次关键字索引表.txt","r"))==NULL)//读取出版社次关键字索引表
{
printf("文件打开失败!4\n");
exit(0);
}
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s%d%d\n",p[i].press,&p[i].pressHead,&p[i].length);
}
len[3]=i;
fclose(fp);
}
void output(int len[],Book b[],Title t[],Author a[],Press p[])//将数组中数据写到外存文件
{
FILE *fp;
int i;
if((fp=fopen("D:\\图书主文件.txt","w"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
for(i=0;i<len[0];i++)
{
fprintf(fp,"%d %d %s %s %s %d %d %d %d %d\n",b[i].num,b[i].book_num,b[i].book_name,b[i].artist,b[i].press,b[i].collect,b[i].lend,b[i].p1,b[i].p2,b[i].p3);
}
fclose(fp);
if((fp=fopen("D:\\书名次关键字索引表.txt","w"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
for(i=0;i<len[1];i++)
{
fprintf(fp,"%s %d %d\n",t[i].title,t[i].titleHead,t[i].length);
}
fclose(fp);
if((fp=fopen("D:\\作者次关键字索引表.txt","w"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
for(i=0;i<len[2];i++)
{
fprintf(fp,"%s %d %d\n",a[i].author,a[i].authorHead,a[i].length);
}
fclose(fp);
if((fp=fopen("D:\\出版社次关键字索引表.txt","w"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
for(i=0;i<len[3];i++)
{
fprintf(fp,"%s %d %d\n",p[i].press,p[i].pressHead,p[i].length);
}
fclose(fp);
}
void Book_Manage(int len[],Book b[],Title t[],Author a[],Press p[])//图书管理
{
int ch;
system("cls");
input(len,b,t,a,p);
while(1)
{
menu_8();
mysort(len,b);
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)
{
Book_Mes_Input(len,b,t,a,p);
system("cls");
}
if(ch==2)
{
Book_Mes_Change(len,b);
system("cls");
}
if(ch==3)
Book_Mes_Search(len,b,t,a,p);
if(ch==4)
Summary(len,b,t,a,p);
if(ch==5)
{
system("cls");
break;
}
output(len,b,t,a,p);
}
}
void mysort(int len[],Book b[])//插入排序
{
int i,j;
Book temp;
for(i=1;i<len[0];i++)
{
j=i-1;
temp=b[i];
while(j>=0&&(temp.book_num<b[j].book_num))
{
b[j+1]=b[j];
j--;
}
b[j+1]=temp;
}
}
void Book_Mes_Input(int len[],Book b[],Title t[],Author a[],Press p[]) //图书信息输入
{
int i,j=0;
Book temp;
printf("请输入:\n");
printf("书号:");
scanf("%d",&temp.book_num);
printf("书名:");
scanf("%s",temp.book_name);
printf("作者:");
scanf("%s",temp.artist);
printf("出版社:");
scanf("%s",temp.press);
printf("藏书量:");
scanf("%d",&temp.collect);
printf("借出数:");
scanf("%d",&temp.lend);
if(len[0]==0)
{
b[0].num=1;
b[0].book_num=temp.book_num;
strcpy(b[0].book_name,temp.book_name);
strcpy(b[0].artist,temp.artist);
strcpy(b[0].press,temp.press);
b[0].collect=temp.collect;
b[0].lend=temp.lend;
b[0].p1=0;
b[0].p2=0;
b[0].p3=0;
strcpy(t[0].title,b[0].book_name);//书名次关键字索引表
t[0].titleHead=1;
t[0].length=1;
strcpy(a[0].author,b[0].artist);//作者次关键字索引表
a[0].authorHead=1;
a[0].length=1;
strcpy(p[0].press,b[0].press);//出版社次关键字索引表
p[0].pressHead=1;
p[0].length=1;
}
else
{
while(1)
{
for(i=0;i<len[0];i++)
{
if(temp.book_num==b[i].book_num||strcmp(temp.book_name,b[i].book_name)==0&&strcmp(temp.artist,b[i].artist)==0&&strcmp(temp.press,b[i].press)==0)
{
printf("该图书信息已存在,请重新输入!\n");
printf("请输入:\n");
printf("书号:");
scanf("%d",&temp.book_num);
printf("书名:");
scanf("%s",temp.book_name);
printf("作者:");
scanf("%s",temp.artist);
printf("出版社:");
scanf("%s",temp.press);
printf("藏书量:");
scanf("%d",&temp.collect);
printf("借出数:");
scanf("%d",&temp.lend);
break;
}
}
if(i==len[0])
{
b[len[0]].num=len[0]+1;
temp.num=b[len[0]].num;
b[len[0]].book_num=temp.book_num;
strcpy(b[len[0]].book_name,temp.book_name);
strcpy(b[len[0]].artist,temp.artist);
strcpy(b[len[0]].press,temp.press);
b[len[0]].collect=temp.collect;
b[len[0]].lend=temp.lend;
//len[0]++;
break;
}
}
/*
b[len[0]].num=len[0]+1;
temp.num=b[len[0]].num;
b[len[0]].book_num=temp.book_num;
strcpy(b[len[0]].book_name,temp.book_name);
strcpy(b[len[0]].artist,temp.artist);
strcpy(b[len[0]].press,temp.press);
b[len[0]].collect=temp.collect;
b[len[0]].lend=temp.lend;*/
for(i=0;i<len[1];i++)//书名次关键字索引表
{
if(strcmp(temp.book_name,t[i].title)==0)
{
b[len[0]].p1=t[i].titleHead;
t[i].titleHead=b[len[0]].num;
t[i].length=t[i].length+1;
break;
}
}
if(i==len[1])//没有找到相同的,重新建立一个
{
b[len[0]].p1=0;
strcpy(t[len[1]].title,temp.book_name);
t[len[1]].titleHead=temp.num;
t[len[1]].length=1;
len[1]++;
}
for(i=0;i<len[2];i++)//作者名次关键字索引表
{
if(strcmp(temp.artist,a[i].author)==0)
{
b[len[0]].p2=a[i].authorHead;
a[i].authorHead=temp.num;
a[i].length++;
break;
}
}
if(i==len[2])
{
b[len[0]].p2=0;
strcpy(a[len[2]].author,temp.artist);
a[len[2]].authorHead=temp.num;
a[len[2]].length=1;
len[2]++;
}
for(i=0;i<len[3];i++)//出版社次关键字索引表
{
if(strcmp(temp.press,p[i].press)==0)
{
b[len[0]].p3=p[i].pressHead;
p[i].pressHead=temp.num;
p[i].length++;
break;
}
}
if(i==len[3])
{
b[len[0]].p3=0;
strcpy(p[len[3]].press,temp.press);
p[len[3]].pressHead=temp.num;
p[len[3]].length=1;
len[3]++;
}
}
len[0]++;
// mysort(len,b);
}
void Book_Mes_Change(int len[],Book b[]) //图书信息修改
{
int i,ch;
int num;
int x,y;
while(1)
{
printf("请输入需要修改信息的图书的书号:");//无法通过查找书名等方式来修改,只能查找书号
scanf("%d",&num);
for(i=0;i<len[0];i++)
{
if(num==b[i].book_num)
{
printf("请输入需要修改的内容:\n");
printf("1.藏书量\n2.借出数\n");
scanf("%d",&ch);
if(ch==1)
{
printf("请输入修改后的藏书量:");
scanf("%d",&x);
b[i].collect=x;
return ;
}
if(ch==2)
{
printf("请输入修改后的借出量:");
scanf("%d",&y);
b[i].lend=y;
return ;
}
}
}
printf("该图书不存在,请重新输入!\n");
}
}
void Book_Mes_Search(int len[],Book b[],Title t[],Author a[],Press p[]) //图书信息查询
{
int ch,i,j,k,m,x;
int shuhao;
char shuming[20],zuozhe[20],chubanshe[20];
system("cls");
while(1)
{
menu_9();
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)//书号
{
printf("请输入需要查询的书号:");
scanf("%d",&shuhao);
int low=0,high=len[0]-1,mid;
while(low<=high)
{
mid=(low+high)/2;
//printf("%d\n",mid);
if(shuhao==b[mid].book_num)
{
printf("您所查找的信息如下:\n");
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[mid].num,b[mid].book_num,b[mid].book_name,b[mid].artist,b[mid].press,b[mid].collect,b[mid].lend,b[mid].p1,b[mid].p2,b[mid].p3);
return ;
}
else if(shuhao>b[mid].book_num)
low=mid+1;
else
high=mid-1;
}
printf("未找到该图书信息!\n");
}
if(ch==2)//书名
{
printf("请输入需要查询的书名:");
scanf("%s",shuming);
for(i=0;i<len[1];i++)
{
if(strcmp(shuming,t[i].title)==0)
{
j=t[i].titleHead;
for(m=0;m<len[0];m++)
{
if(j==b[m].num)
{
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[m].num,b[m].book_num,b[m].book_name,b[m].artist,b[m].press,b[m].collect,b[m].lend,b[m].p1,b[m].p2,b[m].p3);
x=m;
}
}
if(t[i].length>1)
{
for(k=0;k<t[i].length-1;k++)
{
j=b[x].p1;
for(m=0;m<len[0];m++)
{
if(j==b[m].num)
{
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[m].num,b[m].book_num,b[m].book_name,b[m].artist,b[m].press,b[m].collect,b[m].lend,b[m].p1,b[m].p2,b[m].p3);
x=m;
}
}
}
return ;
}
}
}
printf("未找到该图书信息!\n");
}
if(ch==3)//作者
{
printf("请输入需要查询的作者:");
scanf("%s",zuozhe);
for(i=0;i<len[2];i++)
{
if(strcmp(zuozhe,a[i].author)==0)
{
j=a[i].authorHead;
for(m=0;m<len[0];m++)
{
if(j==b[m].num)
{
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[m].num,b[m].book_num,b[m].book_name,b[m].artist,b[m].press,b[m].collect,b[m].lend,b[m].p1,b[m].p2,b[m].p3);
x=m;
}
}
if(a[i].length>1)
{
for(k=0;k<a[i].length-1;k++)
{
j=b[x].p2;
for(m=0;m<len[0];m++)
{
if(j==b[m].num)
{
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[m].num,b[m].book_num,b[m].book_name,b[m].artist,b[m].press,b[m].collect,b[m].lend,b[m].p1,b[m].p2,b[m].p3);
x=m;
}
}
}
return ;
}
}
}
printf("未找到该图书信息!\n");
}
if(ch==4)//出版社
{
printf("请输入需要查询的出版社:");
scanf("%s",chubanshe);
for(i=0;i<len[2];i++)
{
if(strcmp(chubanshe,p[i].press)==0)
{
j=p[i].pressHead;
for(m=0;m<len[0];m++)
{
if(j==b[m].num)
{
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[m].num,b[m].book_num,b[m].book_name,b[m].artist,b[m].press,b[m].collect,b[m].lend,b[m].p1,b[m].p2,b[m].p3);
x=m;
}
}
if(p[i].length>1)
{
for(k=0;k<p[i].length-1;k++)
{
j=b[x].p3;
for(m=0;m<len[0];m++)
{
if(j==b[m].num)
{
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[m].num,b[m].book_num,b[m].book_name,b[m].artist,b[m].press,b[m].collect,b[m].lend,b[m].p1,b[m].p2,b[m].p3);
x=m;
}
}
}
return ;
}
}
}
printf("未找到该图书信息!\n");
}
if(ch==5)
return;
}
}
void Summary(int len[],Book b[],Title t[],Author a[],Press p[])//汇总统计
{
int i,ch;
printf("请选择汇总方式:\n1.图书汇总\n2.书名汇总\n3.作者汇总\n4.出版社汇总\n请输入:");
scanf("%d",&ch);
if(ch==1)
{
printf("***********************图书汇总*******************************\n");
for(i=0;i<len[0];i++)
printf("%4d%6d%10s%8s%12s%4d%4d%4d%4d%4d\n",b[i].num,b[i].book_num,b[i].book_name,b[i].artist,b[i].press,b[i].collect,b[i].lend,b[i].p1,b[i].p2,b[i].p3);
printf("**************************************************************\n");
}
if(ch==2)
{
printf("********书名汇总********\n");
for(int i=0;i<len[1];i++)
printf("%10s%4d%4d\n",t[i].title,t[i].titleHead,t[i].length);
printf("************************\n");
}
if(ch==3)
{
printf("********作者汇总********\n");
for(int i=0;i<len[2];i++)
printf("%10s%4d%4d\n",a[i].author,a[i].authorHead,a[i].length);
printf("************************\n");
}
if(ch==4)
{
printf("********出版社汇总******\n");
for(int i=0;i<len[3];i++)
printf("%10s%4d%4d\n",p[i].press,p[i].pressHead,p[i].length);
printf("************************\n");
}
}
/******************************图书流通管理子系统*************************/
LR* link_3()//建立链表-借还书信息文件
{
FILE *fp;
LR *head=NULL,*p=NULL,*t=NULL;
if((fp=fopen("D:\\借还书信息文件.txt","r"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
if((p=(LR*)malloc(sizeof(LR)))==NULL)
exit(0);
fscanf(fp,"%s%d%s%s%s\n",p->ID,&p->book_num,p->Lend,p->Return,p->remark);
p->next=NULL;
head=p;
while(!feof(fp))
{
t=p;
if((p=(LR*)malloc(sizeof(LR)))==NULL)
exit(0);
fscanf(fp,"%s%d%s%s%s\n",p->ID,&p->book_num,p->Lend,p->Return,p->remark);
p->next=NULL;
t->next=p;
}
fclose (fp);
return head;
}
void LR_Manage(int len[],Book b[],Title t[],Author a[],Press p[])//图书流通管理
{
int ch;
LR *head=link_3();
system("cls");
while(1)
{
menu_10();
printf("请输入您的选择:");
scanf("%d",&ch);
if(ch==1)
Lend(head,len,b,t,a,p);
if(ch==2)
Return(head,len,b,t,a,p);
if(ch==3)
{
system("cls");
break;
}
}
}
void Lend(LR *head,int len[],Book b[],Title t[],Author a[],Press p[])//借书
{
FILE *fp;
Reader *head1=link_2();
Reader *p1=head1,*w;
LR *q=head,*t1=NULL,*m=NULL;
char id[20];
int shuhao,i;
if((fp=fopen("D:\\读者信息文件.txt","r"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
p1=head1;
printf("请输入读者账号:");
scanf("%s",id);
while(p1!=NULL)
{
if(strcmp(id,p1->ID)==0)
{
if(p1->count<p1->num)
{
printf("请输入书号:");
scanf("%d",&shuhao);
input(len,b,t,a,p);
for(i=0;i<len[0];i++)
{
if(shuhao==b[i].book_num)
{
if(b[i].collect>b[i].lend)
{
b[i].lend+=1;
p1->count+=1;
if((fp=fopen("D:\\读者信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
w=head1;
while(w!=NULL)
{
fprintf(fp,"%s %s %s %s %d %d\n",w->ID,w->name,w->address,w->phone,w->num,w->count);
w=w->next;
}
fclose(fp);
t1=(LR *)malloc(sizeof(LR));
strcpy(t1->ID,id);
t1->book_num=shuhao;
printf("请输入借书日期:\n(温馨提示:借阅书籍需在一个月内归还,否则将进行相应罚款!)\n");
scanf("%s",t1->Lend);
strcpy(t1->Return,"未还书");
strcpy(t1->remark,"无");
while(q!=NULL)
{
m=q;
q=q->next;
}
m->next=t1;
t1->next=NULL;
if((fp=fopen("D:\\借还书信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
m=head;
while(m!=NULL)
{
fprintf(fp,"%s %d %s %s %s\n",m->ID,m->book_num,m->Lend,m->Return,m->remark);
m=m->next;
}
printf("借书成功!\n");
output(len,b,t,a,p);
fclose(fp);
free(p1);
free(q);
free(m);
free(t1);
free(w);
return ;
}
else
{
printf("该书籍已全部借出!\n");
return ;
}
}
}
if(i==len[0])
{
printf("未找到该书籍!\n");
return;
}
}
else
{
printf("该读者所借书数已超出限额,无法借书!\n");
return ;
}
}
p1=p1->next;
}
if(p1==NULL)
printf("该读者不存在!\n");
fclose(fp);
}
void Return(LR *head,int len[],Book b[],Title t[],Author a[],Press p[])//还书
{
FILE *fp,*fp1;
Reader *head1=link_2();
head=link_3();
Reader *p1=head1,*w=NULL;
LR *q=head,*m=NULL;
char id[20],date[20];
int shuhao,i;
if((fp=fopen("D:\\读者信息文件.txt","r"))==NULL)
{
printf ("文件打开失败!\n");
exit(0);
}
p1=head1;
printf("请输入读者账号:");
scanf("%s",id);
while(p1!=NULL)
{
if(strcmp(id,p1->ID)==0)
{
printf("请输入书号:");
scanf("%d",&shuhao);
while(q!=NULL)
{
if(strcmp(id,q->ID)==0&&shuhao==q->book_num)
{
printf("已查询到该信息:\n");
printf("%s %d %s %s %s\n",q->ID,q->book_num,q->Lend,q->Return,q->remark);
printf("请判断该读者是否在规定时间内还书:\n1.是\n2.不是\n请输入您的选择:");
int ch;
scanf("%d",&ch);
if(ch==1)
{
input(len,b,t,a,p);
for(i=0;i<len[0];i++)
{
if(shuhao==b[i].book_num)
{
if((fp=fopen("D:\\读者信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!1\n");
exit(0);
}
p1->count=p1->count-1;
w=head1;
while(w!=NULL)
{
fprintf(fp,"%s %s %s %s %d %d\n",w->ID,w->name,w->address,w->phone,w->num,w->count);
w=w->next;
}
fclose(fp);
b[i].lend=b[i].lend-1;
output(len,b,t,a,p);
printf ("请输入还书日期:");
scanf("%s",date);
//printf("%s\n",q->Return);
strcpy(q->Return,date);
strcpy(q->remark,"无");
//printf("%s\n",q->Lend);
//printf("%s\n",q->Return);
//printf("%s\n",q->remark);
if((fp1=fopen("D:\\借还书信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!2\n");
exit(0);
}
m=head;
while(m!=NULL)
{
fprintf(fp1,"%s %d %s %s %s\n",m->ID,m->book_num,m->Lend,m->Return,m->remark);
m=m->next;
}
printf("还书成功!\n");
fclose(fp1);
free(p1);
free(q);
free(m);
free(w);
return;
}
}
if(i==len[0])
{
printf("在读者文件中该书号不合法!\n");
return ;
}
}
if(ch==2)
{
strcpy(q->remark,"过期未还");
if((fp1=fopen("D:\\借还书信息文件.txt","w"))==NULL)
{
printf ("文件打开失败!2\n");
exit(0);
}
m=head;
while(m!=NULL)
{
fprintf(fp1,"%s %d %s %s %s\n",m->ID,m->book_num,m->Lend,m->Return,m->remark);
m=m->next;
}
printf("操作完毕!\n");
fclose(fp);
free(p1);
free(q);
free(m);
free(w);
return;
}
}
q=q->next;
}
if(q==NULL)
{
printf("在借还书文件中该书号不合法!\n");
return ;
}
}
p1=p1->next;
}
if(p1==NULL)
printf("该读者不存在!\n");
fclose(fp);
}
//主函数
int main()
{
while(1)
{
system("cls");
menu_1();
printf("请输入您的选择:");
int ch;
scanf("%d",&ch);
if(ch==1) //登录
land();
if(ch==2) // 注册
Register();
if(ch==3) // 退出
return 0;
}
}
图书管理系统
最新推荐文章于 2022-11-21 09:19:27 发布