程序设计——图书馆系统客户端继承版

其他类与客户端相同

一、select类

包括所有的查询操作
按书名、书号、出版社、出版日期查询图书;
按书名模糊查询图书;
按书名+作者、出版社+作者查询图书(组合查询);
输入起止出版日期,查询指定时间段出版的图书;
书号查询图书借阅情况;
图书类型查询本人的借阅情况;)

class Select{

     protected:
       vector<Book>b1;
       //vector<Reader>r1;
       vector<Record>d1;
       Date date;
       Reader reader;
       multimap<string,int>bookname;
       multimap<string,int>booknumber;
       multimap<string,int>bookpublisher;
       multimap<string,int>bookpdate;
       multimap<string,int>author;
       multimap<string,int>RecordBN;
       multimap<string,int>RecordSno;
       multimap<string,int>RecordBT;

    public:
       Select(Date date,Reader reader);
       ~Select();
       void SelectBookName();
       void SelectBookNumber();
       void SelectPublisher();
       void SelectPDate();
       void LikeBN();//模糊查询
       void SelectBNA();//书名+作者查询
       void SelectPA();//出版社+作者查询
       void SelectSchedule(string d1,string d2);//指定时间段查询
       void SelectBNRecord(string bn);//书号查询图书借阅情况
       void SelectBTRecord(string bt);//图书类型查询借阅情况
};
Select::Select(Date date,Reader reader)
{
    this->date=date;
    this->reader=reader;
}
Select::~Select()
{}
void Select::SelectBookNumber()
{
   string bn;
   cin>>bn;
   multimap<string,int>::iterator i;
   i=booknumber.find(bn);
   if(i==booknumber.end())
   {
       return;
   }
   else
   {
       cout<<b1[i->second]<<endl;
   }
}
void Select::SelectBookName()
{
    string bna;
    cin>>bna;
   multimap<string,int>::iterator i,j;
   i=bookname.find(bna);
   if(i==bookname.end())
   {
       return;
   }
   else
   {
       for(j=bookname.lower_bound(bna);j!=bookname.upper_bound(bna);j++)
       {
           cout<<b1[j->second]<<endl;
       }
   }
}
void Select::SelectPublisher()
{
  string pb;
  cin>>pb;
  multimap<string,int>::iterator i,j;
  for(j=bookpublisher.lower_bound(pb);j!=bookpublisher.upper_bound(pb);j++)
       {
           cout<<b1[j->second]<<endl;
       }
}
void Select::SelectPDate()
{
    string pd;
    cin>>pd;
    multimap<string,int>::iterator i,j;
    i=bookpdate.find(pd);
    for(j=bookpdate.lower_bound(pd);j!=bookpdate.upper_bound(pd);j++)
    {
        cout<<b1[j->second]<<endl;
    }
}
class Find
{
    private:
      const string &f;
    public:
      Find(const string &fd):f(fd){}
      bool operator()(const multimap<string,int>::value_type& pair)
      {
          int n=pair.first.find(f);
          if(n!=pair.first.npos)
          {
              return true;
          }
          else
          {
              return false;
          }
      }
};
void Select::LikeBN()
{
    string name;
    cin>>name;
    multimap<string,int>::iterator i,p,first;
    first=bookname.begin();
    for(p=bookname.begin();p!=bookname.end();p++)
    {
        i=find_if(first,bookname.end(),Find(name));
        if(i==bookname.end())
        return;
        else{
            cout<<b1[i->second]<<endl;
            i++;
            first=i;
        }
    }
}
//出版社+作者组合查找
void Select::SelectPA()
{
    string Pub,Aut;
    cin>>Pub>>Aut;
    multiset<int> m1,m2;
    multimap<string,int>::iterator s1,s2,j;
    vector<int> m;
    vector<int>::iterator p;
    s1=bookpublisher.find(Pub);
    if(s1!=bookpublisher.end())
    {
        for(j=bookpublisher.lower_bound(Pub);j!=bookpublisher.upper_bound(Pub);j++)
        {
            m1.insert(j->second);
        }
    }
    s2=author.find(Aut);
    if(s2!=author.end())
    {
        for(j=author.lower_bound(Aut);j!=author.upper_bound(Aut);j++)
        {
            m2.insert(j->second);
        }
    }
    set_intersection(m1.begin(),m1.end(),m2.begin(),m2.end(),insert_iterator<vector<int> >(m,m.begin()));
    for(p=m.begin();p!=m.end();p++)
    {
        cout<<b1[*p]<<endl;
    }
}
//书名+作者组合查找
void Select::SelectBNA()
{
    string Bn,Aut;
    cin>>Bn>>Aut;
    multiset<int>m1,m2;
    multimap<string,int>::iterator s1,s2,j;
    vector<int> m;
    vector<int>::iterator p;
    s1=bookname.find(Bn);
    if(s1!=bookname.end())
    {
        for(j=bookname.lower_bound(Bn);j!=bookname.upper_bound(Bn);j++)
        {
            m1.insert(j->second);
        }
    }

    s2=author.find(Aut);
    if(s2!=author.end())
    {
        for(j=author.lower_bound(Aut);j!=author.upper_bound(Aut);j++)
        {
            m2.insert(j->second);
        }
    }
    set_intersection(m1.begin(),m1.end(),m2.begin(),m2.end(),insert_iterator<vector<int> >(m,m.begin()));
    for(p=m.begin();p!=m.end();p++)
    {
        cout<<b1[*p]<<endl;
    }
}
void Select::SelectSchedule(string d1,string d2)
{
    multimap<string,int>::iterator i;
    for(i=bookpdate.lower_bound(d1);i!=bookpdate.upper_bound(d2);i++)
    {
        cout<<b1[i->second];
    }
}
//按书号查询图书借阅情况;
void Select::SelectBNRecord(string bn)
{
    multimap<string,int>::iterator i;
    for(i=RecordBN.lower_bound(bn);i!=RecordBN.upper_bound(bn);i++)
    {
        cout<<d1[i->second];
    }
}
//图书类型查询本人的借阅情况;
void Select::SelectBTRecord(string bt)
{
    multimap<string,int>::iterator i,j;
    i=RecordSno.find(reader.getSno());
    if(i!=RecordSno.end())
    {
        for(j=RecordSno.begin();j!=RecordSno.end();j++)
        {
            if(d1[j->second].getBookType()==bt)
            {
                cout<<d1[j->second];
            }
        }
    }
}

二、operate类(继承Select类)

包括其他的操作(借书、还书、续借操作)

注:继承类的构造函数的写法
在这里插入图片描述

 operate(Date date,Reader reader):Select(date,reader)
         {
             this->date=date;
             this->reader=reader;
             BookRead();
             RecordRead();
         }

完整的操作类程序

class operate:public Select
{
       public:
         operate(Date date,Reader reader):Select(date,reader)
         {
             this->date=date;
             this->reader=reader;
             BookRead();
             RecordRead();
         }
         ~operate();
         void BookRead();
         void BookWrite();
         void RecordRead();
         void RecordWrite();
         void BorrowBook(string bn);
         void ReturnBook(string bn);
         void ReBorrowBook(string bn);
};
operate::~operate()
{
    BookWrite();
    RecordWrite();
}
void operate::BookRead()
{   Book t;
    int a,b;
    ifstream in("D:\\book.txt");
    if(!in)
    {
        return ;
    }
   while(!in.eof())
   {
       in>>t;
       in>>a>>b;
       t.setBookSum(a);
       t.setBookIn(b);
       b1.push_back(t);
       bookname.insert(make_pair(t.getTitle(),b1.size()-1));
       booknumber.insert(make_pair(t.getBookNumber(),b1.size()-1));
       bookpdate.insert(make_pair(t.getPulishDate(),b1.size()-1));
       bookpublisher.insert(make_pair(t.getPublisher(),b1.size()-1));
       author.insert(make_pair(t.getAuthor(),b1.size()-1));
   }
   in.close();
}
void operate::BookWrite()
{
    ofstream out("D:\\book.txt");
    vector<Book>::iterator i;
    for(i=b1.begin();i!=b1.end();i++)
    {
        out<<*i;
    }
    out.close();
}

void operate::RecordRead()
{   Record r;
    ifstream in("D:\\record.txt");
    if(!in)
    {
        return ;
    }
     while(in.eof())
   {
       in>>r;
       d1.push_back(r);
       RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
       RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
       RecordBT.insert(make_pair(r.getBookType(),d1.size()-1));
   }
    in.close();
}
void operate::RecordWrite()
{
    ofstream out("D:\\record.txt");
    vector<Record>::iterator i;
    for(i=d1.begin();i!=d1.end();i++)
    {
        out<<*i;
    }
    out.close();
}
//借书(输入书号,如果书库有这本书且本人借阅量不超限,办理借书手续(本人借书量加一、图书在库数量减一)
//对本人和书生成借阅记录);
void operate::BorrowBook(string bn)
{
    multimap<string,int>::iterator i;
    i=booknumber.find(bn);
    if(i==booknumber.end())
    return;
    else{
        if(b1[i->second].getBookIn()>0&&reader.getBorrowNumber()<Base::getBorrowNumberMax())
        {
            reader.setBorrowNumber(reader.getBorrowNumber()+1);
            b1[i->second].setBookIn(b1[i->second].getBookIn()-1);
            Date d=date+Base::getBorrowNumberMax();
            Record r(d,bn,reader.getSno(),"借出",b1[i->second].getBookType());
            d1.push_back(r);
            RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
            RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
        }
    }
}
void operate::ReturnBook(string bn)
{
    multimap<string,int>::iterator i;
    i=booknumber.find(bn);
    if(i==booknumber.end())
    return;
    else{
        reader.setBorrowNumber(reader.getBorrowNumber()-1);
        b1[i->second].setBookIn(b1[i->second].getBookIn()+1);
        Record r(date,bn,reader.getSno(),"还回",b1[i->second].getBookType());
        d1.push_back(r);
        RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
        RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
       }
}
void operate::ReBorrowBook(string bn)
{
     multimap<string,int>::iterator i;
    i=booknumber.find(bn);
    if(i==booknumber.end())
    return;
    else{
        Date d=date+Base::getBorrowNumberMax();
        Record r(date,bn,reader.getSno(),"续借",b1[i->second].getBookType());
        d1.push_back(r);
        RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
        RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
       }
}

int main()
{
//读者类:学号(常成员)、姓名、专业、班级、已借图书数量、借阅记录向量;
    Reader r1("2018212405","潘佳雯","计算机","18-4",1);
    Date d1(2020,5,5);
    operate op1(d1,r1);
    op1.SelectBookName();
    op1.SelectBookNumber();
    op1.SelectPublisher();
    op1.SelectPDate();
    op1.SelectBNA();//书名+作者
    op1.SelectPA();//出版社+作者
    op1.LikeBN();
    op1.SelectSchedule("2002","2010");
    op1.BorrowBook("0000");
    op1.ReturnBook("0002");
    cout<<endl;
    op1.ReBorrowBook("0001");
    op1.SelectBNRecord("0001");
    cout<<endl;
    op1.SelectBTRecord("专业");

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值