设计题目二:7.3.4交通咨询系统设计P160一、设计要求1.问题描述根据不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅行的旅客希望旅费尽可能的少,而老年人则要求中转次数少。模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。2.需求分析二、概要设计1.主界面设计(图2.1“交通咨询系统”主菜单)2.存储结构设计本系统采用图结构类型存储抽象交通咨询系统的信息。typedefstructTrafficNode{charname[MAX_STRING_NUM];//班次//MAX_STRING_NUM最为10intStartTime,StopTime;//起止时间intEndCity;//该有向边指向的顶点在数组中的位置,即该城市编号intCost;//票价}TrafficNodeDat;typedefstructVNode{CityTypecity;intTrainNum,FlightNum;//标记下面Train数组和Flight数组里元素个数TrafficNodeDatTrain[MAX_TRAFFIC_NUM];//数组成员为结构体,记录了到达城市、起止时间、票价和班次TrafficNodeDatFlight[MAX_TRAFFIC_NUM];//intCost;//遍历时到达该城市的耗费(时间或者费用)}VNodeDat;typedefstructPNode{intCity;intTraNo;}PNodeDat;3.系统功能设计(1)添加城市。添加一个城市的名称(2)删除城市。输入一个城市名称,删除该城市。(3)添加交通路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间和票价(4)删除交通路线。输入火车或飞机的班次删除该交通路线。(5)查询最小费用路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间查询最小费用路线。三、模块设计1.模块设计(图2.2模块调用示意图)主程序模块工作区模块无向网操作模块2.系统子程序及功能设计(1)intShowMenu()//主菜单(2)voidCopyRight()(3)intSeekCity(char*name)//寻找城市(4)intInsertCity(char*Name)//添加城市(5)intSaveSysInfo()//向程序输入数据(6)intDelCity(char*Name)//删除城市(7)intInsertTrain(char*train,char*StartCity,char*EndCity,intStartTime,intEndTime,intcost)//添加火车路线(8)intInsertFlight(char*flight,char*StartCity,char*EndCity,intStartTime,intEndTime,intcost)//添加飞机航线(9)intDelPath(char*name)//删除路线(10)voidDijkstra(intmatx[Dij_MAXN][Dij_MAXN],intp_start,intp_end,intTravelType)(11)intInitSysData()//存储数据(12)intSearchMinTime(CityTypeCity,CityTypeEndCity,intCurTime,intcurPathNo,intTravelType)//查询最短时间(13)intCalcMinTime(intStartCity,intEndCity,intTravelType)//显示最短时间(14)intCalcMinCost(intStartCity,intEndCity,intTravelType)//最少花费(15)intmain()//主函数3.函数主要调用关系图15main()89112754136361223716(图2.3函数主要调用关系图)四、详细设计1.数据类型定义(1)全局变量的定义typedefshortintCityType;//CityType定义短整形的变量typedefstructTrafficNode{charname[MAX_STRING_NUM];//班次//MAX_STRING_NUM最为10intStartTime,StopTime;//起止时间intEndCity;//该有向边指向的顶点在数组中的位置,即该城市编号intCost;//票价}TrafficNodeDat;typedefstructVNode{CityTypecity;intTrainNum,FlightNum;//标记下面Train数组和Flight数组里元素个数TrafficNodeDatTrain[MAX_TRAFFIC_NUM];//数组成员为结构体,记录了到达城市、起止时间、票价和班次TrafficNodeDatFlight[MAX_TRAFFIC_NUM];//intCost;//遍历时到达该城市的耗费(时间或者费用)}VNodeDat;typedefstructPNode{intCity;intTraNo;}PNodeDat;2.系统主要子程序详细设计(1)用户工作区模块的设计intShowMenu(){printf(\n|******************欢迎使用交通咨询系统*******|\n);printf(\n|------------------1:添加城市----------------|);printf(\n|------------------2:删除城市----------------|);printf(\n|------------------3:添加交通路线------------|);printf(\n|------------------4:删除交通路线------------|);printf(\n|------------------5:查询最小费用路线--------|);printf(\n|------------------6:查询最快路线------------|);printf(\n|------------------7:清除屏幕----------------|);printf(\n|------------------0:退出--------------------|\n);printf(\n|***********o(∩_∩)oo(∩_∩)o**************|\n);printf(\n请输入你的选择:);return1;}(2)用Dijkstra算法求两段路程的最短距离voidDijkstra_Output(intmatx[Dij_MAXN][Dij_MAXN],intPreCity[Dij_MAXN],intp_end,intTravelType){inttrack[Dij_MAXN];inti=0,j,k,min,tmp,end,cost=0;j=p_end;track[i++]=j;while(PreCity[j]=0){cost+=matx[PreCity[j]][j];track[i++]=j=PreCity[j];}printf(\nTrackWay:);if(!TravelType){for(i--;i0;i--){printf(\n%s:,CityName[track[i]]);end=track[i-1];min=32767;for(k=0;kAdjList[track[i]].TrainNum;k++)if(AdjList[track[i]].Train[k].EndCity==end&&minAdjList[track[i]].Train[k].Cost){min=AdjList[track[i]].Train[k].Cost;tmp=k;}printf(%s,AdjList[track[i]].Train[tmp].name);printf(%2d:%2d-%2d:%2d,AdjList[track[i]].Train[tmp].StartTime/60,AdjList[track[i]].Train[tmp].StartTime%60,AdjList[track[i]].Train[tmp].StopTime/60,AdjList[track[i]].Train[tmp].StopTime%60);}}else{for(i--;i0;i--){printf(\n%s:,CityName[track[i]]);end=track[i-1];min=32767;for(k=0;kAdjList[track[i]].FlightNum;k++)if(AdjList[track[i]].Train[k].EndCity==end&&minAdjList[track[i]].Flight[k].Cost){min=AdjList[track[i]].Flight[k].Cost;tmp=k;}printf(%s,AdjList[track[i]].Flight[tmp].name);printf(%2d:%2d-%2d:%2d,AdjList[track[i]].Flight[tmp].StartTime/60,AdjList[track[i]].Flight[tmp].StartTime%60,AdjList[track[i]].Flight[tmp].StopTime/60,AdjList[track[i]].Flight[tmp].StopTime%60);}}printf(\n%s:DESTINATION!,CityName[track[0]]);printf(\nMinCost:%d\n,cost);}voidDijkstra(intmatx[Dij_MAXN][Dij_MAXN],intp_start,intp_end,intTravelType){intPreCity[Dij_MAXN];//PreCity[i]==-1,neverused;//PreCity0,theprecityofCityiinti,j,min,pre,pos;for(i=0;iCityNum;i++){PreCity[i]=-1;}PreCity[p_start]=-2;while(PreCity[p_end]==-1){min=-1;for(i=0;iCityNum;i++)if(PreCity[i]!=-1){for(j=0;jCityNum;j++)if(PreCity[j]==-1&&matx[i][j]0&&(min0||matx[i][j]min)){pre=i;pos=j;min=matx[i][j];}}PreCity[pos]=pre;}Dijkstra_Output(matx,PreCity,p_end,TravelType);}五、测试分析1.添加城市在主菜单下,用户输入1,添加城市名称。(图2.4添加城市)2.删除城市在主菜单下,用户输入2,删除已添加城市名称。(图2.5删除城市)3.添加交通路线在主菜单下,用户输入3,已添加城市名称。添加起始城市、终点城市名称、乘车类型、乘车班次、起始时刻、终点时刻、和票价。(图2.6添加交通路线)4.删除交通路线输入班次号,删除交通路线(图2.7删除交通路线)5.查询最小费用交通路线(图2.8查询最小费用交通路线)6.查询最快交通路线(图2.9查询最快交通路线)7.清除屏幕8.退出六、用户手册使用本系统时,用户需先向程序添加城市后,在已有城市基础上添加已有城市的路线和使用各项功能。七、调试报告程序运行无错误,但当系统输入其他无储存内容时程序会意外中断,代码需要优化。八、程序清单#includestdafx.h#includestdio.h#includestring.h#includestdlib.h#def