


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、问题描述 全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。 例如, 因公出差的旅客希望在旅途中的时间尽可能短, 出门旅游的游客则希望旅费尽可 能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序, 为旅客提供两种或三种最优决策的交通咨询。【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能(2) 城市之间有两种交通工具:火车和飞机。提供对列车时刻表和 飞机航班进行编辑(增设或删除)的功能。(3) 提供两种最优决策:最快到达或最省钱到达。全程只考虑一种 交通工具。(4) 旅途中耗费的总时间应该包括中转站的等候时间。(5) 咨询以用户和计算机的对话方式
2、进行。由用户输入起始站、终 点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次 于何时乘坐哪一趟列车或哪一次班机到何地。【测试数据】今鲁木齐21618921100昆明6391145534'深圳上海825南2昌 福州北京37 704.徐州651672255柳州南宁684296790740934917天津大连242 哈尔滨305 长春二、数据结构设计和核心算法设计描述:1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下:班次起止时间交通工具 信息2、逻辑结构拆分:票价3、核心设计:根据上面的流程图和逻辑拆分,对这个
3、问题有了一个比较直观, 详细地了解。并且从中也可得知路线的添加即数据的存储是这个系统进行运作的 一个基础。而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这 些数据进行了存储。将每个信息量放在不同的文件中, 可以更有效、直观地对这 些数据进行处理。流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是 其他操作都是在路线添加好后进行的, 并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用的是无限循环形式,即while (1)。以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外, 包 括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。
4、三、主控及功能模块层次结构:1、模块说明:本系统分为个模块1、 )主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:rFtf裁退5艾 档诒入內存薜B航班焉加到车有僭信息到袁Hi r蓟返3文样请入內存刑肚脏婕电悄信良列文件11Fqr初蛤化玉坨 赴夾S工 匕幢入内存)蠶黑驚存桶倍翅到文住卸始化磊蜿匏据(从文计篦导快魅 纯輕曹的町 司列卩吐
5、储诣息到文啤基本操作: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函数变量声明:#in elude <>#in elude <>#d
6、efi 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 10con st char CityFile ="D:"con st char Trai nFile ="D:"con st char FlightFile ="D:"typedef short int CityType;typedef struct TrafficNodechar nameMA
7、X_STRING_NUM; rainNum;fprin tf(fp,"%dn",total);for (i=O;i<CityNum;i+)for (j=0;j<AdjListi.Trai nNu m;j+)fprin tf(fp,"%s %s %s ", AdjListi.Trai nj. name,CityNamei,CityNameAdjListi.Trai nj.E ndCity);%dn",fprin tf(fp,"%2d:%2d%2d:%2dAdjListi.Trai nj.StartTime/60,AdjLis
8、ti.Trai nj.StartTime%60,AdjListi.Trai nj.StopTime/60,AdjListi.Trai nj.StopTime%60, AdjListi.Trai nj.Cost);fclose(fp);total=0;fp=fope n(FlightFile,"w");for (i=0;i<CityNum;i+)total+=AdjListi.FlightNum;fprin tf(fp,"%dn",total);for (i=0;i<CityNum;i+)for (j=0;j<AdjListi.Fligh
9、tNum;j+)fprin tf(fp,"%s %s %s ", AdjListi.Flightj. name, CityNamei,%dn",CityNameAdjListi.Flightj.E ndCity); fprin tf(fp,"%2d:%2d%2d:%2dAdjListi.Flightj.StartTime/60,AdjListi.Flightj.StartTime%60, AdjListi.Flightj.StopTime/60, AdjListi.Flightj.StopTime%60,AdjListi.Flightj.Cost);fc
10、lose(fp);return 1;(4) 添加城市:int In sertCity (char *Name)strcpy(CityNameCityNum,Name);AdjListCityNum.city=CityNum;AdjListCityNum.FIightNum=O;AdjListCityNum.Trai nNu m=0;CityNum+;return 1;(5) 删除城市:int DelCity (char *Name)/ in t city,i,j;/city=SeekCity(Name);for (i=city;i<CityNum-1;i+)strcpy(CityName
11、i,CityNamei+1);AdjListi.FIightNum=AdjListi+1.FIightNum;AdjListi.Trai nNu m=AdjListi+1.Trai nNum;for (j=0;j<AdjListi.FlightNum;j+)AdjListi.Flightj.Cost=AdjListi+1.Flightj.Cost;AdjListi.Flightj.E ndCity=AdjListi+1.FIightj.E ndCity;strcpy(AdjListi.Flightj. name,AdjListi+1.FIightj. name);AdjListi.Fli
12、ghtj.StartTime=AdjListi+1.Flightj.StartTime;AdjListi.FIightj.StopTime=AdjListi+1.FIightj.StopTime; /CityNum-;return 1;(6) 添加火车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,intStartTime,intEn dTime,i nt cost)int i,j; i=SeekCity(StartCity); j=SeekCity(E ndCity);AdjListi.Trai nAdjListi.
13、Trai nN um.Cost=cost;AdjListi.Trai nAdjListi.Trai nN um.E ndCity=j;AdjListi.Trai nAdjListi.Trai nN um.StartTime=StartTime;AdjListi.Trai nAdjListi.Trai nN um.StopTime=E ndTime;strcpy(AdjListi.Trai n AdjListi.Trai nNu m. name,trai n);/ AdjListi.Trai nNu m+;return 1;StartTime,i nt(7) 添加航班路线:int InsertF
14、light(char *flight,char *StartCity,char *EndCity,intEn dTime,i nt cost)int i,j;i=SeekCity(StartCity);j=SeekCity(E ndCity);AdjListi.FIightAdjListi.FIightNum.Cost=cost;AdjListi.FIightAdjListi.FIightNum.E ndCity=j;AdjListi.FIightAdjListi.FIightNum.StartTime=StartTime;AdjListi.FIightAdjListi.FIightNum.S
15、topTime=E ndTime;、strcpy(AdjListi.FIightAdjListi.FIightN,flight);AdjListi.FIightNum+; return 1;(8) 删除路线:int DelPath (char *n ame)int i,j,flag=0;for (i=0;i<CityNum;i+)for (j=0;j<AdjListi.FIightNum;j+)if (strcmp(AdjListi.FIightj. name, name)=0)flag=1;break;if (flag)for (;j<AdjListi.FIi
16、ghtNum-1;j+) / AdjListi.FIightj.Cost=AdjListi.FIightj+1.Cost;AdjListi.Flightj.E ndCity=AdjListi.FIightj+1.E ndCity; strcpy(AdjListi.FIightj. name,AdjListi.FIightj+1. name);AdjListi.FIightj.StartTime=AdjListi.FIightj+1.StartTime;AdjListi.FIightj.StopTime=AdjListi.FIightj+1.StopTime;AdjListi.FIightNum
17、-;break;for (j=0;j<AdjListi.Trai nNu m;j+)if (strcmp(AdjListi.Trai nj. name, name)=0) flag=1;break; if (flag)for (;j<AdjListi.Trai nNu m-1;j+)AdjListi.Trai nj.Cost=AdjListi.Trai nj+1.Cost;AdjListi.Trai nj.E ndCity=AdjListi.Trai nj+1.E ndCity;strcpy(AdjListi.Trai nj. name,AdjListi.Trai nj+1. na
18、me);AdjListi.Trai nj.StartTime=AdjListi.Trai nj+1.StartTime;AdjListi.Trai nj.StopTime=AdjListi.Trai nj+1.StopTime;AdjListi.Trai nN um-; break;/ return 1;(9) 打印最小费用路线:voidDijkstra_Output( intmatxDij_MAXNDij_MAXN,i ntPreCityDij_MAXN,i nt p_e nd,i nt TravelType)int trackDij_MAXN;int i=O,j,k, min ,tmp,e
19、 nd,cost=0;int startH, startM, endH, en dM;rai nN um;k+)if(AdjListtracki.Trai n k.E ndCity=e nd&&min> AdjListtracki.Trai n k.Co st) 、min=AdjListtracki.Trai nk.Cost;tmp=k; /prin tf("%s ",AdjListtracki.Trai ntmp. name); startH = AdjListtracki.Trai ntmp.StartTime/60 ; startM = AdjL
20、isttracki.Trai ntmp.StartTime%60; endH = AdjListtracki.Trai n tmp.StopTime/60 ; endM = AdjListtracki.Traintmp.StopTime%60 ;if( !(startH/10)mlH-lHlW: 卡l<書祐冲皿曲宀primfa) / pinff(=%<±=sQrrtH= if(一 (sQTrtMMO)宀primfa)pinff(=%d 丨=s5rrtM)八if(一(endHMO)宀primfa) pimf(=%dnendH= if(一(endMMO)primfa) pri
21、mf(=%2n=endMX En=mpLSQrrtTimeo5PAdj 匚 ssrack 巨.Tain=mpLSQrrtTime%6PAdj Lissrac k 巨.Tain=mpLsfopTime、6PAdj 匚 ssrack 巨.Tain=mpLsfopTime%60)八 F )/ e-se 宀 / folxT'J.ivo 八!) 宀 / prinff(-vl%s=cifyNamenrack=s- endILracku二 minH32767八 for (kHO 八 kAAdj Lisi 口rack 巨 F-ighfNum 八 k+)rai nk.E ndCity改AdjListtr
22、acki.FIightk.E ndCity !/*if(AdjListtracki.Trai n k.E ndCity=e nd&&min >AdjListtracki.FIightk.Co st) */ if(AdjListtracki.FIightk.E ndCity=e nd&&min> AdjListtracki.FIightk.C ost)/ min=AdjListtracki.FIightk.Cost;tmp=k;prin tf("%s",AdjListtracki.FIighttmp. name);startH =
23、AdjListtracki.FIighttmp.StartTime60 ;startM = AdjListtracki.FIighttmp.StartTime60;endH = AdjListtracki.FIighttmp.StopTime / 60 ;en dM = AdjListtracki.FIighttmp.StopTime60 ;if( !(startH/10) )/ /prin tf("0");/prin tf("%d:",startH);if( !(startM/10)prin tf("0");printf("
24、;%d - ",startM);if( !(en dH/10)/prin tf("0");/ prin tf("%d:",e ndH);/if( !(en dM/10) )/prin tf("0");prin tf("%dn",e ndM);lighttmp.StartTime60,AdjListtracki.FIighttmp.StartTime60,AdjListtracki.FIighttmp.StopTime60,AdjListtracki.FIighttmp.StopTime % 60);pri
25、n tf("n%s: DESTINATION!",CityNametrack0);prin tf("nMin Cost : %dn",cost);p_en d,i nt(10) 找出最小费用路线void Dijkstra(i nt matxDij_MAXNDij_MAXN,i nt p_start,i nt TravelType)int PreCityDij_MAXN; .n");/return -1;fscan f(fp,"%d",&CityNum);for (i=0;i<CityNum;i+)fsca nf
26、(fp,"%s",&CityNamei);AdjListi.city=i;AdjListi.Trai nNu m=0;AdjListi.FIightNum=O;fclose(fp);fp=fope n( Trai nFile,"r");if (!fp)/ printf("nError:Cannot Open Train File.n”);return -1;fscan f(fp,"%d",&n um);for (i=0;i <nu m;i+)fscan f(fp,"%s",&
27、stmp1);fscan f(fp,"%s",&stmp2);fscan f(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjListj.Trai nAdjListj.Trai nN um.E ndCity=SeekCity(stmp3); strcpy(AdjListj.Trai nAdjListj.Trai nNu m. name,stmp1);fscan f(fp,"%d:%d",&hour,&min ute);AdjListj.Trai nAdjListj.Trai n
28、N um.StartTime=hour*60+mi nute; fscan f(fp,"%d:%d",&hour,&min ute);AdjListj.Trai nAdjListj.Trai nN um.StopTime=hour*60+mi nute;fscan f(fp,"%d",&cost);AdjListj.Trai nAdjListj.Trai nN um.Cost=cost;AdjListj.Trai nNu m+;fclose(fp);fp=fope n( FlightFile,"r");if (
29、!fp)prin tf("nError:Ca nnot Ope n Flight File.n");return -1;fscan f(fp,"%d",&n um);for (i=0;i <nu m;i+)fscan f(fp,"%s",&stmp1);/fscan f(fp,"%s",&stmp2);/ “fscanf(fp,"%s",&stmp3);/j=SeekCity(stmp2);AdjListj.FIightAdjListj.FIightNum.
30、E ndCity=SeekCity(stmp3);strcpy(AdjListj.FIightAdjListj.FIightNum. name,stmp1); fscan f(fp,"%d:%d",&hour,&min ute);AdjListj.FIightAdjListj.FIightNum.StartTime=hour*60+mi nute;fscan f(fp,"%d:%d",&hour,&min ute);AdjListj.FIightAdjListj.FIightNum.StopTime=hour*60+mi
31、nute;fscan f(fp,"%d",&cost);AdjListj.FIightAdjListj.FIightNum.Cost=cost;AdjListj.FIightNum+; fclose(fp);return 1;(12)找出最快路线:int SearchMi nTime (CityType City,CityType En dCity,i nt CurTime,i nt curPathNo,i nt TravelType)int i;if (City=E ndCity)if (Min Time>CurTime-StartTime)for (i=0
32、;i<=curPathNo;i+)Mi nPathi.City=Pathi.City;Min Pathi.TraNo=Pathi.TraNo; curPath=curPathNo;Mi nTime=CurTime-StartTime;/ / elsecurPathNo+;PathcurPathNo.City=City;if (!TravelType)for (i=0;i<AdjListCity.Trai nNu m;i+)if(AdjListCity.Trai ni.StartTime>=(CurTime%1440)&&(AdjListCity.Trai n
33、i.StopTime+(CurTime/1440)*1440-StartTime<Mi nTime)PathcurPathNo.TraNo=i;SearchMi nTime(AdjListCity.Trai ni.E ndCity,E ndCity,AdjListCity.Trai ni.S topTime+(CurTime/1440)*1440,curPathNo,TravelType); /if/(AdjListCity.Trai ni.StartTime<(CurTime%1440)&&(AdjListCity.Trai ni.StopTime+(CurTim
34、e/1440)*1440-StartTime<Mi nTime) / PathcurPathNo.TraNo=i;SearchMi nTime(AdjListCity.Trai ni.E ndCity,E ndCity,AdjListCity.Trai ni.S topTime+(CurTime/1440+1)*1440,curPathNo,TravelType);elsefor (i=0;i<AdjListCity.FIightNum;i+)/ /if(AdjListCity.FIighti.StartTime>=CurTime)&&(AdjListCity
35、.FIighti.StopT ime+(CurTime/1440)*1440-StartTime<Mi nTime)PathcurPathNo.TraNo=i;SearchMi nTime(AdjListCity.FIighti.E ndCity,E ndCity,AdjListCity.FIighti.StopTime+(CurTime/1440)*1440,curPathNo,TravelType);if(AdjListCity.FIighti.StartTime<CurTime)&&(AdjListCity.FIighti.StopTi me+(CurTime
36、/1440)*1440-StartTime<Mi nTime)PathcurPathNo.TraNo=i;SearchMi nTime(AdjListCity.FIighti.E ndCity,E ndCity,AdjListCity.FIighti. StopTime+(CurTime/1440+1)*1440,curPathNo,TraveIType); /return 1;(13)计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType)int i;int startH, startM, endH
37、, endM;ity=StartCity;if (!TravelType)for (i=O;i<AdjListStartCity.Trai nNu m;i+)Path0.TraNo=i;StartTime=AdjListStartCity.Trai ni.StartTime;SearchMi nTime(AdjListStartCity.Trai ni.E ndCity,E ndCity,AdjListStartCity .Trai ni.StopTime,0,TravelType);elsefor (i=0;i<AdjListStartCity.FlightNum;i+)Path
38、0.TraNo=i;StartTime=AdjListStartCity.Flighti.StartTime;SearchMi nTime(AdjListStartCity.FIighti.E ndCity,E ndCity,AdjListStartCity .FIighti.StopTime,0,TravelType); if (Min Time=32767)prin tf("nNo access to that dest in ati on!");return 0;rai nMi nPath0.TraNo.StartTime;lightMi nPath0.TraNo.S
39、tartTime;prin tf("nPath:n");for (i=0;i<=curPath;i+)if (!TravelType)%s%sprin tf("%s",CityNameMi nPathi.City,AdjListMi nPathi.City.Trai nMi nPathi.TraNo .n ame);elseprin tf("%s",CityNameMi nPathi.City,AdjListMi nPathi.City.FIightMi nPathi.TraNo .n ame);startHAdjListMi
40、nPathi.City.Trai nMi nPathi.TraNo.StartTime / 60 ;startMAdjListMinPathi.City.TrainMinPathi.TraNo.StartTime % 60 ;en dHAdjListMi nPathi.City.Trai nMi nPathi.TraNo.StopTime / 60 ;en dMAdjListMi nPathi.City.Trai nMi nPathi.TraNo.StopTime % 60 ;if( !(startH/10)'prin tf("0"); prin tf("
41、%d:",startH);if( !(startM/10)prin tf("0");prin tf("%d - ",startM);if( !(en dH/10)prin tf("0");prin tf("%d:",e ndH);if( !(endM/10)prin tf("0");prin tf("%dn",e ndM);rainNum)/ /min=32767;en d=AdjListi.Trai nj.E ndCity;while(en d=AdjListi.
42、Trai nj.E ndCity&&j<AdjListi.Trai nNum)if (AdjListi.Trai nj.Cost<mi n)min=AdjListi.Trai nj.Cost;j+;elsemaie nd=mi n;for (i=0;i<CityNum;i+)mi n=32767;j=0;while (j<AdjListi.FIightNum)min=32767;en d=AdjListi.Flightj.E ndCity; while(en d=AdjListi.FIightj.E ndCity&&j<AdjLis
43、ti.FIightNum)if (AdjListi.FIightj.Cost<mi n)min=AdjListi.Flightj.Cost;/ j+;maie nd=mi n;/ / Dijkstra(ma,StartCity,E ndCity,TravelType);return 1;五、功能模块间函数的调用关系,如下图所示:Calcm in cost(startci删除路线:In itSysData()DelPath( name)SaveSysI nfo()CalcMi nCost():Dijkstra(ma,StertC ity,E ndCity,TravelT ype)添加路线:
44、In itSysData()In sertFlight( name,s_city,e_city,s_hour*60+s_ minu te,e_hour*60+e_ minu te,cost)In sertFlight( name,s_city,e_city,s_hour*60+s_ minu te,e_hour*60+e_ minu te,cost)SaveSysI nfo()六、调试结果:1、主界面:Dijkstra():Dijkstra_OutPut(m atx,PreCity,p_e nd, TravelType)SeekCity(StartCity) SeekCity(E ndCity
45、)In sertFlight():SeekCity(StartCity) SeekCity(E ndCity)s pg据咕恸交适棋拟'Debugs违嚼曲弋冯F讨Mr$ u m 卄、帀帀適杲快| 讓wnw 卄诰出 s添删恳翌_皆退7CKMMM MM-MMMMMMM RMM3CMM1CMM: X M M SC MTjiiie In Vdlap Cloimand;回 S、添加城市:输入命令1后,按提示输入城市名,而后返回主界面回 SZ线fe&-BUK路 誠£:亀最 除加暑询岀 删厉坐舌正klType In youf Lomnand: 半:线线曇H、帀量xg'事加际加
46、常询岀谭city文件:0、city文件:E P:強祭吕交运模世Debjg总遇臬卞弋冯-论cityR -讦李丰第】行,第1取L3、删除城市:输入命令2后,按提示输入城市名,而后返回主界面:退出JlHSI W JtH 賈耳)(貝JCJlMJtJCJtMSl入减审嗒二成都Iitf J Sde OKt丄线 si kJ EHU线线肇 一威城亠笑SI取 一加除加屠询岀 一添删添聖查退Type In Your C<n>mnand:4、添加路线:输入命令3后,按提示依次输入起始站、终点站、类 型、起始时刻、到达时刻、票价等信息,而后返回主界面- 口谓i看哉交诣模世Wbg交遇慎也弋冯 *| H 回 SZvstem Intoi Saye uKT4添加路线后的train文件:" train.口回 広 IIaraa I立忙i月亦§i.£j ffi贰i.s 秀看(V iPaiHi1.rrq 重庆析州 12: o S3: o 126线nJ路 WM巾帀B1S小快 “黴克交必日®眾 心穆加屠询出 -暮删涯删査查识M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中班防欺凌课件
- 新疆阿克苏市沙雅县二中2025年高三第二次诊断性检测化学试卷含解析
- 统编版语文五年级下册《语文园地六》精美课件
- 浙教版 2021-2022学年度八年级数学上册模拟测试卷
- 浙教版 2021-2022学年度八年级数学上册模拟测试卷
- 2025太原工业学院辅导员考试题库
- 2025泉州工艺美术职业学院辅导员考试题库
- 2025福建体育职业技术学院辅导员考试题库
- “白沙”杯价格法规知识竞赛题库
- “刑法”知识考试题库
- 供货调试验收方案
- 2024年江苏省盐城市中考物理真题
- 2025年山东省烟草专卖局公司招聘笔试参考题库含答案解析
- 《光电对抗原理与应用》课件第7章
- 2024版标本采集课件
- 自建房质量安全课件
- 沥青拌和站安全培训
- 江苏省事业单位综合知识和能力素质真题与答案解析
- 盐城内河港大丰港区沪丰粮油码头工程环评报告表
- 2024年全国《考评员》专业技能鉴定考试题库与答案
- 2022届上海市各区高考数学一模试卷(含详细解析)共11份 (学生版+解析版)
评论
0/150
提交评论