#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//书籍链表
struct book{
char name[20];//书名;
int page;//页数;
int price;//价格;
int total;//数量库存;
int borrow;//借出多少本
int countborrow;//一本书借过多少次,
int count;//总共有多少本
struct book *next;
};
//借出书籍的链表
struct borrow
{
char person[20];//借的人
char name[20];//借出的书名子
int num;//借了好了本
int days;//借出多少天
int month;//借的月份
int day;//借的号数
struct borrow * next;
};
struct book *head,*end,*q,*p;
struct borrow *bhead,*bend,*btemp;
//开始主菜单
int menu()
{
int num;
printf("\n");
printf("\t\t|-----------------成信大图书管理----------------|\t\t");
printf("\t\t|\t1.查看所有图书信息\t\t\t|\t\t");
printf("\t\t|\t2.图书信息修改\t\t\t\t|\t\t");
printf("\t\t|\t3.图书出借\t\t\t\t|\t\t");
printf("\t\t|\t4.图书归还\t\t\t\t|\t\t");
printf("\t\t|\t5.单个图书信息插入\t\t\t|\t\t");
printf("\t\t|\t6.删除书籍\t\t\t\t|\t\t");
printf("\t\t|\t7.统计\t\t\t\t\t|\t\t");
printf("\t\t|\t8.查询\t\t\t\t\t|\t\t");
printf("\t\t|\t9.借出统计\t\t\t\t|\t\t");
printf("\t\t|\t0.退出,请正常退出,以免文件错误\t|\t\t");
printf("\t\t|-----------------------------------------------|\t\t");//\t调节页面样式,一个\t相当于一个turbo
scanf("%d",&num);
if(num<0||num>9)
{
return menu();
}
else
return num ;
}
//获取时间
int date(char * type){
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
if(strcmp(type,"month")==0){
return timeinfo->tm_mon;
}
if(strcmp(type,"day")==0){
return timeinfo->tm_mday;
}
if(strcmp(type,"year")==0){
return timeinfo->tm_year;
}
if(strcmp(type,"hour")==0){
return timeinfo->tm_hour;
}
}
//得到书籍链表输出控制台
void output(struct book *head1)
{
struct book *q;
q=head1->next;
while(q!=NULL)
{
printf("%s\t%d页\t%d元\t还剩%d本\t总数%d本\n",q->name,q->page,q->price,q->total,q->count);
q=q->next;
}
printf("\n");
}
//得到书籍链表将其写入文件
void fput(struct book *head1)
{
FILE *fp1;
struct book *q;
fp1=fopen("lib.txt","w");
q=head1->next;
while(q!=NULL)
{
fprintf(fp1,"%s\t%d\t%d\t%d\t%d\t%d\t%d\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);
q=q->next;
}
fclose(fp1);
}
//输出统计
void count(struct book *head1)
{
int count=0;//书馆书的总数
int countborrow=0;//统计被借出多少
int counttotal=0;//统计书馆现有多少书籍
int countb=0;
struct book *q;
int num[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};int i=0,temp,x,y;
q=head1->next;
while(q!=NULL)
{
count = count + q->count;
countborrow = countborrow +q->borrow;
counttotal = counttotal + q->total;
countb = countb + q->countborrow;
//统计总共书籍数,借出书籍数,剩余书籍数,借出次数
if(q->countborrow!=NULL)
num[i]=q->countborrow;
if(q->next==NULL||9==i)
{
for(x=0;x<i;x++)
{
for(y=0;y<i-1-x;y++)
{
if(num[y]<num[y+1])
{
temp=num[y];
num[y]=num[y+1];
num[y+1]=temp;
}//从大到小排序
}
}
}
if(q->countborrow>num[9]&&i>9)
{
temp=num[9];
num[9]=countborrow;
for(x=0;x<10;x++)
{
for(y=0;y<10-1-x;y++)
{
if(num[y]<num[y+1])
{
temp=num[y];
num[y]=num[y+1];
num[y+1]=temp;
}
}
}//把第十一本书借出去的次数和前十中借出次数最少的相比较,再进行排序
}
i++;
q=q->next;
}
printf("书籍总数%d本,\t借出%d本,\t在馆书籍%d本,借过%d次\n",count,countborrow,counttotal,countb);
if(countborrow!=0)
{
q=head1->next;
for(x=0;x<=i;x++)
{
while(q!=NULL)
{
if(q->countborrow==num[x])
{
printf("第%d是%s,借出%d次,总数%d本,借出%d本\n",x+1,q->name,q->countborrow,q->count,q->borrow);
}
q=q->next;
}
}
}
}
//查询
void see(struct book *head1)
{
int num;
char str[20];
struct book *q=head1->next;
loop:
printf("1.通过名字查询\t2.通过价格查询\t3.通过页数查询\t4.全部借出的书\n");
scanf("%d",&num);
switch(num)
{
case 1:
{
printf("输入模糊名字,大小写区分\n");
scanf("%s",&str);
while(q!=NULL)
{
if(strstr(q->name,str))
{
printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);
}
q=q->next;
}
}
break;
case 2:
{
//printf("输入价格 ( >价格 )表示查询大于等于输入价格,直接输入表示查询等价的\n");
printf("输入价格 \n");
scanf("%d",&num);
while(q!=NULL)
{
if(q->price==num)
{
printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);
}
q=q->next;
}
//可添加根据范围查询价格
}
break;
case 3:
{
printf("输入页数\n"); //可添加根据大于小于查询页数
scanf("%d",&num);
while(q!=NULL)
{
if(q->page==num)
{
printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);
}
q=q->next;
}
}
break;
case 4:
{
while(q!=NULL)
{
if(q->borrow==q->count)
{
printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);
}
q=q->next;
}
}
break;
default :goto loop;
}
}
//从书籍文件得到链表,
void foutput(int flag)
{
FILE *fp;
fp=fopen("lib.txt","r");
head=(struct book *)malloc(sizeof(struct book));
end=head;
end->next=NULL;
while(!feof(fp)) //------!feof(fp)值为0,不在执行循环语句 ------
{
p=(struct book *)malloc(sizeof(struct book));
if(fscanf(fp,"%s %d %d %d %d %d %d\n",&p->name,&p->page,&p->price,&p->total,&p->borrow,&p->countborrow,&p->count)==7)
{
p->next=NULL;
end->next=p;
end=p;
}
}
if(1==flag)
{
output(head);//函数调用,输出书籍链表
}
if(0==flag)
{
count(head);
}
if(2==flag)
{
see(head);
}
fclose(fp); //----关闭文件-----
}
//从借出文件得到链表,
void borrowf()
{
FILE *fp;
fp=fopen("borrow.txt","r");
bhead=(struct borrow*)malloc(sizeof(struct borrow));
bend=bhead;
bend->next=NULL;
while(!feof(fp)) //------!feof(fp)值为0,不在执行循环语句 ------
{
btemp=(struct borrow *)malloc(sizeof(struct borrow));
if(fscanf(fp,"%s %s %d %d %d %d \n",&btemp->person,&btemp->name,&btemp->num,&btemp->days,&btemp->month,&btemp->day)==6)
{
btemp->next=NULL;
bend->next=btemp;
bend=btemp;
}
}
fclose(fp); //----关闭文件-----
}
//输出借出文件的
void boutput(struct borrow * bhead){
btemp=bhead->next;
while(btemp!=NULL)
{
printf("%s借%s,%d本,借了%d天 %d月 %d号 \n",btemp->person,btemp->name,btemp->num,btemp->days,btemp->month++,btemp->day);
btemp=btemp->next;
}
printf("\n");
}
//得到借出链表表将其写入文件
void fborrput(struct borrow * bhead)
{
FILE *fp1;
fp1=fopen("borrow.txt","w");
btemp=bhead->next;
while(btemp!=NULL)
{
fprintf(fp1,"%s %s %d %d %d %d \n",btemp->person,btemp->name,btemp->num,btemp->days,btemp->month,btemp->day);
btemp=btemp->next;
}
fclose(fp1);
}
//删除图书
void shanchu()
{
int m=0;
char name[20];
struct book *q;
foutput(1);
printf("请输入你要删除的书籍\n");
scanf("%s",name);
q=head;
p=q->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
if(p->next==NULL){
q->next=NULL;
m++;
break;
}
else{
q->next=p->next;
free(p);
p=q->next;
m++;
break;
}
}
q=q->next;
p=q->next;
}
if(m==0) printf("\n图书库内没有您要删除的书\n");
else
{
printf("已删除\n");
fput(head);//将删除后的书籍存入文件中
}
}
//图书信息修改
void xiugai()
{
char name[20];
int m=0;
foutput(1);//先得到文件中的所有书籍,
printf("请输入您要修改的书名\n");
scanf("%s",name);
p=head->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)//比较两个字符串是否相同
{
printf("请输入你要修改后的书名\n");
scanf("%s",p->name);
printf("请输入你要修改后的页数\n");
scanf("%d",&p->page);
printf("请输入你要修改后的书价\n");
scanf("%d",&p->price);
printf("请输入你要修改后的数量\n");
scanf("%d",&p->total);
printf("请输入你要修改后的总数\n");
scanf("%d",&p->count);
m++;
}
p=p->next;
}
if(m==0)
printf("\n没有找到所要修改的书!\n\n");
else{
fput(head);//将修改后的书籍存入文件中
printf("修改成功!");
}
}
//书籍出借
void chujie()
{
int m=0,n;
char name[20];
foutput(1);
borrowf();
printf("请您输入您要借阅的书名\n");
scanf("%s",name);
p=head->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)//比较两个字符串是否相同
{
printf("请问您要借几本?请输入\n");
scanf("%d",&n);
if(p->total==0) printf("\n您要的书已经借光\n");
if(n>p->total) printf("\n您要借的书籍库存不够\n");
else
{
btemp=(struct borrow *)malloc(sizeof(struct borrow));
printf("请输入你的名字\n");
scanf("%s",&btemp->person);
strcpy(btemp->name,name);
btemp->num=n;
printf("借好多天,注意!超出天数将根据单价罚款!\n");
scanf("%d",&btemp->days);
btemp->month=date("month");
btemp->day=date("day");
p->total = p->total - n;//从总数中把借出去的数量扣除d
p->borrow=p->borrow+n;
p->countborrow+=1;
printf("\n欢迎您的借阅\n");
}
m++;
}
p=p->next;
}
if(m==0) printf("\n对不起,图书库内没有您要借阅的书\n");
else
{
fput(head);//将借出后剩余的书籍存入文件中
btemp->next=NULL;
bend->next=btemp;
bend=btemp;
fborrput(bhead);
}
}
//图书归还
void guihuan()
{
int m=0,n;
char name[20];
foutput(1);
printf("请输入您要归还的书名\n");
scanf("%s",name);
p=head->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)//比较字符串是否相同
{
printf("请输入您要归还的数量\n");
scanf("%d",&n);
p->total=p->total+n;
p->borrow=p->borrow-1;
m++;
}
p=p->next;
}
if(m==0) printf("\n对不起,此书未借出or书名错误!!!\n");
else fput(head);//将归还后的书籍数量存入文件中
}
//单个录入书籍
void record()
{
foutput(1);
p=(struct book *)malloc(sizeof(struct book));//分配内存空间来录入书籍
printf("请输入你要增加的书名\n");
scanf("%s",&p->name);
printf("请输入你要增加的书的页数\n");
scanf("%d",&p->page);
printf("请输入你要增加的书的价格\n");
scanf("%d",&p->price);
printf("请输入你要增加的书的总数\n");
scanf("%d",&p->count);
p->total=p->count;
p->borrow=0;
p->countborrow=0;
p->next=NULL;
end->next=p;
end=p;
fput(head);
printf("增加成功!\n");
}
void kongzhi(int n)//设计思路
{
switch(n)
{
case 1: foutput(1);break;
case 2: xiugai();break;
case 3: chujie();break;
case 4: guihuan();break;
case 5: record();break;
case 6: shanchu();break;
case 7: foutput(0);break;
case 8: foutput(2);break;
case 9: {borrowf();boutput(bhead);break;}
}
}
//主函数,调用处
int main()
{
int n;
FILE *fp1;
//书籍文件
fp1=fopen("lib.txt","r+");
if(fp1==NULL)
{
fp1=fopen("lib.txt","w+");
fclose(fp1);
}
//打开借出文件
fp1=fopen("borrow.txt","r+");
if(fp1==NULL)
{
fp1=fopen("borrow.txt","w+");
fclose(fp1);
}
n=menu();
while(n!=0)
{
kongzhi(n);
n=menu();
}
system("cls");
return 0;
}