c++面向对象练习:西安市地铁售票系统

2024-01-03 13:10

本文主要是介绍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++面向对象练习:西安市地铁售票系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565792

相关文章

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve