全國交通咨詢模擬系統(tǒng)實驗報告_第1頁
全國交通咨詢模擬系統(tǒng)實驗報告_第2頁
全國交通咨詢模擬系統(tǒng)實驗報告_第3頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、全國交通咨詢模擬:處于對不同目的的旅客對交通工具有不同的要求。例如, 因公出差的旅客希望在旅途中的時間盡可能短, 出門旅游的游客則希望旅費盡可 能省,而老年旅客則要求中轉(zhuǎn)次數(shù)最少。編制一個全國城市間的交通咨詢程序, 為旅客提供兩種或三種最優(yōu)決策的交通咨詢?!净疽蟆浚?)提供對城市信息進(jìn)行編輯(如:添加或刪除)的功能。(2)城市之間有兩種交通工具:火車和飛機(jī)。提供對列車時刻表和 飛機(jī)航班進(jìn)行編輯(增設(shè)或刪除)的功能。(3)提供兩種最優(yōu)決策:最快到達(dá)或最省錢到達(dá)。全程只考慮一種 交通工具。(4)旅途中耗費的總時間應(yīng)該包括中轉(zhuǎn)站的等候時間。(5) 咨詢以用戶和計算機(jī)的對話方式進(jìn)行。由用戶輸入起始

2、站、終點站、最優(yōu)決策原則和交通工具,輸出信息:最快需要多長時 間才能到達(dá)或者最少需要多少旅費才能到達(dá),并詳細(xì)說明依次【測試數(shù)據(jù)】于何時乘坐哪一趟列車或哪一次班機(jī)到何地。 今魯木爾濱305蘭州 842 西安534/弋菱沈陽天津397'349674大連鄭州徐州 武漢110067409<907-丄 367貴陽'672株州675廣州140639昆明607二、數(shù)據(jù)結(jié)構(gòu)設(shè)計和核心算法設(shè)計描述:宀南丁1、根據(jù)題目中的基本要求分析,可以創(chuàng)建651825南昌25上海622福州,流程設(shè)計框圖如下:/'開始iJ丿王界面用戶輸入,頑取option的值王界面詳細(xì)地

3、了解。并且從中也可得知路線的添加即數(shù)據(jù)的存儲是這個系統(tǒng)進(jìn)行運(yùn)作的 一個基礎(chǔ)。而為了便于數(shù)據(jù)的存儲、添加、刪除等操作,我選擇了儲存文件對這 些數(shù)據(jù)進(jìn)行了存儲。將每個信息量放在不同的文件中, 可以更有效、直觀地對這 些數(shù)據(jù)進(jìn)行處理。流程圖中的7個主要功能模塊在主函數(shù)中,采用輸入選項進(jìn)入子菜單,但是 其他操作都是在路線添加好后進(jìn)行的, 并且為了每一項功能進(jìn)行完后,系統(tǒng)可以 及時回到主交互界面,我采用的是無限循環(huán)形式,即 while ( 1)。以鄰接表作交通圖的存儲結(jié)構(gòu),表示邊的結(jié)點內(nèi)除含有鄰接點的信息外, 包 括交通工具、路程中消耗的時間和花費以及出發(fā)和到達(dá)的時間等多項屬性。三、主控及功能模塊層次結(jié)

4、構(gòu):1、模塊說明:本系統(tǒng)分為個模塊1、)主函數(shù)2、)添加城市3、)查找城市并返回序號4、)刪除城市5、)添加列車6、)添加航班7、)刪除列車或航班&)找岀最小費用路線9、)初始化系統(tǒng)數(shù)據(jù)(讀入內(nèi)存)10、)找出最快路線11、)計算最快路線耗費的時間并打印12、)計算最小費用路線13、)主界面14、)存儲信息到文件15、)退岀、2、下面是各模塊示意圖:基本操作:TrafficNodeDat交通工具 信息Charn ameMAX_STRING_NUM班次Int starttime出發(fā)時間Int starttime到達(dá)時間Int cost票價UNodeDat路線 信息Short int ci

5、ty城市編號Int TrainNum火車路線數(shù)int FlightNum航班路線數(shù)TrafficNodeDatTrai nMAX_TRAFFIC_NUM火車路線信息TrafficNodeDat FlightMAX_TRAFFIC_ NUM航班路線信息函數(shù)變量聲明:#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)計算最快路線所需時間并打?。篿nt 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;五、功能模塊間函數(shù)的調(diào)用關(guān)系,如下圖所示: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()六、調(diào)試結(jié)果: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養(yǎng)專卄市帀道杲快* 蔽威立亠*曇亟卄加除如脣詢出*添刪添闍香退M:2、添加城市:輸入命令1后,按提示輸入城市名,而后返回主界面> 一!ils:l一W4&a專署麒乂蓉霧刪添闍查退ij/pe In 配廿ule Cohm id.iid-

46、1輸入城審名二重慶lofu Sdye OK?Type In ¥onr Uomnand: 2K:曹燮 節(jié)芒.qr,決 叢更£'第 加囂屠詢岀 添刪添墾查退原city文件:添加城市后的city文件:吃式亙看(Vcity-M -遠(yuǎn)李豐3、刪除城市:輸入命令2后,按提示輸入城市名,而后返回主界面 H Iff 和 K -nit km w nn:£彳屆加或市肅入城審名二成都 yghtsin nfif Sdue OX!*T Vue Im Vunr C<LHiM idiid-2線«-!-SH-韋專路除加屠慟出刪添gw杳IJ添加帥逡 攣鄭懸路線查詢農(nóng)快路線

47、退岀Type In Your Ud<mnand:4、添加路線:輸入命令3后,按提示依次輸入起始站、終點站、類 型、起始時刻、到達(dá)時刻、票價等信息,而后返回主界面ustern Lnf9 Saue OKTIn Vour Comnand:3:添加城止IL.Mi.ik-3-M線r_&-£"巾帀迪眾快“械克交宀韻®眾“題加需詢出-暮刪涯刪査查識I ype起始辛城幣,笆=重慶 終再站螂if 類 m t.to,ia. rati) :a 列車?yán)鋺?yīng)廠"沖 氏割佃少嘰24hB4jl|:12:M :.二j w恥靦,±4小時喲X賞=ae-12Gystem Info Save OKT添加路線后的tr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論