12306最重要的功能就是实现购票,退票,改签三大功能,这些属于乘客要实现的功能。购票,就像我们平时乘车买票,需要规范输入自己的姓名,手机号,还有身份证号,然后调取数据判读信誉度是否可以买票。退票查找到个人的狗牌记录然后删除。改签其实就是先退票后购票,然后稍微改动一下。

管理员需要实现对站点的增加,两个站之间增加一个站点,输入站点的名称,经过的车次号,到站时间,出站时间,在这个站点放多少票。删除站点就把次站点的所有信息删除。修改站点,我是先把站点的所有信息删除然后再添加新的站点信息。增加乘客信息,需要添加乘客的姓名,手机号,身份证号,还有信誉度,信誉度不足的乘客是不允许乘车的,管理乘客功能主要就是对乘客的信誉度进行管理,如果该乘客做了违法乱纪的事情,就把他的信誉度变为0,不可乘车买票。               接下来就是查询功能,查询的话要根据车次号来查询把中间经过的站点还有到站时间,出站时间全部输出。还要根据始发站和终点站来查询,然后把有座的列车都输出来,并且输出始发时间和到站时间。还需要查询每个乘客的乘车记录,输入姓名就能查询到乘车记录,包括始发站,终点站,车次号,发车时间,到站时间。查询功能是乘客和管理员都有使用的,所以单独写一个类,然后用来继承。

直接上代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
using namespace std;
class Time
{
int hour;
int minute;
public:
Time() {}
Time(int h,int m):hour(h),minute(m) {}
int gethour()
{
return hour;
}
int getminute()
{
return minute;
}
friend ostream&operator<<(ostream&os,const Time&T);
friend istream&operator>>(istream&is,Time&T);
bool operator<(const Time&T1)const
{
return hour!=T1.hour?
hour<T1.hour:minute<T1.minute;
}
bool operator>(const Time&T1)const
{
return hour!=T1.hour?
hour>T1.hour:minute>T1.minute;
}
bool operator+(const Time&T1)const
{
if(hour==T1.hour&&minute==T1.minute)
return true;
return false;
}
};

ostream&operator<<(ostream&os,const Time & T)
{
os<<T.hour<<":"<<T.minute;
return os;
}

istream&operator>>(istream&is,Time & T)
{
while(1)
{
is>>T.hour>>T.minute;
if(T.hour<0||T.hour>24||T.minute<0||T.minute>60)
continue;
else
break;
}
return is;
}

class Station
{
string StationName;//站点名称
string StationTrain;//车次号
Time TimeTo;//到站时间
Time TimeFrom;//出站时间
int TicketNum;//到达下一站的车票数量
public:
Station() {}
Station(string sn,string st,Time tt,Time tf,int tn):StationName(sn),StationTrain(st),TimeTo(tt),TimeFrom(tf),TicketNum(tn) {}
string getStationName()
{
return StationName;
}
string getStationTrain()
{
return StationTrain;
}
Time getTimeTo()
{
return TimeTo;
}
Time getTimeFrom()
{
return TimeFrom;
}
int getTicketNum()
{
return TicketNum;
}
string setStationName(string sn)
{
StationName=sn;
return StationName;
}
string setStationTrain(string st)
{
StationTrain=st;
return StationTrain;
}
Time setTimeTo(Time tt)
{
TimeTo=tt;
return TimeTo;
}
Time setTimeFrom(Time tf)
{
TimeFrom=tf;
return tf;
}
int setTicketNum(int tn)
{
TicketNum=tn;
return TicketNum;
}
void print()
{
cout<<StationName<<" "<<StationTrain<<" "<<TimeTo<<" "<<TimeFrom<<" "<<TicketNum<<endl;
}
friend ostream&operator<<(ostream&os,Station&S);
friend istream&operator>>(istream&is,Station&S);
};

ostream &operator<<(ostream &os,Station&S)
{
os<<S.StationName<<" "<<S.StationTrain<<" "<<S.TimeTo<<" "<<S.TimeFrom<<" "<<S.TicketNum<<endl;
return os;
}

istream &operator>>(istream &is,Station&S)
{
is>>S.StationName>>S.StationTrain>>S.TimeTo>>S.TimeFrom>>S.TicketNum;
return is;
}

/*int main()
{
string sn,st;
Time t1,t2;
int tn;
cin>>sn>>st>>t1>>t2>>tn;
Station S(sn,st,t1,t2,tn);
S.print();
tn--;
S.setTicketNum(tn);
//S.print();
cout<<S;
return 0;
}*/

class Passenger
{
string name;//乘客姓名
string IDNumber;//乘客身份证号
string telNumber;//乘客手机号
bool reputation;//乘客信誉度,默认可以买票
public:
Passenger(string na,string id,string tel):name(na),IDNumber(id),telNumber(tel)
{
reputation=true;
}
Passenger()
{
reputation=true;
}
string getname()
{
return name;
}
string getIDNumber()
{
return IDNumber;
}
string gettelNumber()
{
return telNumber;
}
bool getreputation()
{
return reputation;
}
string setname(string na)
{
name=na;
return name;
}
string setIDNumber(string id)
{
IDNumber=id;
return IDNumber;
}
string settelNumber(string tel)
{
telNumber=tel;
return telNumber;
}
bool setreputation(bool re)
{
reputation=!re;
return reputation;
}
void print()
{
cout<<name<<" "<<IDNumber<<" "<<telNumber<<" "<<reputation<<endl;
}
friend ostream&operator<<(ostream&os,Passenger&P);
friend istream&operator>>(istream&is,Passenger&P);
};

ostream&operator<<(ostream &os,Passenger&P)
{
os<<P.name<<" "<<P.IDNumber<<" "<<P.telNumber<<" "<<P.reputation<<endl;
return os;
}

istream&operator>>(istream &is,Passenger&P)
{
while(1)
{
is>>P.name>>P.IDNumber>>P.telNumber;
if(P.IDNumber.size()!=18||P.telNumber.size()!=11)
continue;
else
break;
}
//is>>P.name>>P.IDNumber>>P.telNumber>>P.reputation;
return is;
}

/*int main()
{
string na,id;
ll tel;
cin>>na>>id>>tel;
Passenger P(na,id,tel);
P.print();
bool re=P.getreputation();
P.setreputation(re);
cout<<P;
}*/

class Jilu
{
string Passengername;//乘客姓名
string trainnum;//列车号
string initialstation;//始发站
string terminal;//终点站
Time setoff;//发车时间
Time arrive;//到站时间
public:
Jilu() {}
Jilu(string pn,string tn,string is,string te,Time se,Time ar):
Passengername(pn),trainnum(tn),initialstation(is),terminal(te),setoff(se),arrive(ar) {}
string getPassengername()
{
return Passengername;
}
string gettrainnum()
{
return trainnum;
}
string getinitialstation()
{
return initialstation;
}
string getterminal()
{
return terminal;
}
Time getsetoff()
{
return setoff;
}
Time getarrive()
{
return arrive;
}
void print()
{
cout<<Passengername<<" "<<trainnum<<" "<<initialstation<<" "<<terminal<<" "<<setoff<<" "<<arrive<<endl;
}
friend ostream&operator<<(ostream&os,Jilu&J);
friend istream&operator>>(istream&is,Jilu&J);
};

ostream&operator<<(ostream &os,Jilu&J)
{
os<<J.Passengername<<" "<<J.trainnum<<" "<<J.initialstation<<" "<<J.terminal<<" "<<J.setoff<<" "<<J.arrive<<endl;
return os;
}

istream&operator>>(istream &is,Jilu&J)
{
is>>J.Passengername>>J.trainnum>>J.initialstation>>J.terminal>>J.setoff>>J.arrive;
return is;
}

/*int main()
{
string pn,tn,is,te;
Time t1,t2;
cin>>pn>>tn>>is>>te>>t1>>t2;
Jilu J(pn,tn,is,te,t1,t2);
J.print();
cin>>J;
cout<<J;
}*/

class Search
{
protected:
vector<Station>St;
multimap<string,int>m1;//按照站点名字查询
multimap<string,int>::iterator m11,m12,m13,m14;
multimap<string,int>m2;//按照车次号查询
multimap<string,int>::iterator m21,m22;
vector<Jilu>Ji;
multimap<string,int>m4;//按照姓名号查询记录
multimap<string,int>::iterator m41,m42;
public:
Search()
{
St.clear();
m1.clear();
m2.clear();
Ji.clear();
m4.clear();
loadstation();
loadjilu();
}
void loadstation();
void loadjilu();
void printstation();
void printjilu();
void searchbystation();
void searchbytrain();
void searchjilu();
};

void Search::loadstation()
{
ifstream infile("2018216487-邵光亮-station.txt",ios::in);
Station S;
while(infile>>S)
{
St.push_back(S);
m1.insert(make_pair(S.getStationName(),St.size()-1));
m2.insert(make_pair(S.getStationTrain(),St.size()-1));
}
infile.close();
}

void Search::loadjilu()
{
ifstream infile("2018216487-邵光亮-jilu.txt",ios::in);
Jilu J;
while(infile>>J)
{
Ji.push_back(J);
m4.insert(make_pair(J.getPassengername(),Ji.size()-1));
}
infile.close();
}

void Search::printstation()
{
multimap<string,int>::iterator mn;
for(mn=m1.begin(); mn!=m1.end(); mn++)
{
cout<<St[mn->second]<<endl;
}
}

/*int main()
{
Search se;
se.printstation();
}*/

void Search::printjilu()
{
multimap<string,int>::iterator mn;
for(mn=m4.begin(); mn!=m4.end(); mn++)
{
cout<<Ji[mn->second]<<endl;
}
}

/*int main()
{
Search se;
se.printjilu();
}*/

void Search::searchbytrain()
{
string st;
cin>>st;
m21=m2.lower_bound(st);
m22=m2.upper_bound(st);
/*cout<<st<<endl;
cout<<m21->second<<endl;
cout<<m22->second<<endl;*/
multimap<string,int>::iterator mn;
if(m21==m22)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m21; mn!=m22; mn++)
{
cout<<St[mn->second]<<endl;
}
}

/*int main()
{
Search Se;
Se.searchbytrain();
Se.searchbytrain();
}*/

void Search::searchbystation()
{
string sf,st;
string train1,train2;
cin>>sf>>st;
m11=m1.lower_bound(sf);
m12=m1.upper_bound(sf);
m13=m1.lower_bound(st);
m14=m1.upper_bound(st);
/*cout<<sf<<endl;
cout<<m11->second<<" "<<m12->second<<endl;
cout<<m13->second<<" "<<m14->second<<endl;*/
if(m11==m12||m13==m14)
{
cout<<"无该车次信息"<<endl;
return ;
}
multimap<string,int>::iterator mn;
multimap<string,int>::iterator mm;
for(mn=m11; mn!=m12; mn++)
{
train1=St[mn->second].getStationTrain();
//cout<<train1<<endl;
for(mm=m13; mm!=m14; mm++)
{
train2=St[mm->second].getStationTrain();
if(train2==train1)
{
if(St[mn->second].getTicketNum()!=0)
cout<<train1<<" "<<sf<<" "<<St[mn->second].getTimeTo()<<" "<<St[mn->second].getTimeFrom()<<" "<<st<<" "
<<St[mm->second].getTimeTo()<<" "<<St[mm->second].getTimeFrom()<<" "<<St[mn->second].getTicketNum()<<endl<<endl;
}
}
}
}

/*int main()
{
Search Se;
//cout<<"1"<<endl;
Se.searchbystation();
Se.searchbystation();
}*/

void Search::searchjilu()
{
string na;
cin>>na;
m41=m4.lower_bound(na);
m42=m4.upper_bound(na);
if(m41==m42)
{
cout<<"无该乘客买票信息"<<endl;
return ;
}
multimap<string,int>::iterator mn;
for(mn=m41; mn!=m42; mn++)
{
cout<<Ji[mn->second]<<endl;
}
}

/*int main()
{
Search se;
se.searchjilu();
se.searchjilu();
}*/

class AdminOp:public Search
{
public:
vector<Passenger>Pa;
multimap<string,int>m3;//按照姓名查询
multimap<string,int>::iterator m31,m32;
public:
AdminOp()
{
Pa.clear();
m3.clear();
loadpassenger();
}
~AdminOp()
{
savestation();
savepassenger();
}
void loadpassenger();
void savestation();
void savepassenger();
void printpassenger();
void addpassenger();
void managepassenger();
void addstation();
void deletestation();
void modifystation();
};

void AdminOp::loadpassenger()
{
ifstream infile("2018216487-邵光亮-passenger.txt",ios::in);
Passenger P;
while(infile>>P)
{
Pa.push_back(P);
m3.insert(make_pair(P.getname(),Pa.size()-1));
}
infile.close();
}

void AdminOp::savepassenger()
{
ofstream outfile("savepassenger.txt",ios::out);
if(!outfile)
return;
multimap<string,int>::iterator mn;
for(mn=m3.begin(); mn!=m3.end(); mn++)
{
outfile<<Pa[mn->second]<<endl;
}
outfile.close();
}

void AdminOp::savestation()
{
ofstream outfile("savestation.txt",ios::out);
if(!outfile)
return;
multimap<string,int>::iterator mn;
for(mn=m1.begin(); mn!=m1.end(); mn++)
{
outfile<<St[mn->second]<<endl;
}
outfile.close();
}

void AdminOp::printpassenger()
{
int i;
for(i=0; i<Pa.size(); i++)
{
cout<<Pa[i]<<endl;
}
}

/*int main()
{
AdminOp A;
A.printpassenger();
}*/

void AdminOp::addpassenger()
{
string na,id,tel;
while(1)
{
cin>>na>>id>>tel;
if(id.size()!=18||tel.size()!=11)
continue;
else
break;
}
Passenger P(na,id,tel);
Pa.push_back(P);
m3.insert(make_pair(P.getname(),Pa.size()-1));
}

/*int main()
{
AdminOp A;
A.addpassenger();
A.printpassenger();
}*/

void AdminOp::managepassenger()
{
string na;
cin>>na;
multimap<string,int>::iterator mn;
mn=m3.find(na);
bool re=Pa[mn->second].getreputation();
Pa[mn->second].setreputation(re);
//cout<<Pa[mn->second].getreputation()<<endl;
}

/*int main()
{
AdminOp A;
A.printpassenger();
A.managepassenger();
A.printpassenger();
}*/

void AdminOp::addstation()
{
string sn,t;
Time st,sf;
int tn;
Station S;
cin>>S;
St.push_back(S);
m1.insert(make_pair(S.getStationName(),St.size()-1));
m2.insert(make_pair(S.getStationTrain(),St.size()-1));
}

/*int main()
{
AdminOp A;
A.printstation();
A.addstation();
A.addstation();
A.searchbytrain();
A.searchbystation();
}*/

void AdminOp::deletestation()
{
string sn,st,st1;
cin>>sn>>st;
multimap<string,int>::iterator mn;
m11=m1.lower_bound(sn);
m12=m1.upper_bound(sn);
if(m11==m12)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m11; mn!=m12; mn++)
{
st1=St[mn->second].getStationTrain();
if(st1==st)
{
//cout<<St[mn->second]<<endl;
m1.erase(mn);
}
}
m11=m2.lower_bound(st);
m12=m2.upper_bound(st);
if(m11==m12)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m11; mn!=m12; mn++)
{
st1=St[mn->second].getStationName();
if(st1==sn)
{
//cout<<St[mn->second]<<endl;
m2.erase(mn);
}
}
}

/*int main()
{
AdminOp A;
A.printstation();
A.deletestation();
}*/

void AdminOp::modifystation()
{
string na,st,st1;
Time t1,t2;
bool flag=0;
cin>>na>>st>>t1>>t2;
multimap<string,int>::iterator mn;
m11=m1.lower_bound(na);
m12=m1.upper_bound(na);
if(m11==m12)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m11; mn!=m12; mn++)
{
st1=St[mn->second].getStationTrain();
if(st1==st)
{
flag=1;
St[mn->second].setStationName(na);
St[mn->second].setStationTrain(st);
St[mn->second].setTimeTo(t1);
St[mn->second].setTimeFrom(t2);

}
}
if(flag==0)
{
cout<<"无该车次信息"<<endl;
}
}

/*int main()
{
AdminOp A;
A.modifystation();
A.modifystation();
A.modifystation();
//A.searchbystation();
//A.searchbytrain();
A.printstation();
A.printpassenger();
}*/

class PassengerOp:public Search
{
AdminOp u;
public:
PassengerOp() {};
~PassengerOp()
{
savejilu();
};

void savejilu();
void buyticket();
void returnticket();
void changeticket();
};

void PassengerOp::savejilu()
{
ofstream outfile("savejilu.txt",ios::out);
if(!outfile)
return;
multimap<string,int>::iterator mn;
for(mn=m4.begin(); mn!=m4.end(); mn++)
{
outfile<<Ji[mn->second]<<endl;
}
outfile.close();
}

/*int main()
{
PassengerOp P;
P.printjilu();
}*/

void PassengerOp::buyticket()
{
string pn,sf,st,t,s1;
int num;
Time t1,t2,t3;
bool flag=0;//判断有无该车次
bool flag1=0;
cin>>pn>>t>>sf>>st;
bool re;//判断信誉度是否可以买票
multimap<string,int>::iterator mn;
mn=u.m3.find(pn);
re=u.Pa[mn->second].getreputation();
//cout<<u.Pa[mn->second].getIDNumber()<<endl;
//cout<<re<<endl;
if(re==0)
{
cout<<"信誉度不足,无法购票"<<endl;
return ;
}
else
{
m11=m1.lower_bound(sf);
m12=m1.upper_bound(sf);
if(m11==m12)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m11; mn!=m12; mn++)
{
s1=St[mn->second].getStationTrain();
if(s1==t)
{
flag=1;
t1=St[mn->second].getTimeFrom();
break;
}
}
m11=m1.lower_bound(st);
m12=m1.upper_bound(st);
if(m11==m12)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m11; mn!=m12; mn++)
{
s1=St[mn->second].getStationTrain();
if(s1==t)
{
flag1=1;
t2=St[mn->second].getTimeTo();
break;
}
}
//cout<<t1<<":"<<t2<<endl;
if(flag==1&&flag1==1)
{
m21=m2.lower_bound(t);
m22=m2.upper_bound(t);
for(mn=m21; mn!=m22; mn++)
{
num=St[mn->second].getTicketNum();
t3=St[mn->second].getTimeFrom();
if(num==0)
{
if(t1+t3)
{
cout<<"余票不足"<<endl;
return;
}
if((t1<t3)&&(t2>t3))
{
cout<<"余票不足"<<endl;
return;
}
}
}
//cout<<flag<<endl;
for(mn=m21; mn!=m22; mn++)
{
num=St[mn->second].getTicketNum();
t3=St[mn->second].getTimeFrom();
if(t1+t3)
{
num--;
St[mn->second].setTicketNum(num);
}
if((t1<t3)&&(t2>t3))
{
num--;
St[mn->second].setTicketNum(num);
}
}
Jilu J(pn,t,sf,st,t1,t2);
Ji.push_back(J);
m4.insert(make_pair(J.getPassengername(),Ji.size()-1));
}
else
{
cout<<"无该车次信息"<<endl;
}
}
}

/*int main()
{
PassengerOp P;
AdminOp A;
P.printjilu();
//A.managepassenger();
//A.printpassenger();
P.buyticket();
//P.buyticket();
//P.buyticket();
P.printjilu();
P.printstation();
}*/

void PassengerOp::returnticket()
{
string pn,t,sf,st,s,ss,tt;
cin>>pn>>t>>sf>>st;
Time t1,t2,t3;
int num;
bool flag=0;
multimap<string,int>::iterator mn;
m41=m4.lower_bound(pn);
m42=m4.upper_bound(pn);
if(m42==m41)
{
cout<<"没有查询到您的乘车记录"<<endl;
return ;
}
for(mn=m41; mn!=m42; mn++)
{
tt=Ji[mn->second].gettrainnum();
s=Ji[mn->second].getinitialstation();
ss=Ji[mn->second].getterminal();
if(s==sf&&ss==st&&t==tt)
{
flag=1;
t1=Ji[mn->second].getsetoff();
t2=Ji[mn->second].getarrive();
m4.erase(mn);
break;
}
}
if(flag==0)
{
cout<<"没有查询到您乘坐该列车的信息"<<endl;
}
//cout<<t1<<" "<<t2<<endl;
m21=m2.lower_bound(t);
m22=m2.upper_bound(t);
for(mn=m21; mn!=m22; mn++)
{
num=St[mn->second].getTicketNum();
t3=St[mn->second].getTimeFrom();
if(t1+t3)
{
//cout<<"1"<<endl;
num++;
St[mn->second].setTicketNum(num);
}
if((t1<t3)&&(t2>t3))
{
//cout<<"1"<<endl;
num++;
St[mn->second].setTicketNum(num);
}
}
}

/*int main()
{
PassengerOp P;
P.printjilu();
//P.printstation();
P.returnticket();
P.returnticket();
P.returnticket();
P.returnticket();
P.printjilu();
//P.printstation();
}*/

void PassengerOp::changeticket()
{
string pn,t,sf,st,s,ss,tt,s1;
Time t1,t2,t3;
int num;
cin>>pn>>t>>sf>>st;//输入原来的车票信息
multimap<string,int>::iterator mn;
m41=m4.lower_bound(pn);
m42=m4.upper_bound(pn);
for(mn=m41; mn!=m42; mn++)
{
tt=Ji[mn->second].gettrainnum();
s=Ji[mn->second].getinitialstation();
ss=Ji[mn->second].getterminal();
if(s==sf&&ss==st&&t==tt)
{
t1=Ji[mn->second].getsetoff();
t2=Ji[mn->second].getarrive();
m4.erase(mn);
break;
}
}
m21=m2.lower_bound(t);
m22=m2.upper_bound(t);
for(mn=m21; mn!=m22; mn++)
{
num=St[mn->second].getTicketNum();
t3=St[mn->second].getTimeFrom();
if(t1+t3)
{
//cout<<"1"<<endl;
num++;
St[mn->second].setTicketNum(num);
}
if((t1<t3)&&(t2>t3))
{
//cout<<"1"<<endl;
num++;
St[mn->second].setTicketNum(num);
}
}
cin>>pn>>t>>sf>>st;//输入要改签的车次信息
m11=m1.lower_bound(sf);
m12=m1.upper_bound(sf);
if(m11==m12)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m11; mn!=m12; mn++)
{
s1=St[mn->second].getStationTrain();
if(s1==t)
{
t1=St[mn->second].getTimeFrom();
break;
}
}
m11=m1.lower_bound(st);
m12=m1.upper_bound(st);
if(m11==m12)
{
cout<<"无该车次信息"<<endl;
return ;
}
for(mn=m11; mn!=m12; mn++)
{
s1=St[mn->second].getStationTrain();
if(s1==t)
{
t2=St[mn->second].getTimeTo();
break;
}
}
//cout<<t1<<" "<<t2<<endl;
m21=m2.lower_bound(t);
m22=m2.upper_bound(t);
//m22--;
for(mn=m21; mn!=m22; mn++)
{
num=St[mn->second].getTicketNum();
t3=St[mn->second].getTimeFrom();
if(t1+t3)
{
num--;
St[mn->second].setTicketNum(num);
}
if((t1<t3)&&(t2>t3))
{
num--;
St[mn->second].setTicketNum(num);
}
}
Jilu J(pn,t,sf,st,t1,t2);
Ji.push_back(J);
m4.insert(make_pair(J.getPassengername(),Ji.size()-1));
}

/*int main()
{
PassengerOp P;
P.printjilu();
P.printstation();
P.changeticket();
P.printjilu();
P.printstation();
}*/

int main()
{
ios::sync_with_stdio(false);
AdminOp A;
PassengerOp P;
/*A.printjilu();
A.printpassenger();
A.printstation();
A.searchbystation();
A.searchbytrain();
A.searchjilu();
A.addpassenger();
A.managepassenger();
A.printpassenger();
A.addstation();
A.deletestation();
A.modifystation();
P.printjilu();
P.buyticket();
P.printjilu();
P.returnticket();
P.printjilu();
P.changeticket();
P.printjilu();*/
A.printjilu();
P.returnticket();
P.printjilu();
return 0;
}