全國交通咨詢模擬系統(tǒng).doc_第1頁
全國交通咨詢模擬系統(tǒng).doc_第2頁
全國交通咨詢模擬系統(tǒng).doc_第3頁
全國交通咨詢模擬系統(tǒng).doc_第4頁
全國交通咨詢模擬系統(tǒng).doc_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

全國交通咨詢模擬系統(tǒng)目錄一、 需求分析4二、 個人工作4三、概要設(shè)計51主程序流程圖:52創(chuàng)建圖算法流程圖:6四、源程序14五、程序結(jié)果255.3設(shè)計和調(diào)試分析29六、程序設(shè)計體會30全國交通咨詢模擬系統(tǒng)一、 需求分析旅客對由于出行目的的不同對交通工具的要求也有不同。例如,因公事出差的旅客希望在旅途中的時間盡可能短,出門旅游的游客則希望旅費(fèi)盡可能省,而老年旅客則要求中轉(zhuǎn)次數(shù)最少。為了能滿足廣大旅客的需求,方便旅客出行,就此編制一個全國城市間的交通咨詢程序,為旅客提供兩種或者三種最優(yōu)決策的交通咨詢,達(dá)到如下的基本要求::(1) 提供對城市信息進(jìn)行編輯(如:添加和刪除)的功能.(2) 城市之間有兩種交通工具:火車和飛機(jī)。提供對列車時刻表和飛機(jī)航班表進(jìn)行編輯(增加或刪除)的功能。(3) 提供兩種最優(yōu)決策:最快到達(dá)和最省錢到達(dá)。全程只考慮一種交通工具。(4) 旅途中耗費(fèi)的總時間應(yīng)該包括中轉(zhuǎn)站的等候時間。(5) 咨詢以用戶和計算機(jī)的對話方式進(jìn)行。由用戶輸入起始站、終點(diǎn)站、最優(yōu)決策原則和交通工具,輸出信息:最快需要多長時間才能到達(dá)或者最少需要多少旅費(fèi)才能到達(dá),并詳細(xì)說明依次于何時乘哪趟列車或哪一次班機(jī)到何地。(6) 通過對比以及用戶操作基本達(dá)到旅客出行的便利。二、 個人工作 此次課程設(shè)計是對全國城市交通圖列車時刻表及飛機(jī)航班表的編輯。此次課設(shè)是利用VC工具在dos環(huán)境下實現(xiàn)全國交通的咨詢與管理。通過此次程序可以對全國城市之間火車與飛機(jī)進(jìn)行兩方面的咨詢,即最少的時間與最少的費(fèi)用的咨詢,從而方便旅客的出行。通過此次課程設(shè)計,我要學(xué)會怎樣用在VC dos環(huán)境下編程,而且要通過此次課程設(shè)計加深對數(shù)據(jù)結(jié)構(gòu)的理解,在設(shè)計中用鄰接表作交通圖的存儲結(jié)構(gòu),表示邊的結(jié)點(diǎn)中除含有鄰接點(diǎn)的信息外,還包括交通工具、路程中消耗的時間和花費(fèi)以及出發(fā)和到達(dá)的時間等屬性。圖中頂點(diǎn)城市的信息,包括城市名稱、城市編號和依附該頂點(diǎn)的邊的指針。在程序中,利用迪杰斯特拉算法求花錢最少和花時間最少的交通方式。三、概要設(shè)計1主程序流程圖:開始CreateGraph(GT)CreateGraph(GP)OpenGraph_T(GT)OpenGraph_P(GP)Main_Menu(GT,GP)DestoryGraph(GT) DestoryGraph(GP)結(jié)束SaveGraph_T(GT)SaveGraph_P(GP)2創(chuàng)建圖算法流程圖:N開始iMAXVTXNUMG.FLAGI=0i+Y結(jié)束3打開圖算法流程圖:開始NY讀出城市的號數(shù)cityNum,標(biāo)志Flag,城市名稱cityNamejvexNum讀出圖中頂點(diǎn)數(shù)vexNum,邊數(shù)edgeNum打開文件j+iedgeNumN讀出邊上的各信息Y 結(jié)束i+4主菜單操作算法流程圖:開始Switch(n)Case 2:Case 0:Case 1:Inquire_Menu(GT,GP)breakManage_Menu(GT,GP)5咨詢菜單流程圖Inquire_Menu(GT,GP)Switch(choice)Case 1:Case 2:Case 0:Inquire_Money(GT,GP)Inquire_Time(GT,GP)break6咨詢錢最少模塊圖Inquire_Money(GT,GP)NWhile(True)Y輸入 nYn=1NYinput_Money(GP,st, nd)n=2LeastMoneyPath (GP,st,nd,p)Ninput_Money(GT,st, nd)print_Money(GP,p)LeastMoneyPath(GT,st,nd,p)Yn=2結(jié)束Nprint_Money(GT,p)結(jié)束結(jié)束結(jié)束7input_Money(Graph G, int &st,int &sn)算法流程圖While(True)輸入起始城市名稱YinputVex(G,st)=truebreakNWhile(True)輸入終止城市名稱inputVex(G,sn)=truebreakN8inputVex(G,st)算法流程圖開始輸入城市名字 nameYLocateVex(G,name,i)=trueReturn trueN輸出城市不存在結(jié)束9LocateVex(G,name,i)算法流程圖開始imaxvexnumYG.Flagi=1&strcmp(G.Adjlisti.cityName,name)=0i+YReturn falseReturn true結(jié)束10print_Money(GT,p)算法流程圖開始i=0ip.len打印邊p的信息Sum+=p.money i+Y結(jié)束輸錢sumN11LeastMoneyPath(GT,st,nd,p)算法流程圖結(jié)束初始化i=0inextEdgep-elem.Moneyelem.jvex重置每個頂點(diǎn)的最少錢的路徑dijkstp-elem.jvex=p-elem.Money t=p-elemSetPath(pathp-elem.jvex,st,p-elem.jvex,t)Yp=qYNFound = false求從st 到nd 的最短路徑算法并復(fù)制此路徑copyPath(pathw,pathv)開始11ShortestTimePath(GT,st,nd,p)算法流程圖開始每個點(diǎn)初始一個最大值初始每條路徑置時間0置起點(diǎn)的時間為n置p為起點(diǎn)的第一條邊檢測依附每個頂點(diǎn)的邊依據(jù)迪杰斯特求每個起點(diǎn)到終點(diǎn)的時間最少的路徑結(jié)束12Manage_Menu(GT,GP)算法流程圖開始Switch(choice)Case 1:Case 0:Case 3:Case 2:Plane_Edit(GT,GP)breakTrain_Edit(GT,GP)City_Edit(GT,GP)13City_Edit(GT,GP)算法流程圖開始輸入n進(jìn)行選擇Nn=1NYn =2添加城市及相關(guān)信息Y刪除城市及相關(guān)信息結(jié)束輸出錯誤輸入n進(jìn)行選擇結(jié)束Nn =0Y結(jié)束14. Train_Edit(GT,GP)算法流程圖開始NWhile(true)YBreak 輸入n進(jìn)行選擇結(jié)束Yn=1NYn=2輸入列車的信息breakN刪除列車的信息重新輸入n進(jìn)行選擇Nn=0breakYbreak注釋:部分算法的設(shè)計思想相同,只是參數(shù)不同,故省略部分程序流程圖。四、源程序#define MAXVTXNUM 30 /圖中頂點(diǎn)數(shù)的最大值/*頂點(diǎn)、邊和圖類型*/typedef struct /定義各車次及航班的信息弧的信息int ivex; /起始點(diǎn)號int jvex; /終點(diǎn)號char Number10; / 車次號int Money; /費(fèi)用int StartTime; /起始時間(秒)int EndTime; /終止時間(秒)int Time; /中途時間(秒)EdgeInfo; /邊的信息typedef struct EdgeNode /邊的信息 弧結(jié)點(diǎn) EdgeInfo elem; EdgeNode *nextEdge;EdgeNode, *EdgePtr;/邊的結(jié)點(diǎn)類型,指向邊的指針typedef struct /城市信息 頭結(jié)點(diǎn)char cityName10;int cityNumber;EdgePtr firstEdge; /指向的一條依附該頂點(diǎn)的邊的指針Vnode; /頂點(diǎn)類型typedef struct /圖的結(jié)構(gòu)Vnode AdjlistMAXVTXNUM;/鄰接表int vexNum, edgeNum; /圖中的頂點(diǎn)數(shù)和邊數(shù)int FlagMAXVTXNUM; /標(biāo)志是否是圖中的頂點(diǎn),0表示不是,1表示是 Graph; /圖類型/*圖的基本操作*/* 路徑類型 */typedef structint vx,vy; /vx為路徑的起點(diǎn),vy為路徑的終點(diǎn)EdgeInfo p; /路徑中邊的信息Edge;typedef struct Edge edgesMAXVTXNUM; /路徑中邊的序列 : edgesi表示從起點(diǎn)到i的最短路徑int len; /路徑中邊的數(shù)目Path;/*/void copyPath (Path &p1,Path &p2)/復(fù)制路徑p1=p2int i;for(i=0;ip2.len;i+)p1.edgesi.vx=p2.edgesi.vx;p1.edgesi.vy=p2.edgesi.vy;p1.edgesi.p =p2.edgesi.p;p1.len=p2.len;void SetPath(Path &pa, int v, int w, EdgeInfo t)/設(shè)置pa從v到w的第一條邊,邊的信息為tpa.edges0.vx=v;pa.edges0.vy=w;pa.edges0.p=t;pa.len=1;#include int TimeChange(int hour,int minute) /把輸入的小時和分鐘樹轉(zhuǎn)換成分鐘的形式,忽略天數(shù)if(minute60)hour=hour+minute/60;minute=minute%60;if(hour24)hour=hour%24;#include #include #include #include Graph.h#include Time.h#include Path.h#define NULL 0bool OpenGraph_T(Graph &G);bool OpenGraph_P(Graph &G);int Main_Menu(Graph >,Graph &GP);bool SaveGraph_T(Graph G); bool SaveGraph_P(Graph G);void main()Graph GT; /火車交通圖Graph GP; /飛機(jī)交通圖 CreateGraph(GT); /建立空的火車交通圖CreateGraph(GP); /建立空的飛機(jī)交通圖OpenGraph_T(GT); /打開已經(jīng)存在火車的數(shù)據(jù)OpenGraph_P(GP); /打開已經(jīng)存在飛機(jī)的數(shù)據(jù)Main_Menu(GT,GP); SaveGraph_T(GT); /保存火車數(shù)據(jù)SaveGraph_P(GP); /保存飛機(jī)數(shù)據(jù)DestoryGraph(GT);DestoryGraph(GP);/*/void LeastMoneyPath(Graph G, int st, int nd, Path &pathA) /st:起點(diǎn)號,nd:終點(diǎn)號,結(jié)果存儲在pathA中 /path包括路徑的長度,起點(diǎn),終點(diǎn)和路徑信息/利用迪杰斯特拉算法的基本思想求圖G中從頂點(diǎn)st到nd的一條/最短路徑PathInfo,路徑長度pathLength/設(shè)int dijkstMAXVTXNUM;Path pathMAXVTXNUM;int i;int dijkstMAXVTXNUM;bool finalMAXVTXNUM=false; Path pathMAXVTXNUM; /每個頂點(diǎn)都有路徑 EdgeNode *p,*q; /邊的信息 弧結(jié)點(diǎn) EdgeInfo t; /邊的信息bool found;int min=9999,min_i,v,w;for(i=0;inextEdge;if(p-elem.Moneyelem.jvex)dijkstp-elem.jvex=p-elem.Money;t=p-elem;SetPath(pathp-elem.jvex,st,p-elem.jvex,t);p=q;found= false;while(!found)/在所有未求得最短路徑的頂點(diǎn)求使得dijksti取最小的ifor(i=0;iMAXVTXNUM;i+)if(finali=false & dijkstinextEdge;w=p-elem.jvex;if(finalw=false &(dijkstv+p-elem.Money)elem.Money;copyPath(pathw,pathv);InsertPath(pathw,v,w,p-elem);p=q; /while(p) /else/ while(!found)copyPath(pathA,pathnd);void ShortestTimePath(Graph G, int st, int nd, int n ,Path &pathA)/st:起點(diǎn)號,nd:終點(diǎn)號,n:當(dāng)前時間(秒),結(jié)果存儲在pathA中/利用迪杰斯特拉算法的基本思想求圖G中從頂點(diǎn)st到nd的一條/最短路徑PathInfo,路徑長度pathLength/設(shè)int dijkstMAXVTXNUM;Path pathMAXVTXNUM;int i;int dijkstMAXVTXNUM;bool finalMAXVTXNUM=false; int nowMAXVTXNUM;Path pathMAXVTXNUM;EdgeNode *p,*q;EdgeInfo t;bool found;int min=99999,min_i,v,w,time;for(i=0;inextEdge;if(p-elem.StartTimeelem.EndTime=nowst)time= 1440-TimeSub(p-elem.EndTime,nowst);elsetime= TimeSub(p-elem.EndTime,nowst);if(timeelem.jvex)dijkstp-elem.jvex=time;t=p-elem;SetPath(pathp-elem.jvex,st,p-elem.jvex,t);nowp-elem.jvex=p-elem.EndTime;p=q;found= false;while(!found)/在所有未求得最短路徑的頂點(diǎn)求使得dijksti取最小的ifor(i=0;iMAXVTXNUM;i+)if(finali=false & dijkstinextEdge;w=p-elem.jvex;if(finalw=false &(dijkstv+TimeSub(p-elem.EndTime,nowv)elem.EndTime,nowv);copyPath(pathw,pathv);InsertPath(pathw,v,w,p-elem);p=q; /while(p) /else/ while(!found)copyPath(pathA,pathnd);void Inquire_Money(Graph GT,Graph GP)Path p;int n=5;int st,nd;while(1)cout tt 1.查詢飛機(jī);cout t 2.查詢火車;cout t 0.退出n;cout n;fflush(stdin);cout n;if(n=1)input_Money(GP,st, nd);LeastMoneyPath (GP,st,nd,p); /最少錢數(shù)print_Money(GP,p);break;else if(n=2)input_Money(GT,st, nd);LeastMoneyPath (GT,st,nd,p); /最少錢數(shù)print_Money(GT,p);break;else if (n=0)break;elsecout 輸入有誤,請重新輸入!nn;/咨詢系統(tǒng)菜單void Inquire_Menu(Graph GT,Graph GP)while(1)int choice=5;coutt*n;coutt*咨詢系統(tǒng)菜單 *n;cout t* 1.最省錢咨詢 *n;cout t* 2.最快到達(dá)咨詢 *n;cout t* 0.退出系統(tǒng) *n;cout t*n;cout choice;fflush(stdin);if(choice=0) break;switch(choice)case 1: Inquire_Money(GT,GP);break;case 2: Inquire_Time(GT,GP);break;default:cout 輸入錯誤選項,請重試。nn;/城市編輯void City_Edit(Graph >,Graph &GP)int n,i;char name10;while(1)cout n;cout t 1.添加城市 ;cout t 2.刪除城市 ;cout t 0.退出 ;cout n;fflush(stdin);if(n=1)cout name;fflush(stdin);InsertVex(GT,name);InsertVex(GP,name);cout n添加成功!n;break;else if(n=2)cout n請輸入刪除城市的名稱:;if(input_Vex(GT,i)=true)DeleteVex(GT,i);DeleteVex(GP,i);cout 刪除成功!n;break;else if(n=0)cout n;break;elsecout 輸入有誤,請重新輸入!;/列車時刻表編輯 void Train_Edit(Graph >,Graph GP)int n,st,sn;int hour,minute;char number10;EdgeInfo q;while(1)cout n;cout t 1.添加列車 ;cout t 2.刪除列車 ;cout t 0.退出 ;cout n;fflush(stdin);if(n=1)while(1)cout n請輸入起始城市的名稱:;if(input_Vex(GT,st)=true)break;while(1)cout n請輸入終點(diǎn)城市的名稱:;if(input_Vex(GT,sn)=true)break;cout number ;fflush(stdin);q.ivex=st;q.jvex=sn;strcpy(q.Number,number);cout q.Money;fflush(stdin);cout n請輸入起始時間:;cout hour;fflush(stdin);cout minute;fflush(stdin);q.StartTime=TimeChange(hour,minute);cout n請輸入到站時間:;cout hour;fflush(stdin);cout minute;fflush(stdin);q.EndTime=TimeChange(hour,minute);q.Time=TimeSub(q.EndTime,q.StartTime);cout n行車時間: q.Time/60 小時 q.Time%60 分鐘;InsertEdge(GT,q);cout n添加成功! n;break;else if(n=2)while(1)cout n請輸入起始城市的名稱:;if(input_Vex(GT,st)=true)break;while(1)cout n請輸入終點(diǎn)城市的名稱:;if(input_Vex(GT,sn)=true)break;cout n請輸入車次:;if(input_Number(GT,st,sn,number)q.ivex=st;q.jvex=sn;strcpy(q.Number,number);DeleteEdge(GT,q);cout 刪除成功!n;break;else if(n=0)cout (n);break;elsecout 輸入有誤,請重新輸入!;void Manage_Menu(Graph >,Graph &GP)while(1)int choice=5;cout t* n;cout t* 管理系統(tǒng)菜單 *n;cout t* 1.城市編輯 *n;cout t* 2.列車時刻表編輯 *n;cout t* 3.航班時刻表編輯 *n;cout t* 0.退出系統(tǒng) *n;cout t* n;cout choice;fflush(stdin);if(choice=0) break;switch(choice)case 1: City_Edit(GT,GP);break;case 2: Train_Edit(GT,GP);break;case 3: Plane_Edit(GT,GP);break;default:cout 輸入錯誤選項

溫馨提示

  • 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

提交評論