📄 图书借阅管理系统.cpp
字号:
#include <iostream.h>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip.h>
#include <time.h>
#define MAX 100
#define MAX1 2 //本科生最大借阅量
#define MAX2 5 //研究生最大借阅量
#define MAX3 10 //教师最大借阅量
#define MAX4 100 //管理员最大借阅量
//书的结构体
typedef struct book
{
char name[80]; //图书名
long num; //图书编号
float price; //图书单价
char writername[20]; //作者姓名
char publish[30]; //出版社名称
int yes; //判断书是否存在或者已经借出,1存在,0借出
int membernum; //借书人编号
struct book *next; //结点指针
}Book,*BookList;
//借书时间结构体
typedef struct Time
{
int year;
int month;
int day;
}data;
//会员借的书的结构体
typedef struct BorrowBook
{
long num; //借的书的编号
struct Time time; //借书时间
struct Time borrowtime; //借书期限
}BBook;
//会员的结构体
typedef struct member
{
char name[20]; //会员姓名
char sex; //会员性别,男m,女f
long num; //会员编号
int style; //会员类型,1:本科生;2:研究生;3:教师;4:管理员;
int max; //会员借书数目,初始为0
int yes; //会员是否借书,1是,0否
BBook t[MAX]; //会员借的书的数组
struct member *next; //结点指针
}Member,*MemberList;
//增加图书
Book *Init_B() //初试化图书链表
{
Book *H;
H=(Book *)malloc(sizeof(Book));
if(!H) exit(1);
H->next=NULL;
return H;
}
int BookAdd(BookList &H) //建立一个带头结点的链表用来存储图书信息
{
int i=0; //统计要增加的图书量
Book *p,*q;
p=(Book *)malloc(sizeof(Book));
if(!p) exit(1);
if(H->next==NULL)
{
cout<<"输入图书编号:"<<endl;
cin>>p->num;
if(p->num==0) //退出"增加图书"
{
cout<<" 共计"<<i<<"本图书入库!"<<endl;
system("cls"); //清屏函数
return 1;
}
cout<<"输入书名:"<<endl;
cin>>p->name;
cout<<"输入图书价格:"<<endl;
cin>>p->price;
cout<<"输入作者姓名:"<<endl;
cin>>p->writername;
cout<<"输入出版社名称:"<<endl;
cin>>p->publish;
p->yes=1; //1表示没有借出
p->next=NULL;
H->next=p;
q=p;
++i;
cout<<endl;
}
else
{
q=H;
while(q->next!=NULL)
q=q->next;
p->num=1; //进入循环的条件
p->next=NULL;
}
while(p->num!=0) //以图书编号作为判断链表是否结束
{
p=(Book *)malloc(sizeof(Book));
if(!p) exit(1);
cout<<"输入图书编号:"<<endl;
cin>>p->num;
if(p->num==0) //退出"增加图书"
{
cout<<" 共计"<<i<<"本图书入库!"<<endl;
break;
}
cout<<"输入书名:"<<endl;
cin>>p->name;
cout<<"输入图书价格:"<<endl;
cin>>p->price;
cout<<"输入作者姓名:"<<endl;
cin>>p->writername;
cout<<"输入出版社名称:"<<endl;
cin>>p->publish;
p->yes=1; //1表示没有借出
p->next=NULL;
q->next=p;
q=p;
++i;
cout<<endl;
}
return 1;
}
//查询图书
int Search_BookName(BookList &H) //按书名查询
{
Book *p;
p=H->next;
char n[80];
int flag=0;
cout<<"输入要查询的书名:";
cin>>n;
for(;p!=NULL;p=p->next)
{
if(strcmp(p->name,n)==0)
{
if(flag==0)
cout<<endl<<"书名 编号 单价 作者 出版社 是否借出"<<endl;
cout<<" "<<p->name<<" "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish;
if(p->yes==1)
cout<<setw(15)<<"否"<<endl;
else
cout<<setw(15)<<"是"<<endl;
flag=1;
continue;
}
}
if(p==NULL&&flag==0)
cout<<"没有相关信息!"<<endl;
return 1;
}
int Search_BookNum(BookList &H) //按编号查询
{
Book *p;
p=H->next;
long n;
int flag=0;
cout<<"输入要查询的书的编号:";
cin>>n;
for(;p!=NULL;p=p->next)
{
if(n==p->num)
{
if(flag==0)
cout<<endl<<"书名 编号 单价 作者 出版社 是否借出"<<endl;
cout<<" "<<p->name<<" "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish;
if(p->yes==1)
cout<<setw(15)<<"否"<<endl;
else
cout<<setw(15)<<"是"<<endl;
flag=1;
continue;
}
}
if(p==NULL&&flag==0)
cout<<"没有相关信息!"<<endl;
return 1;
}
int Search_BookWritername(BookList &H) //按作者名查询
{
Book *p;
p=H->next;
int flag=0;
char n[30];
cout<<"输入要查询的书的作者名:";
cin>>n;
for(;p!=NULL;p=p->next)
{
if(strcmp(p->writername,n)==0)
{
if(flag==0)
cout<<endl<<"书名 编号 单价 作者 出版社 是否借出"<<endl;
cout<<" "<<p->name<<" "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish;
if(p->yes==1)
cout<<setw(15)<<"否"<<endl;
else
cout<<setw(15)<<"是"<<endl;
flag=1;
continue;
}
}
if(p==NULL&&flag==0)
cout<<"没有相关信息!"<<endl;
return 1;
}
int Search_Publish(BookList &H) //按出版社查询
{
Book *p;
p=H->next;
int flag=0;
char n[50];
cout<<"输入要查询的书的出版社名称:";
cin>>n;
for(;p!=NULL;p=p->next)
{
if(strcmp(p->publish,n)==0)
{
if(flag==0)
cout<<endl<<"书名 编号 单价 作者 出版社 是否借出"<<endl;
cout<<" "<<p->name<<" "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish;
if(p->yes==1)
cout<<setw(15)<<"否"<<endl;
else
cout<<setw(15)<<"是"<<endl;
flag=1;
continue;
}
}
if(p==NULL&&flag==0)
cout<<"没有相关信息!"<<endl;
return 1;
}
int Search_AllB(BookList &H) //查询所有图书信息
{
Book *p;
p=H->next;
int i=0,flag=0;
for(;p!=NULL;p=p->next)
{
if(flag==0)
cout<<endl<<"书名 编号 单价 作者 出版社 是否借出"<<endl;
cout<<" "<<p->name<<" "<<setw(10)<<p->num<<setw(12)<<p->price<<setw(11)<<p->writername<<setw(13)<<p->publish;
if(p->yes==1)
cout<<setw(15)<<"否"<<endl;
else
cout<<setw(15)<<"是"<<endl;
flag=1;
i++;
}
cout<<" 共计"<<i<<"本书。"<<endl;
return 1;
}
int BookSearch(BookList &H)
{
int m;
while(m!=0)
{
cout<<endl<<" 图书查询"<<endl<<endl;
cout<<" *******************************************"<<endl;
cout<<" * *"<<endl;
cout<<" * 1. 按书名查询 2. 按编号查询 *"<<endl;
cout<<" * *"<<endl;
cout<<" * 3. 按作者名查询 4. 按出版社查询 *"<<endl;
cout<<" * *"<<endl;
cout<<" * 5. 查询所有图书信息 0. 退出 *"<<endl;
cout<<" * *"<<endl;
cout<<" *******************************************"<<endl;
cout<<" 请选择(0--4):";
cin>>m;
switch(m)
{
case 1:system("cls"); Search_BookName(H); break; //按书名查询
case 2:system("cls"); Search_BookNum(H); break; //按编号查询
case 3:system("cls"); Search_BookWritername(H); break; //按作者名查询
case 4:system("cls"); Search_Publish(H); break; //按出版社查询
case 5:system("cls"); Search_AllB(H); break; //查询所有图书信息
case 0:system("cls"); break; //退出
}
}
return 1;
}
//删除图书
int BookDel(BookList &H) //以图书编号作为主键进行删除
{
Book *p;
long n;
int flag=0;
p=H;
cout<<"输入要删除的书的编号:"<<endl;
cin>>n;
for(;p!=NULL;p=p->next)
{
if(p->next!=NULL&&p->next->num==n)
{
if(p->next->yes==0)
{
cout<<"当前图书被借出,不能删除!"<<endl;
return 1;
}
p->next=p->next->next; //删除语句
cout<<" 成功删除!"<<endl;
flag=1; //成功删除标记
break;
}
}
if(p==NULL&&flag==0)
cout<<" 删除不成功!"<<endl; //已经被删除或没有这本书
return 1;
}
//图书借阅
int Member_Y(MemberList &L,long num) //判断是否是会员,1是,0否。只有会员才有权限借书
{
Member *p;
p=L;
for(;p!=NULL;p=p->next)
if(p->num==num)
return 1;
return 0;
}
int BookBorrow(BookList &H,MemberList &L) //借阅时以编号作为主键
{
Book *p,*s;
Member *q;
long m=1,num;
int t=0,flag=0,max;
cout<<"输入会员编号:"<<endl;
cin>>num;
if(Member_Y(L,num)==1)
{
q=L;
for(;q!=NULL;q=q->next)
if(q->num==num) break;
while(m)
{
if(t==0)
cout<<"输入要借阅的书的相关信息:"<<endl;
t=1;
cout<<"编号:";
cin>>m;
for(s=H->next;s!=NULL;s=s->next)
if(s->num==m) break;
if(s==NULL)
{
cout<<"没有这本书!"<<endl;
continue;
}
for(p=H->next;p!=NULL;p=p->next)
{
if(p->num==m)
{
if(p->yes==0)
{
cout<<"当前图书被借出,不能借阅!"<<endl;
break;
}
if(q->style==1) max=MAX1;
else if(q->style==2) max=MAX2;
else if(q->style==3) max=MAX3;
else if(q->style==4) max=MAX4;
q->max++;
if(q->max>max)
{
cout<<"你已经借的书超过了最大借阅量,不能再借书!"<<endl;
q->max--;
return 1;
}
p->yes=0;
p->membernum=q->num;
q->yes=1;
for(int i=1;i<=max;i++)
if(q->t[i].num==0) break;
q->t[i].num=p->num;
time_t timer=time(0);//调用time()函数获取当前时间
struct tm *ptrtime=localtime(&timer);//调用localtime()函数将获得的系统时间转化为指向struct tm的指针指向的结构体
q->t[i].time.year=1900+ptrtime->tm_year;
q->t[i].time.month=1+ptrtime->tm_mon;
q->t[i].time.day=ptrtime->tm_mday;
if(q->t[i].time.month>=10)
q->t[i].borrowtime.year=1900+ptrtime->tm_year+1;
else
q->t[i].borrowtime.year=1900+ptrtime->tm_year;
q->t[i].borrowtime.month=(1+ptrtime->tm_mon+3)%12;
q->t[i].borrowtime.day=ptrtime->tm_mday;
cout<<" 成功借出!"<<endl;
flag=1; //成功借出标记
break;
}
}
if(p==NULL&&flag==0)
cout<<" 借书不成功!"<<endl; //没有这本书
}
}
else
cout<<"对不起,您不是会员,借书失败!如果想进行此操作,请先注册!"<<endl;
return 1;
}
//还书
int BookReturn(BookList &H,MemberList &L) //还书时以编号作为主键
{
Book *p,*s;
Member *q;
long m=1;
int flag=0,max;
cout<<"输入要归还的书的相关信息:"<<endl;
while(m)
{
cout<<"编号:";
cin>>m;
for(s=H->next;s!=NULL;s=s->next)
if(s->num==m) break;
if(s==NULL)
{
cout<<"没有这本书!"<<endl;
continue;
}
for(p=H->next;p!=NULL;p=p->next)
{
if(p->num==m)
{
if(p->yes==1)
{
cout<<"这本书没有借出,还书失败!"<<endl;
break;
}
for(q=L;q!=NULL;q=q->next)
if(q->num==p->membernum) break;
p->yes=1;
if(q->style==1) max=MAX1;
else if(q->style==2) max=MAX2;
else if(q->style==3) max=MAX3;
else if(q->style==4) max=MAX4;
for(int k=1;k<=max;k++) //从借的书的数组中删除这本书
if(q->t[k].num==p->num)
{
q->t[k].num=0;
q->max--;
break;
}
cout<<" 还书成功!"<<endl;
if(q->max==0)
q->yes=0;
flag=1; //成功还书标记
break;
}
}
if(p==NULL&&flag==0)
cout<<" 还书不成功!"<<endl; //没有借这本书
}
return 1;
}
//增加会员
Member *Init_M() //初试化会员链表
{
Member *L;
L=(Member *)malloc(sizeof(Member));
if(!L) exit(1);
L->next=NULL;
return L;
}
int MemberAdd(MemberList &L) //建立一个带头结点的链表用来存储会员信息
{
int i=0,k=0,max; //统计要增加的会员人数
Member *p,*q,*s;
p=(Member *)malloc(sizeof(Member));
if(!p) exit(1);
if(L->next==NULL)
{
cout<<"输入编号:"<<endl;
cin>>p->num;
if(p->num==0) //退出"增加会员"
{
cout<<" 共计"<<k<<"名会员入会!"<<endl;
system("cls"); //清屏函数
return 1;
}
cout<<"输入姓名:"<<endl;
cin>>p->name;
for(s=L->next;s!=NULL;s=s->next)
if(s->num==p->num)
{
cout<<"同一会员不能重复注册!"<<endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -