12306 列車時刻查詢系統簡單執行程式碼
阿新 • • 發佈:2018-11-19
#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:使用者端帶時間的查詢功能
在帶時間的基本查詢中,一開始沒有呼叫時間的過載大於的等於號,導致一直出錯,修改後便能順利進行。
總之能完成這次系統的設計是收益頗豐的,熬了一星期的夜也是值得的啦