【数据结构实训——图书信息管理系统】

/*********************************************************** 
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;
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值