图书管理系统总结
做了很久也只能做出一个很简单的系统,只能实现最基本的几个功能,其中利用了面向对象的方法以及C++的编程思想来完成系统的设计。我认为,比较重要的方面有两个部分。第一,了解编译器的特性,熟悉调试方法。这意味着,在今后的开发中,你有独立的解决bug的能力,当然,前提是你了解基础语法。第二,了解代码的组织结构和逻辑关系,是我们永不止步的源泉。
具体,我认为重要的有一下几个部分:
1、了解C++/C的基本数据结构,同时如何自定义数据结构;
2、了解C++类的定义与功能实现(比如:登录,登出,注册,添加书本等等),什么是构造函数,什么是析构函 数、操作符重载;
3、如何实现默认参数传递,什么是用户接口统一;
4、文件I\o输入输出流,个人觉得不好理解也很难记住
5、了解部分windows编程控制台、消息、句柄等逻辑关系;
一:问题描述:
在图书管理系统中,要为每个借阅者建立一个账户,账户中存储借阅者的个人信息、借阅信息以及预定信息。持有借阅卡的借阅者可以借阅书刊、返还书刊、查询书刊信息,但这些操作都是通过图书管理员进行的,也即借阅者不直接与系统交互,而是图书管理员充当借阅者的代理与系统交互。在借阅书刊时,需要输入所借阅的书刊名,书刊的ISBN/ISSN号,然后输入借阅者的图书卡号和借阅者名,系统验证借阅者是否有效(在系统中存在账户),若有效,借阅请求被接受,系统查询数据库系统,看借阅者所借阅的书刊是否存在,若存在,则借阅者可借出书刊,建立并在系统中存储借阅记录。借阅者还书后,删除关于所还书刊的借阅记录。如果借阅者所借的书刊已被借出,借阅者还可预定该书刊,一旦借阅者预定的书刊可以获得,就将书刊直接寄给预定人(为了简化系统,预定书刊可获得时就不通知借阅者了)。另外,为了简化系统,也不考虑书刊的最长借阅期限,假设借阅者可以无限期地保存所借阅的书刊。
二:系统功能分析:
系统通过调用函数来实现删除图书、读者信息,添加图书、读者信息等功能。delbook( )函数用于删除图书信息;
addbook( )函数用于增加图书信息;
borrowbook( )函数用于实现借书操作;
backbook( )函数用于实现还书操作等等;
主函数用于掉用这些函数
三:详细分析:
读者类的设计:该类定义了借书操作,还书操作,设置读者姓名等功能;
读者库类的设计:该类实现了建立读者的个人资料,删除读者信息,输出读者信息等功能;
图书类的设计:可以实现对图书的描述,图书的编号,书名,借出,还入等操作;
图书库类的设计:增删查改;
四:代码
#include<bits/stdc++.h>
#include <iostream>
#include <iomanip>
#include <string.h>
#include <fstream>
using namespace std;
const int Maxr=1000;
const int Maxb=1000;
const int Maxbor=10;
class Time
{
private:
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 set_year(int y)
{
year=y;
}
void set_month(int m)
{
month=m;
}
void set_day(int d)
{
day=d;
}
int get_year()
{
return year;
}
int get_month()
{
return month;
}
int get_day()
{
return day;
}
bool operator<(const Time&obj)const
{
return year!=obj.year?year<obj.year:month!=obj.month?month<obj.month:day<obj.day;
}
friend istream&operator>>(istream&is,Time&obj);
friend ostream&operator<<(ostream&os,Time&obj);
};
ostream&operator<<(ostream&os,Time&obj)
{
os<<obj.year<<":";
os<<obj.month<<":";
os<<obj.day;
return os;
}
istream&operator>>(istream&is,Time&obj)
{
is>>obj.year>>obj.month>>obj.day;
return is;
}
class Record
{
private:
string bookName;//书名
int bookindex;
string stuName;
string type;//操作类型
int stuID;
Time startTime;//借书时间
Time endTime;//还书时间
bool ifback;//是否归还
public:
Record()
{
ifback=0;
}
Record(string bn,int b,string s1,int s2,string ty,Time start,Time end,bool f )
{
bookName=bn;
bookindex=b;
stuName=s1;
stuID=s2;
type=ty;
startTime=start;
endTime=end;
ifback=f;
}
string get_bookName()
{
return bookName;
}
int get_index()
{
return bookindex;
}
string get_stuName()
{
return stuName;
}
int get_ID()
{
return stuID;
}
Time get_startTime()
{
return startTime;
}
Time get_endTime()
{
return endTime;
}
bool get_ifback()
{
return ifback;
}
string get_type()
{
return type;
}
void set_type(string ty)
{
type =ty;
}
void set_stuName(string x)
{
stuName=x;
}
void set_index(int b)
{
bookindex=b;
}
void set_endTime(Time x)
{
endTime=x;
}
void set_bookName(string bn)
{
bookName=bn;
}
void set_startTime(Time t)
{
startTime=t;
}
void set_ID(int x)
{
stuID=x;
}
void set_ifback(bool f)
{
ifback=f;
}
friend ostream&operator<<(ostream&out,Record&obj);
friend istream&operator>>(istream&in,Record&obj);
};
istream&operator>>(istream&in,Record&obj)
{
in>>obj.bookindex;
in>>obj.bookName;
in>>obj.stuName;
in>>obj.stuID;
in>>obj.type;
in>>obj.startTime;
in>>obj.endTime;
in>>obj.ifback;
return in;
}
ostream&operator<<(ostream&out,Record&obj)
{
out<<obj.bookindex<<" ";
out<<obj.bookName<<" ";
out<<obj.stuName<<" ";
out<<obj.stuID<<" ";
out<<obj.type<<" ";
out<<obj.startTime<<" ";
out<<obj.endTime<<" ";
out<<obj.ifback<<" ";
return out;
}
class Records
{
protected:
int RecordNum;
vector<Record>v1;
vector<Record>::iterator vit1;
multimap<bool,int>m2;
multimap<bool,int>::iterator mit2;//是否归还bool;
public:
Records()
{
RecordNum=0;
}
int get_RecordNum()
{
return RecordNum;
}
vector<Record> &get_Record()
{
return v1;
}
multimap<bool,int>&get_m2()
{
return m2;
}
void set_RecordNum(int x)
{
RecordNum=x;
}
void disAllRecord();//所有记录
void disNobackRecord();//显示未还书记录//////////////////////////////////////////////
};
void Records::disAllRecord()
{
for(int i=0;i<v1.size();++i)
cout<<v1[i]<<endl;
}
void Records::disNobackRecord()
{
if(m2.find(0)!=m2.end())
for(mit2=m2.lower_bound(0);mit2!=m2.upper_bound(0);++mit2)
cout<<v1[mit2->second]<<endl;
else
cout<<"no records!"<<endl;
}
class Book:public Records
{
private:
string name;
int index;//是否在架
int tot;//总册数
int shengyu;//剩余册数
char ch;//辅助格式
multimap<int,int>m1;
multimap<int,int>::iterator mit1;//学号
public:
Book(int in,string nam,int tott,int sy)
{
name=nam;
index=in;
tot=tott;
shengyu=sy;
ch='/';
}
Book()
{
ch='/';
}
multimap<int,int>&get_m1()
{
return m1;
}
string get_name()
{
return name;
}
int get_index()
{
return index;
}
int get_shengyu()
{
return shengyu;
}
int get_tot()
{
return tot;
}
void set_tot(int x)
{ tot=x;
}
void set_shengyu(int sy)
{
shengyu=sy;
}
void set_endTime(int);
void set_index(int in)
{
index=in;
};
void deleteRecord(int id,Time perTime)//还书时标记结束记录
{
for(mit1=m1.lower_bound(id);mit1!=m1.upper_bound(id);++mit1)
{
if(v1[mit1->second].get_ifback()==0)
{
v1[mit1->second].set_ifback(1);
v1[mit1->second].set_endTime(perTime);
}
}
}
void addRecord(Record r)//增加一条记录
{
RecordNum++;
v1.push_back(r);
m2.insert(make_pair(r.get_ifback(),v1.size()-1));
m1.insert(make_pair(r.get_ID(),v1.size()-1));
}
friend istream&operator>>(istream&is,Book&obj);
friend ostream&operator<<(ostream&os,Book&obj);
void disBase()
{
cout<<index<<" "<<name<<" "<<shengyu<<" "<<ch<<" "<<tot;
}
};
void Book::set_endTime(int id)
{
Time tt;
for (mit1=m1.lower_bound(id);mit1!=m1.upper_bound(id);++mit1)
{
if(v1[mit1->second].get_ifback()==0)
{
tt=v1[mit1->second].get_startTime();
tt.set_month(tt.get_month()+2);
v1[mit1->second].set_endTime(tt);
}
}
}
ostream&operator<<(ostream&os,Book&obj)
{
os<<obj.index<<" "<<obj.name<<" "<<obj.shengyu<<" "<<obj.ch<<" "<<obj.tot<<" "<<obj.RecordNum<<endl;
if(obj.get_RecordNum())
{
vector<Record>vt;
vt=obj.get_Record();
for(int j=0;j<vt.size();++j)
os<<vt[j]<<endl;}
return os;
}
istream&operator>>(istream&is,Book&obj)
{
is>>obj.index>>obj.name>>obj.shengyu>>obj.ch>>obj.tot>>obj.RecordNum;
int p=obj.RecordNum;
obj.set_RecordNum(0);
for(int i=1;i<=p;++i)
{
Record r;
is>>r;
obj.addRecord(r);
}
return is;
}
class Student:public Records
{
private:
int ID;//学号
string name;//姓名
int num;//剩余借阅量
multimap<int,int>m1;
multimap<int,int>::iterator mit1;//书号int
public:
Student(string n,int id)
{
name=n;
ID=id;
num=10;
}
Student()
{
num=10;
}
multimap<int,int>&get_m1()
{
return m1;
}
int get_ID()
{
return ID;
}
string get_name()
{
return name;
}
int get_num()
{
return num;
}
void set_name(string n)
{
name=n;
}
void set_num(int x)
{
num=x;
}
void setID(int x)
{
ID=x;
}
void deleteRecord(int index,Time perTime)
{
for(mit1=m1.lower_bound(index);mit1!=m1.upper_bound(index);++mit1)
{
if(v1[mit1->second].get_ifback()==0)
{
v1[mit1->second].set_ifback(1);
v1[mit1->second].set_endTime(perTime);
}
}
}
void set_endTime(int index)
{
Time tt;
for(mit1=m1.lower_bound(index);mit1!=m1.upper_bound(index);++mit1)
{
if(v1[mit1->second].get_ifback()==0)
{
tt=v1[mit1->second].get_startTime();
tt.set_month(tt.get_month()+2);
v1[mit1->second].set_endTime(tt);
}
}
}
void addRecord(Record r)//增加一条记录
{
RecordNum++;
v1.push_back(r);
m2.insert(make_pair(r.get_ifback(),v1.size()-1));
m1.insert(make_pair(r.get_index(),v1.size()-1));
}
bool queryTLE(Time);
void disBase()
{
cout<<name<<" ";
cout<<ID<<" ";
cout<<num;
}
friend istream&operator>>(istream&is,Student&obj);
friend ostream&operator<<(ostream&os,Student&obj);
};
istream &operator>>(istream &is,Student &obj)
{
is>>obj.name>>obj.ID>>obj.num>>obj.RecordNum;
int p=obj.get_RecordNum();
obj.set_RecordNum(0);
for(int i=1;i<=p;++i)
{
Record r;
is>>r;
obj.addRecord(r);
}
return is;
}
ostream &operator<<(ostream&os,Student&obj)
{
os<<obj.name<<" ";
os<<obj.ID<<" ";
os<<obj.num<<" ";
os<<obj.RecordNum<<endl;
if(obj.get_RecordNum())
{
vector<Record> vt;
vt=obj.get_Record();
for(int j=0;j<vt.size();++j)
os<<vt[j]<<endl;
}
return os;
}
bool Student::queryTLE(Time tt)
{
Time temp;
for(mit2=m2.lower_bound(0);mit2!=m2.upper_bound(0);++mit2)
{
temp=v1[mit2->second].get_endTime();
if(temp<tt)
return 1;
}
return 0;
}
class MangerOp
{
private:
int stuNum;//用户总数
int bookNum;//书种数
vector<Student>v1;
vector<Student>::iterator vit1;
map<int,int>m1;
map<int,int>::iterator mit1;
vector<Book>v2;
vector<Book>::iterator vit2;
map<int,int>m2;
map<int,int>::iterator mit2;
map<string,int>m3;
map<string,int>::iterator mit3;
public:
MangerOp()
{
stuNum=0;
bookNum=0;
v2.clear();
m2.clear();
m3.clear();
load1();
load2();
}
~MangerOp()
{save1();
save2();
}
void deletebook();
void queryStuNoback();
void load1();
void load2();
void save1();
void save2();
void addBook();
void addStu();
void deleteBook();
void deleteStu();
void queryStuAll();//查询某学生所有记录
void quetyStuNoback();//未还书记录
void queryBookAllRecord();
void queryBookNoback();
void queryABook();//某本书信息
void queryAStu();//某用户信息
};
void MangerOp::load1()
{
ifstream infile("20171809book.txt",ios::in);
if(!infile)
return;
v2.clear();
m2.clear();
m3.clear();
Book b;
int i=0;
while(infile>>b)
{
bookNum++;
v2.push_back(b);
m2.insert(make_pair(b.get_index(),i));
m3.insert(make_pair(b.get_name(),i));
i++;
vector<Record>&vt=b.get_Record();
multimap<bool,int>&m2=b.get_m2();
multimap<int,int>&m1=b.get_m1();
vt.clear();
m1.clear();
m2.clear();
m3.clear();
}
bookNum=i;
infile.close();
cout<<"books load success!"<<endl;
}
void MangerOp::load2()
{
ifstream infile("20171809stu.txt",ios::in);
if(!infile)
return;
v1.clear();
m1.clear();
Student s;
int i=0;
while(infile>>s)
{
v1.push_back(s);
m1.insert(make_pair(s.get_ID(),i));
i++;
vector<Record>&vt=s.get_Record();
multimap<bool,int>&m2=s.get_m2();
multimap<int,int>&m1=s.get_m1();
vt.clear();
m1.clear();
m2.clear();
m3.clear();
}
stuNum=i;
infile.close();
cout<<"students load success!"<<endl;
}
void MangerOp::save1()
{
ofstream outfile("g:\\20171809book.txt",ios::out);
if(!outfile)
return ;
for(int i=0;i<bookNum;++i)
{
outfile<<v2[i];
}
outfile.close();
}
void MangerOp::save2()
{
ofstream outfile("g:\\20171809stu.txt",ios::out);
if(!outfile)
return ;
for(int i=0;i<stuNum;++i)
{
outfile<<v1[i];
}
outfile.close();
}
void MangerOp::queryAStu()
{
int id;
cin>>id;
mit1=m1.find(id);
if(mit1!=m1.end())
{
cout<<v1[m1[id]];
}
}
void MangerOp::queryABook()
{
int index;
cin>>index;
//mit2=m2.find(index);
if(mit2!=m2.end())
cout<<v2[m1[index]];
}
void MangerOp::addBook()
{
string name;
int index;
int n;
while(cin>>index&&index!=-1)
{
cin>>name>>n;//输入书号,书名,数量
//mit2=m2.find(index);
if(mit2!=m2.end())
{
v2[mit2->second].set_tot(v2[mit2->second].get_tot()+n);
v2[mit2->second].set_shengyu(v2[mit2->second].get_shengyu()+n);
}
else
{
v2.push_back(Book(index,name,n,n));
m2.insert(make_pair(index,v2.size()-1));
m3.insert(make_pair(name,v2.size()-1));
bookNum++;
}
}
}
void MangerOp::addStu()
{
int id;
string name;
while(cin>>id&&id!=-1)
{
cin>>name;
mit1=m1.find(id);
if(mit1==m1.end())
{
stuNum++;
v1.push_back(Student(name,id));
m1.insert(make_pair(id,v1.size()-1));
}
}
}
void MangerOp::deletebook()
{
int index,num;
cin>>index>>num;
mit2=m2.find(index);
int i=mit2->second;
if(mit2!=m2.end())
{
if(num==v2[i].get_shengyu()&&num==v2[i].get_tot())
{
bookNum--;
v2.erase(v2.begin()+i);
m2.erase(index);
m3.erase(v2[i].get_name());
}
else
if(num<=v2[i].get_shengyu())
{
v2[i].set_shengyu(v2[i].get_shengyu()-num);
v2[i].set_tot(v2[i].get_tot()-num);
}
}
}
void MangerOp::deleteStu()
{
int id;
cin>>id;
mit1=m1.find(id);
if(mit1!=m1.end())
{
stuNum--;
m1.erase(id);
v1.erase(v1.begin()+(mit1->second));
}
}
void MangerOp::queryBookAllRecord()
{
int index;
cin>>index;
mit2=m2.find(index);
if(mit2!=m2.end())
{
v2[mit2->second].disAllRecord();
}
}
void MangerOp::queryBookNoback()
{
int index;
cin>>index;
mit2=m2.find(index);
if(mit2!=m2.end())
{
v2[mit2->second].disNobackRecord();
}
}
void MangerOp::queryStuAll()
{
int id;
cin>>id;
mit1=m1.find(id);
if(mit1!=m1.end());
{
v1[mit1->second].disAllRecord();
}
}
void MangerOp::queryStuNoback()
{
int id;
cin>>id;
mit1=m1.find(id);
if(mit1!=m1.end())
{
v1[mit1->second].disNobackRecord();
}
}
class StuOp
{
private:
Student stu;
int id;
Time t1;
vector<Book>v1;
vector<Book>::iterator vit1;
map<int,int>m1;
map<int,int>::iterator mit1;
public:
StuOp(int ID,Time t):id(ID),t1(t)
{
load1();
load2();
}
~StuOp()
{
save1();
save2();
}
void load1();
void load2();
void save1();
void save2();
void borrow();
void back();
void againBorrow();//续借
void disAllRecord();//该生所有记录
void disNobackRecord();//未还书记录
void queryABook();
void disAllBook();
};
void StuOp::load1()
{
ifstream infile("20171809book.txt",ios::in);
if(!infile)
return;
v1.clear();
Book b;
int k=0;
while(infile>>b)
{
v1.push_back(b);
m1.insert(make_pair(b.get_index(),k));
k++;
vector<Record>&vt=b.get_Record();
multimap<bool,int>&m2=b.get_m2();
multimap<int,int>&m1=b.get_m1();
vt.clear();
m1.clear();
m2.clear();
m1.clear();////////////////////////////////////////////////////
}
infile.close();
cout<<"books load success!"<<endl;
}
void StuOp::load2()
{
bool flag=0;
ifstream infile("20171809stu.txt",ios::in);
if(!infile)
return;
Student s;
while(infile>>s)
{
if(s.get_ID()==id)
{
stu=s;
stu.disBase();
cout<<"... ...landing success!"<<endl;
flag=1;
break;
}
vector<Record>&vt=s.get_Record();
multimap<bool,int>&m2=s.get_m2();
multimap<int,int>&m1=s.get_m1();
vt.clear();
m1.clear();
m2.clear();
}
if(!flag)
cout<<"id wrong!"<<endl;
}
void StuOp::save1()
{
ofstream outfile("20171809stu.txt",ios::out);
if(!outfile)
return;
for(int i=0;i<v1.size();++i)
{
outfile<<v1[i];
}
outfile.close();
}
void StuOp::save2()
{
ifstream infile("20171809stu.txt",ios::in);
if(!infile)
return;
vector<Student>v3;
vector<Student>::iterator vit3;
int k=0;
Student s;
while(infile>>s)
{
v3.push_back(s);
k++;
vector<Record>&vt=s.get_Record();
multimap<bool,int>&m2=s.get_m2();
multimap<int,int>&m1=s.get_m1();
vt.clear();
m1.clear();
m2.clear();
}
infile.close();
ofstream outfile("20171809stu.txt",ios::out);
if(!infile)
return;
for(int i=0;i<v3.size();++i)
{
if(v3[i].get_ID()==stu.get_ID())
{
outfile<<stu;
}
else
{
outfile<<v3[i];
}
}
outfile.close();
}
void StuOp::disAllBook()
{
cout<<"disAllBook : "<<endl;
for(mit1=m1.begin();mit1!=m1.end();++mit1)
{
v1[mit1->second].disBase();
cout<<endl;
}
}
void StuOp::queryABook()
{
int index;
cin>>index;
mit1=m1.find(index);
if(mit1!=m1.end())
cout<<v1[m1[index]];
}
void StuOp::disAllRecord()
{
stu.disAllRecord();
}
void StuOp::disNobackRecord()
{
stu.disNobackRecord();
}
void StuOp::borrow()
{
int index;
cin>>index;
mit1=m1.find(index);
if(mit1==m1.end())
cout<<"book fail!"<<endl;
else
{
Time t2;
t2=t1;
t2.set_month(t1.get_month()+1);
if(stu.get_num()<1||v1[m1[index]].get_shengyu()<1)
cout<<"num fail!"<<endl;
if(stu.queryTLE(t1))
cout<<"TLE fail!"<<endl;
else
{
Record rr(v1[m1[index]].get_name(),index,stu.get_name(),stu.get_ID(),"jieshu",t1,t2,0);
stu.addRecord(rr);
v1[m1[index]].addRecord(rr);
v1[mit1->second].set_shengyu(v1[m1[index]].get_shengyu()-1);
stu.set_num(stu.get_num()-1);
cout<<"borrow succss!"<<endl;
}
}
}
void StuOp::back()
{
int index;
cin>>index;
mit1=m1.find(index);
if(mit1!=m1.end())
{
Record r(v1[m1[index]].get_name(),index,stu.get_name(),stu.get_ID(),"huanshu",t1,t1,1);
stu.addRecord(r);
v1[mit1->second].addRecord(r);
stu.set_num(stu.get_num()+1);
v1[mit1->second].deleteRecord(stu.get_ID(),t1);
cout<<"back succss!"<<endl;
}
else
cout<<"query fail!"<<endl;
}
void StuOp::againBorrow()
{
int index;
cin>>index;
mit1=m1.find(index);
if(mit1!=m1.end())
{
Record r(v1[m1[index]].get_name(),index,stu.get_name(),stu.get_ID(),"xvjie",t1,t1,1);
v1[mit1->second].addRecord(r);
stu.addRecord(r);
stu.set_endTime(index);
v1[mit1->second].set_endTime(stu.get_ID());
cout<<"againBorrow success!"<<endl;
}
}
int main()
{
// MangerOp man;
//man.deleteBook();
// man.deleteStu();
int id;
Time t;
cin>>id>>t;
StuOp(id,t);
// stu.disAllBook();
//stu.borrow();
//stu.back();
// stu.againBorrow();
//*/
return 0;
}
设计体会与小结:
图书馆管理系统是我做的第一个管理系统,持续了两个多月,修改了好多次,到现在还是处在修改完善的状态,这个过程很辛苦,但也说实话收获并不是很大。在这个过程里,我遇到的第一个障碍应该是文件的读取,我一开始对重载输入输出流的定义不当,导致文件读取的内容不对,看了好久课本和老师的模板才改过来,但是还是搞不大懂。这个程序写出来也是全都是错误,只能一点点照着模板改。模板运用了继承和多态,我对这个新知识不是很懂,就只能照着葫芦画瓢,这一部分还需要进一步的研究。通过这个系统,我觉得能把只是记住是很重要的,不能只依靠模板,同时我明白了一个道理,考虑问题一定要考虑周全,这个系统做的并不好,一度让我很绝望,但是我并不想放弃,总想尝试一下自己修改,即使会错误百出,我也会继续努力。