本文主要是介绍c++面向对象练习:西安市地铁售票系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
c++面向对象练习:西安市地铁售票系统
- 自定义三个类
- 每个类的详细信息
- 地铁线路类
- 地图类
- 数据类
- 测试代码
- 测试结果
- 目前存在的问题
自定义三个类
地铁线路类:保存本条线路的所有站点信息和换乘车站信息。
地图类:保存所有地铁线路,根据用户的起始站和终点站可以计算本次车费。
数据类:地铁线路的数据来源。
每个类的详细信息
地铁线路类
#ifndef MYROUTER_H
#define MYROUTER_H
#include <vector>
#include <map>
#include <iostream>
#include "dataconfig.h"
using namespace std;class MyRouter
{
public:MyRouter(string num = "1");//输入乘车站点,遍历vector,返回值是一个vector第几个站点int getStationNo(const string & station);string getRouterNumber();void printThisTrip();//计算乘车站点和下车站点之间总共几站路。int getDistance( const string & startStation, const string & endStation );friend ostream & operator << ( ostream & out, const MyRouter & router );
private:void setStartStation(const string & station);void setEndStation(const string & station);string mStrName; //几号线string startStation;int startNum;string endStation;int endNum;vector<string> stations;map<string, string> changeStations;
};#endif // MYROUTER_H
#include "myrouter.h"
#include <stdio.h>MyRouter::MyRouter(string num):mStrName(num)//几号线
{DataConfig dataConfig;//判断一下map中是否有key为num的键值对,如果有,返回1,没有返回0if (dataConfig.mLineStations.count(num)){stations = dataConfig.mLineStations.at(num);changeStations = dataConfig.mLineChangeStations.at(num);startStation = stations[0];endStation = stations[stations.size() - 1];}elsecout << "第 " << num <<" 条地铁线路还没有建好! 请耐心等待哦~~~" << endl;
}string MyRouter::getRouterNumber()
{return this->mStrName;
}
void MyRouter::setStartStation(const string & station)
{if ( 0 < getStationNo(station) ){this->startStation = station;}
}
void MyRouter::setEndStation(const string & station)
{if ( 0 < getStationNo(station) ){this->endStation = station;}else{//最短路径}
}
//输入乘车站点,遍历vector,返回值是一个vector第几个站点
int MyRouter::getStationNo(const string & station)
{for ( unsigned int i = 0; i < stations.size(); i++ ){if ( stations[i] == station ){return i;}}return -1;
}
void MyRouter::printThisTrip()
{int i = 0;if (startNum > endNum){for ( i = startNum; i > endNum ; i--){cout << stations[i] << " ---> " ;}}else{for ( i = startNum; i < endNum ; i++){cout << stations[i] << " ---> " ;}}cout << stations[i] << endl;
}
//计算乘车站点和下车站点之间总共几站路。
int MyRouter::getDistance( const string & startStation, const string & endStation )
{startNum = getStationNo(startStation);if ( startNum < 0 )//输入了错误的站占名称{return -1;}endNum = getStationNo(endStation);if ( endNum < 0 ) //终点站不在当前线路上{return stations.size() - startNum;}this->startStation = startStation;this->endStation = endStation;return (endNum - startNum) > 0 ? endNum - startNum : startNum - endNum;
}ostream & operator << ( ostream & out, const MyRouter & router )
{out << endl << endl << "~~~~~~~~~~您现在查看的是西安地铁【 " << router.mStrName << " 】号线线路图~~~~~~~~";out << router.startStation << "<--->" << router.endStation << "~~~~~~~~~" <<endl<<endl<<endl;vector<string>::iterator item;vector<string> tmp = router.stations;for (item = tmp.begin(); item != tmp.end(); item++){out << *item << "--->";}out << "(终点站)"<< endl << endl <<endl;map<string, string>::iterator mapItem;map<string, string> mapTmp = router.changeStations;out << "===========西安地铁【 " << router.mStrName << " 】号线可以在以下【 " << mapTmp.size() <<" 】个站点选择换乘==============="<<endl;for (mapItem = mapTmp.begin(); mapItem != mapTmp.end(); mapItem++ ){out << mapItem->first << ":" << mapItem->second << endl;}return out;
}
地图类
#ifndef MYMAP_H
#define MYMAP_H
#include <vector>
#include <map>
#include <iostream>
using namespace std;
#include "myrouter.h"class MyMap
{
public:MyMap(double price = 1.0 , string start = "", string end = "");//显示所有乘车路线。void printSubwayMap();//显示本次出行路线void showRouteOfThisTrip();int getTotalStationOfThisTrip();//计算车票价格double fee();void setTripStation(string start, string end );
protected:vector<MyRouter> mVectorSubwayLine;//所有地铁线路map<string, map<string, string>> mMapStations; //起始站/终点站/换乘站double mDoublePrice; //每一站多少钱string startStation;string endStation;int mTotalStationsOfThisTrip;
};#endif // MYMAP_H
#include "mymap.h"
#include "dataconfig.h"MyMap::MyMap(double price, string start, string end):mDoublePrice(price),startStation(start),endStation(end),mTotalStationsOfThisTrip(0)
{unsigned int i = 1;DataConfig dataConfig;map<string, vector<string>>::iterator mapItem = dataConfig.mLineStations.begin();for ( i = 0; i < dataConfig.mLineStations.size() && mapItem != dataConfig.mLineStations.end() ; i++, mapItem++ ) //西安有地铁1,2,3,4,5,6,9{MyRouter router1(static_cast<string>(mapItem->first));mVectorSubwayLine.push_back(router1);}
}//显示所有乘车路线。
void MyMap::printSubwayMap()
{for (unsigned int i = 0; i < mVectorSubwayLine.size(); i++){cout << mVectorSubwayLine[i] << endl;}
}void MyMap::setTripStation(string start, string end )
{int ret = 0;map<string, string> station;string lineNum;for ( unsigned int i = 0; i < mVectorSubwayLine.size(); i++){//遍历每一条线路,记录哪条线路,第几站ret = mVectorSubwayLine[i].getStationNo(start);if (ret > 0){//找到起始点lineNum = mVectorSubwayLine[i].getRouterNumber();station.insert(make_pair(lineNum, start));}}if ( station.size() <= 0 ){cout << "起始站点输入有误 " << endl;return ;}else if ( station.size() > 1 ){map<string, string>::iterator iter;do{cout << "经过【 " << start <<" 】有【 " << station.size() <<" 】条地铁,请选择合适的地铁编号" << endl;//遍历station,请用户重新输入for(iter = station.begin(); iter != station.end(); iter++){cout<<iter->first<<" :"<<iter->second<<endl;}cin >> lineNum;}while (station.count(lineNum) < 1 );pair<string, string> p ( lineNum , station.at(lineNum));station.clear();station.insert(p);mMapStations.insert(make_pair("start", station));}else{mMapStations.insert(make_pair("start", station));}//这里需要最短路径计算,省略station.clear();for ( unsigned int i = 0; i < mVectorSubwayLine.size(); i++){ret = mVectorSubwayLine[i].getStationNo(end);if (ret > 0){//找到终点station.insert(make_pair(mVectorSubwayLine[i].getRouterNumber(), end));}}if ( station.size() <= 0 ){cout << "终点站输入有误 " << endl;return ;}else if ( station.size() > 1 ){map<string, string>::iterator iter;do{cout << "经过【 " << end <<" 】有【 " << station.size() <<" 】条地铁,请选择合适的地铁编号" << endl;//遍历station,请用户重新输入for(iter = station.begin(); iter != station.end(); iter++){cout<<iter->first<<" :"<<iter->second<<endl;}cin >> lineNum;}while (station.count(lineNum) < 1 );pair<string, string> p ( lineNum , station.at(lineNum));station.clear();station.insert(p);mMapStations.insert(make_pair("end", station));}else{mMapStations.insert(make_pair("end", station));}map<string, map<string, string>> ::iterator iter = mMapStations.begin();for (; iter != mMapStations.end(); iter++){cout << iter-> first << "---->" ;map<string, string>::iterator m = iter->second.begin();for ( ; m != iter->second.end(); m++){cout <<" " << m->first << ":" << m->second << endl;}}
}//显示本次出行路线
void MyMap::showRouteOfThisTrip()
{mTotalStationsOfThisTrip = 0;map<string, string> & mapStart = mMapStations.at("start");map<string, string> & mapEnd = mMapStations.at("end");//遍历地图for ( unsigned int i = 0; i < mVectorSubwayLine.size(); i++ ){string lineNum = mVectorSubwayLine[i].getRouterNumber();if ( 0 < mapStart.count(lineNum) ){mTotalStationsOfThisTrip = mVectorSubwayLine[i].getDistance( mapStart.at(lineNum), mapEnd.at(lineNum));mVectorSubwayLine[i].printThisTrip();}}
}int MyMap::getTotalStationOfThisTrip()
{return mTotalStationsOfThisTrip;
}
//计算车票价格
double MyMap::fee()
{return mTotalStationsOfThisTrip * mDoublePrice;
}
数据类
#ifndef DATACONFIG_H
#define DATACONFIG_H#include <map>
#include <vector>
#include <iostream>
using namespace std;class DataConfig
{
public:DataConfig();map<string, vector<string>> mLineStations;map<string, map<string, string>> mLineChangeStations;
};#endif // DATACONFIG_H
#include "dataconfig.h"DataConfig::DataConfig()
{vector<string> v;pair<string, vector<string>> p;pair<string, map<string, string>> q;pair<string, string> pStringString;map<string, string> mapTmp;string arr1[] = {"后卫寨", "三桥", "皂河", "枣园", "汉城路", "开远门 ", "劳动路", "玉祥门","洒金桥", "北大街", "五路口", "朝阳门", "康复路", "通化门", "万寿路","长乐坡", "?河", "半坡", "纺织城"};v.clear();for(unsigned int i = 0 ; i < sizeof(arr1) / sizeof(arr1[0]);i++){v.push_back(arr1[i]);}mLineStations.insert(pair<string, vector<string>>("1", v));string arr1ChangeStations[] = {"2", "北大街","3", "通化门","4", "五路口","9", "纺织城","6", "纺织城",};mapTmp.clear();for(unsigned int i = 0 ; i < sizeof(arr1ChangeStations) / sizeof(arr1ChangeStations[0]);i+=2){pStringString.first = arr1ChangeStations[i];pStringString.second = arr1ChangeStations[i+1];mapTmp.insert(pStringString);}q.first = "1";q.second = mapTmp;mLineChangeStations.insert(q);string arr2[] = {"北客站", "北苑", "运动公园", "行政中心", "凤城五路", "市图书馆", "大明宫西","龙首原", "安远门", "北大街", "钟楼", "永宁门", "南稍门", "体育场", "小寨","纬二街", "会展中心", "三爻", "凤栖原", "航天城", "韦曲南"};v.clear();for(unsigned int i = 0 ; i < sizeof(arr2) / sizeof(arr2[0]);i++){v.push_back(arr2[i]);}mLineStations.insert(make_pair("2", v));string arr2ChangeStations[] = {"1", "北大街","3", "小寨","4", "行政中心","5", "南稍门"};mapTmp.clear();for(unsigned int i = 0 ; i < sizeof(arr2ChangeStations) / sizeof(arr2ChangeStations[0]);i+=2){pStringString.first = arr2ChangeStations[i];pStringString.second = arr2ChangeStations[i+1];mapTmp.insert(pStringString);}q.first = "2";q.second = mapTmp;mLineChangeStations.insert(q);string arr3[] = {"大雁塔", "北池头", "青龙寺", "延兴门", "咸宁路", "长乐公园", "通化门", "胡家庙","石家街", "辛家庙", "广泰门", "桃花潭", "?灞中心", "香湖湾", "务庄", "国际港务区","双寨", "新筑", "保税区"};v.clear();for(unsigned int i = 0 ; i < sizeof(arr3) / sizeof(arr3[0]);i++){v.push_back(arr3[i]);}mLineStations.insert(make_pair("3", v));string arr3ChangeStations[] = {"1", "通化门","5", "青龙寺","4", "大雁塔","2", "小寨","6", "科技路"};mapTmp.clear();for(unsigned int i = 0 ; i < sizeof(arr3ChangeStations) / sizeof(arr3ChangeStations[0]);i+=2){pStringString.first = arr3ChangeStations[i];pStringString.second = arr3ChangeStations[i+1];mapTmp.insert(pStringString);}q.first = "3";q.second = mapTmp;mLineChangeStations.insert(q);string arr4[] = {"航天新城", "航天东路", "神舟大道", "东长安街", "飞天路", "航天大道", "金滹沱","曲江池西", "大唐芙蓉园", "大雁塔", "西安科技大学", "建筑科技大学·李家村", "和平门","大差市", "五路口", "含元殿", "大明宫", "大明宫北", "余家寨", "百花村", "常青路", "市中医医院","行政中心", "文景路", "凤城九路", "凤城十二路", "元朔路", "北客站(北广场)"};v.clear();for(unsigned int i = 0 ; i < sizeof(arr4) / sizeof(arr4[0]);i++){v.push_back(arr4[i]);}p.first = "4";p.second = v;mLineStations.insert(p);string arr4ChangeStations[] = {"1", "五路口","3", "大雁塔","5", "建筑科技大学·李家村","2", "行政中心"};mapTmp.clear();for(unsigned int i = 0 ; i < sizeof(arr4ChangeStations) / sizeof(arr4ChangeStations[0]);i+=2){pStringString.first = arr4ChangeStations[i];pStringString.second = arr4ChangeStations[i+1];mapTmp.insert(pStringString);}q.first = "4";q.second = mapTmp;mLineChangeStations.insert(q);string arr5[] = {"创新港", "创新港东", "翱翔小镇", "钓台", "沣西文化公园", "东马坊", "高桥","文教园", "欢乐谷", "镐京", "复兴大道南", "斗门", "王寺", "阿房宫南","石桥立交", "西窑头", "汉城南路", "金光门", "丰庆公园", "西北工业大学", "边家村","省人民医院·黄雁村", "南稍门", "文艺路", "建筑科技大学·李家村", "太乙路", "雁翔路北口","青龙寺", "理工大曲江校区", "黄渠头", "马腾空", "月登阁", "雁鸣湖", "西安东"};v.clear();for(unsigned int i = 0 ; i < sizeof(arr5) / sizeof(arr5[0]);i++){v.push_back(arr5[i]);}p.first = "5";p.second = v;mLineStations.insert(p);string arr5ChangeStations[] = {"2", "南稍门","3", "青龙寺","4", "建筑科技大学·李家村","6", "西北工业大学"};mapTmp.clear();for(unsigned int i = 0 ; i < sizeof(arr5ChangeStations) / sizeof(arr5ChangeStations[0]);i+=2){pStringString.first = arr5ChangeStations[i];pStringString.second = arr5ChangeStations[i+1];mapTmp.insert(pStringString);}q.first = "5";q.second = mapTmp;mLineChangeStations.insert(q);string arr6[] = {"西安南客站", "西电科大南校区", "西安国际医学中心", "仁村", "郭杜西", "西部大道(西太路口)", "造字台", "丈八六路","丈八四路", "丈八一路", "省游泳馆", "木塔寺", "甘家寨", "科技路", "西北工业大学", "丰庆路", "西关正街", "贡院门","广济街", "钟楼", "大差市", "长乐门(东门)", "大唐西市", "咸宁路", "万寿南路", "东胜北路","田家湾", "纺南路", "纺五路", "纺三路", "纺织城", "纺织城停车场"};v.clear();for(unsigned int i = 0 ; i < sizeof(arr6) / sizeof(arr6[0]);i++){v.push_back(arr6[i]);}p.first = "6";p.second = v;mLineStations.insert(p);string arr6ChangeStations[] = {"1", "纺织城","3", "科技路","9", "纺织城","5", "西北工业大学"};mapTmp.clear();for(unsigned int i = 0 ; i < sizeof(arr6ChangeStations) / sizeof(arr6ChangeStations[0]);i+=2){pStringString.first = arr6ChangeStations[i];pStringString.second = arr6ChangeStations[i+1];mapTmp.insert(pStringString);}q.first = "6";q.second = mapTmp;mLineChangeStations.insert(q);string arr9[] = {"纺织城", "香王", "灞柳二路", "田王", "洪庆", "紫霞三路","凤凰池", "鹦鹉寺公园", "芷阳广场", "西工程大西科大", "西花园", "华清池", "东三岔", "银桥大道", "秦陵西"};v.clear();for(unsigned int i = 0 ; i < sizeof(arr9) / sizeof(arr9[0]);i++){v.push_back(arr9[i]);}p.first = "9";p.second = v;mLineStations.insert(p);string arr9ChangeStations[] = {"1", "纺织城"};mapTmp.clear();for(unsigned int i = 0 ; i < sizeof(arr9ChangeStations) / sizeof(arr9ChangeStations[0]);i+=2){pStringString.first = arr9ChangeStations[i];pStringString.second = arr9ChangeStations[i+1];mapTmp.insert(pStringString);}q.first = "9";q.second = mapTmp;mLineChangeStations.insert(q);
}
测试代码
#include <iostream>
#include "myrouter.h"
#include "mymap.h"using namespace std;int main()
{MyMap myMap;myMap.printSubwayMap();myMap.setTripStation("北大街", "市图书馆" );myMap.showRouteOfThisTrip();cout << "本次行程总共【 "<< myMap.getTotalStationOfThisTrip()<< " 】站,";cout << "需要付费【 " << myMap.fee() << " 】元" << endl;return 0;
}
测试结果
目前存在的问题
没有进行最短路径设计。如果用户输入的起始站和终点站不在同一条线路上,会运行失败。
这篇关于c++面向对象练习:西安市地铁售票系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!