全国交通咨询模拟系统实验报告材料

上传人:痛*** 文档编号:62665452 上传时间:2022-03-15 格式:DOC 页数:44 大小:1,019KB
返回 下载 相关 举报
全国交通咨询模拟系统实验报告材料_第1页
第1页 / 共44页
全国交通咨询模拟系统实验报告材料_第2页
第2页 / 共44页
全国交通咨询模拟系统实验报告材料_第3页
第3页 / 共44页
点击查看更多>>
资源描述
一、问题描述全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。例如, 因公出差的旅客希望在旅途中的时间尽可能短, 出门旅游的游客则希望旅费尽可 能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序, 为旅客提供两种或三种最优决策的交通咨询。【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能(2) 城市之间有两种交通工具:火车和飞机。提供对列车时刻表和 飞机航班进行编辑(增设或删除)的功能。(3) 提供两种最优决策:最快到达或最省钱到达。全程只考虑一种 交通工具。(4) 旅途中耗费的总时间应该包括中转站的等候时间。(5) 咨询以用户和计算机的对话方式进行。由用户输入起始站、终 点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。【测试数据】乌鲁木齐21618921145京137 J04-天津1100昆明6396672140 深圳安534409367255*南宁都842967907武汉”82534967天津大连徐州651哈尔滨305沈阳397上海62昌 福州二、数据结构设计和核心算法设计描述:1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下:主界面用户输入,茯取option的値*主界面票价3、核心设计:根据上面的流程图和逻辑拆分,对这个问题有了一个比较直观,详细地了解。并且从中也可得知路线的添加即数据的存储是这个系统进行运作的 一个基础。而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这 些数据进行了存储。将每个信息量放在不同的文件中, 可以更有效、直观地对这 些数据进行处理。流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是 其他操作都是在路线添加好后进行的, 并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用的是无限循环形式,即while (1)。以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外, 包 括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。三、主控及功能模块层次结构:1、模块说明:本系统分为个模块1、)主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:添加城市数毎从文莒读入内存)存储信息钊文件VJ绘化索统 数毎C从文 读入内存)删除城市1r删除城市逵加交適踣线初绘化索统数据从文读入内存)添加航班耀加列车存储信息到文件册除交11路线数毎从文莒读入内存)存摘信息到文件査询巖距吋间踣线F1TF初始化系统当读入内存)计算最快路 毀耗费的时 间并打印存储倍息到文件基本操作:TrafficNodeDat交通工具 信息Charn ameMAX_STRING_NUM班次Int starttime出发时间Int starttime到达时间Int cost票价UNodeDat路线信息Short int city城市编号:Int TrainNum火车路线数int FlightNum航班路线数TrafficNodeDat Trai nMAX_TRAFFIC_ NUM火车路线信息TrafficNodeDatFlightMAX TRAFFIC航班路线信息NUM函数变量声明:#i nclude #include #defi ne ERR 0#defi ne OK 1#defi ne Dij_MAXN 33#defi ne MAX_VERTEX_NUM 31#defi ne MAX_STRING_NUM 10#defi ne MAX_TRAFFIC_NUM 10 con st char CityFile =D:city.txt; const char TrainFile =D:train.txt; con st char FlightFile =D:flight.txt;typedef short int CityType;typedef struct TrafficNodechar nameMAX_STRING_NUM; / 班次int StartTime,StopTime; /起止时间int En dCity; /该有向边指向的顶点在数组中的位置,即该城市编号int Cost; 票价 TrafficNodeDat;typedef struct VNodeCityType city;int TrainNum,FlightNum; /标记下面Train数组和Flight数组里元素个数 TrafficNodeDat Trai nM AX_TRAFFIC_NUM; / 数组成员为结构体,记录了 到达城市、起止时间、票价和班次TrafficNodeDat FlightMAX_TRAFFIC_NUM; / int Cost; /遍历时到达该城市的耗费(时间或者费用) VNodeDat;typedef struct PNodeint City;int TraNo; PNodeDat;VNodeDat AdjListMAX_VERTEX_NUM; /System Infochar CityNameMAX_VERTEX_NUMMAX_STRING_NUM;/ 城市名,采用第一下标为该城市在本程序中的编号int CityNum; / 城市数目PNodeDat PathMAX_VERTEX_NUM; / 存储临时最小时间路径PNodeDat MinPathMAX_VERTEX_NUM; /存储搜索到当前的最小时间路径int Min Time,StartTime;int curPath;函数构成:int mai n()char n ameMAX_STRING_NUM;char s_cityMAX_STRING_NUM;char e_cityMAX_STRING_NUM;int Comma nd,cost;int startcity,endcity,traveltype;int s_hour,s_mi nute,e_hour,e_mi nu te;while (1)ShowMe nu(); 显示菜单sea nf(%d,&Comma nd); / switch (Comma nd)case 0: /退出return 0;case 1: /添加城市In itSysData(); printf(n输入城市名:);sca nf(%s,&n ame);In sertCity( name);SaveSysI nfo();prin tf(System Info Save OK!n); break;case 2: /删除城市In itSysData(); printf(n输入城市名:); scan f(%s,&n ame);DelCity (n ame);SaveSysI nfo();prin tf(System Info Save OK!n); break;case 3: /添加路线In itSysData();printf(起始站城市名:); scan f(%s,&s_city);printf(终点站城市名:);scan f(%s,&e_city);printf(类型(列车0,航班1):); scan f(%d, &traveltype);printf(输入列车/飞机班次:);scan f(%s,&n ame);printf(起始时刻(00:00,24 小时制):); scan f(%2d:%2d,&s_hour,&s_mi nute); printf(到达时刻(00:00, 24 小时制):);scan f(%2d:%2d,&e_hour,&e_mi nu te); printf(票价:);sca nf(%d,&cost);if (traveltype)In sertFlight( name,s_city,e_city,s_hour*60+s_mi nute,e_hour*60+e_mi nute,cost);elseIn sertTrai n(n ame,s_city,e_city,s_hour*60+s_mi nute,e_hour*60+e_mi nute,cost);SaveSysI nfo();prin tf(System Info Save OK!n);break;case 4:删除路线In itSysData();printf(输入班次:);scan f(%s,&n ame);DelPath( name);SaveSysI nfo();prin tf(System Info Save OK!n); break;case 5: /最小耗费In itSysData();printf(n 起始城市:);sca nf(%s,&n ame);startcity=SeekCity( name);if (startcity0)prin tf(ErrorCity Name:No suchcity!n);break;printf(终点城市:);sea nf(%s,&n ame);en dcity=SeekCity( name);if (en dcity0)prin tf(ErrorCity Name:Nocity!n);break;printf(类型(列车0,航班1):);sca nf(%d,& traveltype);if (traveltype!=0&traveltype!=1)prin tf(Error In put!);break;CalcMi nCost(startcity,e ndcity,traveltype); prin tf(n);break;case 6: /最短时间路线In itSysData();printf(n 起始城市:);sca nf(%s,&n ame);startcity=SeekCity( name);if (startcity0)prin tf(ErrorCity Name:Nocity!n);break;printf(终点城市:);sca nf(%s,&n ame);en dcity=SeekCity( name);suchsuchif (en dcity0)prin tf(Error City Name:No such city!n); break;printf(类型(列车0,航班1):);sca nf(%d,& traveltype);if (traveltype!=0&traveltype!=1)prin tf(Error In put!); break;CalcMi nTime(startcity,e ndcity,traveltype); prin tf(n);break;四、主函数中的各个调用的函数代码具体如下:(1) 显示菜单: int ShowMenu() printf(n*MENU*n)n5:printf(1:添加城市n2:删除城市n3:添加交通路线n4:删除交通路线 查询最小费用路线n6:查询最快路线n0:退出);printf(n*n);printf(nType In Your Command:);return 1;(2) 查找城市并返回城市序号:int SeekCity (char *name) int i;for (i=0;iCityNum;i+) if (strcmp(name,CityNamei)=0)return i;return -1;(3) 储存信息到文件:int SaveSyslnfo()FILE *fp;int i,j,total;fp=fopen(CityFile,w); fprintf(fp,%dn,CityNum);for (i=0;iCityNum;i+)fprintf(fp,%sn,CityNamei);fclose(fp);total=0;fp=fopen (TrainFile,w);for (i=0;iCityNum;i+)total+=AdjListi.TrainNum;fprintf(fp,%dn,total);for (i=0;iCityNum;i+)for (j=0;jAdjListi.TrainNum;j+)%dn,fprintf(fp,%s %s %s , AdjListi.Trainj.name, CityNamei, CityNameAdjListi.Trainj.EndCity); fprintf(fp,%2d:%2d%2d:%2dAdjListi.Trainj.StartTime/60,AdjListi.Trainj.StartTime%60,AdjListi.Trainj.StopTime/60,AdjListi.Trainj.StopTime%60,AdjListi.Trainj.Cost);fclose(fp);total=0;fp=fopen(FlightFile,w);for (i=0;ivCityNum;i+) total+=AdjListi.FlightNum; fprintf(fp,%dn,total); for (i=0;iCityNum;i+)for (j=0;jvAdjListi.FlightNum;j+)%dn,fprintf(fp,%s %s %s , AdjListi.Flightj.name, CityNamei, CityNameAdjListi.Flightj.EndCity); fprintf(fp,%2d:%2d%2d:%2dAdjListi.Flightj.StartTime/60,AdjListi.Flightj.StartTime%60,AdjListi.Flightj.StopTime/60,AdjListi.Flightj.StopTime%60, AdjListi.Flightj.Cost); fclose(fp);return 1;(4) 添加城市:int InsertCity (char *Name) strcpy(CityNameCityNum,Name); AdjListCityNum.city=CityNum; AdjListCityNum.FlightNum=0; AdjListCityNum.TrainNum=0; CityNum+;return 1;(5) 删除城市:int DelCity (char *Name)int city,i,j;city=SeekCity(Name);for (i=city;iCityNum-1;i+)strcpy(CityNamei,CityNamei+1);AdjListi.FlightNum=AdjListi+1.FlightNum;AdjListi.TrainNum=AdjListi+1.TrainNum;for (j=0;jAdjListi.FlightNum;j+) AdjListi.Flightj.Cost=AdjListi+1.Flightj.Cost;AdjListi.Flightj.EndCity=AdjListi+1.Flightj.EndCity;strcpy(AdjListi.Flightj.name,AdjListi+1.Flightj.name);AdjListi.Flightj.StartTime=AdjListi+1.Flightj.StartTime;AdjListi.Flightj.StopTime=AdjListi+1.Flightj.StopTime;CityNum-;return 1;(6) 添加火车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost)int i,j; i=SeekCity(StartCity); j=SeekCity(EndCity);AdjListi.TrainAdjListi.TrainNum.Cost=cost;AdjListi.TrainAdjListi.TrainNum.EndCity=j;AdjListi.TrainAdjListi.TrainNum.StartTime=StartTime;AdjListi.TrainAdjListi.TrainNum.StopTime=EndTime; strcpy(AdjListi.TrainAdjListi.TrainNum.name,train); AdjListi.TrainNum+;return 1;(7) 添加航班路线:int lnsertFlight(char *flight,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost)int i,j;i=SeekCity(StartCity); j=SeekCity(EndCity); AdjListi.FlightAdjListi.FlightNum.Cost=cost; AdjListi.FlightAdjListi.FlightNum.EndCity=j; AdjListi.FlightAdjListi.FlightNum.StartTime=StartTime; AdjListi.FlightAdjListi.FlightNum.StopTime=EndTime; strcpy(AdjListi.FlightAdjListi.FlightNum.name,flight); AdjListi.FlightNum+;return 1;(8) 删除路线:int DelPath (char *name)int i,j,flag=0;for (i=0;iCityNum;i+)for (j=0;jAdjListi.FlightNum;j+)if (strcmp(AdjListi.Flightj.name,name)=0)flag=1;break;if (flag)for (;jvAdjListi.FIightNum-1;j+)AdjListi.FIightj.Cost=AdjListi.FIightj+1.Cost;AdjListi.FIightj.EndCity=AdjListi.FIightj+1.EndCity;strcpy(AdjListi.FIightj.name,AdjListi.FIightj+1.name);AdjListi.FIightj.StartTime=AdjListi.FIightj+1.StartTime;AdjListi.FIightj.StopTime=AdjListi.FIightj+1.StopTime;AdjListi.FIightNum-;break;for (j=0;j=0)cost+=matxPreCityjj; tracki+=j=PreCityj;printf(nTrack Way:);if (!TravelType)for(i-;i0;i-) printf(n%s:,CityNametracki); end=tracki-1;min=32767;for (k=0;kAdjListtracki.Traink.CoSt)min=AdjListtracki.Traink.Cost; tmp=k;printf(%s ,AdjListtracki.Traintmp.name); startH = AdjListtracki.Traintmp.StartTime/60 ; startM = AdjListtracki.Traintmp.StartTime%60; endH = AdjListtracki.Traintmp.StopTime/60 ; endM = AdjListtracki.Traintmp.StopTime%60 ;if( !(startH/10)printf(0);printf(%d:,startH);if( !(startM/10)printf(0);printf(%d - ,startM);if( !(endH/10)printf(0);printf(%d:,endH);if( !(endM/10)printf(0); printf(%dn,endM);printf(%2d:%2d-%2d:%2d,AdjListtracki.Traintmp.StartTime/60,AdjL isttracki.Traintmp.StartTime%60,AdjListtracki.Traintmp.StopTime/60 ,AdjListtracki.Traintmp.StopTime%60);elsefor(i-;i0;i-)printf(n%s:,CityNametracki); end=tracki-1;min=32767;for (k=0;kAdjListtracki.FIightk.Co st) */if(AdjListtracki.FIightk.EndCity=end&minAdjListtracki.FIightk.C ost) min=AdjListtracki.FIightk.Cost; tmp=k;printf(%s,AdjListtracki.FIighttmp.name);startH = AdjListtracki.FIighttmp.StartTime / 60 ;startM = AdjListtracki.FIighttmp.StartTime %60;endH = AdjListtracki.FIighttmp.StopTime / 60 ;endM = AdjListtracki.FIighttmp.StopTime %60 ;if( !(startH/10)printf(0);printf(%d:,startH);if( !(startM/10)printf(0);printf(%d - ,startM);if( !(endH/10)printf(0);printf(%d:,endH);if( !(endM/10)printf(0); printf(%dn,endM);printf(%2d:%2d-%2d:%2d,AdjListtracki.FIighttmp.StartTime/60,AdjListtracki.FIighttmp.StartTime%60,AdjListtracki.FIighttmp.StopTime/60,AdjListtracki.FIighttmp.StopTime % 60);printf(n%s: DESTINATION!,CityNametrack0); printf(nMin Cost : %dn,cost);(10) 找出最小费用路线void Dijkstra(int matxDij_MAXNDij_MAXN,int p_start,int p_end,int TravelType)int PreCityDij_MAXN; PreCityi=-1,never used; PreCity0,the precity of City i int i,j,min,pre,pos;for (i=0;iCityNum;i+)PreCityi=-1;PreCityp_start=-2;while (PreCityp_end=-1) min=-1;for (i=0;iCityNum;i+)if (PreCityi!=-1)for (j=0;j0&(min0|matxijvmin) pre=i;pos=j;min=matxij;PreCitypos=pre; Dijkstra_Output(matx,PreCity,p_end,TravelType);(11) 初始化系统数据:int InitSysData ()FILE *fp;int i,j,hour,minute,num,cost;char stmp1MAX_STRING_NUM;char stmp2MAX_STRING_NUM;char stmp3MAX_STRING_NUM;fp=fopen(CityFile,r);if (!fp)printf(nError:Cannot Open City Filen); return -1;fscanf(fp,%d, &CityNum);for (i=0;iCityNum;i+)fscanf(fp,%s,&CityNamei);AdjListi.city=i;AdjListi.TrainNum=0;AdjListi.FlightNum=0;fclose(fp);fp=fopen (T rainFile,r);if (!fp)printf(nError:Cannot Open Train Filen); return -1;fscanf(fp,%d,&num);for (i=0;inum;i+)fscanf(fp,%s, &stmp1);fscanf(fp,%s, &stmp2);fscanf(fp,%s, &stmp3);j=SeekCity(stmp2);仪旺unu 至+09Lnoq3lu 匚 dsEnN26=LJ.uhsnp26=LJ.uhsnp =2nu 至4noqod:p%E%=d4)4ueQS4nu 至+09Lnoq3lu 匚七J3sEnN26=LJ.uhsnp26=LJ.uhsnp=2nu 至4noqod:p%E%=d4)4ueQS4= Ldllqslw2uEnN26 二LJ.msnp26 二LL.nhsnrpvMdoqsd$s)A七oypesHA七0puwEnN26=LJ.uhsnp26=LJ.uhsnppasdllqsod:s%=d4)4ueQS4d$sod:s%=d4)4ueQS4= Ld$sod:s%=d4)4ueQS4+土目二一一乂)O4=Enuod:p%=d4)4ueQS4 宀-L* Erqalr5一iz26 二LLUQdo 4ouue0Lo.u 山 UJEUrd(dm七=._iz26=LJ.)uadolrd4工 d40soo4宀+EnN.EalJJmsnpi?SOQod:p%=d4)4ueQS4gnu 至+09Lnoq3lu 匚 dswnN.EalJJmsnpuwuuhsnp=2nu 至4noqod:p%E%=d4)4ueQS4gnu 至+09Lnoq3lu 匚七J3swnN.EalJJmsnpuwuuhsnp=2nu 至4noqod:p%E%=d4)4ueQS4二 :upasH0pullJEnN.EalJJmsnpuwuuhsnpCurTime-StartTime)for (i=0;iv=curPathNo;i+)MinPathi.City=Pathi.City; MinPathi.TraNo=Pathi.TraNo; curPath=curPathNo;MinTime=CurTime-StartTime;elsecurPathNo+;PathcurPathNo.City=City;if (!TraveIType)for (i=0;i=(CurTime%1440)&(AdjListCity.Traini.StopTime+(CurTime/1440)*1440-StartTime=CurTime)&(AdjListCity.Flighti.StopT ime+(CurTime/1440)*1440-StartTimeMinTime)PathcurPathNo.TraNo=i;SearchMinTime(AdjListCity.Flighti.EndCity,EndCity,AdjListCity.Flighti. StopTime+(CurTime/1440)*1440,curPathNo,TravelType);if(AdjListCity.Flighti.StartTimevCurTime)&(AdjListCity.Flighti.StopTime+(CurTime/1440)*1440-StartTimeMinTime) PathcurPathNo.TraNo=i;SearchMinTime(AdjListCity.FIighti.EndCity,EndCity,AdjListCity.FIighti.StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType);return 1;(13) 计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType)int i;int startH, startM, endH, endM;/定义四个变量:startH 出发的小时,startM出发的分钟, endH到达的小时, endM到达的分钟MinTime=32767;curPath=0;Path0.City=StartCity;if (!TravelType)for (i=0;iAdjListStartCity.TrainNum;i+)Path0.TraNo=i;StartTime=AdjListStartCity.Traini.StartTime;SearchMinTime(AdjListStartCity.Traini.EndCity,EndCity,AdjListStartCity .Traini.StopTime,0,TravelType); else for (i=0;iAdjListStartCity.FlightNum;i+)Path0.TraNo=i;StartTime=AdjListStartCity.FIighti.StartTime;SearchMinTime(AdjListStartCity.FIighti.EndCity,EndCity,AdjListStartCity .FIighti.StopTime,0,TravelType);if (MinTime=32767)printf(nNo access to that destination!);return 0;/ if (!TravelType)II StartTime=AdjListStartCity.TrainMinPath0.TraNo.StartTime;II elseII StartTime=AdjListStartCity.FIightMinPath0.TraNo.StartTime;printf(nPath:n);for (i=0;iv=curPath;i+)if (!TraveIType)printf(%s:%s,CityNameMinPathi.City,AdjListMinPathi.City.TrainMinPathi.TraNo .name);eIseprintf(%s:%s,CityNameMinPathi.City,AdjListMinPathi.City.FIightMinPathi.TraNo .name);startHAdjListMinPathi.City.TrainMinPathi.TraNo.StartTime I 60 ;startMAdjListMinPathi.City.TrainMinPathi.TraNo.StartTime % 60 ;J ujn)aj 09%ew!丄 U!M09/eg 丄 U!M,冋 nu!iuPZ%JnoqPZ%:)soqeni!丄 uqu!dAiiopualaiueNAiioiNOIlVNIlSaa :s%.)Buud(H#e)s“usz%:SZ%-SZ%:SZ% )Buud/ i(l/lpuat11up%11)Buud.O.jBuud (Ok/l/IPua)i )J!i(HPuat11:p%11)Buud.O.jBuud(Ok/HPua)i )J!- p%.)BU!Jd.O.jBuud(Ok/l/IPB)s)i )J!i(Hpe)st11:p%11)Buud.O.jBuud(Ok/HPe)s)j )J!:09 % aiU!ido)s oNBJi !q)edU!|/|u!eJi A)!o !q)edU!l/|)snrpv l/ipua:09 / aiU!ido)s oNBJi !q)edU!|/|u!eJi A)!o !q)edU!l/|)snrpvHPua(14) 计算最小费用路线:int CalcMinCost (int StartCity,int EndCity,int TravelType) int maDij_MAXNDij_MAXN;int i,j,min,end;for (i=0;iCityNum;i+)for (j=0;jCityNum;j+) maij=-1;if (T ravelType=0)for (i=0;iCityNum;i+)min=32767;j=0;while (jAdjListi.TrainNum)min=32767; end=AdjListi.Trainj.EndCity; while(end=AdjListi.Trainj.EndCity&jvAdjListi.TrainNum)if (AdjListi.Trainj.Costmin) min=AdjListi.Trainj.Cost; j+; elsemaiend=min;for (i=0;iCityNum;i+) min=32767;j=0;while (jvAdjListi.FIightNum)min=32767; end=AdjListi.FIightj.EndCity; while(end=AdjListi.FIightj.EndCity&jvAdjListi.FIightNum)if (AdjListi.FIightj.Costvmin)min=AdjListi.FIightj.Cost;j+; maiend=min;Dijkstra(ma,StartCity,EndCity,TravelType); return 1;五、功能模块间函数的调用关系,如下图所示:1主界面:0燼寻结艳佼送携和Wbug佼逍模披代诃妙*.帀帀ahg:,快 -矍父蓉6*加除加鹭询岀
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!