对于我们大一的新生来说写一个管理类程序确实很难,但是这个“难”不再“思维”,而在“综合”。你如果坚持把这个管理系统写完你就会发现他不难都是基础的知识,但是很杂、综合性很高。尽管没有思维上的难度,一个又杂又大综合性高的程序让一个大一的小白来写自然会感到很难。
我的C语言是直接从函数开始学,前面的没学都是后来自己补的。开始面对这个大程序我也放弃过,大概中断了将近2个月。但是后来我还是坚持把他给弄完了。一定要坚持。
另外说一下,我的C语言不是很好,写的很低级。如有不足请多包涵
(程序不连贯每完成一项后需要重新开始)
3.15 图书借阅管理系统设计(难度系数:5级)
【任务描述】
编写一个图书信息管理系统,对我校的图书信息进行管理,并实现借书、还书功能。
【功能要求】
(1)管理员功能
图书信息管理:图书信息包括:编号、书名、作者名、分类号、出版单位、出版时间、库存数量,价格等。可对图书进行添加、删除、修改、查询、保存、浏览等操作。
读者信息管理:读者信息包括:编号,借阅号,姓名,最大借阅额度,已借阅数量,读者密码。可对读者信息进行添加、删除、修改、查询、保存、浏览等操作。
提供多种形式的查询:如按书名,按作者名,按出版单位,按出版时间等进行查询。
借阅信息查询:可按图书、按读者、按作者等,查询相关的借书信息。
还书信息查询:可按图书、按读者、按作者等,查询相关的还书信息。
(2)读者功能
图书查询功能
借书功能:读者登录后,选择借书功能。系统可查看是否允许借阅。如果允许借阅,进行图书借阅操作:在借阅表中添加新记录,修改库存,修改读者相关信息。
还书功能:读者登录后,选择还书功能。系统查看图书是否超期。超期图书需支付相应费用。在还书表中添加新记录,修改库存,修改读者相关信息。
读者密码维护
(3)设计提示
管理员、读者分别用密码登录,分别完成不同的操作。
重点 3个stand函数
他们的作用是把文件中的信息转到链表;
head = stand(fp);
r_head = r_stand(cp);
l_head = l_stand(rp);
只要将这三个函数搞明白剩下的一切就不攻自破;
管理员密码 :255426331
造作说明
1.先进行管理员登录
2.进入图书信息管理添加图书
3进入读者信息管理添加读者
这之后就可以随便玩了-------------------------------------
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
struct book
{
long int bian_name;//编号
char book_name[50];//书名
char author[50];//作者名
char classification_number[10];//分类号
char Publisher[20];//出版社
char Publication_date[20];//出版日期
int Inventory_quantity;//库存数量
float Price;//价格
struct book *next;
};
struct reader
{
long int re_numbering;//读者编号
long int borrowing_number;//借阅号
char re_name[20];//读者
int Maximum_borrowing;//最大借阅量
int borrow_have;//以借书籍量
char re_code[20];//密码
struct reader *next;
};
struct lend//借书的结构体
{
char p_name[20];//借阅人名
char b_name[20];//借的书的名字
int l_year; //还书日期
int l_month;
int l_day;
int b_year;//借书日期
int b_month;
int b_day;
int judgment;//判断1为还书 0为借书
struct lend *next;
};
void menu();//总菜单
//管理员系统
//(1)图书信息
void intendant(FILE *fp,FILE *cp,FILE *rp,struct book *head, struct reader *r_head, struct lend *l_head);//管理者系统
struct book *stand(FILE *fp);//将图书文件信息转到链表 关键
void add(FILE *fp);//添加图书信息
void browse(struct book *head);//浏览图书信息
void erase(FILE *fp,struct book *head);//删除图书信息
void in_file(FILE *fp,struct book *head);//存入图书信息
void revise(FILE *fp,struct book *head);//修改图书信息
void view(struct book *head);
//(2)读者信息
struct reader *r_stand(FILE *cp);//将读者信息导入链表 关键
void r_add(FILE *cp);//添加读者信息
void r_browse(struct reader *r_head);//浏览读者信息
void r_erase(FILE *cp,struct reader *r_head);//删除信息
void r_in_file(FILE *cp,struct reader *r_head);//存入读者信息
void r_revise(FILE *cp,struct reader *r_head);//修改读者信息
void r_view(struct reader *r_head);//查看读者信息
//(3)借书查询
void find1(struct lend *l_head);//按图书查找借书信息
void find2(struct lend *l_head);//按读者查找借书信息
void find3(struct lend *l_head,struct book *head);//按作者查找借书信息
//(4)还书查询
void find11(struct lend *l_head);//按图书查找还书信息
void find22(struct lend *l_head);//按读者查找还书信息
void find33(struct lend *l_head,struct book *head);//按作者查找还书信息
//读者系统
void logs(struct reader *r_head);//读者登录
struct lend *l_stand(FILE *rp);//将借阅信息导入链表 关键
void re_login(FILE *fp,FILE *cp,FILE *rp,struct book *head, struct reader *r_head, struct lend *l_head);//读者系统
void borrow_books(FILE *fp,FILE *cp,FILE *rp,struct book *head,struct reader *r_head,struct lend *l_head);//借书系统
void return_books(FILE *fp,FILE *cp,FILE *rp,struct book *head,struct reader *r_head,struct lend *l_head);//还书系统
void maintenance(struct reader *r_head,FILE *cp);//修改密码
void Check_again(char name[20],struct lend *l_head);//借书查重
int Overage_billing(int x,int y,int z,int s,int k,int t);//检查是否超期借阅
void penalty(int j);//超期借阅的罚款
struct reader *now;
void main()
{
FILE *fp, *cp, *rp;
struct book *head;
struct reader *r_head;
struct lend *l_head;
if((fp = fopen("图书信息","a+"))==NULL)
{
printf("can not open the file!\n");
exit(0);
}
if((cp = fopen("读者信息","a+"))==NULL)
{
printf("can not open the file!\n");
exit(0);
}
if((rp = fopen("借书信息","a+"))==NULL)
{
printf("can not open the file!\n");
exit(0);
}
head = stand(fp); //基石 文件——————>链表
r_head = r_stand(cp); //基石 文件——————>链表
l_head = l_stand(rp); //基石 文件——————>链表
int order;
menu();
printf("\n请输入对应功能前的序号:");
scanf("%d",&order);
switch(order)
{
case 1:
re_login(fp,cp,rp,head, r_head, l_head);//读者系统
break;
case 2:
intendant(fp,cp,rp,head, r_head, l_head);//管理者系统
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
fclose(fp);
fclose(cp);
fclose(rp);
}
void menu()
{
printf("\nC语言结课设计 \n");
printf("学生:XX \n");
printf("学号:XXXXXXXXXXXX \n\n");
printf("\t\t*****************************************\n");
printf("\t\t*****************************************\n");
printf("\t\t 图书管理系统(5级) \n");
printf("\t\t 1.读者登录 \n");
printf("\t\t 2.管理者登录 \n");
printf("\t\t*****************************************\n");
printf("\t\t*****************************************\n");
}
void intendant(FILE *fp,FILE *cp,FILE *rp,struct book *head, struct reader *r_head, struct lend *l_head)
{
int order2,order3;
char use_password[20];
printf("\n请输入登录密码:\n");
scanf("%s",use_password);
if(strcmp(use_password,"255426331")==0)
{
printf("登陆成功!\n\n");
printf("\t\t***********************\n");
printf("\t\t***********************\n");
printf("\t\t 1.图书信息管理\n");
printf("\t\t 2.读者信息管理\n");
printf("\t\t 3.借阅信息查询\n");
printf("\t\t 4.还书信息查询\n");
printf("\t\t***********************\n");
printf("\t\t***********************\n\n");
printf("\n请输入对应功能前的序号:");
scanf("%d",&order2);
switch(order2)
{
case 1:
printf("\t\t************************\n");
printf("\t\t************************\n");
printf("\t\t 1.添加图书信息\n");
printf("\t\t 2.浏览图书信息\n");
printf("\t\t 3.删除图书信息\n");
printf("\t\t 4.修改图书信息\n");
printf("\t\t 5.查看图书信息\n");
printf("\t\t************************\n");
printf("\t\t************************\n\n");
printf("\n请输入对应功能前的序号:");
scanf("%d",&order3);
switch(order3)
{
case 1:
add(fp);
break;
case 2:
browse(head);//浏览
break;
case 3:
erase(fp,head);//删除
break;
case 4:
revise(fp,head);//修改
break;
case 5:
view(head);//查看
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
break;
case 2:
printf("\t\t******************************\n");
printf("\t\t******************************\n");
printf("\t\t 1.添加读者信息\n");
printf("\t\t 2.浏览读者信息\n");
printf("\t\t 3.删除读者信息\n");
printf("\t\t 4.修改读者信息\n");
printf("\t\t 5.查看读者信息\n");
printf("\t\t******************************\n");
printf("\t\t******************************\n\n");
printf("\n请输入对应功能前的序号:");
scanf("%d",&order3);
switch(order3)
{
case 1:
r_add(cp);//添加
break;
case 2:
r_browse(r_head);//浏览
break;
case 3:
r_erase(cp,r_head);//删除
break;
case 4:
r_revise(cp,r_head);//修改
break;
case 5:
r_view(r_head);//查看
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
break;
case 3:
//图书、按读者、按作者
printf("\t\t********************\n");
printf("\t\t1.按图书查找借阅信息\n");
printf("\t\t2.按读者查找借阅信息\n");
printf("\t\t3.按作者查找借阅信息\n");
printf("\t\t********************\n\n");
printf("\n请输入对应功能前的序号:");
scanf("%d",&order3);
switch(order3)
{
case 1:
find1(l_head);//图书
break;
case 2:
find2(l_head);//读者
break;
case 3:
find3(l_head,head);//作者
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
break;
case 4:
printf("\t\t******************************\n");
printf("\t\t******************************\n");
printf("\t\t 1.按图书查找还书信息\n");
printf("\t\t 2.按读者查找还书信息\n");
printf("\t\t 3.按作者查找还书信息\n");
printf("\t\t******************************\n");
printf("\t\t******************************\n\n");
printf("\n请输入对应功能前的序号:");
scanf("%d",&order3);
switch(order3)
{
case 1:
find11(l_head);//图书
break;
case 2:
find22(l_head);//读者
break;
case 3:
find33(l_head,head);//作者
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
}
else
{
printf("密码错误结束程序!\n");
exit(0);
}
}
struct book *stand(FILE *fp)
{
struct book *a,*b,*head;
head = (struct book *)malloc(sizeof(struct book));
a = b = head;
head->next=NULL;
while(!feof(fp))
{
a = (struct book *)malloc(sizeof(struct book));
fscanf(fp,"%ld",&a->bian_name);
fscanf(fp,"%s",a->book_name);
fscanf(fp,"%s",a->author);
fscanf(fp,"%s",a->classification_number);
fscanf(fp,"%s",a->Publisher);
fscanf(fp,"%s",a->Publication_date);
fscanf(fp,"%d",&a->Inventory_quantity);
fscanf(fp,"%f",&a->Price);
a->next = NULL;
b->next = a;
b = a;
}
return head;
}
void add(FILE *fp)
{
int order=1;
struct book tj;
while(order)
{
printf("编号\n");
scanf("%ld",&tj.bian_name);
printf("书名\n");
scanf("%s",tj.book_name);
printf("作者名\n");
scanf("%s",tj.author);
printf("分类号\n");
scanf("%s",tj.classification_number);
printf("出版单位\n");
scanf("%s",tj.Publisher);
printf("出版时间\n");
scanf("%s",tj.Publication_date);
printf("库存数量\n");
scanf("%d",&tj.Inventory_quantity);
printf("价格\n");
scanf("%f",&tj.Price);
fprintf(fp,"\n%ld ",tj.bian_name);
fprintf(fp,"%s ",tj.book_name);
fprintf(fp,"%s ",tj.author);
fprintf(fp,"%s ",tj.classification_number);
fprintf(fp,"%s ",tj.Publisher);
fprintf(fp,"%s ",tj.Publication_date);
fprintf(fp,"%d ",tj.Inventory_quantity);
fprintf(fp,"%.2f",tj.Price);
printf("输入非零数继续添加:");
scanf("%d",&order);
}
}
void browse(struct book *head)
{
struct book *a;
a = head;
while(a->next != NULL)
{
a = a->next;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
void erase(FILE *fp,struct book *head)
{
int ok=0;
struct book *a,*b;
char contrast_name[50];
b = a = head;
printf("输入要删除书的书名!\n");
scanf("%s",contrast_name);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_name,a->book_name)==0)
{
a = a->next;
b->next = a;
break;
}
b = b->next;
}
in_file(fp,head);
}
void in_file(FILE *fp,struct book *head)
{
fclose(fp);
if((fp = fopen("图书信息","w+"))==NULL)
{
printf("can not open the file!\n");
exit(0);
}
struct book *a;
a = head;
while(a->next != NULL)
{
a = a->next;
fprintf(fp,"\n%ld ",a->bian_name);
fprintf(fp,"%s ",a->book_name);
fprintf(fp,"%s ",a->author);
fprintf(fp,"%s ",a->classification_number);
fprintf(fp,"%s ",a->Publisher);
fprintf(fp,"%s ",a->Publication_date);
fprintf(fp,"%d ",a->Inventory_quantity);
fprintf(fp,"%.2f",a->Price);
}
}
void revise(FILE *fp,struct book *head)
{
int order;
struct book *a;
char contrast_name[50];
a = head;
printf("输入要修改书籍的名字!\n");
scanf("%s",contrast_name);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_name,a->book_name)==0)
{
printf("\t\t******************************\n");
printf("\t\t******************************\n");
printf("\t\t 1.修改编号\n");
printf("\t\t 2.修改书名\n");
printf("\t\t 3.修改作者名\n");
printf("\t\t 4.修改分类号\n");
printf("\t\t 5.修改出版社\n");
printf("\t\t 6.修改出版日期\n");
printf("\t\t 7.修改库存\n");
printf("\t\t 8.修改价格\n");
printf("\t\t 9.全部修改\n");
printf("\t\t******************************\n");
printf("\t\t******************************\n\n");
printf("\n请输入对应修改功能的序号:");
scanf("%d",&order);
switch(order)
{
case 1:
printf("输入修改后的编号:");
scanf("%ld",&a->bian_name);
break;
case 2:
printf("输入修改后的书名:");
scanf("%s",a->book_name);
break;
case 3:
printf("输入修改后的作者名:");
scanf("%s",a->author);
break;
case 4:
printf("输入修改后的分类号:");
scanf("%s",a->classification_number);
break;
case 5:
printf("输入修改后的出版社:");
scanf("%s",a->Publisher);
break;
case 6:
printf("输入修改后的出版日期:");
scanf("%s",a->Publication_date);
break;
case 7:
printf("输入修改后的库存:");
scanf("%d",&a->Inventory_quantity);
break;
case 8:
printf("输入修改后的价格:");
scanf("%f",&a->Price);
break;
case 9:
printf("输入修改后的编号:");
scanf("%ld",&a->bian_name);
printf("输入修改后的书名:");
scanf("%s",a->book_name);
printf("输入修改后的作者名:");
scanf("%s",a->author);
printf("输入修改后的分类号:");
scanf("%s",a->classification_number);
printf("输入修改后的出版社:");
scanf("%s",a->Publisher);
printf("输入修改后的出版日期:");
scanf("%s",a->Publication_date);
printf("输入修改后的库存:");
scanf("%d",&a->Inventory_quantity);
printf("输入修改后的价格:");
scanf("%f",&a->Price);
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
break;
}
}
in_file(fp,head);
}
void view(struct book *head)
{
int order,n=0;
struct book *a;
a = head;
printf("\t\t******************************\n");
printf("\t\t******************************\n");
printf("\t\t 1.按编号查找\n");
printf("\t\t 2.按书名查找\n");
printf("\t\t 3.按作者查找\n");
printf("\t\t 4.按分类号查找\n");
printf("\t\t 5.按出版社查找\n");
printf("\t\t 6.按出版日期查找\n");
printf("\t\t 7.按库存查找\n");
printf("\t\t 8.按价格查找\n");
printf("\t\t******************************\n");
printf("\t\t******************************\n\n");
printf("输入对应功能前的序号:");
scanf("%d",&order);
switch(order)
{
case 1:
long int contrast_bian_name;
printf("输入你要查找书籍的编号:");
scanf("%ld",&contrast_bian_name);
while(a->next != NULL)
{
a = a->next;
if(contrast_bian_name == a->bian_name)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
case 2:
char contrast_book_name[50];
printf("输入你要查找书籍的书名:");
scanf("%s",contrast_book_name);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_book_name,a->book_name)==0)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
case 3:
char contrast_author[50];
printf("输入你要查找书籍的作者名:");
scanf("%s",contrast_author);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_author,a->author)==0)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
case 4:
char contrast_classification_number[10];
printf("输入你要查找书籍的分类号:");
scanf("%s",contrast_classification_number);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_classification_number,a->classification_number)==0)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
case 5:
char contrast_Publisher[20];
printf("输入你要查找书籍的出版社:");
scanf("%s",contrast_Publisher);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_Publisher,a->Publisher)==0)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
case 6:
char contrast_Publication_date[20];
printf("输入你要查找书籍的出版时间:");
scanf("%s",contrast_Publication_date);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_Publication_date,a->Publication_date)==0)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
case 7:
int contrast_Inventory_quantity;
printf("输入你要查找书籍的库存:");
scanf("%d",&contrast_Inventory_quantity);
while(a->next != NULL)
{
a = a->next;
if(contrast_Inventory_quantity == a->Inventory_quantity)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
case 8:
float contrast_Price;
printf("输入你要查找书籍的价格:");
scanf("%f",&contrast_Price);
while(a->next != NULL)
{
a = a->next;
if(contrast_Price == a->Price)
{
n=1;
printf("编号:%ld\n",a->bian_name);
printf("书名:%s\n",a->book_name);
printf("作者名:%s\n",a->author);
printf("分类号:%s\n",a->classification_number);
printf("出版单位:%s\n",a->Publisher);
printf("出版时间:%s\n",a->Publication_date);
printf("库存数量:%d\n",a->Inventory_quantity);
printf("价格:%.2f\n\n",a->Price);
}
}
if(n==0)
{
printf("查无此书,自动结束程序\n");
exit(0);
}
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
}
struct reader *r_stand(FILE *cp)
{
struct reader *a,*b,*head;
head = (struct reader *)malloc(sizeof(struct reader));
a = b = head;
head->next =NULL;
while(!feof(cp))
{
a = (struct reader *)malloc(sizeof(struct reader));
fscanf(cp,"%ld",&a->re_numbering);
fscanf(cp,"%ld",&a->borrowing_number);
fscanf(cp,"%s",a->re_name);
fscanf(cp,"%d",&a->Maximum_borrowing);
fscanf(cp,"%d",&a->borrow_have);
fscanf(cp,"%s",a->re_code);
a->next = NULL;
b->next = a;
b = a;
}
return head;
}
void r_add(FILE *cp)
{
int n=1;
struct reader tj;
struct reader *a;
a = &tj;
while(n)
{
printf("输入读者编号\n");
scanf("%ld",&a->re_numbering);
printf("输入读者借阅号.(10***)\n");
scanf("%ld",&a->borrowing_number);
printf("输入读者姓名\n");
scanf("%s",a->re_name);
printf("输入读者最大借阅量\n");
scanf("%d",&a->Maximum_borrowing);
printf("输入读者以借阅数量\n");
scanf("%d",&a->borrow_have);
printf("输入读者密码\n");
scanf("%s",a->re_code);
fprintf(cp,"\n%ld ",a->re_numbering);
fprintf(cp,"%ld ",a->borrowing_number);
fprintf(cp,"%s ",a->re_name);
fprintf(cp,"%d ",a->Maximum_borrowing);
fprintf(cp,"%d ",a->borrow_have);
fprintf(cp,"%s",a->re_code);
printf("输入非零数继续添加:");
scanf("%d",&n);
}
}
void r_browse(struct reader *r_head)
{
struct reader *a;
a = r_head;
while(a->next != NULL)
{
a = a->next;
printf("读者编号:%ld\n",a->re_numbering);
printf("读者借阅号:%ld\n",a->borrowing_number);
printf("读者姓名:%s\n",a->re_name);
printf("读者最大借阅量:%d\n",a->Maximum_borrowing);
printf("读者以借阅数量:%d\n",a->borrow_have);
printf("读者密码:%s\n\n",a->re_code);
}
}
void r_erase(FILE *cp,struct reader *r_head)
{
char contrast_name[50];
struct reader *a,*b;
a = b = r_head;
printf("\n请输入你要删除读者的姓名\n");
scanf("%s",contrast_name);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_name,a->re_name)==0)
{
a = a->next;
b->next = a;
break;
}
b = b->next;
}
r_in_file(cp,r_head);
}
void r_in_file(FILE *cp,struct reader *r_head)
{
fclose(cp);
if((cp = fopen("读者信息","w+"))==NULL)
{
printf("can not open the file!\n");
exit(0);
}
struct reader *a;
a = r_head;
while(a->next != NULL)
{
a = a->next;
fprintf(cp,"\n%ld ",a->re_numbering);
fprintf(cp,"%ld ",a->borrowing_number);
fprintf(cp,"%s ",a->re_name);
fprintf(cp,"%d ",a->Maximum_borrowing);
fprintf(cp,"%d ",a->borrow_have);
fprintf(cp,"%s",a->re_code);
}
}
void r_revise(FILE *cp,struct reader *r_head)
{
int order;
struct reader *a;
char contrast_name[50];
a = r_head;
printf("输入要修改读者的姓名\n");
scanf("%s",contrast_name);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_name,a->re_name)==0)
{
printf("\t\t******************************\n");
printf("\t\t******************************\n");
printf("\t\t 1.修改读者编号\n");
printf("\t\t 2.修改读者借阅号\n");
printf("\t\t 3.修改读者姓名\n");
printf("\t\t 4.修改读者最大借阅量\n");
printf("\t\t 5.修改读者以借阅数量\n");
printf("\t\t 6.修改读者密码\n");
printf("\t\t 7.全部修改\n");
printf("\t\t******************************\n");
printf("\t\t******************************\n\n");
printf("\n请输入对应修改功能的序号:");
scanf("%d",&order);
switch(order)
{
case 1:
printf("输入修改后的编号");
scanf("%ld",&a->re_numbering);
break;
case 2:
printf("输入修改后的借阅号");
scanf("%ld",a->borrowing_number);
break;
case 3:
printf("输入修改后的读者姓名\n");
scanf("%s",a->re_name);
break;
case 4:
printf("输入修改后的读者最大借阅量\n");
scanf("%d",&a->Maximum_borrowing);
break;
case 5:
printf("输入修改后的读者以借阅数量\n");
scanf("%d",&a->borrow_have);
break;
case 6:
printf("输入修改后的读者密码\n");
scanf("%s",a->re_code);
break;
case 7:
printf("输入修改后的读者编号\n");
scanf("%ld",&a->re_numbering);
printf("输入修改后的读者借阅号.(10***)\n");
scanf("%ld",&a->borrowing_number);
printf("输入修改后的读者姓名\n");
scanf("%s",a->re_name);
printf("输入修改后的读者最大借阅量\n");
scanf("%d",&a->Maximum_borrowing);
printf("输入修改后的读者以借阅数量\n");
scanf("%d",&a->borrow_have);
printf("输入修改后的读者密码\n");
scanf("%s",a->re_code);
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
break;
}
}
r_in_file(cp,r_head);
}
void r_view(struct reader *r_head)
{
int order;
struct reader *a;
a = r_head;
printf("\t\t********************************\n");
printf("\t\t********************************\n");
printf("\t\t 1.按读者编号查找\n");
printf("\t\t 2.按读者借阅号查找\n");
printf("\t\t 3.按读者姓名查找\n");
printf("\t\t 4.按读者最大借阅量查找\n");
printf("\t\t 5.按读者以借阅数量查找\n");
printf("\t\t 6.按读者密码查找\n");
printf("\t\t********************************\n");
printf("\t\t********************************\n\n");
printf("输入对应功能前的序号:");
scanf("%d",&order);
switch(order)
{
case 1:
long int contrast_re_numbering;
printf("输入查找的编号:");
scanf("%ld",&contrast_re_numbering);
while(a->next != NULL)
{
a = a->next;
if(contrast_re_numbering == a->re_numbering)
{
printf("读者编号:%ld\n",a->re_numbering);
printf("读者借阅号:%ld\n",a->borrowing_number);
printf("读者姓名:%s\n",a->re_name);
printf("读者最大借阅量:%d\n",a->Maximum_borrowing);
printf("读者以借阅数量:%d\n",a->borrow_have);
printf("读者密码:%s\n\n",a->re_code);
}
}
break;
case 2:
long int contrast_borrowing_number;
printf("输入查找的借阅号:");
scanf("%ld",&contrast_borrowing_number);
while(a->next != NULL)
{
a = a->next;
if(contrast_borrowing_number == a->borrowing_number)
{
printf("读者编号:%ld\n",a->re_numbering);
printf("读者借阅号:%ld\n",a->borrowing_number);
printf("读者姓名:%s\n",a->re_name);
printf("读者最大借阅量:%d\n",a->Maximum_borrowing);
printf("读者以借阅数量:%d\n",a->borrow_have);
printf("读者密码:%s\n\n",a->re_code);
}
}
break;
case 3:
char contrast_re_name[20];
printf("输入查找的读者姓名:");
scanf("%s",contrast_re_name);
while(a->next != NULL)
{
a = a->next;
if(strcmp(contrast_re_name,a->re_name)==0)
{
printf("读者编号:%ld\n",a->re_numbering);
printf("读者借阅号:%ld\n",a->borrowing_number);
printf("读者姓名:%s\n",a->re_name);
printf("读者最大借阅量:%d\n",a->Maximum_borrowing);
printf("读者以借阅数量:%d\n",a->borrow_have);
printf("读者密码:%s\n\n",a->re_code);
}
}
break;
case 4:
int contrast_Maximum_borrowing;
printf("输入查找的读者最大借阅量:");
scanf("%d",&contrast_Maximum_borrowing);
while(a->next != NULL)
{
a = a->next;
if(contrast_Maximum_borrowing == a->Maximum_borrowing)
{
printf("读者编号:%ld\n",a->re_numbering);
printf("读者借阅号:%ld\n",a->borrowing_number);
printf("读者姓名:%s\n",a->re_name);
printf("读者最大借阅量:%d\n",a->Maximum_borrowing);
printf("读者以借阅数量:%d\n",a->borrow_have);
printf("读者密码:%s\n\n",a->re_code);
}
}
break;
case 5:
int contrast_borrow_have;
printf("输入查找的读者以借阅数量:");
scanf("%d",&contrast_borrow_have);
while(a->next != NULL)
{
a = a->next;
if(contrast_borrow_have == a->borrow_have)
{
printf("读者编号:%ld\n",a->re_numbering);
printf("读者借阅号:%ld\n",a->borrowing_number);
printf("读者姓名:%s\n",a->re_name);
printf("读者最大借阅量:%d\n",a->Maximum_borrowing);
printf("读者以借阅数量:%d\n",a->borrow_have);
printf("读者密码:%s\n\n",a->re_code);
}
}
break;
case 6:
char contrast_re_code[20];
printf("输入查找的读者密码:");
scanf("%s",contrast_re_code);
while(a->next != NULL)
{
a = a->next;
if(strcmp( contrast_re_code,a->re_code)==0)
{
printf("读者编号:%ld\n",a->re_numbering);
printf("读者借阅号:%ld\n",a->borrowing_number);
printf("读者姓名:%s\n",a->re_name);
printf("读者最大借阅量:%d\n",a->Maximum_borrowing);
printf("读者以借阅数量:%d\n",a->borrow_have);
printf("读者密码:%s\n\n",a->re_code);
}
}
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
}
void find1(struct lend *l_head)
{
char name[20];
struct lend *a;
a = l_head;
printf("\n请输入书名\n");
scanf("%s",name);
while(a->next != NULL)
{
a = a->next;
if( (strcmp(name,a->b_name)==0) &&(a->judgment == 0) )
{
printf("\n借阅人:%s\n",a->p_name);
printf("借阅书籍:%s\n",a->b_name);
printf("借书时间:%d:%d:%d\n\n",a->b_year,a->b_month,a->b_day);
}
}
}
void find2(struct lend *l_head)
{
char name[20];
struct lend *a;
a = l_head;
printf("\n请输入读者的名字\n");
scanf("%s",name);
while(a->next != NULL)
{
a = a->next;
if( (strcmp(name,a->p_name)==0) && (a->judgment==0) )
{
printf("\n借阅人:%s\n",a->p_name);
printf("借阅书籍:%s\n",a->b_name);
printf("借书时间:%d:%d:%d\n\n",a->b_year,a->b_month,a->b_day);
}
}
}
void find3(struct lend *l_head,struct book *head)
{
char writer[20],name[50];
struct book *a = head;
struct lend *b = l_head;
printf("\n请输入作者名\n");
scanf("%s",writer);
while(a->next != NULL)
{
a = a->next;
if(strcmp(writer,a->author)==0)
{
strcpy(name,a->book_name);
while(b->next != NULL)
{
b = b->next;
if( (strcmp(name,b->b_name)==0) && (b->judgment==0) )
{
printf("\n借阅人:%s\n",b->p_name);
printf("借阅书籍:%s\n",b->b_name);
printf("借书时间:%d:%d:%d\n\n",b->b_year,b->b_month,b->b_day);
}
}
}
}
}
//-------------------------------------------------------------------------------------------------------//
void find11(struct lend *l_head)
{
char name[20];
struct lend *a;
a = l_head;
printf("\n请输入书名\n");
scanf("%s",name);
while(a->next != NULL)
{
a = a->next;
if( (strcmp(name,a->b_name)==0) &&(a->judgment == 1) )
{
printf("\n归还人:%s\n",a->p_name);
printf("归还书籍:%s\n",a->b_name);
printf("归还时间:%d/%d/%d",a->l_year,a->l_month,a->l_day);
}
}
}
void find22(struct lend *l_head)
{
char name[20];
struct lend *a;
a = l_head;
printf("\n请输入读者的名字\n");
scanf("%s",name);
while(a->next != NULL)
{
a = a->next;
if( (strcmp(name,a->p_name)==0) && (a->judgment==1) )
{
printf("\n归还人:%s\n",a->p_name);
printf("归还书籍:%s\n",a->b_name);
printf("归还时间:%d/%d/%d",a->l_year,a->l_month,a->l_day);
}
}
}
void find33(struct lend *l_head,struct book *head)
{
char writer[20],name[50];
struct book *a = head;
struct lend *b = l_head;
printf("\n请输入作者名\n");
scanf("%s",writer);
while(a->next != NULL)
{
a = a->next;
if(strcmp(writer,a->author)==0)
{
strcpy(name,a->book_name);
while(b->next != NULL)
{
b = b->next;
if( (strcmp(name,b->b_name)==0) && (b->judgment==1) )
{
printf("\n归还人:%s\n",b->p_name);
printf("归还书籍:%s\n",b->b_name);
printf("归还时间:%d/%d/%d",b->l_year,b->l_month,b->l_day);
}
}
}
}
}
void re_login(FILE *fp,FILE *cp,FILE *rp,struct book *head, struct reader *r_head, struct lend *l_head)
{
int order1;
logs(r_head); // 读者登录
printf("\t\t******************************\n");
printf("\t\t******************************\n");
printf("\t\t 1.借书\n");
printf("\t\t 2.还书\n");
printf("\t\t 3.浏览图书信息\n");
printf("\t\t 4.修改密码信息\n");
printf("\t\t******************************\n");
printf("\t\t******************************\n\n");
printf("\n输入对应功能前的序号:");
scanf("%d",&order1);
switch(order1)
{
case 1:
borrow_books(fp,cp,rp,head, r_head, l_head);//借书
break;
case 2:
return_books(fp,cp,rp,head, r_head, l_head);//还书
break;
case 3:
browse(head);//浏览
break;
case 4:
maintenance(r_head,cp);//维护密码信息
break;
default:
printf("\t\t指令输入错误!\n\t\t已自动结束程序!");
exit(0);
}
}
struct lend *l_stand(FILE *rp)
{
struct lend *a,*b,*head;
head = (struct lend *)malloc(sizeof(struct lend));
a = b = head;
head->next = NULL;
while(!feof(rp))
{
a = (struct lend *)malloc(sizeof(struct lend));
fscanf(rp,"%s",a->p_name);
fscanf(rp,"%s",a->b_name);
fscanf(rp,"%d%d%d",&a->b_year,&a->b_month,&a->b_day);
fscanf(rp,"%d",&a->judgment);
if(a->judgment == 1)
fscanf(rp,"%d%d%d",&a->l_year,&a->l_month,&a->l_day);
a->next = NULL;
b->next = a;
b = a;
}
return head;
}
void logs(struct reader *r_head)
{
int n=0;
char mima[20],name[20];
struct reader *a;
a = r_head;
printf("\n请输入读者姓名:\n");
scanf("%s",name);
printf("\n请输入登录密码:\n");
scanf("%s",mima);
while(a->next != NULL)
{
a = a->next;
if( (strcmp(mima,a->re_code)==0) && (strcmp(name,a->re_name)==0) )
{
now = a;
printf("登陆成功!\n");
n=1;
break;
}
}
if(n==0)
{
printf("密码错误.\n登录失败自动退出程序");
exit(0);
}
}
void borrow_books(FILE *fp,FILE *cp,FILE *rp,struct book *head,struct reader *r_head,struct lend *l_head)
{
time_t timep;
time(&timep);
struct tm *p;
p = gmtime(&timep);
int n=0;
char name[20];
struct book *a;
a = head;
printf("\n请输入要借图书的书名:\n");
scanf("%s",name);
while(a->next != NULL)
{
a = a->next;
if(strcmp(name,a->book_name)==0)
{
if( (a->Inventory_quantity==0) || (now->borrow_have > now->Maximum_borrowing) )
{
printf("库存不足或超过最大借阅额度不可借阅!\n");
exit(0);
}
Check_again(name,l_head);//借书查重函数
n = 1;
a->Inventory_quantity = a->Inventory_quantity - 1;
now -> borrow_have = now->borrow_have + 1;
fprintf(rp,"\n%s ",now->re_name);
fprintf(rp,"%s ",a->book_name);
fprintf(rp,"%d %d %d ",1900 + p->tm_year,1 + p->tm_mon,p->tm_mday);
fprintf(rp,"%d",0);
printf("借书成功!\n");
}
}
if(n == 0)
{
printf("查无此书!自动结束程序\n");
exit(0);
}
in_file(fp,head);
r_in_file(cp,r_head);
}
void Check_again(char name[20],struct lend *l_head)
{
int n=0,m=0;
struct lend *a = l_head;
while(a->next != NULL)
{
a = a->next;
if( (strcmp(name,a->b_name)==0) && (a->judgment == 0) )//判断借书情况
{
n++;
}
if( (strcmp(name,a->b_name)==0) && (a->judgment == 1) )//判断还书情况
{
m++;
}
}
if(n>m)
{
printf("不可重复借阅,自动退出程序\n");
exit(0);
}
}
void return_books(FILE *fp,FILE *cp,FILE *rp,struct book *head,struct reader *r_head,struct lend *l_head)
{
time_t timep;
time(&timep);
struct tm *p;
p = gmtime(&timep);
int n=0,j;
char name[20];
struct book *a;
struct lend *b;
a = head;
b = l_head;
printf("输入归还书籍的名称:\n");
scanf("%s",name);
if(now->borrow_have == 0)
{
printf("你还未借阅过任何一本图书,无法执行程序\n");
exit(0);
}
while(b->next != NULL)
{
b = b->next;
if( strcmp(name,b->b_name)==0 && (strcmp(now->re_name,b->p_name)==0) )
{
n=1;
now->borrow_have = now->borrow_have - 1;
fprintf(rp,"\n%s ",b->p_name);
fprintf(rp,"%s ",b->b_name);
fprintf(rp,"%d %d %d ",b->b_year,b->b_month,b->b_day);
fprintf(rp,"%d ",1);
fprintf(rp,"%d %d %d",1900 + p->tm_year,1 + p->tm_mon,p->tm_mday);
j = Overage_billing(b->b_year,b->b_month,b->b_day, 1900 + p->tm_year,1 + p->tm_mon,p->tm_mday);//判断是否超时并计算费用
if(j<31)
printf("还书成功!\n");
if(j>=31)
{
penalty(j);
}
break;
}
}
if(n==0)
{
printf("您还未借过此书,自动结束程序\n");
exit(0);
}
while(a->next != NULL)
{
a = a->next;
if(strcmp(name,a->book_name)==0)
{
a->Inventory_quantity = a->Inventory_quantity + 1;
}
}
in_file(fp,head);
r_in_file(cp,r_head);
}
int Overage_billing(int x,int y,int z,int s,int k,int t)//x,y,z借书时间,s,k,t还书时间
{
int d_month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int Difference_day,p_day,n_day,y_day,i;
y_day = (s-x)*365;
for(i=x; i<s; i++)
{
if ((i%4==0 && i%100!=0) || i%400==0)
y_day = y_day + 1;
}
p_day = z;
for(i=0; i<y-1; i++)
p_day = p_day + d_month[i];
if (((x%4==0 && x%100!=0) || x%400==0)&&(y>2))
p_day = p_day + 1;
n_day = t;
for(i=0; i<k-1; i++)
n_day = n_day + 1;
if (((s%4==0 && s%100!=0) || s%400==0)&&(k>2))
n_day = n_day + 1;
Difference_day = y_day - p_day + n_day;
return Difference_day;
}
void penalty(int j)
{
double i;
i = (j-30)*0.1;
printf("尊敬的用户:%s,您好!\n超期借阅%d天,请自行去前台交付超期罚款%.2f元\n\n",now->re_name,j-30,i);
}
void maintenance(struct reader *r_head,FILE *cp)
{
int n=0;
char code[20];
struct reader *a = r_head;
printf("\n请输入原来的密码\n");
scanf("%s",code);
while(a->next != NULL)
{
a = a->next;
if(strcmp(code,a->re_code)==0)
{
printf("\n请输入新的密码\n");
scanf("%s",a->re_code);
printf("\n请再次输入新的密码\n");
scanf("%s",code);
if(strcmp(code,a->re_code)==0)
{
n=1;
printf("修改成功\n");
}
if(strcmp(code,a->re_code)!=0)
{
printf("密码不一致,自动结束程序\n");
exit(0);
}
break;
}
}
if(n==1)
{
r_in_file(cp,r_head);
}
if(n==0)
{
printf("密码错误,自动结束程序\n");
exit(0);
}
}