#include<bits/stdc++.h>
using namespace std;
class Time //时间类
{
int year,month,day; //数据成员:年、月、日
public:
Time() //无参构造函数;
{
year=0;
month=0;
day=0;
}
Time(int y,int m,int d) //带参构造函数;
{
year=y;
month=m;
day=d;
}
void setYear(int y)
{
year=y;
}
void setMonth(int m)
{
month=m;
}
void setDay(int d)
{
day=d;
}
int getYear()
{
return year;
}
int getMonth()
{
return month;
}
int getDay()
{
return day;
}
bool operator<(const Time&t1)const
{
return year!=t1.year?year<=t1.year:month!=t1.month?month<=t1.month:day<=t1.day;
}
friend istream&operator>>(istream&input,Time&t);
friend ostream&operator<<(ostream&output,Time&t);
};
ostream&operator<<(ostream&output,Time&t)
{
output<<t.year<<" ";
output<<t.month<<" ";
output<<t.day;
return output;
}
istream&operator>>(istream&input,Time&t)
{
input>>t.year>>t.month>>t.day;
return input;
}
class Record //借阅记录类;
{
int id; //学号;
Time start; //借书日期;
int sh; //书号;
Time end; //还书日期;
int xj; //续借;
int state; //书的借阅状态;1在借,0在还;
public:
Record(){}
Record(int i,Time s,int h)
{
id=i;
start=s;
sh=h;
if(s.getMonth()+2>12) //自动生成还书日期(默认借书时间为两个月);
{
Time e(s.getYear()+1,s.getMonth()-10,s.getDay());
end=e;
}
else
{
Time e(s.getYear(),s.getMonth()+2,s.getDay());
end=e;
}
xj=0;
state=0;
}
int getId()
{
return id;
}
Time getStart()
{
return start;
}
int getSh()
{
return sh;
}
Time getEnd()
{
return end;
}
void setEnd();
void setXj()
{
xj=1;
}
int getXj()
{
return xj;
}
void setState(int n)
{
state=n;
}
int getState()
{
return state;
}
friend ostream&operator<<(ostream&output,Record&r);
friend istream&operator>>(istream&input,Record&r);
};
void Record::setEnd() //默认续借时间1个月;
{
Time e;
if(end.getMonth()+1>12)
e=Time(end.getYear()+1,end.getMonth()-11,end.getDay());
else
e=Time(end.getYear(),end.getMonth()+1,end.getDay());
end=e;
}
istream&operator>>(istream&input,Record&r)
{
input>>r.id;
input>>r.start;
input>>r.sh;
input>>r.end;
input>>r.xj;
input>>r.state;
return input;
}
ostream&operator<<(ostream&output,Record&r)
{
output<<r.id<<" ";
output<<r.start<<" ";
output<<r.sh<<" ";
output<<r.end<<" ";
output<<r.xj<<" ";
output<<r.state<<endl;
return output;
}
class Records //记录类;
{
protected:
int rnum; //借阅记录的条数;
vector<Record>v1;
vector<Record>::iterator it1;
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
public:
Records(){rnum=0;}
void setRnum(int n)
{
rnum=n;
}
int getRnum()
{
return rnum;
}
vector<Record>getRecord()
{
return v1;
}
multimap<int,int>getMap()
{
return m1;
}
void dispRecord1();
void clear1();
};
void Records::dispRecord1()
{
if(v1.size()!=0)
for(it1=v1.begin();it1!=v1.end();it1++)
cout<<*it1;
else
cout<<"No Record!"<<endl;
}
void Records::clear1()
{
v1.clear();
}
class Book:public Records //图书数据类;
{
int sh; //书号;
string name; //书名;
string author; //作者;
string press; //出版社;
int date; //出版时间;
int num; //馆藏图书数量;
int jc; //借出数量;
public:
int getSh()
{
return sh;
}
string getName()
{
return name;
}
string getauthor()
{
return author;
}
string getPress()
{
return press;
}
int getDate()
{
return date;
}
void setNum(int n)
{
num=n;
}
int getNum()
{
return num;
}
void setJc(int j)
{
jc=j;
}
int getJc()
{
return jc;
}
void addRecord1(Record r1); //增加借阅记录;
void addR1(Record r1);
void deleteRecord1(int no); //根据学号还书;
friend istream&operator>>(istream&input,Book&b);
friend ostream&operator<<(ostream&output,Book&b);
int search1(int no);
void display(); //显示书的基本信息;
void modify(int no); //续借;
};
void Book::display() //显示书的基本信息;
{
cout<<sh<<" ";
cout<<name<<" ";
cout<<author<<" ";
cout<<press<<" ";
cout<<date<<" ";
cout<<num<<" ";
cout<<jc<<endl;
}
istream&operator>>(istream&input,Book&b) //输入不需要输入借阅记录;
{
input>>b.sh;
if(b.sh==-1) //多次输入的小技巧;
return input;
input>>b.name;
input>>b.author;
input>>b.press;
input>>b.date;
input>>b.num;
input>>b.jc;
input>>b.rnum;
return input;
}
ostream&operator<<(ostream&output,Book&b) //注意:输出里面包含输出借阅记录;
{
output<<b.sh<<" "<<b.name<<" "<<b.author<<" "<<b.press;
output<<" "<<b.date<<" "<<b.num<<" "<<b.jc<<" "<<b.rnum<<endl;
if(b.getRnum()!=0)
for(int i=0;i<b.getRnum();i++)
output<<b.v1[i];
return output;
}
void Book::addR1(Record r1) //只增加记录,不牵扯书籍的借还状态;
{
v1.push_back(r1);
int i=v1.size();
m1.insert(make_pair(r1.getId(),i-1));
}
void Book::addRecord1(Record r1)
{
r1.setState(1);
v1.push_back(r1);
int i=v1.size();
m1.insert(make_pair(r1.getId(),i-1));
}
int Book::search1(int no)
{
mit1=m1.find(no);
if(mit1!=m1.end())
return mit1->second;
else
return -1;
}
void Book::modify(int no)
{
int i=search1(no);
if(v1[i].getXj()==0)
{
v1[i].setXj();
v1[i].setEnd();
}
}
void Book::deleteRecord1(int no)
{
int i;
i=search1(no);
if(i!=-1)
{
v1[i].setState(0);
}
}
class User:public Records //用户数据类;
{
int id; //学号;
string name; //姓名;
string major; //专业班级;
int max; //最大借阅量;
int now; //当前借书量;
int wj; //违纪;
string mima; //密码;
public:
User()
{
wj=0;
}
int getId()
{
return id;
}
void setName(string nam)
{
name=nam;
}
string getName()
{
return name;
}
void setMajor(string major)
{
this->major=major;
}
string getMajor()
{
return major;
}
void setMax(int m)
{
max=m;
}
int getMax()
{
return max;
}
void setNow(int n)
{
now=n;
}
int getNow()
{
return now;
}
void setWj(int n)
{
wj=n;
}
int getWj()
{
return wj;
}
void setmima(string mima1){mima=mima1;}
string getmima(){return mima;}
void addRecord2(Record r2);
int search2(int h);
void deleteRecord2(int h);
void modify(int h);
friend istream&operator>>(istream&input,User&u);
friend ostream&operator<<(ostream&output,User&u);
void pd(Time t); //根据还书时间判断是否违纪;
void addR2(Record r);
void operator=(User&u) //重载赋值运算符;
{
id=u.getId();
name=u.getName();
max=u.getMax();
now=u.getNow();
wj=u.getWj();
rnum=u.getRnum();
v1=u.getRecord();
m1=u.getMap();
mima=u.getmima();
major=u.getMajor();
}
bool operator==(User u) //重载等于运算符;
{
return this->id==u.getId()?1:0;
}
};
istream&operator>>(istream&input,User&u)
{
input>>u.id;
if(u.id==-1)
return input;
input>>u.name;
input>>u.major;
input>>u.max;
input>>u.now;
input>>u.wj;
input>>u.rnum;
input>>u.mima;
return input;
}
ostream&operator<<(ostream&output,User&u)
{
output<<u.id<<" "<<u.name<<" "<<u.major<<" "<<u.max<<" ";
output<<u.now<<" "<<u.wj<<" "<<u.rnum<<" "<<u.mima<<endl;
if(u.getRnum()!=0)
for(int i=0;i<u.getRnum();i++)
output<<u.v1[i];
return output;
}
void User::addR2(Record r2)
{
v1.push_back(r2);
int i=v1.size();
m1.insert(make_pair(r2.getSh(),i-1));
}
void User::addRecord2(Record r2)
{
r2.setState(1);
v1.push_back(r2);
int i=v1.size();
m1.insert(make_pair(r2.getSh(),i-1));
}
int User::search2(int h)
{
mit1=m1.find(h);
if(mit1!=m1.end())
return mit1->second;
else
return -1;
}
void User::deleteRecord2(int h)
{
int i;
i=search2(h);
if(i!=-1)
{
v1[i].setState(0);
}
}
void User::pd(Time t)
{
setWj(0);
for(int i=0;i<v1.size();i++)
if(v1[i].getEnd()<t&&v1[i].getState()==1)
{
setWj(1);
break;
}
}
void User::modify(int h)
{
int i=search2(h);
if(v1[i].getXj()==0)
{
v1[i].setXj();
v1[i].setEnd();
}
}
class Person //用户登陆信息类
{
int no; //账号;
string pwd; //密码;
int type; //=1是管理员;=0是用户 ;
public:
Person(int n,string p,int t)
{
no=n; pwd=p; type=t;
}
Person(){}
int getNO(){return no;}
void setmima(string mima){pwd=mima;}
string getPwd(){return pwd;}
int getType(){return type;}
friend ostream &operator<<(ostream&os,const Person &a)
{
os<<a.no<<" ";
os<<a.pwd<<" ";
os<<a.type<<endl;
return os;
}
friend istream &operator>>(istream&is,Person &b)
{
is>>b.no;
if(b.no==-1) return is;
is>>b.pwd;
is>>b.type;
return is;
}
};
class queryBook //查询书籍类;
{
protected:
vector<Book>v5;
vector<Book>::iterator it5;
multimap<int,int>m5;
multimap<int,int>::iterator mit5;
public:
int search5(int h)
{
mit5=m5.find(h);
if(mit5!=m5.end())
{
return mit5->second;
}
else
return -1;
}
void querybook()
{
int h;
cin>>h;
int i=search5(h);
cout<<"您是否想查看借阅记录,是请按1,否请按0"<<endl;
int m;cin>>m;
if(m==0)
{
if(i!=-1)
v5[i].display();
}
if(m==1)
{
if(i!=-1)
cout<<v5[i];
}
}
};
class Manage:public queryBook //管理员类;(增删查改)
{
vector<Person>pv;
vector<Person>::iterator pt;
multimap<int,int> mu; //按照账号查询;
multimap<int,int>::iterator muit;
vector<User>v4;
vector<User>::iterator it4;
multimap<int,int>m4; //按照学号查找;
multimap<int,int>::iterator mit4;
public:
Manage()
{
load1();
load2();
load3();
}
~Manage()
{
save1();
save2();
save3();
}
void addBook(); //增加书籍;
void dispBook();
void deleteBook(); //删书;
void modifyBook(); //改书;
void addUser();
void dispUser();
int search4(int h);
void queryById(); //按照学号查询;
void deleteUser();
void modifyUser();
void llxuesheng();
void load1();
void load2();
void load3();
void save1();
void save2();
void save3();
};
void Manage::llxuesheng()
{
for (int i=0;i<v4.size();i++)
cout<<v4[i];
}
void Manage::load1()
{
Book bb;
ifstream infile("E:\\20171801Book.txt",ios::in);
if(!infile)
return;
v5.clear();
m5.clear();
int i=0;
while(infile>>bb)
{
if(bb.getRnum()!=0)
for(int i=0;i<bb.getRnum();i++)
{
Record r3;
infile>>r3;
bb.addR1(r3);
}
v5.push_back(bb);
m5.insert(make_pair(bb.getSh(),i));
i++;
bb.clear1();
}
infile.close();
}
void Manage::load2()
{
User u1;
ifstream infile("E:\\20171801Stu.txt",ios::in);
if(!infile)
return;
v4.clear();
m4.clear();
int i=0;
while(infile>>u1)
{
if(u1.getRnum()!=0)
for(int i=0;i<u1.getRnum();i++)
{
Record r4;
infile>>r4;
u1.addR2(r4);
}
v4.push_back(u1);
m4.insert(make_pair(u1.getId(),i));
i++;
u1.clear1();
}
infile.close();
}
void Manage::load3()
{
Person p;
ifstream infile("E:\\person.txt",ios::in);
if(!infile)
return;
pv.clear();
mu.clear();
int i=0;
while(infile>>p)
{
pv.push_back(p);
mu.insert(make_pair(p.getNO(),i));
i++;
}
infile.close();
}
void Manage::save1() //写文件;
{
ofstream outfile("E:\\20171801Book.txt",ios::out);
if(!outfile)
return ;
for(it5=v5.begin();it5!=v5.end();it5++)
{
outfile<<*it5;
}
outfile.close();
}
void Manage::save2()
{
ofstream outfile("E:\\20171801Stu.txt",ios::out);
if(!outfile)
return ;
for(it4=v4.begin();it4!=v4.end();it4++)
{
outfile<<*it4;
}
outfile.close();
}
void Manage::save3()
{
ofstream outfile("E:\\person.txt",ios::out);
if(!outfile)
return;
for(pt=pv.begin();pt!=pv.end();pt++)
{
outfile<<*pt;
}
outfile.close();
}
void Manage::addBook()
{
Book b;
int i;
while(cin>>b)
{
if(b.getSh()==-1)
break;
v5.push_back(b);
i=v5.size();
m5.insert(make_pair(b.getSh(),i-1));
b.clear1();
}
}
void Manage::deleteBook() //学会删除数据;
{
int h;
cin>>h;
int i=search5(h);
if(i!=-1)
{
it5=v5.begin()+i;
m5.erase(m5.find(h));
v5.erase(it5);
}
}
void Manage::modifyBook()
{
int h;
cin>>h;
int i=search5(h);
int n;
cin>>n;
v5[i].setNum(n);
}
void Manage::dispBook()
{
for( it5=v5.begin();it5!=v5.end();++it5)
cout<<*it5;
}
void Manage::addUser()
{
User u;
int j;int i;
while(cin>>u)
{
if(u.getId()==-1)
break;
v4.push_back(u);
Person pp(u.getId(),u.getmima(),0);
pv.push_back(pp);
j=v4.size();
m4.insert(make_pair(u.getId(),j-1));
i=pv.size();
mu.insert(make_pair(u.getId(),i-1));
u.clear1();
}
}
int Manage::search4(int no)
{
mit4=m4.find(no);
if(mit4!=m4.end())
{
return mit4->second;
}
else
return -1;
}
void Manage::queryById()
{
int no;
cin>>no;
int i=search4(no);
if(i!=-1)
cout<<v4[i];
}
void Manage::deleteUser()
{
int no;
cin>>no;
int i=search4(no);
if(i!=-1)
{
it4=v4.begin()+i;
m4.erase(m4.find(no));
v4.erase(it4);
pt=pv.begin()+i+1;
mu.erase(mu.find(no));
pv.erase(pt);
}
}
void Manage::modifyUser()
{
int no;
cin>>no;
int i=search4(no);
int m;
cin>>m;
v4[i].setMax(m);
cout<<"您是否想修改密码,是请1,否请按0"<<endl;
int f;
cin>>f;
if(f==1)
{
string mima;cin>>mima;
v4[i].setmima(mima);
pv[i+1].setmima(mima);
}
}
void Manage::dispUser()
{
for( it4=v4.begin();it4!=v4.end();++it4)
cout<<*it4;
}
class Client:public queryBook //客户端(用户操作类)
{
User u;
Time t;
public:
Client(int id) //重要;必须带着形参;封装性良好;
{
load3();
load4(id);
}
~Client()
{
save3();
save4();
}
void load3();
void save3();
void load4(int id);
void save4();
void borrow(); //借书;
void back(); //还书;
void renew(); //续借;
};
void Client::save3() // 把向量的信息放回到文件里;
{
ofstream outfile("E:\\20171801Book.txt",ios::out);
if(!outfile)
{return ;}
for(it5=v5.begin();it5!=v5.end();it5++)
{
outfile<<*it5;
}
outfile.close();
}
void Client::load3()
{
Book b;
int i;
ifstream infile("E:\\20171801Book.txt",ios::in);
if(!infile)
{return;}
v5.clear();
m5.clear();
while(infile>>b)
{
if(b.getRnum()!=0)
for(int i=0;i<b.getRnum();i++)
{
Record r3;
infile>>r3;
b.addR1(r3);
}
v5.push_back(b);
int i=v5.size();
m5.insert(make_pair(b.getSh(),i-1));
b.clear1();
}
infile.close();
}
void Client::load4(int id) //从文件里读信息存到向量里;
{
User u1;
int i;
ifstream infile("E:\\20171801Stu.txt",ios::in);
if(!infile)
return;
while(infile>>u1)
{
if(u1.getRnum()!=0)
for(int i=0;i<u1.getRnum();i++)
{
Record r4;
infile>>r4;
u1.addR2(r4);
}
if(u1.getId()==id) //判断用户是否为同一人;
this->u=u1;
u1.clear1();
}
infile.close();
}
void Client::save4()
{
vector<User>v;
vector<User>::iterator it;
User u2;
ifstream infile("E:\\20171801Stu.txt",ios::in);
if(!infile)
return ;
while(infile>>u2) //将新数据再重新写回文件;
{
if(u2.getRnum()!=0)
for(int i=0;i<u2.getRnum();i++)
{
Record r5;
infile>>r5;
u2.addR2(r5);
}
if(u2==this->u)
u2=this->u;
v.push_back(u2);
u2.clear1();
}
infile.close();
ofstream outfile("E:\\20171801Stu.txt",ios::out);
if(!outfile)
return;
for(it=v.begin();it!=v.end();it++)
outfile<<*it;
outfile.close();
}
void Client::borrow()
{
int no;
int q,w,e;
int argc; char ** argv;
time_t temp;
struct tm *t;
time(&temp);
t= localtime(&temp);
q=t->tm_year+1900;
w=t->tm_mon+1;
e=t->tm_mday;
Time d(q,w,e); //系统自动获取当前借书时间;
int h;
cin>>h;
int a=search5(h);
u.pd(d);
if(u.getWj()==0&&u.getNow()<u.getMax())
{
v5[a].setJc(v5[a].getJc()+1);
v5[a].setRnum(v5[a].getRnum()+1); //借阅记录条数+1;
u.setNow(u.getNow()+1);
u.setRnum(u.getRnum()+1);
Record r(u.getId(),d,h);
v5[a].addRecord1(r);
u.addRecord2(r);
}
}
void Client::back()
{
int h;
cin>>h;
int a=search5(h);
v5[a].setJc(v5[a].getJc()-1);
u.setNow(u.getNow()-1);
v5[a].deleteRecord1(u.getId());
u.deleteRecord2(h);
}
void Client::renew()
{
int h;
cin>>h;
int a=search5(h);
v5[a].modify(u.getId());
u.modify(h);
}
class CheckIn //登陆类;
{
public:
int type;
CheckIn(){load();}
void load();
virtual void login()=0; //纯虚函数;
protected:
vector<Person>pv;
vector<Person>::iterator pt;
multimap<int,int> mu; //按照账号查询;
multimap<int,int>::iterator muit;
};
void CheckIn::load()
{
Person p;
ifstream infile("E:\\person.txt",ios::in);
if(!infile)
return;
pv.clear();
mu.clear();
int i=0;
while(infile>>p)
{
pv.push_back(p);
mu.insert(make_pair(p.getNO(),i));
i++;
}
infile.close();
}
class UserCheckin:public CheckIn //用户登陆类;
{
public:
void login()
{
int hao,flag;
string mima;
for(int i=0;i<3;i++)
{
cin>>hao>>mima;
if(mu.find(hao)!=mu.end())
{
multimap<int,int>::iterator mulow=mu.lower_bound(hao),muupp=mu.upper_bound(hao);
for(muit=mulow;muit!=muupp;muit++)
if(pv[muit->second].getPwd()==mima&&pv[muit->second].getType()==0)
{
cout<<"欢迎用户登陆"<<endl;
Client m(hao);
m.borrow();
// m.borrow();
m.back();
m.querybook();
m.renew();
flag=1;
break;
}
}
if(flag==1) break;
if(i>=3) cout<<"非法的账号或密码";
}
}
};
class AdminCheckIn:public CheckIn //管理员登陆类;
{
public:
void login()
{
int hao,flag;
string mima;
for(int i=0;i<3;i++) //3次登陆机会;
{
cin>>hao>>mima;
if(mu.find(hao)!=mu.end())
{
multimap<int,int>::iterator mulow=mu.lower_bound(hao),muupp=mu.upper_bound(hao);
for(muit=mulow;muit!=muupp;muit++)
if(pv[muit->second].getPwd()==mima&&pv[muit->second].getType()==1)
{
cout<<"欢迎管理员登陆"<<endl;
Manage mm; //执行管理员的功能;
// mm.addBook();
//mm.modifyBook();
mm.deleteBook();
mm.querybook();
mm.querybook();
/*mm.addUser();
mm.modifyUser();
mm.deleteUser();
mm.queryById();*/
flag=1;
break;
}
}
if(flag==1) break;
if(i>=3) cout<<"非法的账号或密码";
}
}
};
int main()
{
int a;
cout<<"如果管理员登陆请输1,用户登陆请输0"<<endl;
cin>>a;
if(a==1)
{
AdminCheckIn a;
a.login();
}
if(a==0)
{
UserCheckin u;
u.login();
}
}
设计体会与小结
(一)设计遇到的问题及解决方法和需要注意的地方
ü 文件读取不成功——保证文件输入和输出的格式保持一致,只有当两者相同时,程序在读或写文件时才能够匹配到并做出相应的提取。格式中用到空格和换行不会有太大的问题,当在输入输出时想加入一些符号例如“/”或者“:”时可以补上一个char c(辅助格式)。
ü 文件读取方面还要注意:及时清空数据,避免出错。
ü 要注意前后数据的类型保持一致,函数的返回类型要仔细,避免犯些小的错误。
ü 在表示借阅记录时用到了state这个变量,可以很好的标记书目前的借阅状态。因此可以在程序中学会去使用这种思想。
ü 学习使用让程序增加时间的表达方式(重载+运算符,或者在构造函数中补充)。
ü 多多学习一些小技巧,使程序更加简洁。
ü 对于客户端一定要考虑好并且处理好封装性。
(二)收获
ü 进一步的理解了类的相关知识,能够更加从容的使用类。
ü 通过这个程序对继承和多态有了更深的理解,明白了在程序中怎样去思考什么时候该使用继承,如何运用继承,对多态也有了初步的理解。
ü 更进一步的知道了文件的读取方面的运用及一些注意事项。
ü 学习到了怎样从系统调用当前时间的程序,使程序更加符合实际。
ü 一定要注意在设计一个系统的时候,先要生成思路,思路很重要,先把思路理清之后,再着手写程序,在写的过程中不要太心急,不要想一次性的把所有功能都实现,要一点点的写,不断在写的过程中去增加新的功能,不断补充,还要去大胆尝试,不要怕写错,特别注意一些平常的小细节。
(三)体会总结
通过做这次的图书管理系统,我收获了很多。从一开始的毫无头绪到现在的能够理清思路,能够明白怎样去修改代码,能够想办法将我的新的创意融入到我的系统中去,我觉得真的进步了很多。但是在这个过程中注定不是一帆风顺的,我遇到了很多问题,总有一种刚修改完一个错误,接着就会冒出来另一个错误的感觉,但是每当错误被解决掉的时候,那种开心感真的很棒。在这个不断改进的过程中我初步学会了如何去设计一个程序,如何想方法去缩短代码量,去努力做到自己能够独立看懂下面的错误提示,去尝试修改错误,去不断更新自己的知识,去与同学交流思想,碰撞火花,不断去完善自己的代码。尽管这个程序可能没有做到将所有的功能都涵盖进去,可能没有那些大佬们做的那么完美,我知道自己还欠缺很多,所以在接下来的学习过程中,我会更加努力,努力去让自己的代码变得完美,也成为我像成为的模样。