




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、精品文檔 一、問題描述 全國交通咨詢模擬:處于對不同目的的旅客對交通工具有不同的要求。 例如. 因公出差的旅客希望在旅途中的時間盡可能短 .出門旅游的游客則希望旅費盡可 能省.而老年旅客則要求中轉次數(shù)最少。編制一個全國城市間的交通咨詢程序. 為旅客提供兩種或三種最優(yōu)決策的交通咨詢。 【基本要求】(1)提供對城市信息進行編輯(如:添加或刪除)的功能。 (2)城市之間有兩種交通工具:火車和飛機。提供對列車時刻表和 飛機航班進行編輯(增設或刪除)的功能。 (3)提供兩種最優(yōu)決策:最快到達或最省錢到達。全程只考慮一種 交通工具。 (4)旅途中耗費的總時間應該包括中轉站的等候時間。 (5) 咨詢以用戶和
2、計算機的對話方式進行。由用戶輸入起始站、終 最快需要多長時 .并詳細說明依次 點站、最優(yōu)決策原則和交通工具輸出信息: 間才能到達或者最少需要多少旅費才能到達 于何時乘坐哪一趟列車或哪一次班機到何地。 【測試數(shù)據(jù)】 烏魯木齊 216 1892 1145 都842 1100 昆明 639 672 140 深圳 255 *南寧 6 *西安 534 967 907 北京7嚴3沈陽 349674大連 徐州 651 哈爾濱 305 武漢 409上海 367/25 62昌 福州 二、數(shù)據(jù)結構設計和核心算法設計描述: 1、根據(jù)題目中的基本要求分析.可以創(chuàng)建系統(tǒng)概念模型.流程設計框 圖如下: YES 退岀 刪除
3、交通路線 YES Opt Gfl=E? YES 查詢蠱快路線 丫瓷 / NO optiund?、 / NO yES option=3 ;/ Z X NO option=2? YES bption=1 ? 添加交通路線 刪除城幣 査詢費用最小路線 添加城市 主界面 票價 3、核心設計:根據(jù)上面的流程圖和邏輯拆分.對這個問題有了一個比較直觀 詳細地了解。并且從中也可得知路線的添加即數(shù)據(jù)的存儲是這個系統(tǒng)進行運作的 一個基礎。而為了便于數(shù)據(jù)的存儲、添加、刪除等操作 我選擇了儲存文件對這 些數(shù)據(jù)進行了存儲。將每個信息量放在不同的文件中 可以更有效、直觀地對這 些數(shù)據(jù)進行處理。 流程圖中的7個主要功能模塊
4、在主函數(shù)中.采用輸入選項進入子菜單.但是 其他操作都是在路線添加好后進行的并且為了每一項功能進行完后系統(tǒng)可以 及時回到主交互界面.我采用的是無限循環(huán)形式.即while (1)。 以鄰接表作交通圖的存儲結構.表示邊的結點內(nèi)除含有鄰接點的信息外.包 括交通工具、路程中消耗的時間和花費以及出發(fā)和到達的時間等多項屬性。 三、主控及功能模塊層次結構: 1、模塊說明:本系統(tǒng)分為個模塊 I、)主函數(shù) 2 、)添加城市 3 、)查找城市并返回序號 4、)刪除城市 5、)添加列車 6、)添加航班 7、)刪除列車或航班 8、)找出最小費用路線 9、)初始化系統(tǒng)數(shù)據(jù)(讀入內(nèi)存) 10、)找出最快路線 II、)計算最
5、快路線耗費的時間并打印 12、)計算最小費用路線 13、)主界面 14、)存儲信息到文件 15、)退出、 2、下面是各模塊示意圖: 添加城市 數(shù)毎從文 莒讀入內(nèi)存) 1 F 存儲信息到文件 刪陪城市 VJ繪化索統(tǒng) 數(shù)毎C從文 讀入內(nèi)存) 刪除城市 逵加交適踣線 r 1 F VJ繪it縈統(tǒng) 數(shù)據(jù)(從文 當讀入內(nèi)存) 淳加航班 冊除交11路線 數(shù)毎從文 莒讀入內(nèi)存) 存摘信息到文件 査詢巖距 吋間踣線 F 1 T F 初始化系統(tǒng) 當讀入內(nèi)存) 計算最快路 毀耗費的時 間并打印 存儲倍息到文件 基本操作: TrafficNodeDat 交通工具 信息 Char n ameMAX_STRING_NU
6、班次 M Int starttime 出發(fā)時間 Int starttime 到達時間 Int cost 票價 UNodeDat 路線 信息 Short int city 城市編號 Int TrainNum 火車路線數(shù) int FlightNum 航班路線數(shù) TrafficNodeDat Trai nMAX_TRAFFIC_NU M 火車路線信息 TrafficNodeDat FlightMAX TRAFFIC N 航班路線信息 UM 函數(shù)變量聲明: #i nclude #include #defi ne ERR 0 #defi ne OK 1 #defi ne Dij_MAXN 33 #def
7、i 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 TrafficNode char nameMAX_STRING_NUM; / 班次 int StartTime,StopTime; /起止時間
8、int EndCity; /該有向邊指向的頂點在數(shù)組中的位置.即該城市編號 int Cost; / 票價 TrafficNodeDat; typedef struct VNode CityType city; int TrainNum,FlightNum; /標記下面Train數(shù)組和Flight 數(shù)組里元素個 數(shù) TrafficNodeDatTrainMAX_TRAFFIC_NUM/ 數(shù)組成員為結構體.記錄了到 達城市、起止時間、票價和班次 TrafficNodeDat FlightMAX_TRAFFIC_NUM; / int Cost; /遍歷時到達 該城市的耗費(時間或者費用) VNode
9、Dat; typedef struct PNode int City; int TraNo; PNodeDat; VNodeDat AdjListMAX_VERTEX_NUM; /System Info char CityNameMAX_VERTEX_NUMMAX_STRING_NU城市名.采用第一下標為 該城市在本程序中的編號 int CityNum; /城市數(shù)目 PNodeDat PathMAX_VERTEX_NUM;存儲臨時最小時間路徑 PNodeDat Mi nPathMAX_VERTEX_NUM;存儲搜索到當前的最小時間路徑 int Min Time,StartTime; int c
10、urPath; 函數(shù)構成: 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 nute; while (1) ShowMe nu(); /顯示菜單 scan f(%d, / switch (Comma nd) case 0: /退出 return 0; case 1: /添加城市 In itS
11、ysData(); printf(n輸入城市名:); scan f(%s, In sertCity( name); SaveSysI nfo(); prin tf(System Info Save OK!n); break; case 2: /刪除城市 In itSysData(); printf(n輸入城市名:); scan f(%s, DelCity (n ame); SaveSysI nfo(); prin tf(System Info Save OK!n); break; case 3: /添加路線 In itSysData(); printf(起始站城市名:); scan f(%s,
12、 printf(終點站城市名:); scan f(%s, printf(類型(列車0.航班1):); scan f(%d, printf(輸入列車/飛機班次:); scan f(%s, printf(起始時刻(00:00.24 小時制):); scan f(%2d:%2d, printf(到達時刻(00:00.24 小時制):); scan f(%2d:%2d, prin tf(票價:);sca nf(%d, if (traveltype) In sertFlight( name,s_city,e_city,s_hour*60+s_mi nute,e_hour*60+e_mi nute ,co
13、st); else In 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, DelPath( name); SaveSysI nfo(); prin tf(System Info Save OK!n); break; case 5: /最小耗費 In itSysData
14、(); printf(n起始城市:); sca nf(%s, startcity=SeekCity( name); if (startcity0) prin tf(ErrorCity Name:No such city!n); break; printf(終點城市:); sca nf(%s, en dcity=SeekCity( name); if (en dcity0) printf(Error City Name:No such city!n); break; printf(類型(列車0,航班1):); sca nf(%d, if (traveltype!=O break; CalcMi
15、nCost(startcity,e ndcity,traveltype); prin tf(n); break; case 6: /最短時間路線 In itSysData(); printf(n起始城市:); sca nf(%s, startcity=SeekCity( name); if (startcity0) printf(ErrorCity Name:No such city!n); printf( break; 終點城市:); sea nf(%s, en dcity=SeekCity( name); if (en dcity0) prin tf(ErrorCity city!n);
16、break; printf(類型(列車0,航班1) sca nf(%d, if (traveltype!=O break; CalcMi nTime(startcity,e ndcity,traveltype); prin tf(n); break; 四、主函數(shù)中的各個調用的函數(shù)代碼具體如下: (1) 顯示菜單: int ShowMe nu() printf (n*MENU*n) printf(1:添加城市n2:刪除城市n3:添加交通路線 Name:No such :); n4:刪除交通 路線n5:查詢最小費用路線n6:查詢最快路線n0:退出); prin tf(n * *n); prin t
17、f(nType In Your Comma nd:); return 1; (2) 查找城市并返回城市序號: int SeekCity (char *n ame) int i; for (i=O;iCityNum;i+) if (strcmp( name,CityNamei)=O) return i; return -1; (3) 儲存信息到文件: int SaveSys lnfo() FILE *fp;i nt i,j,total; fp=fope n(CityFile,w); fprin tf(fp,%dn,CityNum); for (i=0;iCityNum;i+) fprin tf(
18、fp,%sn,CityNamei); fclose(fp);total=0; fp=fope n(TrainF ile,w); for (i=0;iCityNum;i+) total+=AdjListi.Trai nNum; fprin tf(fp,%dn,total); for (i=0;iCityNum;i+) for (j=0;jAdjListi.Trai nNu m;j+) fprin tf(fp,%s %s %s , AdjListi.Trai nj. name, CityNamei, -=5p AdjListCityNum.city=CityNum; AdjListCityNum.
19、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;iCityNum-1;i+) strcpy(CityNamei,CityNamei+1); AdjListi.FIightNum=AdjListi+1.FIightNum; AdjListi.Trai nNu m=AdjListi+1.Trai nNum; for (j=0;jAdjListi.FlightN
20、um;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.Flightj.StartTime=AdjListi+1.Flightj.StartTime; AdjListi.FIightj.StopTime=AdjListi+1.FIightj.StopTime; CityNum-; return 1; *E
21、n dCity,i nt (6) 添加火車路線: intIn sertTrain(char*trai n,char*StartCity,char StartTime,i nt En 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=
22、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; *En dCity,i nt (7) 添加航班路線: intIn sertFlight(char*flight,char *StartCity,char StartTime,i nt En dTime,i nt cost) int i,j; i=SeekCity(StartCity); j
23、=SeekCity(E ndCity); AdjListi.FIightAdjListi.FIightNum.Cost=cost; AdjListi.FIightAdjListi.FIightNum.E ndCity=j; AdjListi.FIightAdjListi.FIightNum.StartTime=StartTime; AdjListi.FIightAdjListi.FIightNum.StopTime=E ndTime; strcpy(AdjListi.FIightAdjListi.FIightNum. name,flight); AdjListi.FIightNum+; ret
24、urn 1; (8) 刪除路線: int DelPath (char *n ame) int i,j,flag=0; for (i=0;iCityNum;i+) for (j=O;jAdjListi.FIightNum;j+) if (strcmp(AdjListi.FIightj. name, name)=0) flag=1; break; if (flag) for (;jAdjListi.FlightNum-1;j+) AdjListi.FIightj.Cost=AdjListi.FIightj+1.Cost; AdjListi.Flightj.E ndCity=AdjListi.FIi
25、ghtj+1.E ndCity; strcpy(AdjListi.Flightj. name,AdjListi.FIightj+1 .n ame); AdjListi.FIightj.StartTime=AdjListi.FIightj+1.StartTime; AdjListi.FIightj.StopTime=AdjListi.FIightj+1.StopTime; AdjListi.FIightNum-; break; for (j=0;jAdjListi.Trai nNu m;j+) if (strcmp(AdjListi.Trai nj. name, name)=0) flag=1;
26、break; if (flag) for (;j=0) cost+=matxPreCityjj; tracki+=j=PreCityj; prin tf(nTrack Way:); if (!TravelType) for(i-;i0;i-) prin tf(n%s:,CityNametracki); en d=tracki-1;mi n=32767; for (k=0;k AdjListtracki.Trai nk.Cost) min=AdjListtracki.Trai nk.Cost; tmp=k; prin tf(%s ,AdjListtracki.Trai ntmp. name);
27、startH AdjListtracki.Trai n tmp.StartTime/60 ; startM AdjListtracki.Trai n tmp.StartTime%60; en dH = AdjListtracki.Trai ntmp.StopTime/60 ; endM = AdjListtracki.Trai ntmp.StopTime%60 ; if( !(startH/10) prin tf(0); prin tf(%d:,startH); if( !(startM/10) prin tf(0); prin tf(%d - ,startM); if( !(en dH/10
28、) prin tf(O); prin tf(%d:,e ndH); if( !(en dM/10) prin tf(O); prin tf(%dn,e ndM); /prin tf(%2d:%2d-%2d:%2d,AdjListtracki.Trai ntmp.StartTime/60 ,AdjListtracki.Trai ntmp.StartTime%60,AdjListtracki.Trai nt mp.StopTime/60,AdjListtracki.Trai ntmp.StopTime%60); else for(i-;i0;i-) prin tf(n%s:,CityNametra
29、cki); en d=tracki-1;mi n=32767; for (k=0;k AdjListtracki.FIig htk.Cost) */ if (AdjListtracki.FIightk.E ndCity=e nd prin tf(%dn,e ndM); /prin tf(%2d:%2d-%2d:%2d,AdjListtracki.FIighttmp.StartTime 60,AdjListtracki.FIighttmp.StartTime 60,AdjListtracki.FIighttmp.StopTime 60,AdjListtracki.FIighttmp.StopTi
30、me % 60); prin tf(n%s: DESTINATION!,CityNametrack0); prin tf(nMin Cost : %dn,cost); (10) 找出最小費用路線 void Dijkstra(i nt matxDij_MAXNDij_MAXN,i nt p_start,i nt p_e nd,i nt TravelType) int PreCityDij_MAXN; PreCityi=-1,never used; PreCity0,the precity of City i int i,j,mi n,pre,pos; for (i=0;iCityNum;i+)
31、PreCityi=-1; PreCityp_start=-2; while (PreCityp_e nd=-1) mi n=-1; for (i=0;iCityNum;i+) if (PreCityi!=-1) for (j=O;j0pos=j;mi n=matxij; PreCitypos=pre; Dijkstra_Output(matx,PreCity,p_e nd,TravelType); (11) 初始化系統(tǒng)數(shù)據(jù): int Ini tSysData () FILE *fp;int i,j,hour,minute,num,cost; char stmp1MAX_STRING_NUM;
32、char stmp2MAX_STRING_NUM; char stmp3MAX_STRING_NUM; fp=fope n(CityFile,r); if (!fp) printf(nError:Cannot Open City File.n); return -1; fscan f(fp,%d, for (i=0;iCityNum;i+) fsca nf(fp,%s, AdjListi.city=i; AdjListi.Trai nNu m=0; AdjListi.FIightNum=0; fclose(fp); fp=fope n(Trai nFile,r); if (!fp) print
33、f(nError:Cannot Open Train File.n”); return -1; fscan f(fp,%d, for (i=0;i nu m;i+) fscan f(fp,%s, fscan f(fp,%s, fscan f(fp,%s, 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, AdjListj.Trai nAdj
34、Listj.Trai nN um.StartTime=hour*60+mi nute; fscan f(fp,%d:%d, AdjListj.Trai nAdjListj.Trai nN um.StopTime=hour*60+mi nute; fscan f(fp,%d, AdjListj.Trai nAdjListj.Trai nN um.Cost=cost; AdjListj.Trai nNu m+; fclose(fp); fp=fope n( FlightFile,r); if (!fp) printf(nError:Cannot Open Flight File.n); retur
35、n -1; fscan f(fp,%d, for (i=0;i CurTime-StartTime) for (i=0;i=curPathNo;i+) Mi nPathi.City=Pathi.City; Min Pathi.TraNo=Pathi.TraNo; curPath=curPathNo; Mi nTime=CurTime-StartTime; else curPathNo+; PathcurPathNo.City=City; if (!TravelType) for (i=O;i=(CurTime%1440) SearchMi nTime(AdjListCity.Trai ni.E
36、 ndCity,E ndCity,AdjListCity.T rai ni.StopTime+(CurTime/1440)*1440,curPathNo,TravelType); if (AdjListCity.Trai ni.StartTime(CurTime%1440) SearchMi nTime(AdjListCity.Trai ni.E ndCity,E ndCity,AdjListCity.T rai ni.StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); else for (i=O;i=CurTime) SearchMi
37、nTime(AdjListCity.FIighti.E ndCity,E ndCity,AdjListCity. Flighti.StopTime+(CurTime/1440)*1440,curPathNo,TravelType); if (AdjListCity.Flighti.StartTimeCurTime) SearchMi nTime(AdjListCity.FIighti.E ndCity,E ndCity,AdjListCity. Flighti.StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); return 1; (13
38、) 計算最快路線所需時間并打?。?int CalcMinTime (int StartCity,int EndCity,int TravelType) int i; 出發(fā)的 int startH, startM, endH, endM;/定義四個變量:startH 小時.startM 出發(fā)的分鐘.endH到達的小時.endM到達的分鐘 Min Time=32767;curPath=0; PathO.City=StartCity; if (!TravelType) for (i=O;iAdjListStartCity.Trai nNu m;i+) Path0.TraNo=i; StartTime
39、=AdjListStartCity.Trai ni.StartTime; SearchMi nTime(AdjListStartCity.Trai ni.E ndCity,E ndCity,AdjListSt artCity.Trai ni.StopTime,0,TravelType); else for (i=0;iAdjListStartCity.FIightNum;i+) Path0.TraNo=i; StartTime=AdjListStartCity.Flighti.StartTime; SearchMi nTime(AdjListStartCity.FIighti.E ndCity
40、,E ndCity,AdjListS tartCity.FIighti.StopTime,0,TravelType); if (Min Time=32767) prin tf(nNo access to that dest in ati on!); return 0; / if (!TravelType) / StartTime=AdjListStartCity.Trai nMi nPath0.TraNo.StartTime; / else / StartTime=AdjListStartCity.FIightMi nPath0.TraNo.StartTime; prin tf(nPath:n
41、); for (i=0;i=curPath;i+) %s if (!TravelType) prin tf(%s: ,CityNameMi nPathi.City,AdjListMi nPathi.City.Trai nMi nPathi .TraNo. name); %s else prin tf(%s: ,CityNameMi nPathi.City,AdjListMi nPathi.City.FIightMi nPath i.TraNo. name); startH AdjListMi nPathi.City.Trai nMi nPathi.TraNo.StartTime / 60 ;
42、startM AdjListMinPathi.City.TrainMinPathi.TraNo.StartTime % 60 ; en dH AdjListMi nPathi.City.Trai nMi nPathi.TraNo.StopTime / 60 ; en dM AdjListMi nPathi.City.Trai nMi nPathi.TraNo.StopTime % 60 ; if( !(startH/10) prin tf(0); prin tf(%d:,startH); if( !(startM/10) prin tf(0); prin tf(%d - ,startM); i
43、f( !(en dH/10) prin tf(0); prin tf(%d:,e ndH); if( !(en dM/10) prin tf(0); prin tf(%dn,e ndM); /printf( %2S:%2S-%2S:%2Sn,startH); prin tf(%s: DESTINATION!,CityNameE ndCity); hour %2d prin tf(nTimeCost:%2d mi nute,Mi nTime/60,Mi nTime%60); return 1; (14) 計算最小費用路線: int CalcMi nCost (int StartCity,i nt En dCity,i nt TravelType) int maDij_MAXNDij_MAXN;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳統(tǒng)孝文化現(xiàn)代轉化路徑與教育實踐創(chuàng)新
- 基于熱圖像的機床主軸熱誤差預測與控制技術
- 上海美專校名沿革問題廣告文書推理研究
- 財務共享應用的數(shù)據(jù)中臺設計與實施
- 燃氣工程現(xiàn)場管理課件
- 運動員崗位面試問題及答案
- 熊貓美術課件
- 照明技術課件
- 消防專家課件下載網(wǎng)
- 虛擬現(xiàn)實在廣告應用-洞察闡釋
- 2024-2025新入職員工安全培訓考試試題及完整答案【一套】
- 2025年內(nèi)蒙古鄂爾多斯機場管理集團鄂爾多斯市空港實業(yè)有限公司招聘筆試參考題庫含答案解析
- 2025年鄭州市公安機關招聘警務輔助人員題庫帶答案分析
- CJ/T 340-2016綠化種植土壤
- 廬山市國有投資控股集團有限公司招聘筆試題庫2025
- 2025年貴州省公務員錄用考試《行測》真題及答案解析
- 第一單元:三視圖的判斷、確認與繪制專項練習-2023-2024學年五年級數(shù)學下冊典型例題系列(原卷版)人教版
- 楊梅承包合同協(xié)議書
- 物理光學知到智慧樹期末考試答案題庫2025年山東理工大學
- 2024年新滬科版七年級上冊數(shù)學教學課件 第1章 有理數(shù) 1.2 數(shù)軸、相反數(shù)和絕對值 第1課時 數(shù)軸
- 《高一物理力學進階:動力學與能量學教學教案》
評論
0/150
提交評論