最近几周在制作图书馆简易系统时,实现了最基本的几个功能,包括增加学生和图书的操作、借书和还书的功能。编写代码时必然会遇到诸多的问题。而反思和问题的解决比草率地写代码更重要。以下借助代码来总结一下心得。
时间类及其重载输出和输入运载符。
class Time
{}
数据类及其重载输入和输出运算符
class Record
{
string name;
int no;
int id;
int major;
int classes;
int nowBorrows;
int breaks;
string type;
Time start;
Time end;
bool either;
Time changeEnd;
public:
Record(int no1,int id1,string type1,Time start1,Time end1):no(no1),id(id1),type(type1),start(start1),end(end1){changeEnd=end;};
Record(){changeEnd=end;}
Time getStart(){return start;};
Time getEnd(){return changeEnd;};
Time setChange(Time t){changeEnd=t;}
int getNo(){return no;};
int getId(){return id;};
string getType(){return type;};
string getName(){return name;};
friend ostream&operator<<(ostream&os,const Record&r);
friend istream&operator>>(istream&in,Record&r);
};
istream&operator>>(istream&in,Record&r)
{
in>>r.no;
if(r.no==0)return in;
in>>r.id;
in>>r.type;
in>>r.start;
in>>r.end;
r.changeEnd=r.end;
return in;
}
ostream&operator<<(ostream&os,const Record&r)
{
os<
}本类中包含书籍和学生的部分信息
书籍类及其重载输入输出运算符
class Book
{
string name;
string writer;
string press;
int no;
int number;
int borrow;
int left;
vector
int num;
public:
Book(string name1,int no1,string press1,int number1,int num1):name(name1),no(no1),press(press1),number(number1),num(num1){}
~Book(){r.clear();}
Book(){number=0;borrow=0;num=0;}
string getName(){return name;};
string getPress(){return press;};
Record getRecord(int i){return r[i];};
void addBorrowsJ(int n){borrow+=n;}
void addBorrowsH(int n){borrow-=n;};
int getNo(){return no;};
int getNum(){return num;};
void setNum(int i){num+=i;};
void addRecord(Record rr){num++;r.push_back(rr);};
int getNowNumber(){return (number-borrow);}
int getNumber(){return number;};
int getBorrows(){return borrow;};
int getLeft(){return left;};
vector
friend ostream&operator<<(ostream&os,const Book&b);
friend istream&operator>>(istream&in,Book&b);
void de(){r.clear();}
};
istream&operator>>(istream&in,Book&b)
{
in>>b.name;
if(b.name=="E")return in;
in>>b.no>>b.writer>>b.press>>b.number>>b.num;
for(int i=0;i
Record rr;
in>>rr;
b.r.push_back(rr);
}
return in;
}
ostream&operator<<(ostream&os,const Book&b)
{
os<
os<
return os;
}
本类中提供书的信息和提供这本书一些人借阅记录查阅以及为下面操作做铺垫。
用户学生类
class User
{
string name;
string major;
string classes;
int id;
int num;
int borrows;
int nowBorrows;
int canReborrow;
bool breaks;
vector
multimap
multimap
vector
vector
multimap
multimap
public:
User()
{borrows=10;breaks=0;nowBorrows=0;canReborrow=1;num=0;}
~User(){b.clear();r.clear();m1.clear();}
int getNowBorrows(){return nowBorrows;};
int getNowReborrow(){return canReborrow;};
int getBreaks(){return breaks;};
int getId(){return id;}
string getName(){return name;}
void addBreaks(int m){breaks+=m;};
void addNowBorrowsJ(int m){nowBorrows+=m;};
void addNowBorrowsH(int m){nowBorrows-=m;};
void addRecord(Record rr){num++;r.push_back(rr);}
void show();
void queryTime(Time t);
void changeTime(int no,Time t);
void queryNow();
Time search1(int no);
friend istream&operator>>(istream&in,User &u);
friend ostream&operator<<(ostream&os,User &u);
void operator=(User u);
bool operator==(User u);
vector
vector
void de1(){r.clear();}
void de2(){b.clear();}
};
Time User::search1(int no)
{
for(it=r.begin();it!=r.end();it++)
{
if(it->getId()==no)
return it->getEnd();
}
}
bool User::operator==(User u)
{
return this->id==u.getId()?1:0;
}
void User::operator=(User u)
{
id=u.id;
name=u.name;
major=u.major;
classes=u.classes;
nowBorrows=u.nowBorrows;
breaks=u.breaks;
num=u.num;
r=u.getRecord();
}
void User::show()
{
for(it=r.begin();it!=r.end();it++)
{
cout<<*it;
}
}
istream&operator>>(istream&in,User &u)
{
in>>u.id;
if(u.id==0)return in;
in>>u.name>>u.major>>u.classes>>u.nowBorrows>>u.breaks>>u.num;
for(int i=0;i
Record rr;
in>>rr;
u.r.push_back(rr);
}
return in;
}
ostream&operator<<(ostream&os,User&u)
{
os<
os<
}
在本类,提供大多数数据,包含一部分小函数。
操作类
class Operate
{
vector
vector
multimap
multimap
User u;
public:
Operate(int id)
{
load1();
load2(id);
}
~Operate()
{
load1p();
load2p();
u.getRecord().clear();
u.getBook().clear();
b.clear();
b1.clear();
}
void load1();
void load2(int id);
void load1p();
void load2p();
void borrowBook();
void returnBook();
};
void Operate::borrowBook()
{
int no;
Time t1,t2;
cin>>no>>t1>>t2;
b1p=b1.find(no);
if(u.getBreaks()>=3||u.getNowBorrows()>10||b[b1p->second].getNowNumber()<=0)
{
return;
}
Record r(no,u.getId(),"jieshu",t1,t2);
u.addRecord(r);
b[b1p->second].addRecord(r);
u.addNowBorrowsJ(1);
b[b1p->second].addBorrowsJ(1);
}
void Operate::returnBook()
{
int no;
Time t1,t2;
cin>>no>>t1>>t2;
b1p=b1.find(no);
if(u.search1(no)
u.addBreaks(1);
}
Record r(no,u.getId(),"huanshu",t1,t2);
u.addRecord(r);
b[b1p->second].addRecord(r);
u.addNowBorrowsH(1);
b[b1p->second].addBorrowsH(1);
}
void Operate::load1p()
{
ofstream outfileB("e:\\20171769book.txt",ios::out);
if(!outfileB)
return;
for(it1=b.begin();it1!=b.end();it1++)
{
outfileB<<*it1;
}
outfileB.close();
}
void Operate::load2p()
{
vector
vector
User u1;
ifstream infile("e:\\20171769stu.txt",ios::in);
if(!infile)
return ;
while(infile>>u1)
{
if(u1==this->u)
{
u1=this->u;
}
v1.push_back(u1);
u1.de1();
u1.de2();
}
infile.close();
ofstream outfile("e:\\20171769stu.txt",ios::out);
if(!outfile)
return;
for(it=v1.begin();it!=v1.end();it++)
outfile<<*it;
outfile.close();
}
void Operate::load1()
{
int i;
Book bb;
ifstream infile("e:\\20171769book.txt",ios::in);
if(!infile)
return;
b.clear();
b1.clear();
i=0;
while(infile>>bb)
{
b.push_back(bb);
b1.insert(make_pair(bb.getNo(),i));
bb.de();
i++;
}
infile.close();
}
void Operate::load2(int id)
{
User uu;
int i;
ifstream infile("e:\\20171769stu.txt",ios::in);
if(!infile)
return;
while(infile>>uu)
{
if(uu.getId()==id)
{
u=uu;
break;
}
else
{
uu.de1();
uu.de2();
}
}
infile.close();
}
本类中,实现借书和还书的功能。
void load1()的目的是把文件中的数据读到vector里。 void load1p()是析构函数。 infile.close()先把新的vector构建出来,在文件中替换这个学生的信息,再把这组数据写到文件中。
管理员类
class Adm
{
vector
vector
multimap
multimap
vector
vector
multimap
multimap
public:
Adm()
{
load1();
load2();
}
~Adm()
{
load1p();
load2p();
}
void load1();
void load2();
void load1p();
void load2p();
void addUser();
void addBook();
};
void Adm::load1p()
{
ofstream outfileB("e:\\20171769book.txt",ios::out);
if(!outfileB)
return;
for(it1=b.begin();it1!=b.end();it1++)
{
outfileB<<*it1;
}
outfileB.close();
}
void Adm::load2p()
{
ofstream outfileS("e:\\20171769stu.txt",ios::out);
if(!outfileS)
return;
for(it=u.begin();it!=u.end();it++)
{
outfileS<<*it;
}
outfileS.close();
}
void Adm::addUser()
{
User uu;
while(cin>>uu)
{
if(uu.getId()==0)break;
u.push_back(uu);
}
};
void Adm::addBook()
{
Book bb;
while(cin>>bb)
{
if(bb.getName()=="E")break;
b.push_back(bb);
}
}
void Adm::load1()
{
int i;
Book bb;
ifstream infile("e:\\20171769book.txt",ios::in);
if(!infile)
return;
b.clear();
b1.clear();
i=0;
while(infile>>bb)
{
b.push_back(bb);
b1.insert(make_pair(bb.getNo(),i));
i++;
}
infile.close();
}
void Adm::load2()
{
int i;
User uu;
ifstream infile("e:\\20171769stu.txt",ios::in);
if(!infile)
return;
u.clear();
u1.clear();
i=0;
while(infile>>uu)
{
u.push_back(uu);
u1.insert(make_pair(uu.getId(),i));
i++;
}
infile.close();
}
本类中,有增加书籍和学生的功能。
主函数
int main()
{
int id;
cin>>id;
//Operate o(id);
//o.borrowBook();
//o.returnBook();
//Adm a;
//a.addUser();
//a.addBook();
return 0;
}
这个简易系统使用STL,使程序变得简单。若再使用继承相关,可以简化程序。由于书籍和学生类都包含数据,所以可以在此基础上,让书籍和学生类继承数据类。
由于之前未使用过STL,在编写代码时会遇到很多错误,此时我会反复查阅资料、询问同学,直到可以调通程序,过程虽然可能很艰难,但成功后很有成就感,从而给我更多继续写程序的动力。知识是死的,如何运用才是活的,只记住知识是没用的,因此在今后学习任何编程语言以及编程的路上必定是学习知识和实践相结合,才能更好地学会编程。