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

下载本文档

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

文档简介

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

2、话方式进行。由用户输入起始站、终 点站、最优决策原则和交通工具,输出信息:最快需要多长时 间才能到达或者最少需要多少旅费才能到达,并详细说明依次 于何时乘坐哪一趟列车或哪一次班机到何地。 【测试数据】 今鲁木齐 216 1892 1145 昆明 639 1100 6 842 255 967907 哈尔滨 305 武汉 北京37 704. 徐州 651 34917天津大连 672 140 深圳 安534 上海 /825 南2昌 福州 *南宁 409 367 二、数据结构设计和核心算法设计描述: 1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计 框图如下: 2、逻辑结构拆分: 3、核心

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

4、耗的时间和花费以及出发和到达的时间等多项属性。 三、主控及功能模块层次结构: 1、模块说明:本系统分为个模块 1、)主函数 2、)添加城市 3、)查找城市并返回序号 4、)删除城市 5、)添加列车 6、)添加航班 7、)删除列车或航班 8、)找出最小费用路线 9、)初始化系统数据(读入内存) 10、)找出最快路线 11、)计算最快路线耗费的时间并打印 12、)计算最小费用路线 13、)主界面 14、)存储信息到文件 15、)退出、 2、下面是各模块示意图: 1 F 1 T 体抽诚帀 巨憧信息到之件 也船代彌 蓟返丄文 样读入內存 崩陰城市 畔傅倍羸刮衣件 詡加交ii踣线 r F 册船化輛 裁退

5、5艾 档诒入內存 潍加航珊 1 r 1 r T 枷皓化系轨 蓟返从文 样请入內有 冊陪墜撞 主讪e白利汕 初绐化系如 畑 枫文 匚谕入向存 存桶信尽刮文Ct 卸始化磊蜿 匏据(从文 自爆扎內程) 基本操作: TrafficNodeDat 交通工具 信息 Char n ameMAX_STRING_N UM 班次 Int starttime 出发时间 Int starttime 到达时间 Int cost 票价 UNodeDat 路线 信息 Short int city 城市编号: Int TrainNum 火车路线数 int FlightNum 航班路线数 TrafficNodeDat Trai

6、 nMAX_TRAFFIC_ NUM 火车路线信息 TrafficNodeDat FlightMAX TRAFFIC 航班路线信息 NUM 函数变量声明: #i nclude #include #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 10 con st char CityFile =D:city.txt; const char TrainFile =D:train.txt; co

7、n st char FlightFile =D:flight.txt; typedef short int CityType; typedef struct TrafficNode char nameMAX_STRING_NUM; / 班次 int StartTime,StopTime; /起止时间 int En dCity; /该有向边指向的顶点在数组中的位置,即该城市编号 int Cost; 票价 TrafficNodeDat; typedef struct VNode CityType city; int TrainNum,FlightNum; /标记下面Train数组和Flight数组

8、里元素个数 TrafficNodeDat Trai nM AX_TRAFFIC_NUM;/ 数组成员为结构体,记录了 到达城市、起止时间、票价和班次 TrafficNodeDat FlightMAX_TRAFFIC_NUM; / int Cost; /遍历时到达该城 市的耗费(时间或者费用) VNodeDat; typedef struct PNode int City; int TraNo; PNodeDat; VNodeDat AdjListMAX_VERTEX_NUM; /System Info char CityNameMAX_VERTEX_NUMMAX_STRING_NUM;/ 城市

9、名,采用第 一下标为该城市在本程序中的编号 int CityNum; / 城市数目 PNodeDat PathMAX_VERTEX_NUM; / 存储临时最小时间路径 PNodeDat MinPathMAX_VERTEX_NUM; /存储搜索到当前的最小时间路径 int Min Time,StartTime; int curPath; 函数构成: int mai n() char n ameMAX_STRING_NUM; char s_cityMAX_STRING_NUM; char e_cityMAX_STRING_NUM; int Comma nd,cost; int startcity,

10、endcity,traveltype; int s_hour,s_mi nute,e_hour,e_mi nu te; while (1) ShowMe nu(); 显示菜单 sea nf(%d, / switch (Comma nd) case 0: /退出 return 0; case 1: /添加城市 In itSysData(); printf(n输入城市名:); sca nf(%s, In sertCity( name); SaveSysI nfo(); prin tf(System Info Save OK!n); break; case 2: /删除城市 In itSysData

11、(); 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, printf(终点站城市名:); scan f(%s, printf(类型(列车0,航班1):); scan f(%d, printf(输入列车/飞机班次:); scan f(%s, printf(起始时刻(00:00,24 小时制):); scan f(%2d:%2d, p

12、rintf(到达时刻(00:00, 24 小时制):); scan f(%2d:%2d, printf(票价:);sca nf(%d, if (traveltype) In sertFlight( name,s_city,e_city,s_hour*60+s_mi nute,e_hour*60+e_mi nute,cost); 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); b

13、reak; case 4:删除路线 In itSysData(); printf(输入班次:); scan f(%s, DelPath( name); SaveSysI nfo(); prin tf(System Info Save OK!n); break; case 5: /最小耗费 In itSysData(); printf(n 起始城市:); sca nf(%s, startcity=SeekCity( name); if (startcity0) prin tf(ErrorCity Name:No such city!n); break; printf(终点城市:); sea nf

14、(%s, en dcity=SeekCity( name); if (en dcity0) prin tf(ErrorCity Name:No city!n); break; printf(类型(列车0,航班1):); sca nf(%d, if (traveltype!=0 break; CalcMi nCost(startcity,e ndcity,traveltype); prin tf(n); break; case 6: /最短时间路线 In itSysData(); printf(n 起始城市:); sca nf(%s, startcity=SeekCity( name); if

15、(startcity0) prin tf(ErrorCity Name:No city!n); break; printf(终点城市:); sca nf(%s, en dcity=SeekCity( name); such such if (en dcity0) prin tf(Error City Name:No such city!n); break; printf(类型(列车0,航班1):); sca nf(%d, if (traveltype!=0 break; CalcMi nTime(startcity,e ndcity,traveltype); prin tf(n); break

16、; 四、主函数中的各个调用的函数代码具体如下: (1) 显示菜单: int ShowMe nu() printf (n*MENU*n); prin tf(1: 添加城市n2:删除城市n3:添加交通路线n4:删除交通路线 n5:查询最小费用路线n6:查询最快路线n0:退出); prin tf(n * *n); prin tf(nType In Your Comma nd:); return 1; (2) 查找城市并返回城市序号: int SeekCity (char *n ame) int i; for (i=O;iCityNum;i+) if (strcmp( name,CityNamei)=

17、O) return i; return -1; (3) 储存信息到文件: int SaveSys lnfo() FILE *fp; int i,j,total; fp=fope n(CityFile,w); fprin tf(fp,%dn,CityNum); for (i=O;iCityNum;i+) fprin tf(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); fo

18、r (i=0;iCityNum;i+) for (j=0;jAdjListi.Trai nNu m;j+) fprin tf(fp,%s %s %s , AdjListi.Trai nj. name, CityNamei, CityNameAdjListi.Trai nj.E ndCity); %dn, fprin tf(fp,%2d:%2d%2d:%2d AdjListi.Trai nj.StartTime/60, AdjListi.Trai nj.StartTime%60, AdjListi.Trai nj.StopTime/60, AdjListi.Trai nj.StopTime%60

19、, AdjListi.Trai nj.Cost); fclose(fp);total=0; fp=fope n(FlightFile,w); for (i=0;iCityNum;i+) total+=AdjListi.FlightNum; fprin tf(fp,%dn,total); for (i=0;iCityNum;i+) for (j=0;jAdjListi.FlightNum;j+) fprin tf(fp,%s %s %s , AdjListi.Flightj. name, CityNamei, %dn, CityNameAdjListi.Flightj.E ndCity); fp

20、rin tf(fp,%2d:%2d%2d:%2d AdjListi.FIightj.StartTime/60, AdjListi.FIightj.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; AdjListCit

21、yNum.FIightNum=0; 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.Fl

22、ightNum;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.Flightj.StopTime=AdjListi+1.Flightj.StopTime; CityNum-; return

23、1; (6) 添加火车路线: int InsertTrain (char *train,char *StartCity,char *EndCity,intStartTime,int 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.StartTi

24、me=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; (7) 添加航班路线: StartTime,i nt int InsertFlight(char *flight,char *StartCity,char *EndCity,int En dTime,i nt cost) int i,j; i=SeekCity(StartCity);

25、 j=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+; r

26、eturn 1; (8) 删除路线: int DelPath (char *n ame) int i,j,flag=0; for (i=0;iCityNum;i+) for (j=0;jAdjListi.FIightNum;j+) if (strcmp(AdjListi.FIightj. name, name)=0) flag=1; break; if (flag) for (;jAdjListi.FIightNum-1;j+) AdjListi.FIightj.Cost=AdjListi.FIightj+1.Cost; AdjListi.Flightj.E ndCity=AdjListi.F

27、Iightj+1.E ndCity; strcpy(AdjListi.FIightj. name,AdjListi.FIightj+1. name); 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

28、;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 n k.Co GO minHAdj 匚 s#ack 巨.Trains.cosc fmpHk 八 pinff(=%s=Adj 匚 ssrack 巨.T EnumpL name)八 sQ

29、rrtH H Adj 匚 sqtack 巨.Tain=mpLSQrrtTimeo50 八 sQrrtM H Adj 匚 ssrack 巨.Tain=mpLSQrrtTime%60 八 endH H Adj 匚 ssrack 巨.Tain=mpLsfopTimeo50 八 endM H Adj 匚 ssrack 巨.Tain=mpLsfopTime%60 八 if(一 (sQTrtHMO) 宀 primfa) pinff(=%0;i-) prin tf(n%s:,CityNametracki); en d=tracki-1;mi n=32767; for (k=0;kAdjListtracki.

30、FIightk.Co st) */ if (AdjListtracki.Flightk.E ndCity=e nd tmp=k; prin tf(%s,AdjListtracki.FIighttmp. name); startH = AdjListtracki.Flighttmp.StartTime 60 ; startM = AdjListtracki.Flighttmp.StartTime 60; endH H AdjU s#ack 巨 F-ighsmpLsfopTime - 60 八 endM AdjLisf口rack巨.F-igh#mpLsfopTime % if (一 (sQrrtH

31、MO) prinmo) pinff(=%ck=sQrrtH)八 if (一 (sQrrtMMO) 宀 prinmo) pinff(=%d -=sQrrtM)八 if (一 (endHMO) prinmo) pHf(=%ck=endHX if (一(endMMO) 宀 prinmo) pHf(=%2n=endMX prinff(=%2%2d20,the precity of City i int i,j,min,pre,pos; for (i=0;iCityNum;i+) PreCityi=-1; PreCityp_start=-2; while (PreCityp_e nd=-1) mi n=

32、-1; for (i=0;iCityNum;i+) if (PreCityi!=-1) for (j=0;j0pos=j;mi n=matxij; PreCitypos=pre; Dijkstra_Output(matx,PreCity,p_e nd,TravelType); (11) 初始化系统数据: int Ini tSysData () FILE *fp;int i,j,hour,minute,num,cost; char stmp1MAX_STRING_NUM; char stmp2MAX_STRING_NUM; char stmp3MAX_STRING_NUM; fp=fope n(

33、CityFile,广); if (!fp) prin tf(nError:Ca nnot Ope n 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=O; fclose(fp); fp=fope n( Trai nFile,r); if (!fp) printf(nError:Cannot Open Train File.n); return -1; fscan f(fp,

34、%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 nAdjListj.Trai nN um.StartTime=hour*60+mi nute; fscan f(fp,%d:%

35、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) prin tf(nError:Ca nnot Ope n Flight File.n); return -1; fscan f(fp,%d, for (i=0;i CurTime-StartTime) for (

36、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=0;i=(CurTime%1440) SearchMi nTime(AdjListCity.Trai ni.E ndCity,E ndCity,AdjListCity.Trai ni.S topTime+(CurTime/

37、1440)*1440,curPathNo,TravelType); if (AdjListCity.Trai ni.StartTime(CurTime%1440) SearchMi nTime(AdjListCity.Trai ni.E ndCity,E ndCity,AdjListCity.Trai ni.S topTime+(CurTime/1440+1)*1440,curPathNo,TravelType); else for (i=0;i=CurTime) SearchMi nTime(AdjListCity.Flighti.E ndCity,E ndCity,AdjListCity.

38、FIighti. StopTime+(CurTime/1440)*1440,curPathNo,TravelType); if (AdjListCity.Flighti.StartTimeCurTime) SearchMi nTime(AdjListCity.FIighti.E ndCity,E ndCity,AdjListCity.FIighti. StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); return 1; (13) 计算最快路线所需时间并打印: int CalcMinTime (int StartCity,int EndC

39、ity,int TravelType) int i; int startH, startM, endH, endM;/ 定义四个变量:startH 出发的小 时,startM 出发的分钟,endH到达的小时,endM到达的分钟 Min Time=32767;curPath=0; Path0.City=StartCity; if (!TravelType) for (i=0;iAdjListStartCity.Trai nNu m;i+) Path0.TraNo=i; StartTime=AdjListStartCity.Trai ni.StartTime; SearchMi nTime(Adj

40、ListStartCity.Trai ni.E ndCity,E ndCity,AdjListStartCity .Trai ni.StopTime,0,TravelType); else for (i=0;iAdjListStartCity.FlightNum;i+) Path0.TraNo=i; StartTime=AdjListStartCity.FIighti.StartTime; SearchMi nTime(AdjListStartCity.FIighti.E ndCity,E ndCity,AdjListStartCity .FIighti.StopTime,0,TravelTy

41、pe); 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.FlightMi nPath0.TraNo.StartTime; prin tf(nPath:n); for (i=0;i=curPath;i+) if (!TravelType) %s %s prin t

42、f(%s: ,CityNameMi nPathi.City,AdjListMi nPathi.City.Trai nMi nPathi.TraNo .n ame); else prin tf(%s: ,CityNameMi nPathi.City,AdjListMi nPathi.City.FIightMi nPathi.TraNo .n ame); startH AdjListMi nPathi.City.Trai nMi nPathi.TraNo.StartTime / 60 ; startM AdjListMi nPathi.City.Trai nMi nPathi.TraNo.StartTime % 60 ; 爺snH庶 endH H Adj 匚 SHM5pafh 三 GM.Tra 亘 MinPafh 日.TraNOLSfopTime _ 60 - endM H Adj 匚 SHM5pafh 三 GM.Tra 亘 MinPafh 日.TraNOLSfopTime % 60 - if (一 (sQrrtHMO) 宀 Primo) pinff(=%ck=sQrrtH)八 if (一 (sQrrtMMO) 宀 Primo)

温馨提示

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

评论

0/150

提交评论