全国交通咨询模拟系统实验报告_第1页
全国交通咨询模拟系统实验报告_第2页
全国交通咨询模拟系统实验报告_第3页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。例如, 因公出差的旅客希望在旅途中的时间尽可能短, 出门旅游的游客则希望旅费尽可 能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序, 为旅客提供两种或三种最优决策的交通咨询。【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。(2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和 飞机航班进行编辑(增设或删除)的功能。(3)提供两种最优决策:最快到达或最省钱到达。全程只考虑一种 交通工具。(4)旅途中耗费的总时间应该包括中转站的等候时间。(5) 咨询以用户和计算机的对话方式进行。由用户输入起始

2、站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时 间才能到达或者最少需要多少旅费才能到达,并详细说明依次【测试数据】于何时乘坐哪一趟列车或哪一次班机到何地。 今鲁木尔滨305兰州 842 西安534/弋菱沈阳天津397'349674大连郑州徐州 武汉110067409<907-丄 367贵阳'672株州675广州140639昆明607二、数据结构设计和核心算法设计描述:宀南丁1、根据题目中的基本要求分析,可以创建651825南昌25上海622福州,流程设计框图如下:/'开始iJ丿王界面用户输入,頑取option的值王界面详细地

3、了解。并且从中也可得知路线的添加即数据的存储是这个系统进行运作的 一个基础。而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这 些数据进行了存储。将每个信息量放在不同的文件中, 可以更有效、直观地对这 些数据进行处理。流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是 其他操作都是在路线添加好后进行的, 并且为了每一项功能进行完后,系统可以 及时回到主交互界面,我采用的是无限循环形式,即 while ( 1)。以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外, 包 括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。三、主控及功能模块层次结

4、构:1、模块说明:本系统分为个模块1、)主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班&)找岀最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退岀、2、下面是各模块示意图:基本操作:TrafficNodeDat交通工具 信息Charn ameMAX_STRING_NUM班次Int starttime出发时间Int starttime到达时间Int cost票价UNodeDat路线 信息Short int ci

5、ty城市编号Int TrainNum火车路线数int FlightNum航班路线数TrafficNodeDatTrai nMAX_TRAFFIC_NUM火车路线信息TrafficNodeDat FlightMAX_TRAFFIC_ NUM航班路线信息函数变量声明:#in elude <>#in elude <>#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 10con st

6、 char CityFile ="D:"con st char Trai nFile ="D:"con st char FlightFile ="D:"typedef short int CityType;typedef struct TrafficNodechar nameMAX_STRING_NUM; rainNum; fprin tf(fp,"%dn",total);for (i=O;i<CityNum;i+)for (j=0;j<AdjListi.TrainNum;j+)fprintf(fp,&

7、quot;%s %s %s ", AdjListi.T, CityNamei, CityNameAdjListi.Trainj.EndCity); fprintf(fp,"%2d:%2d %2d:%2d %dn", AdjListi.Trainj.StartTime/60,AdjListi.Trainj.StartTime%60, AdjListi.Trainj.StopTime/60, AdjListi.Trainj.StopTime%60, AdjListi.Trainj.Cost);fclose(fp);total=0;fp=fopen(

8、FlightFile,"w");for (i=0;i<CityNum;i+)total+=AdjListi.FlightNum;fprintf(fp,"%dn",total);for (i=0;i<CityNum;i+)for (j=0;j<AdjListi.FlightNum;j+)fprintf(fp,"%s %s %s ", AdjListi.F, CityNamei, CityNameAdjListi.Flightj.EndCity); fprintf(fp,"%2d:%2d

9、%2d:%2d %dn", AdjListi.Flightj.StartTime/60,AdjListi.Flightj.StartTime%60,AdjListi.Flightj.StopTime/60,AdjListi.Flightj.StopTime%60,AdjListi.Flightj.Cost);fclose(fp);return 1;(4) 添加城市:int In sertCity (char *Name)strcpy(CityNameCityNum,Name);AdjListCityNum.city=CityNum;AdjListCityNum.FIightNum=O

10、;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(CityNamei,CityNamei+1);AdjListi.FIightNum=AdjListi+1.FIightNum;AdjListi.Trai nNu m=AdjListi+1.Trai nNum;for (j=0;j<AdjListi.FlightNum;j+)AdjListi

11、.Flightj.Cost=AdjListi+1.Flightj.Cost;AdjListi.Flightj.E ndCity=AdjListi+1.FIightj.E ndCity;strcpy(AdjListi.Flightj. name,AdjListi+1.FIightj. name);AdjListi.Flightj.StartTime=AdjListi+1.Flightj.StartTime;AdjListi.FIightj.StopTime=AdjListi+1.FIightj.StopTime;CityNum-;return 1;(6) 添加火车路线:int In sertTr

12、ain (char *tra in, char *StartCity,char *En dCity,i nt StartTime,i ntEn dTime,i nt cost)int i,j;i=SeekCity(StartCity);j=SeekCity(E ndCity);AdjListi.Trai nAdjListi.Trai nN um.Cost=cost;AdjListi.Trai nAdjListi.Trai nN um.E ndCity=j;AdjListi.Trai nAdjListi.Trai nN um.StartTime=StartTime;AdjListi.Trai n

13、AdjListi.Trai nN um.StopTime=E ndTime; strcpy(AdjListi.Trai n AdjListi.Trai nNu m. name,trai n); AdjListi.Trai nNu m+;return 1;(7) 添加航班路线:int InsertFlight(char *flight,char *StartCity,char *EndCity,int StartTime,intEn dTime,i nt cost)int i,j;i=SeekCity(StartCity);j=SeekCity(E ndCity);AdjListi.FIight

14、AdjListi.FIightNum.Cost=cost;AdjListi.FIightAdjListi.FIightNum.E ndCity=j;AdjListi.FlightAdjListi.FlightNum.StartTime=StartTime;AdjListi.FIightAdjListi.FIightNum.StopTime=E ndTime; strcpy(AdjListi.FIightAdjListi.FIightNum. name,flight); AdjListi.FIightNum+;return 1;(8) 删除路线:int DelPath (char *name)i

15、nt i,j,flag=0;for (i=0;i<CityNum;i+)for (j=0;j<AdjListi.FlightNum;j+)if (strcmp(AdjListi.F,name)=0)flag=1;break;if (flag)for (;j<AdjListi.FlightNum-1;j+)AdjListi.Flightj.Cost=AdjListi.Flightj+1.Cost;AdjListi.Flightj.EndCity=AdjListi.Flightj+1.EndCity;strcpy(AdjListi.F,

16、AdjListi.Flightj+1.name);AdjListi.Flightj.StartTime=AdjListi.Flightj+1.StartTime;AdjListi.Flightj.StopTime=AdjListi.Flightj+1.StopTime;AdjListi.FlightNum-;break;for (j=0;j<AdjListi.TrainNum;j+)if (strcmp(AdjListi.T,name)=0) flag=1;break;if (flag)for (;j<AdjListi.Trai nNu m-1;j+)AdjLi

17、sti.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. name);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)

18、 打印最小费用路线:void Dijkstra_Output(i nt matxDij_MAXNDij_MAXN,i ntPreCityDij_MAXN,i nt p_e nd,i nt TravelType)int trackDij_MAXN;int i=O,j,k, min ,tmp,e 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=AdjListt

19、racki.Trai nk.Cost; tmp=k;prin tf("%s",AdjListtracki.Trai ntmp. 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"

20、);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);raintmp.StartTime/60,AdjListtracki.Traintmp.StartTime%60,Adj

21、Listtra cki.Traintmp.StopTime/60,AdjListtracki.Traintmp.StopTime%60);elsefor(i-;i>0;i-)printf("n%s:",CityNametracki); end=tracki-1;min=32767;for (k=0;k<AdjListtracki.FlightNum;k+)raink.EndCity 改为AdjListtracki.Flightk.EndCity !/*if(AdjListtracki.Traink.EndCity=end&&min>AdjL

22、isttracki.Flightk.Cost) */if(AdjListtracki.Flightk.EndCity=end&&min>AdjListtracki.Flightk.C ost) min=AdjListtracki.Flightk.Cost; tmp=k; printf("%s",AdjListtracki.F); startH = AdjListtracki.Flighttmp.StartTime /60 ;startM = AdjListtracki.Flighttmp.StartTime %60;endH

23、= AdjListtracki.Flighttmp.StopTime / 60 ;endM = AdjListtracki.Flighttmp.StopTime %60 ;if( !(startH/10) ) printf("0");printf("%d:",startH);if( !(startM/10) ) printf("0");printf("%d - ",startM);if( !(endH/10) )printf("0");prin tf("%d:",e ndH)

24、;if( !(endM/10)prin tf("0");prin tf("%dn",e ndM); lighttmp.StartTime /60,AdjListtracki.FIighttmp.StartTime %60,AdjListtracki.FIighttmp.StopTime /60,AdjListtracki.FIighttmp.StopTime % 60);prin tf("n%s: DESTINATION!",CityNametrack0);prin tf("nMin Cost : %dn",cos

25、t);(10) 找出最小费用路线void Dijkstra(i nt matxDij_MAXNDij_MAXN,i nt p_start,i nt p_e nd,i nt TravelType)int PreCityDij_MAXN; .n");return -1;fscan f(fp,"%d",&CityNum);for (i=0;i<CityNum;i+)fsca nf(fp,"%s",&CityNamei);AdjListi.city=i;AdjListi.Trai nNu m=0;AdjListi.FIightNu

26、m=0;fclose(fp);fp=fope n( Trai nFiIe,"r");if (!fp)printf("nError:Cannot Open Train File.n");return -1;fscanf(fp,"%d",&num);for (i=0;i<num;i+)fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(

27、stmp2);AdjListj.TrainAdjListj.TrainNum.EndCity=SeekCity(stmp3);strcpy(AdjListj.TrainAdjListj.TrainN,stmp1); fscanf(fp,"%d:%d",&hour,&minute);AdjListj.TrainAdjListj.TrainNum.StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjListj.TrainAdjListj.Tr

28、ainNum.StopTime=hour*60+minute; fscanf(fp,"%d",&cost); AdjListj.TrainAdjListj.TrainNum.Cost=cost; AdjListj.TrainNum+;fclose(fp);fp=fopen(FlightFile,"r");if (!fp)printf("nError:Cannot Open Flight File.n");return -1;fscanf(fp,"%d",&num);for (i=0;i<num

29、;i+)fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscan f(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjListj.FIightAdjListj.FIightNum.E ndCity=SeekCity(stmp3);strcpy(AdjListj.FIightAdjListj.FIightNum. name,stmp1); fscan f(fp,"%d:%d",&hour,&min ute)

30、;AdjListj.FIightAdjListj.FIightNum.StartTime=hour*60+mi nute;fscan f(fp,"%d:%d",&hour,&min ute);AdjListj.FIightAdjListj.FIightNum.StopTime=hour*60+mi nute;fscan f(fp,"%d",&cost);AdjListj.FIightAdjListj.FIightNum.Cost=cost;AdjListj.FIightNum+;fclose(fp);return 1;(12)找出

31、最快路线:int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,i nt TravelType)int i;if (City=E ndCity)if (Min Time>CurTime-StartTime)for (i=0;i<=curPathNo;i+)Mi nPathi.City=Pathi.City;Min Pathi.TraNo=Pathi.TraNo; curPath=curPathNo;Mi nTime=CurTime-StartTime;elsecurPathNo+;Pa

32、thcurPathNo.City=City;if (!TravelType)for (i=0;i<AdjListCity.TrainNum;i+)if(AdjListCity.Traini.StartTime>=(CurTime%1440)&&(AdjListCity.Train i.StopTime+(CurTime/1440)*1440-StartTime<MinTime)PathcurPathNo.TraNo=i;SearchMinTime(AdjListCity.Traini.EndCity,EndCity,AdjListCity.Traini.Sto

33、pTime+(CurTime/1440)*1440,curPathNo,TravelType);if(AdjListCity.Traini.StartTime<(CurTime%1440)&&(AdjListCity.Traini.StopTime+(CurTime/1440)*1440-StartTime<MinTime)PathcurPathNo.TraNo=i;SearchMinTime(AdjListCity.Traini.EndCity,EndCity,AdjListCity.Traini.StopTime+(CurTime/1440+1)*1440,cu

34、rPathNo,TravelType);elsefor (i=0;i<AdjListCity.FlightNum;i+)if(AdjListCity.FIighti.StartTime>=CurTime)&&(AdjListCity.FIighti.StopTime+(CurTime/1440)*1440-StartTime<Mi nTime)PathcurPathNo.TraNo=i;SearchMi nTime(AdjListCity.FIighti.E ndCity,E ndCity,AdjListCity.FIighti. StopTime+(CurT

35、ime/1440)*1440,curPathNo,TravelType);if(AdjListCity.Flighti.StartTime<CurTime)&&(AdjListCity.FIighti.StopTi me+(CurTime/1440)*1440-StartTime<Mi nTime)PathcurPathNo.TraNo=i;SearchMi nTime(AdjListCity.FIighti.E ndCity,E ndCity,AdjListCity.FIighti.StopTime+(CurTime/1440+1)*1440,curPathNo,

36、TraveIType);return 1;(13)计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType)int i;int startH, startM, endH, endM;ity=StartCity;if (!TraveIType)for (i=0;i<AdjListStartCity.Trai nNu m;i+)Path0.TraNo=i;StartTime=AdjListStartCity.Trai ni.StartTime;SearchMinTime(AdjListStartCity.T

37、raini.EndCity,EndCity,AdjListStartCity.Traini.StopTime,0,TravelType);elsefor (i=0;i<AdjListStartCity.FlightNum;i+)Path0.TraNo=i;StartTime=AdjListStartCity.Flighti.StartTime;SearchMinTime(AdjListStartCity.Flighti.EndCity,EndCity,AdjListStartCity .Flighti.StopTime,0,TravelType);if (MinTime=32767)pr

38、intf("nNo access to that destination!");return 0;rainMinPath0.TraNo.StartTime;lightMinPath0.TraNo.StartTime;printf("nPath:n");for (i=0;i<=curPath;i+)if (!TravelType)printf("%s : %s",CityNameMinPathi.City,AdjListMinPathi.City.TrainMinPathi.TraN);elseprintf("

39、;%s : %s",CityNameMinPathi.City,AdjListMinPathi.City.FlightMinPathi.TraNo .name);startH =AdjListMinPathi.City.TrainMinPathi.TraNo.StartTime / 60 ;startM =AdjListMinPathi.City.TrainMinPathi.TraNo.StartTime % 60 ; endH =AdjListMinPathi.City.TrainMinPathi.TraNo.StopTime / 60 ;endM =AdjListMinPathi

40、.City.TrainMinPathi.TraNo.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(&q

41、uot;%dn",endM);rainNum)min=32767; end=AdjListi.Trainj.EndCity; while(end=AdjListi.Trainj.EndCity&&j<AdjListi.TrainNum)if (AdjListi.Trainj.Cost<min)min=AdjListi.Trainj.Cost;j+;maiend=min;elsefor (i=0;i<CityNum;i+)min=32767;j=0;while (j<AdjListi.FlightNum)min=32767; end=AdjLis

42、ti.Flightj.EndCity; while(end=AdjListi.Flightj.EndCity&&j<AdjListi.FlightNum)if (AdjListi.Flightj.Cost<min)min=AdjListi.Flightj.Cost;j+;maiend=min;Dijkstra(ma,StartCity,EndCity,TravelType);return 1;五、功能模块间函数的调用关系,如下图所示:SearchMi nTime()最短时间:In itSysData() SeekCity (n ame) CalcMi nTime(s

43、tartc ity,e ndcity,traveltyp 最小、费用:SaveSysI nfo() In itSysData()SeekCity( name) SeekCity( name) Calcm in cost(startcit yCHcM®Cove)type) SOjJeSysmfoStertCi ty,E ndCity,TravelT ype)删除路线:In itSysData()DelPath( name)显示菜单:添加城市:ShowMe nu()In itSysData()In sertCity(Name)SaveSysI nfo()删除城市:int mai n()I

44、n itSysData()DelCity(Name)SaveSysI nfo()六、调试结果:1、主界面:DelCity():SeekCity( name)DijksarveSysInfo() Dijkstra_OutPut(ma tx,PreCity,p_e nd,Tr avelType)添加路线:In itSysData()In sertFlight( name,s_city,e_city,s_hour*60+s_mmin ute,e_hour*60+e_mi nute,cost)In sertFlight( name,s_city,e_city,s_hour*60_min ute,cos

45、i inute,e hour*60+e InertTrai n。:SaveSys lnfo() SeekCity(StartCity)SeekCity(E ndCity)厂In sertFlight():SeekCity(StartCity)SeekCity(E ndCity)r口阖軸恸交邀模刃'Debug俠題矣妝代玛心古* 线 MrbJUHkN養專卄市帀道杲快* 蔽威立亠*曇亟卄加除如脣询出*添刪添闍香退M:2、添加城市:输入命令1后,按提示输入城市名,而后返回主界面> 一!ils:l一W4&a專署麒乂蓉雾删添闍查退ij/pe In 配廿ule Cohm id.iid-

46、1输入城审名二重庆lofu Sdye OK?Type In ¥onr Uomnand: 2K:曹燮 节芒.qr,決 叢更£'第 加囂屠询岀 添删添墾查退原city文件:添加城市后的city文件:吃式亘看(Vcity-M -远李丰3、删除城市:输入命令2后,按提示输入城市名,而后返回主界面 H Iff 和 K -nit km w nn:£彳届加或市肃入城审名二成都 yghtsin nfif Sdue OX!*T Vue Im Vunr C<LHiM idiid-2线«-!-SH-韋專路除加屠恸出删添gw杳IJ添加帥逡 攣鄭懸路线查询農快路线

47、退岀Type In Your Ud<mnand:4、添加路线:输入命令3后,按提示依次输入起始站、终点站、类 型、起始时刻、到达时刻、票价等信息,而后返回主界面ustern Lnf9 Saue OKTIn Vour Comnand:3:添加城止IL.Mi.ik-3-M线r_&-£"巾帀迪眾快“械克交宀韵®眾“題加需询出-暮删涯删査查识I ype起始辛城币,笆=重庆 终再站螂if 类 m t.to,ia. rati) :a 列车冷应厂"冲 氏割佃少叽24hB4jl|:12:M :.二j w恥腼,±4小时喲X賞=ae-12Gystem Info Save OKT添加路线后的tr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论