#include<bits/stdc++.h>
using namespace std;
class Time
{
int hour,minute;
public:
Time(int h,int m)
{
hour=h;minute=m;
}
Time()
{
}
int gethour() {return hour;}
int getminute() {return minute;}
void sethour(int ho) {hour=ho;}
void setminute(int m) {minute=m;}
void settime(int h,int m) {hour=h,minute=m;}
bool operator<(const Time&a)const
{
if(hour<a.hour)
return true;
else if ((hour==a.hour)&&minute<a.minute)
return true;
return false;
}
bool operator>(const Time &a)const
{
if(hour>a.hour)
return true;
else if ((hour==a.hour)&&minute>a.minute)
return true;
return false;
}
int operator-(const Time&t)const
{
int a=0;
if(hour!=-1&&t.hour!=-1)
{
if(hour>t.hour)
{
a=a+(hour-t.hour)*60+minute-t.minute;
}
if(hour==t.hour)
a=a+minute-t.minute;
return a;
}
else
return 0;
}
bool operator==(const Time &a)const
{
if (hour==a.hour&&minute==a.minute)
return true;
return false;
}
friend ostream&operator<<(ostream&os,const Time &t);
friend istream&operator>>(istream&is,Time&t);
};
ostream&operator<<(ostream&os,const Time&t)
{
os<<t.hour<<" "<<t.minute;
return os;
}
istream&operator>>(istream&is,Time&t)
{
is>>t.hour>>t.minute;
return is;
}
class information
{
string station;
string train;
Time t1,t2;
public:
information(string a,string b,Time c,Time d)
{
train=a;station=b;t1=c;t2=d;
}
information()
{
}
string getsta() {return station;}
string gettra() {return train;}
Time gett1() {return t1;}
Time gett2() {return t2;}
void setsta(string s) {station=s;}
void settra(string t) {train=t;}
void sett1(Time a) {t1=a;}
void sett2(Time b) {t2=b;}
void settime(Time a,Time b) {t1=a,t2=b;}
void dist()
{
cout<<train<<" "<<t1<<" "<<t2<<" "<<t2-t1<<endl;
}
void diss()
{
cout<<station<<" "<<t1<<" "<<t2<<" "<<t2-t1<<endl;
}
friend ostream&operator<<(ostream&os,const information&i);
friend istream&operator>>(istream&is,information&i);
};
ostream&operator<<(ostream&os,const information&i)
{
os<<i.train<<" ";
os<<i.station<<" ";
os<<i.t1<<" ";
os<<i.t2<<" "<<endl;
return os;
}
istream&operator>>(istream&is,information&i)
{
is>>i.train;
if(i.train=="-1")
return is;
is>>i.station>>i.t1>>i.t2;
return is;
}
class station//车站
{
string sta;
information e;
vector<information> v;
vector<information>::iterator it;
multimap<Time,int> m;//车次查询
multimap<Time,int>::iterator mit;
public:
station(string a)
{
sta=a;
}
station()
{
}
void addr(information s)
{
v.push_back(s);
int i=v.size();
m.insert(make_pair(s.gett1(),i-1));
}
string getsta() {return sta;}
void setsta(string s) {sta=s;}
int rsize(){return v.size();}
information getr(int a){return v[a];}
string getinfortra(int a){return v[a].gettra();}
Time getinfortime1(int a){return v[a].gett1();}
Time getinfortime2(int a){return v[a].gett2();}
void settime(string a,Time b,Time c);
friend ostream &operator<<(ostream&os,const station&s);
friend istream &operator>>(istream&is,station&s);
void deleinfor(string a)
{ Time o;
int b;
it=v.begin();
for(int i=0;i<v.size();++i,it++)
if(v[i].gettra()==a)
{v.erase(it);
o=v[i].gett1();
mit=m.find(o);
m.erase(mit);}
}
void displays()//显示
{
int b;
for(mit=m.begin();mit!=m.end();mit++)
{
b=mit->second;
v[b].dist();}
}
};
ostream &operator<<(ostream&os,const station&s)
{
os<<s.sta<<endl;
return os;
}
istream &operator>>(istream&is,station&s)
{
is>>s.sta;
return is;
}
void station::settime(string a,Time b,Time c)
{
Time d;
for(int i=0;i<v.size();i++)
if(v[i].gettra()==a)
{d=v[i].gett1();
mit=m.find(d);
m.erase(mit);
m.insert(make_pair(b,i));
v[i].settime(b,c);
break;}
}
class train//车次
{
string tra;
string s1;
string s2;
vector<information> v;
vector<information>::iterator it;
multimap<Time,int> m;//
multimap<Time,int>::iterator mit;
public:
train(string a,string b,string c)
{
tra=a;s1=b;s2=c;
}
train()
{
}
void addi(information s)
{
v.push_back(s);
int i=v.size();
m.insert(make_pair(s.gett1(),i-1));
}
string gettra() {return tra;}
string settra(string a) {return tra=a;}
string gets1() {return s1;}
string gets2() {return s2;}
information getr(int a){return v[a];}
Time gettime1(int a){v[a].gett1();}
string getsta(int a){v[a].getsta();}
void settime(string a,Time b,Time c);
int rsize() {return v.size();}
void sets1(string a) {s1=a;}
void sets2(string b) {s2=b;}
void deleinfor(string a)
{ Time o;
int b;
it=v.begin();
if(s1==a)
{mit=m.begin();
mit++;
b=mit->second;
s1=v[b].getsta();
}
if(s2==a)
{mit=m.end();
mit--;
mit--;
b=mit->second;
cout<<b<<endl;
s2=v[b].getsta();}
for(int i=0;i<v.size();++i,it++)
{
if(v[i].getsta()==a)
{v.erase(it);
o=v[i].gett1();
mit=m.find(o);
m.erase(mit);}}
}
void displayt()
{
int b;
for (mit=m.begin();mit!= m.end();mit++)
{
b=mit->second;
v[b].diss();
}
}
friend ostream &operator<<(ostream&os,const train&t);
friend istream &operator>>(istream&is,train&t);
};
ostream &operator<<(ostream&os,const train&t)
{
os<<t.tra<<endl;
os<<t.s1<<" "<<t.s2<<endl;
return os;
}
istream &operator>>(istream&is,train&t)
{
is>>t.tra;
is>>t.s1>>t.s2;
return is;
}
void train::settime(string a,Time b,Time c)
{
Time d;
for(int i=0;i<v.size();i++)
if(v[i].getsta()==a)
{d=v[i].gett1();
mit=m.find(d);
m.erase(mit);
m.insert(make_pair(b,i));
v[i].settime(b,c);
break;}
}
class Adminop//后台管理
{
vector<train> v1;
vector<train>::iterator it1;
multimap<string,int> m2;//车次查询
multimap<string,int>::iterator mit2;
vector<station> v2;
vector<station>::iterator it2;
multimap<string,int> m1;//站点查询
multimap<string,int>::iterator mit1;
public:
Adminop()
{
loads();
loadt();
}
~Adminop()
{
saves();
savet();
}
void loads()
{
station a;
information c;
int o;
ifstream infile("c:\\20171819\\station.txt",ios::in);
if(!infile)
return;
v2.clear();
while(infile>>a)
{v2.push_back(a);
o=v2.size()-1;
m1.insert(make_pair(a.getsta(),o));
while(infile>>c)
if(c.gettra()!="-1")
v2[o].addr(c);
else
break;}
infile.close();
}
void loadt()
{
train a;
information c;
int o;
ifstream infile("c:\\20171819\\train.txt",ios::in);
if(!infile)
return;
v1.clear();
while(infile>>a)
{v1.push_back(a);
o=v1.size()-1;
m2.insert(make_pair(a.gettra(),o));
while(infile>>c)
if(c.gettra()!="-1")
v1[o].addi(c);
else
break;}
infile.close();
}
void saves()
{
ofstream outfile("c:\\20171819\\station.txt",ios::out);
if(!outfile)
return;
for(int i=0;i<v2.size();++i)
{
outfile<<v2[i];
for(int j=0;j<v2[i].rsize();++j)
outfile<<v2[i].getr(j);
outfile<<"-1"<<endl;
}
outfile.close();
}
void savet()
{
ofstream outfile("c:\\20171819\\train.txt",ios::out);
if(!outfile)
return;
for(int i=0;i<v1.size();++i)
{
outfile<<v1[i];
for(int j=0;j<v1[i].rsize();++j)
outfile<<v1[i].getr(j);
outfile<<"-1"<<endl;
}
outfile.close();
}
void addtra();//增加车次
void addsta();//增加车站
void addinformation();//增加信息
void deleinformation();//删除信息
int searchtra(string a);//按车次查询
int searchsta(string b);//按站点查询
void deletra();//删除车次
void delesta();//删除站点
void xgt();//修改时间
void querytra();//查找列车
void querysta();//查找站点
};
void Adminop::querytra()//查找列车
{
string a;
int b;
cout<<"请输入要查询的车次,输入-1结束"<<endl;
cin>>a;
if(a!="-1")
{b=searchtra(a);
if(b!=-1)
{cout<<a<<endl;
v1[b].displayt();}
else
{
cout<<"你输入的站点有误,请重新输入"<<endl;
querytra();
}}
else
return;
}
void Adminop::querysta()//查询车站
{
string a;
int b;
cout<<"请输入要查询的车站,输入-1结束"<<endl;
cin>>a;
if(a!="-1")
{b=searchsta(a);
if(b!=-1)
{cout<<a<<endl;
v2[b].displays();}
else
{
cout<<"你输入的站点有误,请重新输入"<<endl;
querysta();
}}
else
return;
}
int Adminop::searchsta(string b)
{
mit1=m1.find(b);
if(mit1!=m1.end())
return mit1->second;
else
return -1;
}
int Adminop::searchtra(string b)
{
mit2=m2.find(b);
if(mit2!=m2.end())
return mit2->second;
else
return -1;
}
void Adminop::addtra()//增加车次
{
string a,e,f;
cout<<"请输入要添加的车次:"<<endl;
cin>>a;
int b,o;
b=searchtra(a);
if(b==-1)
{cout<<"请输入出发站和终点站"<<endl;
cin>>e>>f;
train c(a,e,f);
v1.push_back(c);
o=v1.size()-1;
m2.insert(make_pair(c.gettra(),o));}
else
{
cout<<"您输入的车次已存在请重新输入"<<endl;
addtra();
}
}
void Adminop::addsta()//增加站点
{
string a;
cout<<"请输入要添加的站点,按-1结束输入"<<endl;
while(1)
{
cin>>a;
if (a!="-1")
{int b,o;
b=searchsta(a);
if(b==-1)
{station c(a);
v2.push_back(c);
o=v2.size()-1;
m1.insert(make_pair(c.getsta(),o));}
else
{
cout<<"您输入的站点已存在请重新输入"<<endl;
addsta();
}}
else
break;
}
}
void Adminop::delesta()//删除站点
{
string a;
int o;
cout<<"请输入您要删除的站点,按-1结束"<<endl;
while(1)
{
cin>>a;
o=searchsta(a);
if(o!=-1)
v2[o].deleinfor(a);
else
break;}
}
void Adminop::deletra()//删除车次
{
string a;
int o;
while(1)
{
cout<<"请输入您要删除的车次,按-1结束"<<endl;
cin>>a;
o=searchsta(a);
if(o!=-1)
v1[o].deleinfor(a);
else
break;}
}
void Adminop::addinformation()//增加信息
{
string a,b;
Time c,d;
information r;
cout<<"请输入列车信息,按车次,站点,出发时间,到达时间输入,输入-1结束"<<endl;
while(1)
{
cin>>a;
if(a!="-1")
{
cin>>b>>c>>d;
int i=searchtra(a);
int j=searchsta(b);
if(i!=-1)
{
information r(a,b,c,d);
v1[i].addi(r);
}
else
cout<<"车次不存在"<<endl;
if(j!=-1)
{
information r(a,b,c,d);
v2[j].addr(r);
}
else
cout<<"站点不存在"<<endl;}
else
break;
}
}
void Adminop::deleinformation()//删除信息
{
string a,b;
int o,p;
while(1)
{cout<<"请输入要删除的数据的车次和站点或输入-1结束"<<endl;
cin>>a;
if(a!="-1")
{cin>>b;
o=searchtra(a);
p=searchsta(b);
if(o!=-1&&p!=-1)
{
v2[p].deleinfor(a);
v1[o].deleinfor(b);
}
}
else
break;}
}
class Clientop//客户操作
{
vector<train> v1;
vector<train>::iterator it1;
multimap<string,int> m1;//车次名查询
multimap<string,int>::iterator mit1;
vector<station> v2;
vector<station>::iterator it2;
multimap<string,int> m2;//站点名查询
multimap<string,int>::iterator mit2;
public:
Clientop()
{
loads();
loadt();
}
~Clientop()
{
saves();
savet();
}
void loads()
{
station a;
information c;
int o;
ifstream infile("c:\\20171819\\station.txt",ios::in);
if(!infile)
return;
v2.clear();
while(infile>>a)
{v2.push_back(a);
o=v2.size()-1;
m2.insert(make_pair(a.getsta(),o));
while(infile>>c)
if(c.gettra()!="-1")
v2[o].addr(c);
else
break;}
infile.close();
}
void saves()
{
ofstream outfile("c:\\20171819\\station.txt",ios::out);
if(!outfile)
return;
for(int i=0;i<v2.size();++i)
{
outfile<<v2[i];
for(int j=0;j<v2[i].rsize();++j)
outfile<<v2[i].getr(j);
outfile<<"-1"<<endl;
}
outfile.close();
}
void loadt()
{
train a;
information c;
int o;
ifstream infile("c:\\20171819\\train.txt",ios::in);
if(!infile)
return;
v1.clear();
while(infile>>a)
{v1.push_back(a);
o=v1.size()-1;
m1.insert(make_pair(a.gettra(),o));
while(infile>>c)
if(c.gettra()!="-1")
v1[o].addi(c);
else
break;}
infile.close();
}
void savet()
{
ofstream outfile("c:\\20171819\\train.txt",ios::out);
if(!outfile)
return;
for(int i=0;i<v1.size();++i)
{
outfile<<v1[i];
for(int j=0;j<v1[i].rsize();++j)
outfile<<v1[i].getr(j);
outfile<<"-1"<<endl;
}
outfile.close();
}
void querytra1(int a)
{
v1[a].displayt();
}
int searchsta(string a);
int searchtra(string b);
void querysta();//站点信息查询
void querytra();//列车信息查询
void queryinformation();//查询基本信息
void querycfinfor();//带时间的基本查询
void queryzdinfor();
void distra(int a){v1[a].displayt();}
};
int Clientop::searchsta(string a)
{
mit2=m2.find(a);
if(mit2!=m2.end())
return mit2->second;
else
return -1;
}
int Clientop::searchtra(string b)
{
mit1=m1.find(b);
if(mit1!=m1.end())
return mit1->second;
else
return -1;
}
void Clientop::querysta()//站点信息查询
{
string a;
int b;
cout<<"请输入要查询的车站,输入-1结束"<<endl;
cin>>a;
if(a!="-1")
{b=searchsta(a);
if(b!=-1)
{cout<<a<<endl;
v2[b].displays();}
else
{
cout<<"你输入的站点有误,请重新输入"<<endl;
querysta();
}}
else
return;
}
void Clientop::querytra()//列车信息查询
{
string a;
int b;
cout<<"请输入要查询的车次,输入-1结束"<<endl;
cin>>a;
if(a!="-1")
{b=searchtra(a);
if(b!=-1)
{cout<<a<<endl;
v1[b].displayt();}
else
{
cout<<"你输入的站点有误,请重新输入"<<endl;
querytra();
}}
else
return;
}
void Clientop::queryinformation()//基本查询
{
string a,b,c;
int d,e,o;
cout<<"请输入起始点和目的地,按-1结束"<<endl;
cin>>a>>b;
d=searchsta(a);
e=searchsta(b);
if(d!=-1&&e!=-1)
{
for (int i=0;i<v2[d].rsize();i++)
{
int p=0;
for (int j=1;j<v2[e].rsize();j++)
if(v2[d].getinfortra(i)==v2[e].getinfortra(j))
{if(v2[d].getinfortime1(i)<v2[e].getinfortime1(j))
p=1;
break;}
if(p==1)
{a=v2[d].getinfortra(i);
o=searchtra(a);
querytra1(o);
}}
}
else
cout<<"您输入的站点有误"<<endl;
}
void Clientop::querycfinfor()//带时间的基本查询
{
string a,b;
Time f;
int o,p,e;
cout<<"请依次输入出发站和终点站,和出发时间"<<endl;
cin>>a>>b>>f;
o=searchsta(a);
p=searchsta(b);
if(o!=-1&&p!=-1)
for(int i=0;i<v2[o].rsize();++i)
{int h=0;
for(int j=0;j<v2[p].rsize();++j)
{
if(v2[o].getinfortra(i)==v2[p].getinfortra(j))
{if(v2[o].getinfortime1(i)<v2[p].getinfortime1(j))
if(v2[o].getinfortime2(i)==f||v2[o].getinfortime2(i)>f)
h=1;
break;}
}
if(h==1)
{a=v2[o].getinfortra(i);
cout<<a<<endl;
e=searchtra(a);
distra(e);
}}
else
cout<<"您输入的站点有误"<<endl;
}
void Clientop::queryzdinfor()
{
string a,b;
Time f;
int o,p,e;
cout<<"请依次输入出发站和终点站,和到达时间"<<endl;
cin>>a>>b>>f;
o=searchsta(a);
p=searchsta(b);
if(o!=-1&&p!=-1)
for(int i=0;i<v2[o].rsize();++i)
{int h=0;
for(int j=0;j<v2[p].rsize();++j)
{
if(v2[o].getinfortra(i)==v2[p].getinfortra(j))
{if(v2[o].getinfortime1(i)<v2[p].getinfortime1(j))
if(v2[p].getinfortime1(i)<f||v2[p].getinfortime1(i)==f)
h=1;
break;}
}
if(h==1)
{a=v2[o].getinfortra(i);
e=searchtra(a);
cout<<a<<endl;
distra(e);
}}
else
cout<<"您输入的站点有误"<<endl;
}
int main()
{
//Adminop aa;
//aa.loads();
//aa.loadt();
//aa.addtra();
//aa.addsta();
//aa.addinformation();
//aa.querytra();
//aa.querysta();
//aa.saves();
//aa.savet();
//aa.delesta();
//aa.deletra();
Clientop bb;
// bb.querytra();
//bb.querytra();
//bb.queryinformation();
bb.querycfinfor();
//bb.queryzdinfor();
}
在设计12306列车查询系统过程中遇到很多问题,通过同学的帮助和自己的修改,终于在6月30日完成了系统的设计。
简述一些设计过程中遇见的问题
1:关于车站类和车次类调用信息类的函数。
因为在车站类和车次类中调用信息类成员,信息类成员为私有成员,不能直接调用,因此需要重新构造函数返回信息类的数据成员,从而方便在车站类和车次类中的调用。
2:关于时间的重载。
时间类中对时间比较和计算的重载。重载大于,小于,等于号,为了下面时间的比较做铺垫,同时方便下面调用时间函数。重载减号的作用为为下面显示函数中停留时间的计算。
3:信息类中displays函数和displayt 函数的运用。
在信息类函数中加的displays函数为下面车站显示函数做铺垫,方便直接调用信息里的显示函数,直接显示站点的所有信息。同样displayt函数为下面车次的查询做铺垫,直接显示车次的所有信息。
4:文件读写问题:
当写完管理员操作类的时候发现运行代码之后就会弹出白框告知我代码停止工作。后来只用管理员操作类定义了一个对象然后运行,发现并不能停止,所以去修改了构造函数;改了一些后发现还不能读入文件,于是又从头找读写中构造函数的错误,经过一下午的仔细查找才发现有一处构造函数写的有问题改过来以后便能正常读写文件。
5:用户端带时间的查询功能
在带时间的基本查询中,一开始没有调用时间的重载大于的等于号,导致一直出错,修改后便能顺利进行。
总之能完成这次系统的设计是收益颇丰的,熬了一星期的夜也是值得的啦