图书管理系统

    技术2024-10-04  47

    #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; } }
    Processed: 0.018, SQL: 12