/***********************************************************
02.* 版权所有 (C)2016,刘富家
03.*
04.* 文件名称: Library.h
05.* 文件标识:无
06.* 内容摘要:函数文件
07.* 其它说明:各个模块函数
08.* 作 者:刘富家
09.* 完成日期: 20161231 */
#ifndef MY_H_FILE
#define MY_H_FILE
#include <iostream>
using namespace std;
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <iomanip>
#include <time.h>
#define MAX 100
#define MAX1 2 //本科生最大借阅量
#define MAX2 5 //研究生最大借阅量
#define MAX3 10 //教师最大借阅量
#define MAX4 100 //管理员最大借阅量
#define MaxSize 100 //100条记录
typedef char InfoType[10];
typedef struct //记录类型
{
int key; //关键字项
} RecType; //排序的记录类型定义
//书的结构体
typedef struct book
{
float price; //图书单价
int membernum; //借书人编号
char name[80]; //图书名
long num; //图书编号
char writername[20]; //作者姓名
char publish[40]; //出版社名称
int yes; //判断书是否存在或者已经借出,1存在,0借出
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;
//界面
void Face();
void FaceBook();
void FaceBookSearh();
void FaceDu();
void FaceDuSearh();
//初试化
Book *Init_B(); //初试化图书链表
int BookAdd(BookList &); //建立一个带头结点的链表用来存储图书信息
//查询图书方式
int BookSearch(BookList &); //图书查询菜单
int Search_BookNum(BookList &); //按编号查询
int Search_BookName(BookList &); //按书名查询
int Search_BookWritername(BookList &); //按作者名查询
int Search_Publish(BookList &); //按出版社查询
int Search_AllB(BookList &); //查询所有图书信息
//删除图书
int BookDel(BookList &); //以图书编号作为主键进行删除
//修改图书信息
int BookChange(BookList &);
//图书借阅
int Member_Y(MemberList &,long); //判断是否是读者,1是,0否。只有读者才有权限借书
int BookBorrow(BookList &,MemberList &); //借阅时以编号作为主键
//增加读者
Member *Init_M(); //初试化读者链表
int MemberAdd(MemberList &); //建立一个带头结点的链表用来存储读者信息
//修改读者信息
int MemberChange(MemberList &);
//查询读者
int MemberSearch(MemberList &);
int Search_MemberName(MemberList &); //按姓名查询
int Search_MemberNum(MemberList &); //按编号查询
int Search_MemberSex(MemberList &); //按性别查询
int Search_AllM(MemberList &); //查询所有读者信息
//还书
int BookReturn(BookList &,MemberList &); //还书时以编号作为主键
//删除读者
int MemberDel(MemberList &); //以读者编号作为主键进行删除
//借书信息
int BorrowInfo(MemberList &);
//到期书催还
int LimitTimeInfo(BookList &,MemberList &);
//排序函数
int BookPai(BookList &);
void ShellSort(RecType [],int);
//全局变量声明
extern RecType R[MaxSize];
extern int xer;
extern int X[100];
#endif
/***********************************************************
02.* 版权所有 (C)2016,刘富家
03.*
04.* 文件名称: Library.h
05.* 文件标识:无
06.* 内容摘要:函数文件
07.* 其它说明:各个模块函数
08.* 作 者:刘富家
09.* 完成日期: 20161231 */
#include "Library.h"
/*********************************************************
* 功能描述:图书编号排序
* 输入参数:无
* 输出参数:无
* 返回值 :无
* 其它说明:希尔排序算法
************************************************************/
void ShellSort(RecType R[],int n) //希尔排序算法
{
int i,j,gap;
RecType tmp;
gap=n/2;
;
while (gap>0)
{
for (i=gap; i<n; i++) //对所有相隔gap位置的所有元素组进行排序
{
tmp=R[i];
j=i-gap;
while (j>=0 && tmp.key<R[j].key)//对相隔gap位置的元素组进行排序
{
R[j+gap]=R[j];
j=j-gap;
}
R[j+gap]=tmp;
j=j-gap;
}
gap=gap/2; //减小增量
}
}
/*********************************************************
* 功能描述:查询图书
* 输入参数:n-要查询的书名
* 输出参数:要查询书的信息
* 返回值 :(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;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(p==NULL&&flag==0)
{
cout<<" ※没有相关信息!※"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}
/*********************************************************
* 功能描述:初试化图书链表
* 输入参数:无
* 输出参数:无
* 返回值 :图书链表
* 其它说明:无
************************************************************/
Book *Init_B() //初试化图书链表
{
Book *H;
H=(Book *)malloc(sizeof(Book));
if(!H) exit(1);
H->next=NULL;
return H;
}
/*********************************************************
* 功能描述:新建图书
* 输入参数:X[xer]-图书编号
* 输出参数:是否成功增加
* 返回值 :(1)
* 其它说明:无
************************************************************/
//增加图书
int BookAdd(BookList &H) //建立一个带头结点的链表用来存储图书信息
{
int i=0; //统计要增加的图书量
Book *p,*q,*s;
p=(Book *)malloc(sizeof(Book));
if(!p) exit(1);
if(H->next==NULL)
{
cout<<" ○输入图书编号:";
cin>>p->num;
X[xer]=p->num;
if(p->num==0) //退出"增加图书"
{
cout<<" 共计"<<i<<"本图书入库!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}
cout<<" ○输入书名:";
cin>>p->name;
cout<<" ○输入图书价格:";
cin>>p->price;
cout<<" ○输入作者姓名:";
cin>>p->writername;
cout<<" ○输入出版社名称:";
cin>>p->publish;
p->yes=1; //1表示没有借出
p->next=NULL;
H->next=p;
q=p;
++i;
cout<<endl<< X[xer];
xer++;
}
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<<" ○输入图书编号:";
cin>>p->num;
for(s=H->next; s!=NULL; s=s->next)
if(s->num==p->num || strcmp(s->name,p->name)==0)
{
cout<<" ≮一个编号对应一本书!≯";
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}
//希尔数组的加入
X[xer]=p->num;
if(p->num==0) //退出"增加图书"
{
cout<<" 共计"<<i<<"本图书入库!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
break;
}
cout<<" ○输入书名:";
cin>>p->name;
for(s=H->next; s!=NULL; s=s->next)
if(strcmp(s->name,p->name)==0)
{
cout<<" ≮一个编号对应一本书!≯";
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}
cout<<" ○输入图书价格:";
cin>>p->price;
cout<<" ○输入作者姓名:";
cin>>p->writername;
cout<<" ○输入出版社名称:";
cin>>p->publish;
p->yes=1; //1表示没有借出
p->next=NULL;
q->next=p;
q=p;
++i;
//希尔数组的加入
cout<<endl<< X[xer];
xer++;
}
return 1;
}
/*********************************************************
* 功能描述:查询图书
* 输入参数:n-书的编号
* 输出参数:查询的相应信息
* 返回值 :(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;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(p==NULL&&flag==0)
{
cout<<" ※没有相关信息※!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}
/*********************************************************
* 功能描述:查询图书
* 输入参数:n-书的作者名
* 输出参数:查询的相应信息
* 返回值 :(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;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(p==NULL&&flag==0)
{
cout<<" ※没有相关信息!※"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}
/*********************************************************
* 功能描述:查询图书
* 输入参数:n-书的出版社
* 输出参数:查询的相应信息
* 返回值 :(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;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
if(p==NULL&&flag==0)
{
cout<<" ※没有相关信息!※"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}
/*********************************************************
* 功能描述:查询图书
* 输入参数:无
* 输出参数:图书信息
* 返回值 :(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;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}
/*********************************************************
* 功能描述:查询图书选择模块
* 输入参数:0~9(对应相应功能)
* 输出参数:相应界面
* 返回值 :(1)
* 其它说明:0是退出
************************************************************/
int BookSearch(BookList &H)
{
int m;
while(m!=0)
{
FaceBookSearh();
cin>>m;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
switch(m)
{
case 1:
Search_BookName(H);
break; //按书名查询
case 2:
Search_BookNum(H);
break; //按编号查询
case 3:
Search_BookWritername(H);
break; //按作者名查询
case 4:
Search_Publish(H);
break; //按出版社查询
case 5:
Search_AllB(H);
break; //查询所有图书信息
case 0:
break; //退出
}
}
return 1;
}
/*********************************************************
* 功能描述:删除图书
* 输入参数:n-0删除的书的编号
* 输出参数:是否删除
* 返回值 :(1)
* 其它说明:按图书编号删除
**********************************************************/
//删除图书
int BookDel(BookList &H) //以图书编号作为主键进行删除
{
Book *p;
long n;
int flag=0;
p=H;
cout<<" ○输入要删除的书的编号:";
cin>>n;
for(; p!=NULL; p=p->next)
{
if(p->next!=NULL&&p->next->num==n)
{
if(p->next->yes==0)
{
cout<<" ERROR!当前图书被借出,不能删除!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}
p->next=p->next->next; //删除语句
cout<<" √成功删除!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
flag=1; //成功删除标记
break;
}
}
if(p==NULL&&flag==0)
{
cout<<" 删除不成功!"<<endl; //已经被删除或没有这本书
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}
/*********************************************************
* 功能描述:修改图书
* 输入参数:n-修改的书的编号
* 输出参数:是否修改成功
* 返回值 :(1)
* 其它说明:按图书编号修改
************************************************************/
//修改图书信息
int BookChange(BookList &H) //以图书编号作为主键进行修改
{
Book *p;
long n;
int flag=0;
p=H;
cout<<" ○输入要修改的书的编号:";
cin>>n;
for(; p!=NULL; p=p->next)
{
if(p->num==n)
{
if(p->next->yes==0)
{
cout<<" ERROR!当前图书被借出,不能修改!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
return 1;
}
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;
cout<<" 请输入相应修改数据"<<endl;
cout<<" ○输入编号:";
cin>>p->num;
cout<<" ○输入书名:";
cin>>p->name;
cout<<" ○输入图书价格:";
cin>>p->price;
cout<<" ○输入作者姓名:";
cin>>p->writername;
cout<<" ○输入出版社名称:";
cin>>p->publish;
cout<<" √成功修改!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
flag=1; //成功修改标记
break;
}
}
if(p==NULL&&flag==0)
{
cout<<" 修改失败,没有这本书!"<<endl; //没有这本书
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
}
return 1;
}
/*********************************************************
* 功能描述:判断是否是读者
* 输入参数:无
* 输出参数:无
* 返回值 :(0-不是读者,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;
}
/*********************************************************
* 功能描述:借阅图书
* 输入参数:num-读者编号,m-借阅的书编号
* 输出参数:能否借出
* 返回值 :(1)
* 其它说明:按书的编号查询
************************************************************/
//借阅图书
int BookBorrow(BookList &H,MemberList &L) //借阅时以编号作为主键
{
Book *p,*s;
Member *q;
long m=1,num;
int t=0,flag=0,max,i;
cout<<" ▲输入读者编号:";
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<<" ▲输入要借阅的书的相关信息:";
t=1;
cout<<" ▲编号:";
cin>>m;
for(s=H->next; s!=NULL; s=s->next)
if(s->num==m) break;
if(s==NULL)
{
cout<<" ERROR!没有这本书!"<<endl;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
continue;
}
for(p=H->next; p!=NULL; p=p->next)
{
if(p->num==m)
{
if(p->yes==0)
{
cout<<" ERROR!当前图书被借出,不能借阅!"<<endl;
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;
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<<endl;
q->max--;
return 1;
}
p->yes=0;
p->membernum=q->num;