C++課程設計詳解-12306的模擬實現

目錄

設計思路... 3

思路分析:.... 3

數據組織:.... 4

具體功能實現過程... 4

管理端具體功能實現:.... 4

用戶端具體功能實現:.... 5

調試截圖和調試過程中遇到的問題及改進:... 12

時間類.... 12

站臺類.... 14

列車站點類.... 16

列車類.... 17

車票類.... 19

用戶數據類.... 21

查詢類:.... 22

管理端.... 28

設計體會與小結... 29

 

 

 

 

設計思路

設計一個系統,首先要考慮實現什麼功能,需要怎樣組織數據。所以先通過查詢12306,知道了12306最終要實現:

 

其次在分析實現方式,或者說自己以什麼方式實現:

思路分析:

站臺中不能存車次的所有信息,那樣就會站臺包括車次,車次包括站臺,循環定義,空間無限大,編譯應該是不通過,利用車次與車站名是唯一的,所以站臺與列車信息種只存彼此的名字即可。而對於車票,因爲一個月最多有31天,開一個31天的int儲存,這樣今天20號,那麼輸入11號的話絕對是下個月的,因爲不可能買今天之前的票,21號的話絕對是這個月的21號,因爲最多買後30天的票。餘票的話,因爲車站發售的票,不一定是實際可乘坐的餘票,所以在每個站臺存車次的餘票爲該站臺最多可發售的餘票,而火車種存有每個站臺實際可賣的餘票,乘車區間的火車實際餘票最小值與該站臺最多發售餘票取最小值即爲該乘車區間可發售的餘票。

在在個系統中一定會有時間,應寫一個時間類,時間類包括年月日時分,get/set函數,通過兩個時間類計算停靠時間,這裏會發現,任何一輛高鐵夜間都是不行車的,所以不會出現跨天的可能,其實也不會出現超過一小時的,所以返回分鐘即可。因爲要存日誌文件,所以要判斷記錄中的出行時間是否小於當前時間,要是小於就代表已經出行,需要生成日誌文件,而不繼續存在文件的數據中,這裏用了流對象的儲存文件名參數可以爲一個string變量,可以自定義。最後便於從文件中讀取數據,重載了>>與<<運算符。

詳細的站臺數據應該包括站臺名,站臺包括的車次及餘票,也應該包括某輛車到該站點的時間信息等,將站臺分爲兩個類,第一個是時間得站臺包括車次信息,另一個是組合於列車類的站臺信息包括時間參數等及其打印函數。

爲了能夠生成記錄,以及查詢已購的票,設置了一個車票類或稱record類,包括車站、車次信息,出發、到達時間,購票人的身份證,同一張車票將人車於站臺全部聯繫起來,爲了使車票有自己唯一的編號,通過一個生成名字的函數,基於車次身份證出發時間生成,這樣生成的車票名確定且唯一。

用戶信息類,用戶需要驗證身份信息,所以必須需要一個類來儲存身份信息,應該包括登陸賬號手機號,身份證號,姓名,密碼,是否爲黑名單,已買到的票可以通過向量保存,儲存車票名即可。也許打印身份信息函數,修改手機號函數,改密碼函數。

數據組織:

通過前面的實現思路,數據組織方式也很明確,數據類共計6個分別是①時間類、②站臺類、③列車站點類、④列車類、⑤車票類、⑥用戶數據類。所有數據類都重載類輸入輸出運算符。操作了類共計3個分別是①查詢類、②用戶端類、③管理端類。

具體功能實現過程

管理端具體功能實現:

增刪查改站點:

查,可以繼承用戶端,用戶的操作的管理員的都能做,除了買票退票,但是除此之外的所有有功能在管理端都可以進行於是用戶端繼承查詢類,而修改站點可以簡化爲新建一個站點,刪除舊站點。

增刪查改車次:

查也可以繼承,增可以寫創建函數,刪寫刪除函數,在列車數據vector中遍歷查找要刪除的車次,進行實刪。

用戶端具體功能實現:

查車票:

查詢票需要三個參數,初始站,目的站,乘車日期,此時系統會打印那天所有經過兩個站點的車次信息,是否有票無票都會打印,實現方法,將起始站經過的所有車次於目的站所經過車次對比,相同的保留,可以通過set將車次名放入,車次名在我國意一一對應車次,當放不進set去之後,用vector保存,則vector中的   存儲車次爲可到達車次。通過遍歷取最小值獲得餘票,通過數據裏的打印函數打印列車信息。

         bool Baseque :: cxyp(string a,string b,int riqi)

{

    auto w=station[natosta[a]].quecheci();

    auto v=station[natosta[b]].quecheci(); //vector<pair<string,int>> checi

    set<piao>tem;

    vector<piao>temp;

    temp.clear();

    for(auto po=w.begin();po!=w.end();po++) tem.insert(*po);

    for(auto po=v.begin();po!=v.end();po++)

    {

        if(tem.insert(*po).second==0) temp.push_back(*po);

    }

    if(temp.size()==0)

    {

        cout<<"No ticket"<<endl;

        return 0 ;

}

int  Train::cxyp(string  a,string  b,int c)

{

    bool flag=0;

    int mini=0x3f3f3f3f;

    for(auto po=station.begin();po!=station.end();po++)

    {

        if(po->getsta()==a) flag=true;

        if(flag) mini=min(mini,po->getpiao(c));

        if(po->getsta()==b) break;

    }

    return mini;

}

車站車次查詢:

應該有三個參數出發時間段,到達時間段,車站。此時系統會打印,在出發時段或到達時段通過該站點的車次,通過基類的get函數,獲得經過該站點的車次名稱,在操作類中找到對應的車次信息,判斷他出發時間和到達時間,符合要求打印車次信息。

void Baseque ::czcc(string a,int b,int d)

{

    vector<piao>w=station[natosta[a]].quecheci();

    for(auto po=w.begin();po!=w.end();po++)

    {

       vector<Zt> q= train[checitotrain[po->name]].getzt();

       for(auto pi=q.begin();pi!=q.end();pi++)

       {

            if(a==pi->getsta())

             {

                 if(pi->getarr()==b||b==0||pi->getlea()==d||d==0)

                 {

                      cout<<po->name<<endl;

                     if(pi!=q.begin())

                     {

                            q.begin()->printl();

                            if(pi==q.end()-1)

                            {

                                (q.end()-1)->printa();

                               //cout<<2<<endl;

                                    cout<<endl;

                            }

                            else

                            {

                                pi->print();

                                  //   cout<<endl;

                                (q.end()-1)->printa();

                               //  cout<<3<<endl;

                            }

                             cout<<endl;

                     }

                     else

                     {

                             q.begin()->printl();

                             (q.end()-1)->printa();

                             cout<<endl;

                     }

                     cout<<endl;

                 }

             }

       }

    }

}

車次查詢:

應該有一個參數,車次名,車次每天的都是重複的一樣的,所以只輸入車次名即可,輸入車次名得到對應的車次的數據進而藉助的列車的print函數打印列車的詳細信息。      

 void Baseque ::cxcx(string a)  //車次查詢

{

    if(checitotrain.find(a)==checitotrain.end())

    {

        cout<<"NO Train"<<endl;

        return ;

    } //查不到不打印

    vector<Zt> w=train[checitotrain[a]].getzt();

    for(auto po=w.begin();po!=w.end();po++)

    {

        cout<<station[natosta[po->getsta()]].getname()<<' ';

        if(po!=w.begin()&&po!=w.end()-1)

        {

            po->print();

           //cout<< po->getleave().first<<' '<<po->getleave().first;

        }

          else if(po==w.begin())

          {

               cout<< po->getleave().first<<' '<<po->getleave().first;

          }

          else   cout<<po->getarrive().first<<' '<< po->getarrive().second<<' ';

    }

    cout<<endl;

}

購票:

購票需要傳四個參數,但是在查詢中已經輸入了三個參數,所以只用再選擇車次即可購票。購票爲對某個乘車區間內的要出發那天車票進行自減操作,除此之外還要對起始站站臺內這個車次的那一天的餘票也要減1;實現方式調用站臺類的函數,跟火車類的函數,通過遍歷對火車的區間操作。此外要注意,是否爲黑名單,是否爲買的票超過了5張。

bool Client::buytic(string a,string b,int c) //先查後買,查不到不能買。

{

    if(!(cxyp(a,b,c))){cout<<"無票"<<endl;return 0;}

    if(user[now].getboupiao()>5||user[now].getban())

    {

        cout<<"購票限制"<<endl;

        return 0;

    }

   else

    {

        string id;

        cin>>id;

        pair<int,int>www=train[checitotrain[id]].buytic(a,b,c);

        station[natosta[a]].buytic(a,c);

        Time no1,no2;

        no1.loadtime();

        no2.loadtime();

        no2.seth(www.first,www.second);

        if(no2.getday()<c) no2.setmonth(no2.getmonth()+1);

        Tick tem(no1,no2,a,b,now2,id);

        tick.push_back(tem);

        hashtotick.insert(make_pair(tem.getname(),tick.size()-1));

        user[now].buytic(tem.getname());

    }

    return 1;

}

退票:

退票需要先查詢自己買到了什麼票,然後在進行選擇要推動票,實現方式與買票實現方式相同(某個區間的票+1) ,火車開了之後,不能退票,但是可以改簽。

void Client::reback() //先查後買,查不到不能買。

{

  printmp();

 string id=now2;

 int n;

 cout<<"退哪一張票"<<endl;

 cin>>n;

 n=n-1;

 auto ww=user[now].gettic();

 string a=tick[ hashtotick[ww[n]]].getfrom();

 string b=tick[ hashtotick[ww[n]]].getto();

 int c=tick[ hashtotick[ww[n]]].getlea().getday();

 train[checitotrain[id]].reback(a,b,c);

 string e=tick[ hashtotick[ww[n]]].getna();

 station[natosta[a]].rebac(e,c);

  // tick.erase(hashtotick[ww[n]]+tick.begin());

}                         

改簽:

相當於退票+重新購票,不過改簽的關鍵爲能否找到合適的票進行改簽,如果沒找到要改簽的的票,這樣的改簽無意義,所以相當於先購票後買票,購票失敗等於改簽失敗,所以購票的返回值爲bool類型,購票成功返回1否則返回0。

void Client::replacetic()

{

    string a,b,id;

    int c;

    cin>>a>>b>>c;

  if(  buytic(a,b,c))

   {

        cin>>a>>b>>c;

        reback();

   }

}

換乘:

兩個城市不能接聯通,需要藉助最短路,需要找出中轉城市,但是鑑於京滬線的所有站點都有車次經過,且換乘實現有難度,不考慮這個功能。

查詢修改個人信息:

通過寫一個用戶信息類,一方面用於信息查詢,另一方面用於登陸。這樣再通過用戶信息類的打印函數,即可完成身份信息的查詢。

                     void Client::printmp()

                    {

                        auto ww=user[now].gettic();

                          if(ww.size()==0)return ;

                        for(auto po=ww.begin();po!=ww.end();po++)

                        {

                           cout<<po-ww.begin()+1<<endl;

                            tick[ hashtotick[*po]].print();

                        }

                    }

列車、站臺數據文件讀寫:

void Baseque::load()

{

     int x,y,n;

    ifstream in1("station.txt",ios::in);

    in1>>n;

     while(    n--)

     {

          Station tem1;

               in1>>tem1;

if(tem1.getname()=="$$") continue;

            station.push_back(tem1);

             natosta.insert(make_pair(tem1.getname(),station.size()-1));

     }

     in1.close();

     ifstream in2("train.txt",ios::in);

     in2>>n;

     while(n--   )

    {

        Train tem2;

        in2>>tem2;

        if(tem2.gettr()=="$$") continue;

        train.push_back(tem2);

        checitotrain.insert(make_pair(tem2.gettr(),train.size()-1));

    }

    in2.close();

}

void Baseque::save()

 {

  ofstream out1("station.txt",ios::out);

  out1<<station.size()<<endl;

     for(auto po=station.begin();po!=station.end();po++)

        out1<<*po<<endl;

    out1.close();

    ofstream out2("train.txt",ios::out);

    out2<<train.size()<<endl;

     for(auto po=train.begin();po!=train.end();po++)

        out2<<*po<<endl;

        out2.close();

 }

車票(記錄)和用戶數據讀寫及日誌文件的形成:

void Client::load2()

{

    ifstream in("user.txt",ios::in);

    int n;

    if(!in) return ;

    in>>n;

    while(n--)

    {

        User tem;

        in>>tem;

        if(tem.getphone()=="&&&")continue;

        user.push_back(tem);

        idtouse.insert(make_pair(tem.getname(),user.size()-1));

    }

    in.close();

    ifstream in2("tick.txt",ios::in);

    if(!in2) return ;

    in2>>n;

    while(n--)

    {

        Tick tem;

        in2>>tem;

        if(tem.getname()=="$$$") continue;

        tick.push_back(tem);

        hashtotick.insert(make_pair(tem.getname(),tick.size()-1));

    }

    in.close();

}

void Client::save2()

{

    ofstream out("user.txt",ios::out);

    out<<user.size()<<endl;

    for(auto po=user.begin();po!=user.end();po++) out<<*po<<endl;

    out.close();

    ofstream out2("tick.txt",ios::out);

    stringstream sss;

    Time now;

    now.loadtime();

    string temp;

    sss<<now.getyear()<<"年"<<now.getmonth()<<"月"<<now.getday()<<"日";

    sss>>temp;

    ofstream out3(temp,ios::out);   //做過的車,就存到日誌文件不在讀取。

    int sum=0;

    for(auto po=tick.begin();po!=tick.end();po++)

    {

        if(now>po->getlea())

        {

            out3<<*po<<endl;

        }

        else sum++;

    }

    out3.close();

    out2<<sum<<endl;

    for(auto po=tick.begin();po!=tick.end();po++)

    {

        if(now>po->getlea()) continue;

        out2<<*po<<endl;

    }

    out2.close();

}

設計體會與小結

課程設計中遇到了一個文件讀寫的問題,讓我很棘手,從來不會覺得自己是文件對不上數據讀取出現問題,開始尋找問題,一開始以爲是文件流寫錯了,開始檢查檢查了好幾遍,最後該手動輸入但是還是有問題,我覺的可能是vector的內存空間不夠了,輸入指針失效了,但是在CSDN只是看到了這個問題,並沒有找到合適的解決方法,系統就到了瓶頸期,只要這個文件讀不進去,整個系統都完蛋了,開始發荒,再檢查一遍還是不對,這個時候還是沒察覺到自己文件有問題,回過頭去重新測重載輸入流,測試發現正確,於是我覺得我的文件出現了問題,去檢查數據文件,數據文件看上去沒問題,發現還是不能正常讀入,於是又回過頭用之前數據類的重載的輸入輸出流測數據,發現有一組數據兩個數之間少了空格,於是輸入int的位置放上了string,才導致錯誤,經過修改後程序終於可以順利運行,但是就因爲一個數據文件,卻耽誤了整整一天,這對於這段段代碼來說,一天不是什麼問題,但是如果真的到了就業,還是犯這種粗枝大葉的毛病的話,那可能不是耽誤自己,而是耽誤一個團隊,從一點小事就反映出,敲代碼是一個謹慎的工作,可能一字之差,帶了結果影響巨大,在這次課程設計中,我通過調代碼的痛苦過程銘記謹小慎微的心態,而不是抱着一種我覺得這樣沒錯,這樣跟我想的一樣,而不真的去檢驗,也沒有考慮的那麼全面,這是我在課程設計中最大的教訓,也是最大收穫。

課程設計中又回顧了很久之前用過的字符串流,很長時間沒有使用確實略顯生疏,但是在摸索下還是上手很快,其他也使用很多的重載運算符,尤其是對於輸入輸出流的重載,這對於文件讀寫來說甚是方便。最重要的是學習了一種文件讀寫的方式,ifstream於oftream的open參數是一個字符串,這是之前沒有發現的事情,只是知道第一個參數可以傳“參數”,但是卻忽略了雙引號就是一個string,在查閱記錄無果後,詢問老師,老師給出了方法,在看了源碼後發現這裏就是一個string,通過傳一個string 參數就可以動態的打開一個文件,也可以動態生成任意文件名儲存到任意路徑。

       通過自己寫代碼發現,思路設計的時候總是眼高手低,覺得這個可以這樣實現,那個可以那樣實現,但是等到真的實現的時候卻發現他並不是那麼輕易的就會被實現,所以設想哥實現了具體操作的時候是有很大的出入的,所以應該在設想的時候就要具體的去設計一些功能,而不是淺顯的覺得這個東西用什麼可以去實現,比如買票,而買票的,厄設計的時候當時想的整個區間都減一,但是卻沒有想到這個票的站臺票和車次車次上的餘票是分開的,而且操作的時候也要分兩步進行操作。

代碼中的不足之處是沒有寫出換乘,一是換乘的實現過程比較複雜,二是數據文件不太支持,所以沒有寫出來是比較遺憾的,沒有把算法和程序結合,這點也是不足之處,需要改進!

 

#include<bits/stdc++.h.>
using namespace std;
class Time
{
    int  year,month,day;
    int hour,mini;
public:
    Time(){loadtime();}
    Time(int y,int m,int d):year(y),month(m),day(d){};   //用於車票生成。
    void loadtime();    //定義時間獲取函數,用於獲取買票時間,直接從系統讀入;
    friend istream & operator>>(istream &in,Time & a);
    friend stringstream & operator>>(stringstream &in,Time & a);
    friend ostream & operator<<(ostream &out,Time & a); //排序函數,用於車票信息的儲存;
    bool operator <(const Time &d)const;   //重載小於號,用於數據時間排序,不需要修改數據const
    int judge() const;  //判斷是否爲閏年;
    int judge(int year) const ;//寫一個有參的判斷函數;
    Time operator +(int  a) ;   //重載加號,用於放票;
     bool operator ==(Time & a) ; //判斷是否爲一天;
    friend int operator -(Time a,Time b);  //計算兩段時間間隔;
    void print()const;//打印時間;
    bool operator>(Time&a);
    int getday(){return day;}
    int getmonth(){return month;}
    int getyear(){return year;}
    int gethour(){return hour;}
    void set();
    void setmonth(int a){month=a;}
    pair<int,int> tksj(Time&b); //停靠時間
    void seth(int a,int b){hour=a;mini=b;}
};
 bool Time ::operator>(Time&a)
 {
      return (year!=a.year)?year>a.year:month!=a.month?month>a.month:day!=a.day?day>a.day:0;
 }
bool Time::operator ==(Time & a)
{
    return (year!=a.year)?0:month!=a.month?0:day!=a.day?0:hour!=a.hour?0:mini==a.mini;
}
Time Time::operator +(int  a)
{
    int m[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    day+=a;
    int flag=1;
   while(day>m[month]){
        if(month==2){
            if(day>m[month]+judge()){
                day-=m[month]+judge();
                month++;
            }
        }
        else {
            day=day-m[month];
            month++;
        }
        if(month>12){
        month-=12;
        year++;
    }
   }
}
int operator -(Time a,Time b)
{
    int monthdays[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } };
    int yeardays[2] = { 365,366 };
    int sumdays=0;
   if (a.year == b.year&& a.month == b.month){
        sumdays = b.day - a.day;
    }
    else
        if (a.year == b.year){
            sumdays += monthdays[a.judge(a.year)][a.month-1] - a.day;
            for (int i = a.month; i < b.month-1; i++)
                sumdays += monthdays[a.judge(a.year)][i];
            sumdays += b.day;
        }
        else{
            sumdays += monthdays[a.judge(a.year)][a.month-1] - a.day;
            for (int i = a.month; i < 12; i++)
                sumdays += monthdays[a.judge(a.year)][i];
            for (int i = a.year + 1; i < b.year; i++)
                sumdays += yeardays[a.judge(i)];
            for (int i = 0; i < b.month - 1; i++)
                sumdays += monthdays[a.judge(b.year)][i];
            sumdays += b.day;
        }
    return sumdays;
}
int Time::judge() const{
        if(year % 4 == 0 && year %100 != 0 ||year % 400 == 0) return 1;
        else return 0;
}
int Time::judge(int year) const{
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)return 1;
    else  return 0;
}
void Time::loadtime(){
    time_t rawtime;
    struct tm *ptminfo;
    time(&rawtime);
    ptminfo = localtime(&rawtime);
    year=ptminfo->tm_year + 1900;
    month=ptminfo->tm_mon + 1;
    day=ptminfo->tm_mday;
    hour=ptminfo->tm_hour;
    mini=ptminfo->tm_min;
}
istream & operator>>(istream &in,Time & a){
    in>>a.year>>a.month>>a.day>>a.hour>>a.mini;
    return in;
}
ostream & operator<<(ostream &out,Time & a)
{
    out<<a.year<<" "<<a.month<<" "<<a.day<<" "<<a.hour<<" "<<a.mini<<' ';
    return out;
}
stringstream & operator>>(stringstream &in,Time & a){
    in>>a.year>>a.month>>a.day>>a.hour>>a.mini;
    return in;
}
bool Time:: operator <(const Time &d)const{
    return year!=d.year?year<d.year:month!=d.month?month<d.month:day!=d.day?hour<d.hour:mini<d.mini;
}
void Time:: print()const
{
      cout<<year<<"年"<<month<<"月"<<day<<"日";
            printf("%02d:%02d\n",hour,mini);
}
void Time::set()//容錯處理
{
        int monthdays[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } };
      cout<<"請依次輸入"<<" 年"<<" 月"<<" 日"<<" 小時"<<" 分鐘"<<endl;
      cin>>year;
      while(year<2019){cout<<"不是正確時間,請重新輸入年"<<endl;cin>>year;}
     cin >>month;
      while(month>12||month<1){cout<<"不是正確時間,請重新輸入月"<<endl;cin>>month;}
     cin>>day;
      while(monthdays[judge()][month-1]<day||day<1){cout<<"不是正確時間,請重新輸入日"<<endl;cin>>day;}
    cin>>hour;
    while(hour>24||hour<0){cout<<"不是正確時間,請重新輸入小時"<<endl;cin>>hour;}
    cin>>mini;
    while(mini>60||mini<0){cout<<"不是正確時間,請重新輸入分鐘"<<endl;cin>>mini;}
    cout<<"時間已更改爲"<<endl;
    print();
}
pair<int,int> Time::tksj(Time &b)//高鐵晚上不開車,不考慮超過一天;
{
    pair<int,int>  w;
    if(mini<b.mini)
    {
       w.second=mini-b.mini+60;
       w.first=hour-b.hour-1;
       return w;
    }
    w.second=mini-b.mini;
    w.first=hour-b.hour;
    return w;
}
/*
int main()
{
    Time demo;
    demo.loadtime();
    cout<<demo<<endl;
    demo.print();
}*/
/*int main()
{
    Time demo1;
    cin>>demo1;
    Time demo2(demo1);
    demo1.print();
}*/
/*
int main()
{
    Time demo;
    cout<<demo.judge()<<endl;
    cout<<demo.judge(2008)<<endl;
}*/
/*
int main()
{
    set<Time>demo;
    Time tx;
    int     n=3;
    while(n--)
    {
        tx.set();
        demo.insert(tx);
    }
     set<Time>::iterator po;
    for(po=demo.begin();po!=demo.end();po++)  (*po).print();
}*/
/*
int main()
{
    Time demo1,demo2;
    demo1.loadtime();
    cin>>demo2;
    cout<<demo2.tksj(demo1).first<<' '<<demo2.tksj(demo1).second;
}*/
struct piao
{
    string name;
    int sum[31];
    bool operator <(const piao& a)const
    {
        return name<a.name;
    }
};
class Station
{
    string name; //車站名唯一
    int crotrain;//經過車次數量
    vector<piao> checi; //第一個string是車次,第二個是餘票
    //這個車站最多買多少張票,不一定跟總票數相同
public:
    Station(string na,int n);
    Station():name(""),crotrain(0){checi.clear();}
    void print(int riqi);
    void insert(string a);//爲站臺增加車次
    vector<piao>& quecheci();
    friend istream&   operator>>(istream &in,Station & a);
    friend   ostream&   operator<<(ostream &out,Station & a);
    bool del(string a);
    bool set(string a,int b,int c);// 如果需要調度餘票,可以修改
    void setname(string a){this->name=a;}
    string getname(){return name;}
    void buytic(string a,int b);
    void rebac(string a,int b);
};
void Station::rebac(string a,int b)
{
    for(auto po=checi.begin();po!=checi.end();po++)
        if(po->name==a) po->sum[b]++;
}
void Station::buytic(string a,int b)
{
    for(auto po=checi.begin();po!=checi.end();po++)
        if(po->name==a) po->sum[b]--;
}
Station::Station(string na,int n)
{
    name=na;
    crotrain=n;
    for(int i=0;i<n;i++)
    {
       cout<<"輸入車次 餘票:\n";
        piao w;
        cin>>w.name;
        for(int i=0;i<31;i++) cin>>w.sum[i];
      checi.push_back(w);
    }
}
istream& operator>>(istream& in,Station & w)
{
    in>>w.name>>w.crotrain;
    //cout<<w.crotrain<<endl;
    for(int i=0;i<w.crotrain;i++)
    {
        piao qq;
        in>>qq.name;
        for(int i=0;i<31;i++) in>>qq.sum[i];
     w.checi.push_back(qq);
    }
    return in;
}
ostream& operator<<(ostream& out,Station & w)
{
    out<<w.name<<" "<<w.crotrain<<endl;
    for(auto po=w.checi.begin();po!=w.checi.end();po++)
    {
        out<<po->name<<endl;
        for(int i=0;i<31;i++)  out<<po->sum[i]<<' ';
        out<<endl;
    }
    return out;
}
void Station::print(int b)
{
    cout<<name<<":"<<endl;
    for(auto po=checi.begin();po!=checi.end();po++)
    {
        cout<<"車次:"<<po->name<<" 餘票:"<<po->sum[b]<<endl;
    }
}
vector<piao>& Station ::quecheci()
{
    return checi;
}
void Station::insert(string a)
{
        piao w;
        w.name=a;
        for(int i=0;i<31;i++) cin>>w.sum[i];
      checi.push_back(w);
}
bool Station::del(string a)
{
    for(auto po=checi.begin();po!=checi.end();po++)
    {
        if(po->name==a) {checi.erase(po);break;}
    }
    if(checi.size()!=crotrain)
    {
        crotrain=checi.size();
        return 1;
    }
    else  return 0;
}
  bool Station::set(string a,int b,int c)
  {
    for(auto po=checi.begin();po!=checi.end();po++)
    {
        if(po->name==a) {
            po->sum[c]=b;
            return 1;
        }
        else return 0;
    }
  }
/*
int main()
{
    int n;
    string a;
    cin>>n>>a;
    Station demo(a,n) ;
    demo.print();
}
*/
/*
int main()
{
    Station demo;
    cin>>demo;
    cout<<demo;
}*/
/*
int main()
{
    Station demo;
    int a;
    string b;
    cin>>b>>a;
    demo.insert(b,a);
    cin>>b>>a;
    demo.insert(b,a);
    vector<pair<string,int>>w=demo.quecheci();
    for(auto po=w.begin();po!=w.end();po++)
        cout<<po->first<<' '<<po->second<<endl;
}*/
/*
int main()
{
    Station demo;
    string a;
    cin>>a;
    demo.setname(a);
    int b;
    cin>>a>>b;
    demo.insert(a,b);
    cin>>a>>b;
    demo.insert(a,b);
    demo.print();
    cin>>a;
    cout<<demo.del(a)<<endl;
    cin>>a;
    cout<<demo.del(a);
    cin>>a>>b;
    cout<<demo.set(a,b)<<endl;
    cin>>a>>b;
    cout<<demo.set(a,b)<<endl;
    demo.print();
}*/
//修改後從新測試,get/set比較比較簡單,一般不會寫錯。
/*
int main()
{
    Station demo;
    string b;
    cin>>b;
    demo.insert(b);
    cin>>b;
    demo.insert(b);
    vector<piao>w=demo.quecheci();
    for(auto po=w.begin();po!=w.end();po++)
       {
            cout<<po->name<<' ';
            for(int i=0;i<31;i++) cout<<po->sum[i]<<' ';
            cout<<endl;
       }

}*/
class Zt  //中規中矩的全家桶數據類
{
    pair<int,int> arrive; //在某站的出發到達時家間;
    pair<int,int> leave;
    string  station;  //作爲數據類時指向vector站臺;
    int piao[31];// 實際上存在多少票,今天五號,五號前的是下個月,五號後是這個月,不能買今天前的票。
public:
    Zt(string  a,int c,int d,int e,int f):station(a){setarrive(c,d);setleave(e,f);fill(piao,piao+31,100);}
    Zt(){fill(piao,piao+31,100);}
     pair<int,int>  &getarrive(){return arrive;}
     pair<int,int>  &getleave(){return leave;}
    int getarr(); //出發時段到達只是時段
    int getlea();
    string getsta()const{return station;}
    void setarrive(int a,int b){arrive.first=a;arrive.second=b;}  //用於修改出站到站時間;
    void setleave(int a,int b){leave.first=a;leave.second=b;}
    void setsta(string  a){station=a;}
    void printtk();
    void print();
    void printa();
     void printl();
    int getpiao(int i){return piao[i];}
    void setpiao(int a,int b){piao[b]=a;}
    friend istream&operator>>(istream &in,Zt& a);
    friend ostream&operator<<(ostream &out,Zt& a);
};
void Zt:: print()
{
    cout<<station<<endl;
    printf("%02d:%02d ",arrive.first,arrive.second);
    //cout<<arrive.first<<arrive.second<<endl;
    printf("%02d:%02d\n",leave.first,leave.second);
   // cout<<leave.first<<leave.second<<endl;
}
void Zt:: printl()
{
    cout<<station<<endl;
    printf("%02d:%02d\n",leave.first,leave.second);
}
void Zt:: printa()
{
    cout<<station<<endl;
    printf("%02d:%02d ",arrive.first,arrive.second);
}
int Zt::getarr()
{
    if(arrive.first>=0||arrive.first<6) return 1;
    else if(arrive.first>=6||arrive.first<12) return 2;
    else if(arrive.first>=12||arrive.first<18) return 3;
    else return 4;
}
int Zt::getlea()
{
    if(leave.first>=0||leave.first<6) return 1;
    else if(leave.first>=6||leave.first<12) return 2;
    else if(leave.first>=12||leave.first<18) return 3;
    else return 4;
}
void Zt::printtk()
{
    cout<<leave.second-arrive.second<<"分鐘 "<<endl;//沒有超過一個小時的;
}
istream&operator>>(istream &in,Zt& a)
{
    in>>a.station;
   // cout<<a.station;
   in>>a.arrive.first;
 //  cout<<a.station;
    in>>a.arrive.second;
//    cout<<a.station;
    in>>a.leave.first;
 //   cout<<a.station;
    in>>a.leave.second;
    //cout<<a.station;
    for(int i=0;i<31;i++) in>>a.piao[i];
    return in;
}
ostream&operator<<(ostream &out,Zt &a)
{
    out<<a.station<<' '<<a.arrive.first<<' '<<a.arrive.second<<' '<<a.leave.first<<' '<<a.leave.second<<' ';
    for(int i=0;i<31;i++) out<<a.piao[i]<<' ';
    out<<endl;
    return out;
}
/*
int main()
{

    string a;
    int b,c,d,e;
     Zt demo(a,b,c,d,e);
    cout<<demo.getpiao(15)<<endl;
}*/
/*
int main()
{
    Zt demo1;
    vector<Zt>demo;
    while(cin>>demo1) demo.push_back(demo1);
    cout<<demo1;
}*/
/*
int main()
{
    short n;
    cin>>n;
    Zt demo(n);
    demo.print();
    demo.printtk();
   cout<<demo.getlea()<<endl;
   cout<<demo.getarr()<<endl;
   cout<<demo.getsta()<<endl;
}
*/
/*
int main()
{
    Zt demo;
   demo.setarrive();
   demo.setleave();
   cout<<demo.getarrive()<<endl;
   cout<<demo.getleave()<<endl;
}
*/
/*
int main()
{
    Zt demo;
    int n;
    cin>>n;
    demo.setpiao(n);
    cout<< demo.getpiao();
}*/
class Train
{
    string train; //車次
    vector<Zt> station;
    vector<string>people;//誰買了票指向peo下標,居題買那張票,再等用戶的數據,或者存身份證。
                //雙重map,不如直接string
    map<string,int> ys;
    struct node
    {
        int val;
        int len;
        int lazy;
        int l,r;
    }tree[31][300005];
public:

    Train():train(""){people.clear();station.clear();}
    Train(string tr):train (tr){people.clear();station.clear();}
    pair<int,int> buytic(string  a,string  b,int riqi);
    void reback(string  a,string  b,int riqi);
    void insert(string  a,int d,int f,int g,int h,string w);
    bool del(string  a);
    void cx(string a); //查到就打印,查不到就拉倒
    void setarrive(string  a);//修改某個站的到站時間出發時間
    void setleave(string a);
    void setsta(string a);
    int cxyp(string a, string b,int c);
    vector<string>&getpeople(){return people;}
   // void printf();無法獲取站臺信息,只能傳引用了
     vector<Zt>& getzt(){return station;}
     friend istream&operator>>(istream& in,Train &a);
     friend ostream&operator<<(ostream& out,Train &a);
     void settr(string a){train=a;}
     string  gettr(){return train;}
     //void built_tree( int node, int left, int right,int day );
  //  void  pushdown(int root,int day)  ;//向下傳遞lazy標記
  //  int query(int root,int l,int r,int day);  //計算區間和
  //  void  update(int root,int l,int r,int addval,int day);  //區間更新
};
/*void Train:: built_tree(int root,int l,int r,int day)  //建樹
{
    int mid;
    tree[day][root].lazy=0;
    tree[day][root].l=l;
    tree[day][root].r=r;
    tree[day][root].len=r-l+1;
    if (l==r) tree[day][root].val=station[l].getpiao(day);
    else
    {
        mid=(l+r)/2;
        built_tree(root*2,l,mid,day);
        built_tree(root*2+1,mid+1,r,day);
        tree[day][root].val=min(tree[day][root*2].val,tree[day][root*2+1].val);
    }
}*/
/*void Train:: pushdown(int root,int day)  //向下傳遞lazy標記
{
    if (tree[day][root].lazy)
    {
        tree[day][root*2].lazy+=tree[day][root].lazy;
        tree[day][root*2+1].lazy+=tree[day][root].lazy;
        tree[day][root*2].val+=tree[day][root].lazy;
        tree[day][root*2+1].val+=tree[day][root].lazy;
        tree[day][root].lazy=0;
    }
}
int Train:: query(int root,int l,int r,int day)  //計算區間和
{
    int mid;
    if (tree[day][root].l>=l&&tree[day][root].r<=r)
        return tree[day][root].val;
    if (tree[day][root].l>r||tree[day][root].r<l)
        return 0x7f7f7f7f;
    if (tree[day][root].lazy) pushdown(root,day);
    return min(query(root*2,l,r,day),query(root*2+1,l,r,day));
}
void Train:: update(int root,int l,int r,int addval,int day)  //區間更新
{
    int mid;
    if (tree[day][root].l>=l&&tree[day][root].r<=r)
    {
        tree[day][root].lazy+=addval;
        tree[day][root].val+=addval;
        return;
    }
    if (tree[day][root].l>r||tree[day][root].r<l)
        return;
    if (tree[day][root].lazy) pushdown(root,day);
    update(root*2,l,r,addval,day);
    update(root*2+1,l,r,addval,day);
    tree[day][root].val=min(tree[day][root*2].val,tree[day][root*2+1].val);
}*/
pair<int,int>  Train::buytic(string  a,string  b,int c)  //站臺的票和列車票是分步的 ,這是買票操作的一部分。
{
    pair<int,int> www;
 //   update(1,ys[a],ys[b],-1,c);
    www=station[ys[a]].getleave();
    return www;
}
void  Train::reback(string  a,string  b,int riqi)
{
   //update(1,ys[a],ys[b],1,riqi);
}
void Train::insert(string  a,int d,int f,int g,int h,string w)
{
   Zt tem(a,d,f,g,h);
   if(w=="END"||w=="end"||w=="End")
   {
       station.push_back(tem);
       ys.insert(make_pair(a,station.size()-1));
   }
   else {
        station.insert(station.begin()+ys[w],tem);
        for(auto po=station.begin()+ys[w]-1;po!=station.end();po++)
        {
            ys.insert(make_pair(po->getsta(),po-station.begin()));
        }
   }
//    for(int i=0;i<=31;i++)built_tree(0,0,station.size()-1,i);
}
int  Train::cxyp(string  a,string  b,int c)
{
   //  return  query(1,ys[a],ys[b],c);
}
/*
void Train::print()
{
    for(auto po=station.begin();po!=station.end();po++)
    {
        cout<<
    }
}*/
bool  Train::del(string  a)
{
    bool flag=0;
    for(auto po=station.begin();po!=station.end();po++)
    {
        if(po->getsta()==a)
        {
            station.erase(po);
            flag=1;
            break;
        }
    }
    return flag;
}
void  Train::cx(string  a)
{
    for(auto po=station.begin();po!=station.end();po++)
    {
        if(po->getsta()==a)
        {
            po->print();
            po->printtk();
            break;
        }
    }
}
void Train::setarrive(string   a)
{
    for(auto po=station.begin();po!=station.end();po++)
    {
        if(po->getsta()==a)
        {
            int a,b;
            cin>>a>>b;
            po->setarrive(a,b);
            break;
        }
    }
}
void Train:: setleave(string  a)
{
    for(auto po=station.begin();po!=station.end();po++)
    {
        if(po->getsta()==a)
        {
            int a,b;
            cin>>a>>b;
            po->setleave(a,b);
            break;
        }
    }
}
void  Train::setsta(string  a)
{
    for(auto po=station.begin();po!=station.end();po++)
    {
        if(po->getsta()==a)
        {
            po->setsta(a);
            break;
        }
    }
}
istream&operator>>(istream& in,Train &a)
{
    //vector<Zt> ww;
    a.ys.clear();
    int m,n;
            Zt demo;
    in>>a.train>>n>>m;//=0;
    while(n--)
    {
        in>>demo;
        a.station.push_back(demo);
        a.ys.insert(make_pair(demo.getsta(),a.station.size()-1));
      //  cout<<ww.station.size()<<endl;
    }
   // a.station.swap(ww);
    while(m--)
    {
        string w;
        in>>w;
       a. people .push_back(w);
    }
//    for(int i=0;i<=31;i++)a.built_tree(0,0,a.station.size()-1,i);
    return in;
}
ostream&operator<<(ostream& out,Train &a)
{
    out<<a.train<<' '<<a.station.size()<<' '<<a.people.size()<<endl;
    for(auto po=a.station.begin();po!=a.station.end();po++) out<<*po<<' ';
    for(auto po=a.people.begin();po!=a.people.end();po++) out<<*po<<' ';
    out<<endl;
    return out;
}
/*
int main()
{
    Train demo;
    cin>>demo;
    cout<<demo;
}*/
/*
int main()
{
    Train demo;
    short a,b;
    int c;
    cin>>a>>c;
    demo.insert(a,c);
    cin>>b>>c;
    demo.insert(b,c);
    cout<<demo.cxyp(a,b)<<endl;
    demo.buytic(a,b);
    cout<<demo.cxyp(a,b)<<endl;
    demo.reback(a,b);
    cout<<demo.cxyp(a,b)<<endl;
}
*/
/*
int main()
{
    Train demo;
    cin>>demo;
    short int a;
    cin>>a;
    demo.cx(a);
    demo.del(a);
    demo.cx(a);
    cin>>a;
    demo.setarrive(a);
        demo.cx(a);
    demo.setleave(a);
        demo.cx(a);
    demo.setsta(a);
        demo.cx(a);
}*/
/*
int main()
{
    Train demo;
    cin>>demo;
    cout<<demo.gettr()<<endl;
    string tem;
    cin>>tem;
    demo.settr(tem);
    cout<<demo.gettr()<<endl;
}*/

int main()
{
    Train demo;
    cin>>demo;
    string a,b;
    int c;
   int d,e,f,g;
  cin>>a>>d>>e>>f>>g>>b;
  demo.insert(a,d,e,f,g,b);
    cin>>a>>b>>c;
    cout<<demo.cxyp(a,b,c)<<endl;
    cin>>a>>b>>c;
     cout<<demo.cxyp(a,b,c)<<endl;
    demo.buytic(a,b,c);
     cout<<demo.cxyp(a,b,c)<<endl;
     demo.reback(a,b,c);
      cout<<demo.cxyp(a,b,c)<<endl;
}
class Tick //即使車票,又是記錄
{
    Time buy;
    Time leave; //出發時間,用於確定存日誌文件
    string  from;
    string  to;
    string id;
    string name;
public:
    //只有get函數
    Tick():from(" "),to(" "),id(" "){}
    Tick(Time b,Time l,string f,string t,string i,string w):buy(b),leave(l),from(f),to(t),id(i),name(w){}
    Time&getbuy(){return buy;}
    Time&getlea(){return leave;}
    string getfrom(){return from;}
    string getto(){return to;}
    string getid(){return id;}
    string getname();//本來想hash,但是有點複雜
   void print();
   string getna(){return name;}
    bool operator ==(Tick &a);
    friend istream& operator>>(istream& in,Tick &a );
    friend ostream& operator<<(ostream &out,Tick &a );
};
string Tick::getname()
{
    string w;
    stringstream tem;
    w.clear();
    tem.clear();
    tem<<leave.getday();
    tem<<leave.getmonth();
    tem<<leave.getyear();
    tem>>w;
    w=w+id+from+to;
    return w;
}
bool Tick::operator ==(Tick &a)
{
   return a.buy==buy?(a.leave==leave?(from==a.from?(to==a.to?id==a.id:0):0):0):0;
}
istream& operator>>(istream &in,Tick &a )
{
    in>>a.buy>>a.leave>>a.from>>a.to>>a.id>>a.name;
    return in;
}
ostream& operator<<(ostream &out,Tick &a )
{
    out<<a.buy<<' '<<a.leave<<' '<<a.from<<' '<<a.to<<' '<<a.id<<' '<<a.name<<endl;
    return out;
}
void Tick::print()
{
    cout<<leave<<endl;
    cout<<from<<"----->"<<to<<endl;
    cout<<id<<endl;
}/*
int main()
{
    Tick demo;
    cin>>demo;
    cout<<demo.getname()<<endl;
}*/
/*
int main()
{
    Tick demo;
    cin>>demo;
    cout<<demo;
}
*/
/*
int main()
{
    Time demo1,demo2;
    short a,b;
    string  id;
    cin>>demo1>>demo2>>a>>b>>id;
    Tick demo(demo1,demo2,a,b,id);
    cout<<demo.getbuy()<<endl;
    cout<<demo.getlea()<<endl;
    cout<<demo.getfrom()<<endl;
    cout<<demo.getto()<<endl;
    cout<<demo.getid()<<endl;
}*/
/*
int main()
{
    string a,b,c;
    cin>>a>>b>>c;
    Time q, e;
    cin>>q>>e;
    Tick demo(q,e,a,b,c);
    cout<<demo;
    demo.print();
}*/
/*
int main()
{
    Tick demo;
    cin>>demo;
    demo.print();
}*/
class User//用戶信息
{
    string name;
    string id;  //不能改
    vector<string > tic;
    string phone;
    string key;
    bool ban;//黑名單
public:
    User():name(""),id(""),phone(""){tic.clear();}
    User(string a,string b,string c):name(a),id(b),phone(c){tic.clear();}
    void buytic(string  a){   tic.push_back(a);} //只考慮買就行了,判斷能不能買在下面的類.
    void setph(string p){    phone=p;}
    vector<string >& gettic(){return tic;}
    string getname(){return name;}
    string getphone(){return phone;}
    string getid(){return id;}
    string getkey(){return key;}
    void del(string  a);  //這是系統操作出行後,就看不到訂單了。
    int getboupiao(){return tic.size();}
    bool getban(){return ban;}
    friend istream&operator>>(istream&in,User&a);
    friend ostream&operator<<(ostream&out,User&a);
};
void User::del(string  a)
{
   for(auto po=tic.begin();po!=tic.end();po++)
   {
       if(*po==a) tic.erase(po);
   }
}
istream&operator>>(istream&in,User&a)
{
    int w;
    in>>a.name>>a.id>>a.phone>>a.key>>a.ban>>w;
    while(w--)  //一個月前的就不讀了
    {
        string  q;
        in>>q;
        int dday=(q[0]-'0')*10+(q[1]-'0');
        int dmonth=(q[2]-'0')*10+(q[3]-'0');
        int dyear=(((q[4]-'0')*10+(q[5]-'0'))*10+(q[6]-'0'))*10+(q[7]-'0');
        Time tem(dyear,dmonth,dday);
        Time now;
        now.loadtime();
        if(now>tem) continue;
        a.tic.push_back(q);
    }
    return in;
}
ostream&operator<<(ostream&out,User&a)
{
    out<<a.name<<' '<<a.id<<' '<<a.phone<<' '<<a.key<<' '<<' '<<a.ban<<' '<<a.tic.size()<<endl;
    for(auto po=a.tic.begin();po!=a.tic.end();po++) out<<*po<<' ';
    return out;
}
/*
int main()
{
    User demo;
    cin>>demo;
    cout<<demo;
}
*/
/*
int main()
{
    string name,id,phone;
    cin>>name>>id>>phone;
    User demo(name,id,phone);
    cout<<demo.getname()<<endl;
    cout<<demo.getid()<<endl;
    cout<<demo.getphone()<<endl;
    cin>>phone;
    demo.setph(phone);
    cout<<demo.getphone()<<endl;
}
*/
/*
int main()
{
    User demo;
    int a;
    cin>>a;
    demo.buytic(a);
    cin>>a;
    demo.buytic(a);
    vector<int>   w=demo.gettic();
    for(auto po=w.begin();po!=w.end();po++)cout<<*po<<endl;
    cin>>a;
    demo.del(a);
    w=demo.gettic();
    for(auto po=w.begin();po!=w.end();po++)cout<<*po<<endl;
}*/
class Baseque //查詢類
{
protected:
    //12306所有的都具有唯一性。
    vector<Station> station;//列車裏的int(站臺編號)對應station的int;
    map<string,int>natosta;
    vector<Train> train;
    map<string,int>checitotrain;
   // vector<User> user;
  //  map<string,int> idtouser;
  //  vector<Tick> tick;
//    map<int,int> nutotic;
public:
    Baseque(){station.clear();natosta.clear();train.clear();checitotrain.clear();load();}
    void czcc(string a,int b,int d);
    void  cxcx(string a);
    bool cxyp(string a,string b,int c);
    void load();
    void save();
   //void insert()
    ~Baseque(){save();}
};
    /*void Baseque;;insert()
    {
        Train  tem2;
        while(    cin>>tem2)
            {
                 cout<<-2;  //手動調試點

         if(tem2.gettr()=="$$") continue;
         train.push_back(tem2);
         checitotrain.insert(make_pair(tem2.gettr(),train.size()-1));

            }
    }*/
void Baseque ::czcc(string a,int b,int d)
{
    vector<piao>w=station[natosta[a]].quecheci();
    for(auto po=w.begin();po!=w.end();po++)
    {
       vector<Zt> q= train[checitotrain[po->name]].getzt();
       for(auto pi=q.begin();pi!=q.end();pi++)
       {
            if(a==pi->getsta())
             {
                 if(pi->getarr()==b||b==0||pi->getlea()==d||d==0)
                 {
                      cout<<po->name<<endl;
                     if(pi!=q.begin())
                     {
                            q.begin()->printl();

                           // cout<<1<<endl;
                            if(pi==q.end()-1)
                            {
                                (q.end()-1)->printa();
                               //cout<<2<<endl;
                                    cout<<endl;
                            }
                            else
                            {
                                pi->print();
                                  //   cout<<endl;
                                (q.end()-1)->printa();
                               //  cout<<3<<endl;
                            }
                             cout<<endl;
                     }
                     else
                     {
                                q.begin()->printl();
                                (q.end()-1)->printa();
                                cout<<endl;
                     }
                     cout<<endl;
                 }
             }
           //  pi->print();

       }
      //  cout<<endl;
    }
}
void Baseque ::cxcx(string a)  //車次查詢
{
    if(checitotrain.find(a)==checitotrain.end())
    {
        cout<<"NO Train"<<endl;
        return ;
    } //查不到不打印
    vector<Zt> w=train[checitotrain[a]].getzt();
    for(auto po=w.begin();po!=w.end();po++)
    {
        cout<<station[natosta[po->getsta()]].getname()<<' ';
        if(po!=w.begin()&&po!=w.end()-1)
        {
            po->print();
           //cout<< po->getleave().first<<' '<<po->getleave().first;
        }
          else if(po==w.begin())
          {
               cout<< po->getleave().first<<' '<<po->getleave().first;
          }
          else   cout<<po->getarrive().first<<' '<< po->getarrive().second<<' ';
    }
    cout<<endl;
}
bool Baseque :: cxyp(string a,string b,int riqi)
{
    auto w=station[natosta[a]].quecheci();
    auto v=station[natosta[b]].quecheci(); //vector<pair<string,int>> checi
    set<piao>tem;
    vector<piao>temp;
    temp.clear();
    for(auto po=w.begin();po!=w.end();po++) tem.insert(*po);
    for(auto po=v.begin();po!=v.end();po++)
    {
        if(tem.insert(*po).second==0) temp.push_back(*po);
    }
    if(temp.size()==0)
    {
        cout<<"No ticket"<<endl;
        return 0 ;
    }
    for(auto po=temp.begin();po!=temp.end();po++)
    {
       auto x= train[checitotrain[po->name]].getzt();
       int mini=po->sum[riqi];
       int ss=train[checitotrain[po->name]].cxyp(a,b,riqi);
       mini=min(mini,ss);
       cout<<train[checitotrain[po->name]].gettr()<<endl;;
       for(auto pi=x.begin();pi!=x.end();pi++) //336
       {
            //cout<<s
            pi->print();
       }
       cout<<mini<<endl;
    }
    return 1;
}
void Baseque::load()
 {
     int x,y,n;
    ifstream in1("station.txt",ios::in);
    in1>>n;
     while(    n--)
     {
              Station tem1;
          in1>>tem1;
            //      cout<<-1; 手動調試點
         if(tem1.getname()=="$$") continue;
         station.push_back(tem1);
         natosta.insert(make_pair(tem1.getname(),station.size()-1));
     //    cout<<1;

     }
     in1.close();
     ifstream in2("train.txt",ios::in);

     in2>>n;
       while(n--   )
    {
             Train tem2;
         in2>>tem2;
                // cout<<-2;  //手動調試點

         if(tem2.gettr()=="$$") continue;
         train.push_back(tem2);
         checitotrain.insert(make_pair(tem2.gettr(),train.size()-1));
    }
    in2.close();
}
void Baseque::save()
 {
  ofstream out1("station.txt",ios::out);
  out1<<station.size()<<endl;
     for(auto po=station.begin();po!=station.end();po++)
        out1<<*po<<endl;
    out1.close();
    ofstream out2("train.txt",ios::out);
    out2<<train.size()<<endl;
     for(auto po=train.begin();po!=train.end();po++)
        out2<<*po<<endl;
        out2.close();
 }
 /*
int main()
{
    Baseque demo;
    cin>>demo;
    cout<<demo;
}
*/
/*
int main()
{
    Baseque demo;
    string a;
    int c;
    int b;
    cin>>a>>b>>c;
    demo.czcc(a,b,c);
    cin>>a>>b>>c; //一天分四個時段查詢。5就查不到
    demo.czcc(a,b,c);
}*/
/*
int main()
{
    Baseque demo;
    string a;
    int c;
    int b;
    cin>>a;//>>b>>c;
    demo.cxcx(a);
    cin>>a;//>>b>>c;
    demo.cxcx(a);
}
*/
/*
int main()
{
    Baseque demo;
    string a,b;
    cin>>a>>b;
    demo.cxyp(a,b);
}
*/
/*
int main()
{
    Baseque demo;
}*/
class Client:public Baseque
{
protected:
    vector<User> user;
    map<string,int> idtouse;
    vector<Tick>tick;
    map<string,int> hashtotick;
    int now;//用於記錄當前用戶
    string now2;
public:
        Client(){load2();}
    void load2();
    void save2();
    bool buytic(string a,string b,int c);
    void reback();
    void replacetic();
    virtual void login();
    void setphone(string a);
    void printmp();
    ~Client(){save2();}
};
 void Client::printmp()
 {
    auto ww=user[now].gettic();
    for(auto po=ww.begin();po!=ww.end();po++)
    {
        cout<<po-ww.begin()+1<<endl;
       tick[ hashtotick[*po]].print();
    }
 }
bool Client::buytic(string a,string b,int c) //先查後買,查不到不能買。
{
    if(!(cxyp(a,b,c))){cout<<"無票"<<endl;return 0;}
    if(user[now].getboupiao()>5||user[now].getban())
    {
        cout<<"購票限制"<<endl;
        return 0;
    }
   else
    {
        string id;
        cin>>id;
        pair<int,int>www=train[checitotrain[id]].buytic(a,b,c);
        station[natosta[a]].buytic(a,c);
        Time no1,no2;
        no1.loadtime();
        no2.loadtime();
        no2.seth(www.first,www.second);
        if(no2.getday()<c) no2.setmonth(no2.getmonth()+1);
        Tick tem(no1,no2,a,b,now2,id);
        tick.push_back(tem);
        hashtotick.insert(make_pair(tem.getname(),tick.size()-1));
        user[now].buytic(tem.getname());
    }
    return 1;
}
void Client::reback() //先查後買,查不到不能買。
{
        printmp();
        string id=now2;
        int n;
        cout<<"退哪一張票"<<endl;
        cin>>n;
        n=n-1;
    auto ww=user[now].gettic();
 string a=tick[ hashtotick[ww[n]]].getfrom();
         cout<<1<<endl;;
      string b=tick[ hashtotick[ww[n]]].getto();
         cout<<2<<endl;;
       int c=tick[ hashtotick[ww[n]]].getlea().getday();
         cout<<3<<endl;;
        train[checitotrain[id]].reback(a,b,c);
        cout<<4<<endl;;
         string e=tick[ hashtotick[ww[n]]].getna();
       station[natosta[a]].rebac(e,c);
        cout<<5<<endl;;
     // tick.erase(hashtotick[ww[n]]+tick.begin());

}
void Client::replacetic()
{
    string a,b,id;
    int c;
    cin>>a>>b>>c;
  if(  buytic(a,b,c))
   {
        cin>>a>>b>>c;
        reback();
   }
}
void Client::setphone(string a)
{
    user[now].setph(a);
}
void Client::login()
{
    string phone;
    string key;
    while(cin>>phone>>key)
    {
           for(auto po=user.begin();po!=user.end();po++)
           {
               if(po->getphone()==phone)
                   if(po->getkey()==key)
                    {
                        cout<<"Login prosperity"<<endl;
                        now=po-user.begin();
                        now2=po->getid();
                        return ;
                    }
           }
           cout<<"Wrong password"<<endl;
    }
}
void Client::load2()
{
    ifstream in("user.txt",ios::in);
    int n;
    if(!in) return ;
    in>>n;
    while(n--)
    {
        User tem;
        in>>tem;
        user.push_back(tem);
        idtouse.insert(make_pair(tem.getname(),user.size()-1));
    }
    in.close();
    ifstream in2("tick.txt",ios::in);
    if(!in2) return ;
    in2>>n;
    while(n--)
    {
        Tick tem;
        in2>>tem;
        if(tem.getname()=="$$$") continue;
        tick.push_back(tem);
        hashtotick.insert(make_pair(tem.getname(),tick.size()-1));
    }
    in.close();
}
void Client::save2()
{
    ofstream out("user.txt",ios::out);
    out<<user.size()<<endl;
    for(auto po=user.begin();po!=user.end();po++) out<<*po<<endl;
    out.close();
    ofstream out2("tick.txt",ios::out);
    stringstream sss;
    Time now;
    now.loadtime();
    string temp;
    sss<<now.getyear()<<"年"<<now.getmonth()<<"月"<<now.getday()<<"日";
    sss>>temp;
    ofstream out3(temp,ios::out);   //做過的車,就存到日誌文件不在讀取。
    int sum=0;
    for(auto po=tick.begin();po!=tick.end();po++)
    {
        if(now>po->getlea())
        {
            out3<<*po<<endl;
        }
        else sum++;
    }
    out3.close();
    out2<<sum<<endl;
    for(auto po=tick.begin();po!=tick.end();po++)
    {
        if(now>po->getlea()) continue;
        out2<<*po<<endl;
    }
    out2.close();
}
/*
int main()
{
    Client demo;
    //demo.login();
}*/

/*int main()
{
    Client demo;
    demo.login();//登陸密碼18053176044 123456
    string a,b;
    int riqi;
    cin>>a>>b>>riqi;
    demo.buytic(a,b,riqi);
    demo.cxyp(a,b,riqi);
}*/
/*
int main()
{
    Client demo;
    demo.login();
    string a,b;
    int riqi;
    cin>>a>>b>>riqi;
    demo.buytic(a,b,riqi);
    demo.reback();
    demo.cxyp(a,b,riqi);
}*/
class Admin:public Client
{
public:
    void login(){}
    void insertsta();
    bool delsta(string a);
    void setsta(string a);
    void inserttr();
    bool deltr(string a);
    void settr(string a);
};
void Admin:: insertsta()
{
    Station tem1;
    cin>>tem1;
    station.push_back(tem1);
    natosta.insert(make_pair(tem1.getname(),station.size()-1));
}
bool Admin::delsta(string a)
{
    for(auto po=station.begin();po!=station.end();po++)
    if(po->getname()==a)
    {
        vector<piao> ww=po->quecheci();
        for(auto pi=ww.begin();pi!=ww.end();pi++)
            train[checitotrain[pi->name]].del(a);
        station.erase(po);
        return 1;
    }
    cout<<"無此車站"<<endl;
    return 0;
}
void Admin::setsta(string a)
{
    if(!delsta(a))return ;
    insertsta();
    return ;
}
void Admin::inserttr()
{
    Train tem2;
    cin>>tem2;
    train.push_back(tem2);
    checitotrain.insert(make_pair(tem2.gettr(),train.size()-1));
    return ;
}
bool Admin::deltr(string a)
{
    for(auto po=train.begin();po!=train.end();po++)
    if(po->gettr()==a)
    {
        vector<Zt> ww=po->getzt();
        for(auto pi=ww.begin();pi!=ww.end();pi++)
            station[natosta[pi->getsta()]].del(a);
        train.erase(po);
                return 1;
    }
    cout<<"無此高鐵"<<endl;
    return 0;
}
void Admin::settr(string a)
{
    if(!deltr(a))return ;
    inserttr();
}
/*
int main()
{
    Admin demo;
    demo.insertsta();
    string a;
    cin>>a;
    demo.delsta(a);
  //  cout<<1<<endl;
    demo.insertsta();
    cin>>a;
    demo.setsta(a);
   // cout<<2<<endl;
}*/
/*
int main()
{
    Admin demo;
    demo.inserttr();
}*/
/*
int main()
{
    Admin demo;
    demo.inserttr();
     string a;
    cin>>a;
    demo.deltr(a);
}*/
/*
int main()
{
    Admin demo;
    demo.inserttr();
    string a;
    cin>>a;
    demo.settr(a);
 //   cout<<2<<endl;
}
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章