copyright (c) 2016,烟台大学计算机学院
All rights reserved.
文件名称:1.cpp
作者:孟令康
完成日期:2016年9月12日
版本号:v1.0
All rights reserved.
文件名称:1.cpp
作者:孟令康
完成日期:2016年9月12日
版本号:v1.0
代码:
#include<iostream>
#include"windows.h"
#include<conio.h>//getch();
using namespace std;
#define Max 3 //最多借书数
int n; //当前借了几本书
int w; //是否确定输入
struct Borrow//结构体(借阅信息)
{
int borrow_bid;
int date;//归还日期
}; //关于借书的节点类型用Borrow表示
struct Book//图书信息,
{
int bid; //编号
char bname[20]; //名称
char writer[20]; //作者
int xianyou;//图书现有数量
int kucun;//库存量
struct Book *next;//指向后继节点
}; //关于图书的节点类型用Book表示
Book *bhead;
struct Reader //读者信息
{
int rid;
char rname[20];
int borrow_bnum;//已借书数
Borrow borrow[Max];//读者的借阅情况
struct Reader *next; //建立头节点
}; //关于读者的节点类型用Reader表示
Reader *rhead;
void init_reader(); // 初始化,新读者注册
void init_book(); // 初始化,图书入库
void new_book(); // 采编入库
void new_reader(); // 新读者注册
void borrow_book(); // 借书
void return_book(); // 还书
void search_reader(); // 查询读者借还情况
void search_book(); // 查询图书的借还请情况
int function(); // 功能表
void choose(); // 功能选择
void SaveLinkToFile(void); //将信息保存在文件中
/******************************
*功能描述:列举图书管理系统功能
*输入参数:输入所有的功能
*****************************/
int function() //主菜单
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|
FOREGROUND_BLUE);
cout<<" 图书管理系统功能表"<<endl;
cout<<" ================================================="<<endl;
cout<<" <1>采编入库"<<endl;
cout<<" <2>新读者注册"<<endl;
cout<<" <3>借阅图书"<<endl;
cout<<" <4>归还图书"<<endl;
cout<<" <5>查询图书借还情况"<<endl;
cout<<" <6>查询读者借还情况"<<endl;
cout<<" <7>将图书信息保存至文件 "<<endl;
cout<<" <8>退出程序"<<endl;
cout<<" ================================================="<<endl;
int a;
cin>>a; //a输入的数字
while(cin.fail()||a<0||a>8)//判断输入是否为数字,不是则重新输入
{
cout<<"输入错误"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入1-8之间的数字选择功能(例:1):"<<endl; //输入图书编号
cin>>a;
}
return a;
}
void main() //main函数
{
init_reader();//系统使用者者注册
init_book();//初始状态,新书入库
choose();//调用主菜单
}
void init_reader() //初始状态系统使用者者注册。
{
cout<<"=================系统使用者者注册================="<<endl;
Reader *p;
p=(Reader*)malloc(sizeof(Reader));//创建头节点
rhead=p;//rhead指向头结点
cout<<"欢迎进入图书管理系统,请您先进行注册"<<endl;
cout<<"请输入注册的借书证号(输入数字):"<<endl;
cin>>p->rid;
while(cin.fail()) //判断输入是否为数字,不是则重新输入
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入借书证号(输入数字):"<<endl; //输入图书编号
cin>>p->rid;
}
cout<<"是否确定输入,确定请按0,重新输入请按1"<<endl;
cin>>w;
while(cin.fail()||w>1||w<0)//判断输入是否为数字,不是则重新输入
{
cout<<"输入错误,请重新输入"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cin>>w;
}
if(w==1)
{
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入借书证号(输入数字):"<<endl; //输入图书编号
cin>>p->rid;
}
cout<<"注册姓名:"<<endl;
cin>>p->rname;
p->borrow_bnum=0; //初始化
int i;
for(i=0;i<Max;i++)
{
p->borrow[i].borrow_bid=0;
p->borrow[i].date=0;
}
p->next=NULL;
cout<<"注册成功!按任意键继续下一步操作"<<endl;
getch(); system("cls");
}
void init_book() //初始状态,图书入库
{
cout<<"=================采编入库================="<<endl;
Book *p;
p=(Book*)malloc(sizeof(Book));//创建头节点
bhead=p;//bhead指向头结点
cout<<"图书馆入库第一批新书"<<endl;
cout<<"请输入图书编号(输入数字):"<<endl; //输入图书编号
cin>>p->bid;
while(cin.fail())//判断输入是否为数字,不是则重新输入
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入图书编号(输入数字):"<<endl; //输入图书编号
cin>>p->bid;
}
cout<<"是否确定输入,确定请按0,重新输入请按1"<<endl;
cin>>w;
while(cin.fail()||w>1||w<0)//判断输入是否为数字,不是则重新输入
{
cout<<"输入错误,请重新输入"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cin>>w;
}
if(w==1)
{
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入图书编号(输入数字):"<<endl; //输入图书编号
cin>>p->bid;
}
cout<<"图书名称:"<<endl;//输入图书名称
cin>>p->bname;
cout<<"图书作者:"<<endl;//输入图书作者
cin>>p->writer;
cout<<"图书数量(输入数字):"<<endl;//输入图书入库数量
cin>>p->kucun;
while(cin.fail())//判断输入是否为数字
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新图书数量(输入数字):"<<endl; //输入图书编号
cin>>p->kucun;
}
p->xianyou=p->kucun;//开始时图书现有量和库存量相等
p->next=NULL;
cout<<"图书初始入库完毕!按任意键继续下一步操作"<<endl;
getch();system("cls");
}
void choose() //主菜单函数
{
for(;;)
{
switch(function()) //功能选择
{
case 1:new_book(); break;
case 2:new_reader(); break;
case 3:borrow_book(); break;
case 4:return_book(); break;
case 5:search_book(); break;
case 6:search_reader();break;
case 7:SaveLinkToFile();break;
case 8:{cout<<"系统退出!"<<endl;exit(0);}
default:cout<<endl; //如果输入到function()中a的信息与这七条都不相符的话就执行function中的while语句。
cout<<"请根据提示输入,输入错误系统退出!"<<endl;
exit(0);
}
}
}
void new_reader() //新读者注册
{
Reader *p0,*p1; //p1库内已有的书,p0新入书
p1=rhead;
cout<<"=================图书馆新读者注册================="<<endl;
p0=(Reader *)malloc(sizeof(Reader));
cout<<"欢迎进入图书管理系统,请您先注册"<<endl;
cout<<"请输入借书证号(输入数字):"<<endl;
cin>>p0->rid;
while(cin.get() != '\n')//判断输入是否为数字
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入借书证号(输入数字):"<<endl; //输入图书编号
cin>>p0->rid;
}
cout<<"是否确定输入,确定请按0,重新输入请按1"<<endl;
cin>>w;
while(cin.fail()||w>1||w<0)//判断输入是否为数字,不是则重新输入
{
cout<<"输入错误,请重新输入"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cin>>w;
}
if(w==1)
{
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入借书证号(输入数字):"<<endl; //输入图书编号
cin>>p0->rid;
}
while(p0->rid!=p1->rid&&p1->next!=NULL)
p1=p1->next;
if(p0->rid==p1->rid) //借书号是否被注册
{
cout<<"此借书号已被注册,请重新输入!"<<endl;
cin>>p0->rid;
while(cin.fail())//判断输入是否为数字
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入借书证号(输入数字):"<<endl; //输入图书编号
cin>>p0->rid;
}
}
cout<<"注册姓名:"<<endl;
cin>>p0->rname;
p0->borrow_bnum=0; //初始化,已借书数为0
int i;
for(i=0;i<Max;i++)
{
p0->borrow[i].borrow_bid=0; //初始化,所借图书编号为0
p0->borrow[i].date=0; //初始化,所借归还日期为0
}
while(p1->next) //查找结点
{ p1=p1->next; }
p1->next=p0; //插入
p0->next=NULL;
cout<<"注册成功!按任意键继续下一步操作.."<<endl;
getch();system("cls");
}
void new_book() //采编入库
{
Book *p0,*p1; //p1库内已有的书,p0新入书
p1=bhead;
cout<<"=================采编入库================="<<endl;
p0=(Book *)malloc(sizeof(Book));
cout<<"图书编号(输入数字):"<<endl;
cin>>p0->bid;
while(cin.fail())//判断输入是否为数字
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入图书编号(输入数字):"<<endl; //输入图书编号
cin>>p0->bid;
}
cout<<"是否确定输入,确定请按0,重新输入请按1"<<endl;
cin>>w;
while(cin.fail()||w>1||w<0)//判断输入是否为数字,不是则重新输入
{
cout<<"输入错误,请重新输入"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cin>>w;
}
if(w==1)
{
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入图书编号(输入数字):"<<endl; //输入图书编号
cin>>p0->bid;
}
while(p0->bid!=p1->bid&&p1->next!=NULL)//入库的图书不存在,创立新结点
p1=p1->next;
if(p0->bid==p1->bid) //若图书编号存在,则直接进库,只须输入书的数量
{
cout<<"此编号图书已存在,请直接添加数目!"<<endl;
cout<<"图书数量(输入数字):"<<endl;
cin>>p0->kucun;
while(cin.fail())//判断输入是否为数字
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新图书数量(输入数字):"<<endl; //输入图书编号
cin>>p0->kucun;
}
p1->kucun+=p0->kucun;
p1->xianyou+=p0->kucun;
}
else//若图书编号不存在,则需要输入其他的信息,然后
{
cout<<"图书名称:"<<endl;
cin>>p0->bname;
cout<<"图书作者:"<<endl;
cin>>p0->writer;
cout<<"图书数量(输入数字):"<<endl;
cin>>p0->kucun;
while(cin.fail())
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新图书数量(输入数字):"<<endl; //输入图书编号
cin>>p0->kucun;
}
while(p1->next) //查找结点
{ p1=p1->next; }
p1->next=p0; //链表中最后元素的next指向p0处,插入
p0->next=NULL;
p0->xianyou=p0->kucun;
}
cout<<"新书入库成功!按任意键继续下一步操作"<<endl;
getch();system("cls");
}
void borrow_book() //借书
{
Book *p0;
Reader *p1;
int bo_id,rea_id,lim_date,i;
p0=bhead; p1=rhead;
cout<<"=================借阅图书================="<<endl;
cout<<"请输入借书证号(输入数字):"<<endl;
cin>>rea_id;
while(cin.fail())
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入借书证号(输入数字):"<<endl; //输入借书证号
cin>>rea_id;
}
while(rea_id!=p1->rid&&p1->next!=NULL)//查找借书号结点
p1=p1->next;
if(p1->next==NULL&&rea_id!=p1->rid)//判断输入的借书号是否存在
{
cout<<"此借书证号不存在!请回到主菜单页面进行新读者注册!按任意键返回"<<endl;
goto end;
}
cout<<"请输入图书编号(输入数字):"<<endl;
cin>>bo_id;
while(bo_id!=p0->bid&&p0->next!=NULL)//查找图书书号结点
p0=p0->next;
if(p0->next==NULL&&bo_id!=p0->bid)//判断借的书是否存在
{
cout<<"此图书不存在!您可以借阅其他书籍!按任意键返回"<<endl;
goto end;
}
else if(p0->xianyou<=0) //判断想借的书,馆内是否已借完
{
cout<<"此书已借完!您可以借阅其他书籍!按任意键返回"<<endl;
goto end;
}
else if(p1->borrow_bnum>=Max) //每人最多借3本书
{
cout<<"您的最大借书权限为3本书,若想继续借书,请归还一定数量的图书!按任意键返回"<<endl;
goto end;
}
else if(p1->borrow[0].borrow_bid!=0)//每人不能借两本相同的书
{
for(i=0;i<Max;i++)
{
if(bo_id==p1->borrow[i].borrow_bid)
{
cout<<"不能借两本相同的书!按任意键返回"<<endl;
goto end;
}
else if(p1->borrow[i].borrow_bid==0)
{
cout<<"请输入你要归还图书的日期(输入数字,例:20150101):"<<endl;
cin>>lim_date;
while(cin.fail())
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入归还图书的日期(输入数字,例:20150101):"<<endl; //输入图书编号
cin>>lim_date;
}
p1->borrow[p1->borrow_bnum++].borrow_bid=bo_id;// 登记此书被借出
p1->borrow[p1->borrow_bnum-1].date=lim_date; //登记还书日期
p0->xianyou--;//借书后,现有量-1
cout<<"借书成功!按任意键继续下步操作"<<endl;
goto end;
}
}
}
else
{
cout<<"请输入你要归还图书的日期(输入数字,例:20150101):"<<endl;
cin>>lim_date;
p1->borrow[p1->borrow_bnum++].borrow_bid=bo_id;// 登记此书被借出
p1->borrow[p1->borrow_bnum-1].date=lim_date; //登记还书日期
p0->xianyou--;//借书后,现有量-1
cout<<"借书成功!按任意键继续下步操作"<<endl;
}
end:getch();
system("cls");
n=p1->borrow_bnum;//记录已借几本书
}
void return_book() //还书
{
Book *p;
Reader *q;
int i,j,mark=0;//为0时,未借此书;为1时,读者借了此书;为2时,错误处理
int return_bid,return_rid;
p=bhead;
q=rhead;
cout<<"=================归还图书================="<<endl;
cout<<"请输入借书证号(输入数字):"<<endl;
cin>>return_rid;
while(cin.fail())
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入借书证号(输入数字):"<<endl;
cin>>return_rid;
}
while(q->next!=NULL&&return_rid!=q->rid) //查找借书号结点
q=q->next;
if(q->next==NULL&&return_rid!=q->rid)//输入的借书号未曾注册过
{
mark=2;
cout<<"借书证号输入错误!按任意键返回"<<endl;
goto end;
}
cout<<"请输入要归还的图书编号(输入数字):"<<endl;
cin>>return_bid;
while(cin.fail())
{
cout<<"输入错误,请输入数字"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
cout<<"请重新输入请输入要归还的图书编号(输入数字):"<<endl; //输入图书编号
cin>>return_bid;
}
while(p->next!=NULL&&return_bid!=p->bid) //查找图书号结点
p=p->next;
if(p->next==NULL&&return_bid!=p->bid)//输入的图书号未曾登记过
{
mark=2;
cout<<"图书编号输入错误!按任意键返回"<<endl;
goto end;
}
for(i=0;i<Max;i++)
{ if(return_bid==q->borrow[i].borrow_bid) //如果读者借了此书
{
mark=1;
for(j=i;j<Max-1;j++)
{
q->borrow[j].borrow_bid=q->borrow[j+1].borrow_bid; //归还后,删除数据
q->borrow[j].date=q->borrow[j+1].date;
}
q->borrow[Max-1].borrow_bid=0;//归还后返回初始化阶段
q->borrow[Max-1].date=0;
p->xianyou++;//还书后,现有量+1
q->borrow_bnum--;//借书数-1
cout<<"还书成功!按任意键继续下步操作";
}
}
if(mark==0)
cout<<"此读者未借此书!按任意键返回"<<endl;
end: getch(); system("cls");
}
void search_book() //查询图书信息
{
Book *p;
p=bhead;
cout<<"=================图书信息===================:"<<endl;
cout<<"图书编号"<<" "<<"图书名称"<<" "<<"图书作者"<<" "<<"现有量"<<" "<<"库存量"<<endl;
while(p!=NULL)
{
cout<<p->bid<<" "<<p->bname<<" "<<p->writer<<" "<<p->xianyou<<" "<<p->kucun<<endl;
p=p->next;
}
cout<<"按任意键继续下一步操作.."<<endl;
getch();system("cls");
}
void search_reader() //查询读者信息
{
Reader *p;
p=rhead;
int i;
cout<<"=================读者信息================="<<endl;
while(p!=NULL)
{
cout<<"借书证号:"<<p->rid<<" "<<"姓名"<<p->rname<<endl;
for(i=0;i<n;i++)
{
cout<<"借阅的第"<<i+1<<"本书"<<endl;
cout<<"图书编号"<<p->borrow[i].borrow_bid<<endl;
cout<<"还书日期"<<p->borrow[i].date<<endl;
cout<<endl;
}
p=p->next;
cout<<"--------------------------------"<<endl;
}
cout<<"按任意键继续下一步操作.."<<endl;
getch();system("cls");
}
void SaveLinkToFile(void)
{
Book *p;
FILE *fp;
p=bhead;
if(p==NULL)
{
printf("现在没有信息,请先输入信息\n\n");
return;
}
fp=fopen("tushu.txt","w+");
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%d %s %s %d %d\n",p->bid,p->bname,p->writer,p->xianyou,p->kucun);
p=p->next;
}
printf("保存成功。 \n");
fclose(fp);
getch();system("cls");
}