C++关于图书管理系统的认识

出现过的问题以及解决办法分析

注意定义时间的时候,要加上重载运算符  <

   

bool operator<(const Time&t)const
    {
        return year!=t.year?year<t.year:month!=t.month?month<t.month:day<t.day;
    }

以上用于判断还书时间是否超时,先从年判断,如果年相同就对月进行判断。。。

此处用到三目运算符  ?:

用记录类记录基本信息,用于后面的文件记录写入、记录Book类和User类 的附带基本信息 
为便于后面操作,将借还书和续借定义为int类型
class Record
{
    int uid,bid;//用户学号和所借书的书号
    Time st;
    Time et;//默认et为应该还书的时间
    int xj;//1表示已经续借过,0时还未续借
    int zt;//1时已经还书,0时未还书
class Book
{
    int id;        //书号
    string name;   //书名
    string address;//出版社
    Time cbt;       //出版日期
    int sum,jie;    //总册数和借出数
    int i;
public:
    vector<Record>v1;
    vector<Record>::iterator it1;
    multimap<int,int>m1;
    multimap<int,int>::iterator m1;

注意此处定义的字符,后面要与相应的vector和multimap对应,否则会出现文无法读入,或程序停止运行的问题

对于用multimap储存信息要按照<>中定义的对应类型变量形式储存

如:multimap<string,int>  就要在<>中存入一个stringe类型和一个int类型的信息
添加信息时
void Manager::addUser(User u)
{
    int x;
    x=u.getId();
    mit3=m3.find(x);
    if(mit3!=m3.end()){cout<<"该用户已存在"<<endl;}
    else
    {
        cout<<"添加用户成功"<<endl;
        int i;
        v3.push_back(u);
        i=v3.size();
        m3.insert(make_pair(u.getId(),i-1));
    }
}
在查找信 息的时候会用到 multimap的基本操作find()

在找到相应信息后,可以直接用cout对应的vector中存储的信息



void Manager::searchU(int x)
{
    mit3=m3.find(x);
    if(mit3!=m3.end())
    {
        cout<<"found"<<endl;
        cout<<v3[mit3->second]<<endl;
    }
    else cout<<"not found"<<endl;
}

关于锁定用户可以用在读入文件时定义一个带参数的load()
并判断该用户是否为数据文件中存在的用户

如:

Userop(int x) {load1();load2(x);}
void Userop::load2(int x)
{
    User u;
    ifstream infile("d:\\20177411stu.txt",ios::in);
    if(!infile) return;
    while(infile>>u)
    {
        v6.push_back(u);
        int i=v6.size();
        m6.insert(make_pair(u.getId(),i-1));
        if(x==u.getId())
        {
            this->u=u;
        }
    }
    infile.close();
}


借书操作,需要更改在数据文件中保存的关于借书数量,馆藏数,读者借书数量,以及读者是否续借等相关信息并读入到数据文件中

 

void Userop::borrowBook(int x,Time t)
{
    mit5=m5.find(x);
    int i,jie,sum;
    i=mit5->second;
    jie=v5[i].getJie();
    sum=v5[i].getSum();
    if(u.getwj()==0&&jie<sum&&u.getNowb()<u.getMostb()&&mit5!=m5.end())
    {
        Record r(u.getId(),v5[i].getId(),t);
        u.addRecord(r);
        mit6=m6.find(u.getId());
        v6[mit6->second].addRecord(r);
        v5[i].addRecord(r);
        u.setNowb(u.getNowb()+1);
        v6[mit6->second].setNowb(u.getNowb());
        v5[i].setJie(jie+1);
        cout<<"借书成功"<<endl;
    }
    else cout<<"借书失败"<<endl;
}

还书操作,将借书操作时所涉及到的数据依次更改,并读入到数据文件中

void Userop::returnBook(int x)
{
    mit5=m5.find(x);
    int flag=0;
    int i=mit5->second;
    if(u.v2.size()!=0)
    {
        for(int i=0;i<u.v2.size();i++)
        {
            if(x==u.v2[i].getBid())
            flag=1;
        }
    }
    if(mit5!=m5.end()&&flag==1)
    {
        u.setNowb(u.getNowb()-1);
        mit6=m6.find(u.getId());
        v6[mit6->second].setNowb(u.getNowb());
        v5[i].setJie(v5[i].getJie()-1);
        v5[i].mit1=v5[i].m1.find(u.getId());
        v5[i].v1[v5[i].mit1->second].setZt(1);
        u.mit2=u.m2.find(x);
        u.v2[u.mit2->second].setZt(1);
        int j=mit6->second;
        v6[j].mit2=v6[j].m2.find(x);
        v6[j].v2[v6[j].mit2->second].setZt(1);
        cout<<"还书成功"<<endl;
    }
    else cout<<"还书失败"<<endl;
}

猜你喜欢

转载自blog.csdn.net/dxy2017/article/details/80838719
今日推荐