7.5.5 公交换乘的实现(3)
m_InfoMation是CInfoMation类的一个对象,CInfoMation类实现了公交换乘的算法,下面对CInfoMation类进行介绍,由于本章篇幅的限制,在此只介绍相关的函数,其他函数参见光盘中的源代码。下面介绍CInfoMation类的主要的成员函数。查询函数Query()查询公交换乘的信息。代码如下所示:
代码位置:见光盘中本章源代码的CInfoMatio类。
- 1 BOOL CInfoMation::Query(CWnd *pwnd,CString start,CString end)
- 2 {
- 3 Num=0;
- 4 CMapPublicApp *app=(CMapPublicApp *)AfxGetApp(); //获取应用类的指针
- 5 app->m_show="";
- 6 Num_BusRoad=0; //线路的初始化
- 7 s_road=e_road=0;
- 8 if(Same_RoadWay(pwnd,start,end)) //判断是否是同样车次
- 9 {
- 10 app->m_show+="\r\n推荐方案:方案"+BestMode(); //输出方案
- 11 return 1;
- 12 }
- 13 else if(!Dif_RoadWay(start,end))
- 14 {
- 15 AfxMessageBox("此方案不存在!");
- 16 return 0;
- 17 }
- 18 app->m_show+="\r\n推荐方案:方案"+BestMode(); //显示最佳方案
- 19 return 1;
- 20 }
第8~12行代码为显示不需要换车的最佳乘车方案。
第13~18行代码为显示需要转一次车的最佳乘车方案。
上述代码中函数Same_RoadWay()实现判断两个站是否在同一条线路中,如果是则返回TRUE,此时不需要换乘。如果两个站点在不同的线路中,函数Dif_RoadWay()返回FALSE,此时需要换乘公交才能到达目的站,最终调用函数BestMode()显示最佳的行车路线。函数Same_RoadWay()查询两站点是否在相同的车次中。其中的代码如下:
代码位置:见光盘中本章源代码的CInfoMatio类。
- 1 BOOL CInfoMation::Same_RoadWay(CWnd *pwnd,CString start,CString end)
- 2 {
- 3 CString str,m_sNum; //定义字符串变量
- 4 CStationSet m_StationSet; //定义记录集对象
- 5 CMapPublicApp *app=(CMapPublicApp *)AfxGetApp(); //获取应用类指针
- 6 Init(); //初始化函数
- 7 if(!m_StationSet.IsOpen())
- 8 m_StationSet.Open(); //打开记录集
- 9 m_StationSet.MoveFirst(); //移动到首条记录
- 10 while(!m_StationSet.IsEOF()) //遍历记录集
- 11 {
- 12 if(m_StationSet.m_STATION==start) //查找开始站点
- 13 {
- 14 startflag=!startflag; //标记的设置
- 15 m_BusInfo[0].RoadWay=m_StationSet.m_ID; //赋值
- 16 m_station=m_StationSet.m_ID;
- 17 m_BusInfo[0].StationName=m_StationSet.m_STATION;
- 18 }
- 19 else if(m_StationSet.m_STATION==end) //查找终点站
- 20 {
- 21 startflag=!startflag;
- 22 m_BusInfo[1].RoadWay=m_StationSet.m_ID;
- 23 m_station=m_StationSet.m_ID;
- 24 m_BusInfo[1].StationName=m_StationSet.m_STATION;
- 25 }
- 26 if(m_BusInfo[1].RoadWay==m_BusInfo[0].RoadWay) //同样的线路
- 27 {
- 28 str.Format("\r\n方案%d:从%s乘 %s路 车到%s下车",
- 29 Num,start,m_BusInfo[0].RoadWay,end); //构造显示字符串
- 30 app->m_show+=str;
- 31 m_BusRoad[Num_BusRoad].Precept=Num++;
- 32 m_BusRoad[Num_BusRoad++].Number=busnum;
- 33 Init();
- 34 }
- 35 if(startflag)
- 36 {
- 37 if(m_StationSet.m_ID!=m_station)
- 38 busnum=0;
- 39 else
- 40 busnum++;
- 41 }
- 42 m_StationSet.MoveNext(); //移动到下一条记录
- 43 }
- 44 if(app->m_show!="") //如果查找到目标
- 45 return 1;
- 46 if(m_StationSet.IsEOF()) //没有查找到站点
- 47 {
- 48 return 0;
- 49 }
- 50 else
- 51 return 1;
- 52 }