课程设计——图书管理系统

copyright (c) 2016,烟台大学计算机学院 
 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"); 
}  


 

运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值