#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;
}
转载于:https://blog.51cto.com/lichong258/1623418