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

下載本文檔

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

文檔簡介

1、全國交通咨詢模擬系統(tǒng)目錄一、 需求分析4二、 個人工作4三、概要設(shè)計51主程序流程圖:52創(chuàng)建圖算法流程圖:6四、源程序14五、程序結(jié)果255.3設(shè)計和調(diào)試分析29六、程序設(shè)計體會30全國交通咨詢模擬系統(tǒng)一、 需求分析旅客對由于出行目的的不同對交通工具的要求也有不同。例如,因公事出差的旅客希望在旅途中的時間盡可能短,出門旅游的游客則希望旅費盡可能省,而老年旅客則要求中轉(zhuǎn)次數(shù)最少。為了能滿足廣大旅客的需求,方便旅客出行,就此編制一個全國城市間的交通咨詢程序,為旅客提供兩種或者三種最優(yōu)決策的交通咨詢,達到如下的基本要求::(1) 提供對城市信息進行編輯(如:添加和刪除)的功能.(2) 城市之間有兩

2、種交通工具:火車和飛機。提供對列車時刻表和飛機航班表進行編輯(增加或刪除)的功能。(3) 提供兩種最優(yōu)決策:最快到達和最省錢到達。全程只考慮一種交通工具。(4) 旅途中耗費的總時間應該包括中轉(zhuǎn)站的等候時間。(5) 咨詢以用戶和計算機的對話方式進行。由用戶輸入起始站、終點站、最優(yōu)決策原則和交通工具,輸出信息:最快需要多長時間才能到達或者最少需要多少旅費才能到達,并詳細說明依次于何時乘哪趟列車或哪一次班機到何地。(6) 通過對比以及用戶操作基本達到旅客出行的便利。二、 個人工作 此次課程設(shè)計是對全國城市交通圖列車時刻表及飛機航班表的編輯。此次課設(shè)是利用VC工具在dos環(huán)境下實現(xiàn)全國交通的咨詢與管理

3、。通過此次程序可以對全國城市之間火車與飛機進行兩方面的咨詢,即最少的時間與最少的費用的咨詢,從而方便旅客的出行。通過此次課程設(shè)計,我要學會怎樣用在VC dos環(huán)境下編程,而且要通過此次課程設(shè)計加深對數(shù)據(jù)結(jié)構(gòu)的理解,在設(shè)計中用鄰接表作交通圖的存儲結(jié)構(gòu),表示邊的結(jié)點中除含有鄰接點的信息外,還包括交通工具、路程中消耗的時間和花費以及出發(fā)和到達的時間等屬性。圖中頂點城市的信息,包括城市名稱、城市編號和依附該頂點的邊的指針。在程序中,利用迪杰斯特拉算法求花錢最少和花時間最少的交通方式。三、概要設(shè)計1主程序流程圖:開始CreateGraph(GT)CreateGraph(GP)OpenGraph_T(GT

4、)OpenGraph_P(GP)Main_Menu(GT,GP)DestoryGraph(GT) DestoryGraph(GP)結(jié)束SaveGraph_T(GT)SaveGraph_P(GP)2創(chuàng)建圖算法流程圖:N開始i<MAXVTXNUMG.FLAGI=0i+Y結(jié)束3打開圖算法流程圖:開始NY讀出城市的號數(shù)cityNum,標志Flag,城市名稱cityNamej<vexNum讀出圖中頂點數(shù)vexNum,邊數(shù)edgeNum打開文件j+i<edgeNumN讀出邊上的各信息Y 結(jié)束i+4主菜單操作算法流程圖:開始Switch(n)Case 2:Case 0:Case 1:Inq

5、uire_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)LeastMoneyP

6、ath(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)算法流程圖開始i<maxv

7、exnumYG.Flagi=1&&strcmp(G.Adjlisti.cityName,name)=0i+YReturn falseReturn true結(jié)束10print_Money(GT,p)算法流程圖開始i=0i<p.len打印邊p的信息Sum+=p.money i+Y結(jié)束輸錢sumN11LeastMoneyPath(GT,st,nd,p)算法流程圖結(jié)束初始化i=0i<MAXVTXNUM每個頂點的最短路徑為一最大值dijskti=9999,初始化每條路徑InitPath(pathi) i+Yp=G.Adjlistst.firstEdgeWhile(p)Nq為p

8、的下一條邊q=p->nextEdgep->elem.Money<dijkstp->elem.jvex重置每個頂點的最少錢的路徑dijkstp->elem.jvex=p->elem.Money t=p->elemSetPath(pathp->elem.jvex,st,p->elem.jvex,t)Yp=qYNFound = false求從st 到nd 的最短路徑算法并復制此路徑copyPath(pathw,pathv)開始11ShortestTimePath(GT,st,nd,p)算法流程圖開始每個點初始一個最大值初始每條路徑置時間0置起點的

9、時間為n置p為起點的第一條邊檢測依附每個頂點的邊依據(jù)迪杰斯特求每個起點到終點的時間最少的路徑結(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進行選擇Nn=1NYn =2添加城市及相關(guān)信息Y刪除城市及相關(guān)信息結(jié)束輸出錯誤輸入n進行選擇結(jié)束Nn =0Y結(jié)束14. Train_Edit(GT,GP)算法流程圖開始NWhile(true)YBre

10、ak 輸入n進行選擇結(jié)束Yn=1NYn=2輸入列車的信息breakN刪除列車的信息重新輸入n進行選擇Nn=0breakYbreak注釋:部分算法的設(shè)計思想相同,只是參數(shù)不同,故省略部分程序流程圖。四、源程序#define MAXVTXNUM 30 /圖中頂點數(shù)的最大值/*頂點、邊和圖類型*/typedef struct /定義各車次及航班的信息弧的信息int ivex; /起始點號int jvex; /終點號char Number10; / 車次號int Money; /費用int StartTime; /起始時間(秒)int EndTime; /終止時間(秒)int Time; /中途時間(

11、秒)EdgeInfo; /邊的信息typedef struct EdgeNode /邊的信息 弧結(jié)點 EdgeInfo elem; EdgeNode *nextEdge;EdgeNode, *EdgePtr;/邊的結(jié)點類型,指向邊的指針typedef struct /城市信息 頭結(jié)點char cityName10;int cityNumber;EdgePtr firstEdge; /指向的一條依附該頂點的邊的指針Vnode; /頂點類型typedef struct /圖的結(jié)構(gòu)Vnode AdjlistMAXVTXNUM;/鄰接表int vexNum, edgeNum; /圖中的頂點數(shù)和邊數(shù)in

12、t FlagMAXVTXNUM; /標志是否是圖中的頂點,0表示不是,1表示是 Graph; /圖類型/*圖的基本操作*/* 路徑類型 */typedef structint vx,vy; /vx為路徑的起點,vy為路徑的終點EdgeInfo p; /路徑中邊的信息Edge;typedef struct Edge edgesMAXVTXNUM; /路徑中邊的序列 : edgesi表示從起點到i的最短路徑int len; /路徑中邊的數(shù)目Path;/*<路徑基本操作>*/void copyPath (Path &p1,Path &p2)/復制路徑p1=p2int i;

13、for(i=0;i<p2.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 <iostream.h>int TimeChange(int hour,int minut

14、e) /把輸入的小時和分鐘樹轉(zhuǎn)換成分鐘的形式,忽略天數(shù)if(minute>60)hour=hour+minute/60;minute=minute%60;if(hour>24)hour=hour%24;#include <stdio.h>#include <stdlib.h>#include <string.h>#include "Graph.h"#include "Time.h"#include "Path.h"#define NULL 0bool OpenGraph_T(Graph

15、&G);bool OpenGraph_P(Graph &G);int Main_Menu(Graph &GT,Graph &GP);bool SaveGraph_T(Graph G); bool SaveGraph_P(Graph G);void main()Graph GT; /火車交通圖Graph GP; /飛機交通圖 CreateGraph(GT); /建立空的火車交通圖CreateGraph(GP); /建立空的飛機交通圖OpenGraph_T(GT); /打開已經(jīng)存在火車的數(shù)據(jù)OpenGraph_P(GP); /打開已經(jīng)存在飛機的數(shù)據(jù)Main_Menu

16、(GT,GP); SaveGraph_T(GT); /保存火車數(shù)據(jù)SaveGraph_P(GP); /保存飛機數(shù)據(jù)DestoryGraph(GT);DestoryGraph(GP);/*< 迪杰斯特拉算法 求取最少錢數(shù)和最短時間 >*/void LeastMoneyPath(Graph G, int st, int nd, Path &pathA) /st:起點號,nd:終點號,結(jié)果存儲在pathA中 /path包括路徑的長度,起點,終點和路徑信息/利用迪杰斯特拉算法的基本思想求圖G中從頂點st到nd的一條/最短路徑PathInfo,路徑長度pathLength/設(shè)int

17、dijkstMAXVTXNUM;Path pathMAXVTXNUM;int i;int dijkstMAXVTXNUM;bool finalMAXVTXNUM=false; Path pathMAXVTXNUM; /每個頂點都有路徑 EdgeNode *p,*q; /邊的信息 弧結(jié)點 EdgeInfo t; /邊的信息bool found;int min=9999,min_i,v,w;for(i=0;i<MAXVTXNUM;i+) /初始化dijksti=9999;InitPath(pathi); /pathi.len=0;p=G.Adjlistst.firstEdge;while(p

18、) /初始化dijkst數(shù)組,檢測依附于起始點的每一條邊q=p->nextEdge;if(p->elem.Money<dijkstp->elem.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)/在所有未求得最短路徑的頂點求使得dijksti取最小的ifor(i=0;i<MAXVTXNUM;i+)if(finali=false &&a

19、mp; dijksti<min)min_i=i;finalmin_i=true;if(min_i=nd) found=true;elsev=min_i;p=G.Adjlistv.firstEdge;while(p)q=p->nextEdge;w=p->elem.jvex;if(finalw=false &&(dijkstv+p->elem.Money)<dijkstw)dijkstw=dijkstv+p->elem.Money;copyPath(pathw,pathv);InsertPath(pathw,v,w,p->elem);p=q

20、; /while(p) /else/ while(!found)copyPath(pathA,pathnd);void ShortestTimePath(Graph G, int st, int nd, int n ,Path &pathA)/st:起點號,nd:終點號,n:當前時間(秒),結(jié)果存儲在pathA中/利用迪杰斯特拉算法的基本思想求圖G中從頂點st到nd的一條/最短路徑PathInfo,路徑長度pathLength/設(shè)int dijkstMAXVTXNUM;Path pathMAXVTXNUM;int i;int dijkstMAXVTXNUM;bool finalMAXV

21、TXNUM=false; int nowMAXVTXNUM;Path pathMAXVTXNUM;EdgeNode *p,*q;EdgeInfo t;bool found;int min=99999,min_i,v,w,time;for(i=0;i<MAXVTXNUM;i+) /初始化dijksti=99999;InitPath(pathi);nowi=0;nowst=n;p=G.Adjlistst.firstEdge;while(p) /初始化dijkst數(shù)組,檢測依附于起始點的每一條邊q=p->nextEdge;if(p->elem.StartTime<nowst&

22、amp;&p->elem.EndTime>=nowst)time= 1440-TimeSub(p->elem.EndTime,nowst);elsetime= TimeSub(p->elem.EndTime,nowst);if(time<dijkstp->elem.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= f

23、alse;while(!found)/在所有未求得最短路徑的頂點求使得dijksti取最小的ifor(i=0;i<MAXVTXNUM;i+)if(finali=false && dijksti<min)min_i=i;finalmin_i=true;if(min_i=nd) found=true;elsev=min_i;p=G.Adjlistv.firstEdge;while(p)q=p->nextEdge;w=p->elem.jvex;if(finalw=false &&(dijkstv+TimeSub(p->elem.EndTi

24、me,nowv)<dijkstw)dijkstw=dijkstv+TimeSub(p->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.查詢飛機"cout <<

25、 "t 2.查詢火車"cout << "t 0.退出n"cout << "t 請選擇:"cin >> 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ù)p

26、rint_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;cout<<"t*"<<"n"cout<<"t*咨詢系統(tǒng)菜單 *"<<"n"cout << "t* 1.最省錢咨詢 *"<<&qu

27、ot;n"cout << "t* 2.最快到達咨詢 *"<<"n"cout << "t* 0.退出系統(tǒng) *"<<"n"cout<< t*"<<"n"cout << " 請選擇: "cin >> choice;fflush(stdin);if(choice=0) break;switch(choice)case 1: Inquire_Money(GT,GP);br

28、eak;case 2: Inquire_Time(GT,GP);break;default:cout << " 輸入錯誤選項,請重試。nn"/城市編輯void City_Edit(Graph &GT,Graph &GP)int n,i;char name10;while(1)cout << "n"cout << "t 1.添加城市 "cout << "t 2.刪除城市 "cout << "t 0.退出 "cout <

29、;< "tttt 請選擇:"cin >> n;fflush(stdin);if(n=1)cout << "n請輸入添加城市的名稱:"cin >> name;fflush(stdin);InsertVex(GT,name);InsertVex(GP,name);cout << "n添加成功!"<<"n"break;else if(n=2)cout << "n請輸入刪除城市的名稱:"if(input_Vex(GT,i)=t

30、rue)DeleteVex(GT,i);DeleteVex(GP,i);cout << "刪除成功!n"break;else if(n=0)cout << "n"break;elsecout << "輸入有誤,請重新輸入!"/列車時刻表編輯 void Train_Edit(Graph &GT,Graph GP)int n,st,sn;int hour,minute;char number10;EdgeInfo q;while(1)cout << "n"cout

31、 << "t 1.添加列車 "cout << "t 2.刪除列車 "cout << "t 0.退出 "cout << "ttt 請選擇:"cin>>n;fflush(stdin);if(n=1)while(1)cout << "n請輸入起始城市的名稱:"if(input_Vex(GT,st)=true)break;while(1)cout << "n請輸入終點城市的名稱:"if(input_V

32、ex(GT,sn)=true)break;cout << "n請輸入車次:"cin >> number ;fflush(stdin);q.ivex=st;q.jvex=sn;strcpy(q.Number,number);cout << "n請輸入票價:"cin >> q.Money;fflush(stdin);cout << "n請輸入起始時間:"cout << "n幾點: "cin >> hour;fflush(stdin);c

33、out << "幾分: "cin >> minute;fflush(stdin);q.StartTime=TimeChange(hour,minute);cout << "n請輸入到站時間:"cout << "n幾點: "cin >> hour;fflush(stdin);cout << "幾分: "cin >> minute;fflush(stdin);q.EndTime=TimeChange(hour,minute);q.Tim

34、e=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(

35、GT,st)=true)break;while(1)cout << "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")

36、;break;elsecout << "輸入有誤,請重新輸入!"void Manage_Menu(Graph &GT,Graph &GP)while(1)int choice=5;cout << "t*"<< "n"cout << "t* 管理系統(tǒng)菜單 *"<<"n"cout << "t* 1.城市編輯 *"<<"n"cout << "

37、t* 2.列車時刻表編輯 *"<<"n"cout << "t* 3.航班時刻表編輯 *"<<"n"cout << "t* 0.退出系統(tǒng) *"<<"n"cout<< "t*"<< "n"cout << " 請選擇: "cin >> choice;fflush(stdin);if(choice=0) break;switch

38、(choice)case 1: City_Edit(GT,GP);break;case 2: Train_Edit(GT,GP);break;case 3: Plane_Edit(GT,GP);break;default:cout << " 輸入錯誤選項,請重試。nn"int Main_Menu(Graph &GT,Graph &GP)while(1)int choicem=3;cout << ("n");cout << "t*"<< "n"cout&

39、lt;<"t*全國交通咨詢系統(tǒng)主菜單 *"<<"n" cout << "t* 1.咨詢系統(tǒng) *"<<"n"cout << "t* 2.管理系統(tǒng) *"<<"n"cout << "t* 0.退出系統(tǒng) *"<<"n"cout<< "t*"<< "n"cout << "t

40、tt 請選擇: "cin >> choicem;cout << "n"fflush(stdin);/清除輸入流switch(choicem)case 1: Inquire_Menu(GT,GP);break;case 2: Manage_Menu(GT,GP);break;case 0: return choicem;default:cout << " 輸入有誤,請重試。nn"五、程序結(jié)果5.1操作流程1 本程序的運行環(huán)境為DOS操作系統(tǒng),執(zhí)行文件為源程序目錄下的DeBug子目錄下的:Traffic.exe;

41、雙擊了Traffic.exe后顯示了文本方式的用戶界面如下:選擇1進入:選擇2進入:在選擇1進入咨詢系統(tǒng)菜單后選擇1:在選擇1進入咨詢系統(tǒng)菜單后選擇1:在選擇1進入咨詢系統(tǒng)菜單后選擇2:選擇2進入管理系統(tǒng)后進行選擇1進行城市編輯進入城市編輯后選擇1進行添加城市進入城市編輯選擇2清除城市進入管理菜單選擇2進行列車時刻編輯進入列車時刻表編輯添加列車選擇3進入航班編輯后選擇1進行添加航班選擇3進入航班編輯后選擇2進行刪除航班5.2數(shù)據(jù)測試測試1:長沙上海乘坐火車信息:最省錢:總共費用243元 T147 長沙南昌 63元 K445 南昌上海 180元 最快到達:(擬出發(fā)時間早上8:00)共需48小時30分鐘 T147 長沙南昌 5:50-12:30 K445 南昌上海 16:208:40因為包

溫馨提示

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

評論

0/150

提交評論