#include<iostream>

#include<string>

#include<vector>

#include<fstream>

#include<set>

using namespace std;

 

//使用宏定义输出文件名

#define file_name "bus.txt"

 

//Bus类

class Bus

{

public:

    //编号、名称、类型、起点站和终点站

    //公交编号在生成公交车信息时同时生成,每输入一辆公交车信息编号顺序加1。

    string name;//名称

    int leixing;//类型:0.其它.1.普通车、2.空调车、3.双层车

    string qidian,zhongdian;//起点、终点站

    Bus(string nam1,int typ,string qd,string zd) //带参数构造

    {

        name=nam1;

        leixing=typ;

        qidian=qd;

        zhongdian=zd;

    }

};

 

//全局Global类

class Global

{

public:

    vector<Bus> bus; 

    bool addBus(string nam1,int typ,string qd,string zd);

    bool deleteBus(int num);

    void displayBus(vector<Bus>::iterator iter1);

    void Global::displayAllBus();

    void findBus1(string nam1);

    void findBus2(int typ);

    void findBus3(string qd);

    void findBus4(string zd);

    void readfromtxt();

    void savetxt();

    void allStop();

} ans;

 

//添加车辆

bool Global::addBus(string nam1,int typ,string qd,string zd)

{

    Bus tmp(nam1,typ,qd,zd);

    for(int i=0;i<bus.size();i++)

    {

        if( nam1==bus[i].name )

        {

            cout << "该名称的公交车已经存在" << endl;

            return false;

        }

    }

    bus.push_back(tmp);

    cout<< "添加公交车"<<tmp.name<<"成功" << endl;

    return false;

}

 

//删除车辆

bool Global::deleteBus(int num)

{

    if(num>bus.size()||num<1)

    {

        cout << "编号输入错误" << endl;

        return false;

    }

    vector<Bus>::iterator iter1;

    iter1=bus.begin()+num-1;

    bus.erase(iter1);

    return true;

}

 

//显示全部信息(调用显示单一车辆的方法)

void Global::displayAllBus()

{

    编号、名称、类型、起点站和终点站

    if( bus.size()==0 )

    {

        cout << "没有车辆信息" << endl;

        return;

    }

    cout << "编号\t名称\t类型\t起点站\t\t终点站" << endl;  

    for(vector<Bus>::iterator iter1=bus.begin();iter1!=bus.end();iter1++)

    {

        displayBus(iter1);

    }

}

 

//显示单一车辆

void Global::displayBus(vector<Bus>::iterator iter1)

{

    cout << (int)(iter1-bus.begin()+1) << "\t" << iter1->name << "\t";

    switch( iter1->leixing )

    {

    case 1:cout << "普通车";break;

    case 2:cout << "空调车";break;

    case 3:cout << "双层车";break;

    default:cout << "其它";break;

    }

    cout << "\t" << iter1->qidian << "\t\t" << iter1->zhongdian <<endl;

}

 

//用STL的set实现无重复显示全部车站

void Global::allStop()

{

    if( bus.size() == 0 )

    {

        cout << "无车辆信息,无法查询" << endl;

        return;

    }

    set<string> alstop;

    for(vector<Bus>::iterator iter1=bus.begin();iter1!=bus.end();iter1++)

    {

        if( !alstop.count( iter1->qidian ) )

            alstop.insert( iter1->qidian );

        if( !alstop.count( iter1->zhongdian) )

            alstop.insert( iter1->zhongdian);

    }

    cout << "所有的车站:" << endl;

    for(set<string>::iterator iter2=alstop.begin();iter2!=alstop.end();iter2++)

    {

        cout << *iter2 << " ";

    }

    cout << endl;

}

 

//按名称查找

void Global::findBus1(string nam1)

{

    bool flag(true);

    for(vector<Bus>::iterator iter1=bus.begin();iter1!=bus.end();iter1++)

    {

        if( iter1->name==nam1 )

        {

            if(flag) {

                cout << "编号\t名称\t类型\t起点站\t终点站" << endl;

                flag=false;

            }

            displayBus(iter1);

        }

    }

    if(flag)

    {

        cout << "没有找到名称为" << nam1 << "的公交车" << endl;

    }

}

 

//按类型查找

void Global::findBus2(int typ)

{

    //cout << "0.其它 1.普通车 2.空调车 3.双层车" << endl;

    bool flag(true);

    for(vector<Bus>::iterator iter1=bus.begin();iter1!=bus.end();iter1++)

    {

        if( iter1->leixing==typ )

        {

            if(flag) {

                cout << "编号\t名称\t类型\t起点站\t终点站" << endl;

                flag=false;

            }

            displayBus(iter1);

        }

    }

    if(flag)

    {

        cout << "没有找到类型为";

        switch( typ )

        {

        case 1:cout << "普通车";break;

        case 2:cout << "空调车";break;

        case 3:cout << "双层车";break;

        default:cout << "其它";break;

        }

        cout << "的公交车" << endl;

    }

}

 

//按起点查找

void Global::findBus3(string qd)

{

    bool flag(true);

    for(vector<Bus>::iterator iter1=bus.begin();iter1!=bus.end();iter1++)

    {

        if( iter1->qidian==qd )

        {

            if(flag) {

                cout << "编号\t名称\t类型\t起点站\t终点站" << endl;

                flag=false;

            }

            displayBus(iter1);

        }

    }

    if(flag)

    {

        cout << "没有找到起点为" << qd << "的公交车" << endl;

    }

}

 

//按终点查找

void Global::findBus4(string zd)

{

    bool flag(true);

    for(vector<Bus>::iterator iter1=bus.begin();iter1!=bus.end();iter1++)

    {

        if( iter1->zhongdian==zd )

        {

            if(flag) {

                flag=false;

                cout << "编号\t名称\t类型\t起点站\t终点站" << endl;

            }

            displayBus(iter1);

        }

    }

    if(flag)

    {

        cout << "没有找到终点为" << zd << "的公交车" << endl;

    }

}

 

//读取文件 文件名在程序最上面

void Global::readfromtxt()

{

    ifstream fin(file_name);

    string nam1,qd,zd;

    int typ;

    while(fin >> nam1 >> typ >> qd >> zd)

    {

        addBus(nam1,typ,qd,zd);    

    }

    fin.close();

    cout << "读取到" << bus.size() << "组数据" << endl;

    system("pause");

}

 

 

//存储文件,文件名在程序最上面

void Global::savetxt()

{

    ofstream fout(file_name);

    for(vector<Bus>::iterator iter1=bus.begin();iter1!=bus.end();iter1++)

    {

        fout << iter1->name << endl;

        fout << iter1->leixing << endl;

        fout << iter1->qidian << endl;

        fout << iter1->zhongdian << endl;

    }

    fout.close();

    cout << "存储完毕" << endl;

}

 

//添加车辆菜单

void menu_add()

{

    cout << "->添加车辆" << endl;

    cout << "您正在添加第" << ans.bus.size()+1 <<"辆车" << endl;

    cout << "请输入车辆名称:" << endl;

    string name,qidian,zhongdian;

    int typ;

    cin >> name;

    cout << "请输入车辆类型:" << endl << "0.其它 1.普通车 2.空调车 3.双层车" << endl;

    cin >> typ;

    cout << "请输入车辆起点:" << endl;

    cin >> qidian;

    cout << "请输入车辆终点:" << endl;

    cin >> zhongdian;

    ans.addBus(name,typ,qidian,zhongdian);

    return;

}

 

//删除菜单

void menu_del()

{

    cout << "->删除车辆" << endl;

    if( ans.bus.size()==0 )

    {

        cout << "没有车辆信息,无法执行删除操作" << endl;

        return;

    }

    ans.displayAllBus();

    cout << "请选择要删除的车辆的编号:" << endl;

    int ipt;

    cin >> ipt;

    if(ans.deleteBus(ipt)) cout << "删除成功" << endl;

    else cout << "删除失败" << endl;

    return;

}

 

//查找菜单

void menu_find()

{

    cout << "->查找车辆" << endl;

    cout << "请选择查找方式:" << endl;

    cout << "1.按名称" << endl;

    cout << "2.按类型" << endl;

    cout << "3.按起点" << endl;

    cout << "4.按终点" << endl;

    cout << "5.返回" << endl;

    int ipt,typ;

    string str;

    cin >> ipt;

    switch(ipt)

    {

    case 1:cout << "请输入要查找的车辆名称:" << endl;cin >> str;

        ans.findBus1(str);

        break;

    case 2:cout << "请输入要查找的车辆类型:" << endl << "0.其它 1.普通车 2.空调车 3.双层车" << endl;cin >> typ;ans.findBus2(typ);break;

    case 3:cout << "请输入要查找的车辆起点:" << endl;cin >> str;ans.findBus3(str);break;

    case 4:cout << "请输入要查找的车辆终点:" << endl;cin >> str;ans.findBus4(str);break;

    case 5:return;

    default:cout << "输入有误" << endl;

    }

}

 

//主菜单

void menu1()

{

    int ipt;

    system("cls");

    while(true)

    {

        cout << "----------------------------------" << endl;

        cout << "     欢迎使用公交信息管理系统     " << endl;

        cout << "----------------------------------" << endl << endl;

        cout << "请选择您要进行的操作:" << endl;

        cout << "      1.添加车辆" << endl;

        cout << "      2.删除车辆" << endl;

        cout << "      3.显示全部车辆" << endl;

        cout << "      4.查找车辆" << endl;

        cout << "      5.查看所有车站" << endl;

        cout << "      6.储存到文件" << endl;       

        cout << "      7.退出程序" << endl;

        cin >> ipt;

        switch(ipt)

        {

        case 1:menu_add();break;

        case 2:menu_del();break;

        case 3:ans.displayAllBus();break;

        case 4:menu_find();break;

        case 5:ans.allStop();break;

        case 6:ans.savetxt();break;

        case 7:exit(0);break;

        default:cout << "输入有误,请重新输入" << endl;break;

        }

        system("pause");

        system("cls");

    }  

}

 

//程序入口,选择数据来源

int main()

{

    int ipt1;

    string str1;

    cout << "----------------------------------" << endl;

    cout << "     欢迎使用公交信息管理系统     " << endl;

    cout << "----------------------------------" << endl << endl;

     

retry:  cout << "请选择数据来源:" << endl;

    cout << "1.从文件读入" << endl;

    cout << "2.键盘录入" << endl;

    cout << "请输入:" << endl;

    cin >> ipt1;

    switch(ipt1)

    {

    case 1:ans.readfromtxt();break;

    case 2:break;

    default:cout << "输入错误,请重新输入" << endl;goto retry;break;

    }

    menu1();

    return 0;

}