📄 借书.cpp
字号:
#include "stdio.h"
#include "malloc.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "time.h"
#include "windows.h"
#include "conio.h"
#define LEAP_YEAR(year) year%4==0&&year%100!=0||year%400==0
struct date
{ int year;
int month;
int day;
};
typedef struct owner
{ long int user_number; //用户读者学号
char user_name[20]; //姓名
char user_currntbook_name[50]; //用户当前所借的图书书名
long int user_currntbook_code; //用户当前所借图书编号
struct date user_senddate; // 借书的日期
char state[10]; // 是否借书状态
struct owner *next;
}users;
typedef struct book
{ long int book_code;
char book_name[50];
char state[10];
long int book_currentuser_number;
char book_currentuser_name[20];
struct book *next;
}books;
users *load2();
books *load();
void bookadd();
void bookdelete();
void booksend();
void showbook();
void showbook2();
void showuser();
void showuser2();
void useradd(); //用户添加
void index();
int days(int y,int m,int d);
int userborrow(long int number,long int bookcode,int flag,char bookname[50]);
int borrowdays(users *p1);
struct tm *time();
int borrowdays(users *p1) //计算借书天数
{ struct tm *t;
int i,j,k,l,m,o;
t=time();
k=days(1900+t->tm_year,1+t->tm_mon,t->tm_mday);
l=days(p1->user_senddate.year,p1->user_senddate.month,p1->user_senddate.day);
m=(1900+t->tm_year)-p1->user_senddate.year;
if(m==0)
{ o=k-l;
return o;
}
if(m==1)
{ if(LEAP_YEAR(p1->user_senddate.year))
{ o=366-l+k;
return o;
}
else
{ o=365-l+k;
return o;
}
}
if(m>=2)
{ if(LEAP_YEAR(p1->user_senddate.year))
{ o=366-l+k;
for(i=p1->user_senddate.year+1;i<=1900+t->tm_year-1;i++)
{ if(LEAP_YEAR(i))
o+=366;
else
o+=365;
}
return o;
}
else
{ o=365-l+k;
for(i=p1->user_senddate.year+1;i<=1900+t->tm_year-1;i++)
{ if(LEAP_YEAR(i))
o+=366;
else
o+=365;
}
return o;
}
}
}
int days(int y,int m,int d)
{ int i,n=0,mt[]={31,28,31,30,31,31,30,31,30,31};
if(LEAP_YEAR(y))
mt[2]=29;
for(i=1;i<m;i++)
n+=mt[i];
n+=d;
return n;
}
struct tm *time() //获取系统时间
{ time_t timep;
struct tm *p;
time(&timep);
p=gmtime(&timep);
return p;
}
users *load2() //读出用户资料,并返回资料的链表头指针
{ users *p,*q,*h=NULL;
FILE *fq;
if((fq=fopen("userdocument","rb"))==NULL)
{ printf("can not ppen file\n");
exit(1); }
p=(users *)malloc(sizeof(users));
if(!p)
{ printf("内存溢出!!\n");
return h;
}
h=p;//申请到空间,将它作为头指针
while(!feof(fq))
{
if(1!=fread(p,sizeof(users),1,fq))
break;
p->next=(users *)malloc(sizeof(users));
if(!p->next)
{
printf("\n内存溢出!!\n");
return h;
}
q=p;
p=p->next;//指针后移,新读入数据链到当前表尾
}
q->next=NULL;
fclose(fq);
if(!h)
{ printf("无存储用户信息\n");
index();
}
return h;
}
books *load() //读出图书资料,并返回资料的链表头指针
{ books *p,*q,*h=NULL;
FILE *fp;
if((fp=fopen("bookdocument","rb"))==NULL)
{ printf("can not ppen file\n");
exit(1); }
p=(books *)malloc(sizeof(books));
if(!p)
{ printf("内存溢出!!\n");
return h;
}
h=p;//申请到空间,将它作为头指针
while(!feof(fp))
{ if(1!=fread(p,sizeof(books),1,fp))
break;
p->next=(books *)malloc(sizeof(books));
if(!p->next)
{ printf("\n内存溢出!!\n");
return h;
}
q=p;
p=p->next;//指针后移,新读入数据链到当前表尾
}
q->next=NULL;
fclose(fp);
if(!h)
{ printf("无存储图书信息\n");
index();
}
return(h);
}
void bookadd() //添加图书
{ FILE *fp;
char state[10]={"in"},state2[10]={"none"};
int i=0;
books *p1;
p1=(books *)malloc(sizeof(books));
printf("输入图书编号");
scanf("%d",&p1->book_code);
printf("图书名:");
scanf("%s",p1->book_name);
strcpy(p1->state,state);
p1->book_currentuser_number=0;
strcpy(p1->book_currentuser_name,state2);
p1->next=NULL;
if((fp=fopen("bookdocument","ab"))==NULL)
{ printf("不能打开文件\n");
exit(0);
}
fwrite(p1,sizeof(books),1,fp);
fclose(fp);
printf("添加成功\n");
printf("继续添加请按1,其他返回\n");
scanf("%d",&i);
if(i==1)
bookadd();
else
return;
}
void useradd() //用户添加
{ FILE *fq;
int i,j=0;
char state[10]={"none"};
users *p1;
p1=(users *)malloc(sizeof(users));
printf("请输入借书者学号:\n");
scanf("%d",&p1->user_number);
printf("请输入借书者姓名:\n");
scanf("%s",p1->user_name);
strcpy(p1->state,state);
strcpy(p1->user_currntbook_name,state);
p1->user_senddate.year=0;
p1->user_senddate.month=0;
p1->user_senddate.day=0;
p1->user_currntbook_code=0;
p1->next=NULL;
if((fq=fopen("userdocument","ab"))==NULL)
{ printf("不能打开文件\n");
exit(0);
}
fwrite(p1,sizeof(users),1,fq);
fclose(fq);
printf("添加成功\n");
printf("继续添加请按1,其他返回\n");
scanf("%d",&j);
if(j==1)
useradd();
else
return;
}
void showbook() //显示书本基本信息
{ books *p1;
p1=load();
while(p1!=NULL)
{ printf("编号:%d\t书名:%s\t状态:%s\n", p1->book_code,p1->book_name,p1->state);
p1=p1->next;
}
}
void showuser() //显示用户基本信息
{ users *p1;
p1=load2();
while(p1!=NULL)
{ printf("学号:%d\t姓名:%s\t当前是否借书状态:%s\n", p1->user_number,p1->user_name,p1->state);
p1=p1->next;
}
}
void showbook2() //显示图书详细信息
{ FILE *fp;
books *h;
int i=0,k=0,l=0,flag=0;
long int j;
char n[50];
if((fp=fopen("bookdocument","rb"))==NULL)
{ printf("不能打开文件\n");
exit(0);
}
h=(books *)malloc(sizeof(books));
printf("1--按图书编号查询 2--按图书名字查询:\n");
scanf("%d",&i);
if(i==1)
{
printf("请输入要查询的图书编号:\n");
scanf("%d",&j);
while(!feof(fp))
{ fread(h,sizeof(books),1,fp);
if(h->book_code==j)
{ printf("查找结果:\n");
printf("编号:%d\t书名:%s\t状态:%s\n", h->book_code,h->book_name,h->state);
printf("当前拥有此书的读者姓名(none表示当前没有此书用户):%s\t当前拥有此书的读者学号(0表示当前此书没有用户):%d\n",h->book_currentuser_name,h->book_currentuser_number);
flag=1;
printf("按1继续查找,其他返回\n");
scanf("%d",&l);
if(l==1)
{ fclose(fp);
showbook2();
}
else
return;
}
else
h->next=(books *)malloc(sizeof(books));
}
}
if(i==2)
{ printf("请输入要查询的书名:\n");
scanf("%s",n);
while(!feof(fp))
{ fread(h,sizeof(books),1,fp);
if(!strcmp(h->book_name,n))
{ printf("查找结果:\n");
printf("学号:%d\t姓名:%s\t状态:%s\n", h->book_code,h->book_name,h->state);
printf("当前拥有此书的读者姓名(none表示当前没有此书用户):%s\t当前拥有此书的读者学号(0表示当前此书没有用户):%d\n",h->book_currentuser_name,h->book_currentuser_number);
flag=1;
printf("按1继续查找,其他返回\n");
scanf("%d",&l);
if(l==1)
{ fclose(fp);
showbook2();
}
else
return;
}
else
h->next=(books *)malloc(sizeof(books));
}
}
if(flag==0)
{ printf("不存在这本图书,按1继续查询,其他返回\n");
scanf("%d",&k);
if(k==1)
{ fclose(fp);
showbook2();
}
else
return;
}
}
void showuser2() //显示用户详细信息
{ FILE *fq;
users *h;
int i=0,k=0,l=0,flag=0;
long int j;
char n[20];
if((fq=fopen("userdocument","rb"))==NULL)
{ printf("不能打开文件\n");
exit(0);
}
h=(users *)malloc(sizeof(users));
printf("1--按读者学号查询 2--按读者姓名查询:\n");
scanf("%d",&i);
if(i==1)
{
printf("请输入要查询的读者学号:\n");
scanf("%d",&j);
while(!feof(fq))
{ fread(h,sizeof(users),1,fq);
if(h->user_number==j)
{ printf("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
printf("查找结果:\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -