版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、问题描述 全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。例如, 因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。 (2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和 飞机航班进行编辑(增设或删除)的功能。 (3)提供两种最优决策:最快到达或最省钱到达。全程只考虑一种 交通工具。 (4)旅途中耗费的总时间应该包括中转站的等候时间。 (5)咨询以用户和计算机的对话方式进行。
2、由用户输入起始站、终 点站、最优决策原则和交通工具,输出信息:最快需要多长时 间才能到达或者最少需要多少旅费才能到达,并详细说明依次 于何时乘坐哪一趟列车或哪一次班机到何地。徐州397乌鲁木齐哈尔滨长春沈阳天津郑州西安兰州成都上海昆明贵阳株州福州柳州广州深圳南宁189221611456681100967639907349676511242305704651622367409255607675140【测试数据】呼和浩特北京137674西宁大连534842武汉825南昌6722、 数据结构设计和核心算法设计描述:1、 根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下: 班次2、逻辑
3、结构拆分: 起止时间城市编号交通工具 信息 票价飞机线路总数火车线路总数火车信息路线信息飞机信息3、 核心设计:根据上面的流程图和逻辑拆分,对这个问题有了一个比较直观,详细地了解。并且从中也可得知路线的添加即数据的存储是这个系统进行运作的一个基础。而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这些数据进行了存储。将每个信息量放在不同的文件中,可以更有效、直观地对这些数据进行处理。流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是其他操作都是在路线添加好后进行的,并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用的是无限循环形式,即while(1)。 以邻
4、接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。3、 主控及功能模块层次结构:1、 模块说明:本系统分为个模块1、)主函数 2、)添加城市 3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:基本操作: TrafficNodeDat 交通工具 信息Char nameMAX_ST
5、RING_NUM 班次 Int starttime 出发时间 Int starttime 到达时间 Int cost 票价 UNodeDat 路线 信息 Short int city 城市编号 Int TrainNum 火车路线数 int FlightNum 航班路线数 TrafficNodeDat TrainMAX_TRAFFIC_NUM 火车路线信息 TrafficNodeDat FlightMAX_TRAFFIC_NUM 航班路线信息函数变量声明:#include <stdio.h> #include <string.h> #define ERR 0 #defin
6、e OK 1 #define Dij_MAXN 33 #define MAX_VERTEX_NUM 31 #define MAX_STRING_NUM 10 #define MAX_TRAFFIC_NUM 10 const char CityFile ="D:city.txt" const char TrainFile ="D:train.txt" const char FlightFile ="D:flight.txt" typedef short int CityType; typedef struct TrafficNode c
7、har nameMAX_STRING_NUM; /班次 int StartTime,StopTime; /起止时间 int EndCity; /该有向边指向的顶点在数组中的位置,即该城市编号 int Cost; /票价 TrafficNodeDat; typedef struct VNode CityType city; int TrainNum,FlightNum; /标记下面Train数组和Flight数组里元素个数 TrafficNodeDat TrainMAX_TRAFFIC_NUM; /数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDat Flight
8、MAX_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; /城市名,采用第一下标为该城市在本程序中的编号 int CityNum; /城市数目 PNodeDat PathMAX_VERTEX_NUM; /存储临时最小时间路径 PNodeDat MinPath
9、MAX_VERTEX_NUM; /存储搜索到当前的最小时间路径 int MinTime,StartTime; int curPath; 函数构成: int main() char nameMAX_STRING_NUM; char s_cityMAX_STRING_NUM; char e_cityMAX_STRING_NUM; int Command,cost; int startcity,endcity,traveltype; int s_hour,s_minute,e_hour,e_minute; while (1) ShowMenu(); /显示菜单 scanf("%d"
10、;,&Command); / switch (Command) case 0: /退出 return 0; case 1: /添加城市 InitSysData(); printf("n输入城市名:"); scanf("%s",&name); InsertCity(name); SaveSysInfo(); printf("System Info Save OK!n"); break; case 2: /删除城市 InitSysData(); printf("n输入城市名:"); scanf(&quo
11、t;%s",&name); DelCity(name); SaveSysInfo(); printf("System Info Save OK!n"); break; case 3: /添加路线 InitSysData(); printf("起始站城市名:"); scanf("%s",&s_city); printf("终点站城市名:"); scanf("%s",&e_city); printf("类型(列车0,航班1):"); scanf(
12、"%d",&traveltype); printf("输入列车/飞机班次:"); scanf("%s",&name); printf("起始时刻(00:00,24小时制):"); scanf("%2d:%2d",&s_hour,&s_minute); printf("到达时刻(00:00,24小时制):"); scanf("%2d:%2d",&e_hour,&e_minute); printf("票
13、价:");scanf("%d",&cost); if (traveltype) InsertFlight(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost); else InsertTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost); SaveSysInfo(); printf("System Info Save OK!n"); break; case 4: /删除路线 Init
14、SysData(); printf("输入班次:"); scanf("%s",&name); DelPath(name); SaveSysInfo(); printf("System Info Save OK!n"); break; case 5: /最小耗费 InitSysData(); printf("n起始城市:"); scanf("%s",&name); startcity=SeekCity(name); if (startcity<0) printf("
15、Error City Name:No such city!n"); break; printf("终点城市:"); scanf("%s",&name); endcity=SeekCity(name); if (endcity<0) printf("Error City Name:No such city!n"); break; printf("类型(列车0,航班1) :"); scanf("%d",&traveltype); if (traveltype!=0&a
16、mp;&traveltype!=1) printf("Error Input!"); break; CalcMinCost(startcity,endcity,traveltype); printf("n"); break; case 6: /最短时间路线 InitSysData(); printf("n起始城市:"); scanf("%s",&name); startcity=SeekCity(name); if (startcity<0) printf("Error City N
17、ame:No such city!n"); break; printf("终点城市:"); scanf("%s",&name); endcity=SeekCity(name); if (endcity<0) printf("Error City Name:No such city!n"); break; printf("类型(列车0,航班1) :"); scanf("%d",&traveltype); if (traveltype!=0&&trav
18、eltype!=1) printf("Error Input!"); break; CalcMinTime(startcity,endcity,traveltype); printf("n"); break; 四、主函数中的各个调用的函数代码具体如下:(1) 显示菜单:int ShowMenu() printf("n*MENU*n"); printf("1: 添加城市n2: 删除城市n3: 添加交通路线n4: 删除交通路线n5: 查询最小费用路线n6: 查询最快路线n0: 退出"); printf("n*
19、n"); printf("nType In Your Command:"); return 1; (2) 查找城市并返回城市序号:int SeekCity (char *name) int i; for (i=0;i<CityNum;i+) if (strcmp(name,CityNamei)=0) return i; return -1; (3)储存信息到文件:int SaveSysInfo() FILE *fp;int i,j,total; fp=fopen(CityFile,"w"); fprintf(fp,"%dn&qu
20、ot;,CityNum); for (i=0;i<CityNum;i+) fprintf(fp,"%sn",CityNamei); fclose(fp);total=0; fp=fopen(TrainFile,"w"); for (i=0;i<CityNum;i+) total+=AdjListi.TrainNum; fprintf(fp,"%dn",total); for (i=0;i<CityNum;i+) for (j=0;j<AdjListi.TrainNum;j+) fprintf(fp,"
21、%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(Fl
22、ightFile,"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:
23、%2d %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 InsertCity (char *Name) strcpy(CityNameCityNum,Name); AdjListCityNum.city=CityNum; AdjListCityNum.
24、FlightNum=0; AdjListCityNum.TrainNum=0; CityNum+; return 1; (5)删除城市:int DelCity (char *Name) int city,i,j; city=SeekCity(Name); for (i=city;i<CityNum-1;i+) strcpy(CityNamei,CityNamei+1); AdjListi.FlightNum=AdjListi+1.FlightNum; AdjListi.TrainNum=AdjListi+1.TrainNum; for (j=0;j<AdjListi.FlightN
25、um;j+) AdjListi.Flightj.Cost=AdjListi+1.Flightj.Cost; AdjListi.Flightj.EndCity=AdjListi+1.Flightj.EndCity; strcpy(AdjListi.F,AdjListi+1.F); AdjListi.Flightj.StartTime=AdjListi+1.Flightj.StartTime; AdjListi.Flightj.StopTime=AdjListi+1.Flightj.StopTime; CityNum-; return 1; (6)添加火
26、车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost) int i,j; i=SeekCity(StartCity); j=SeekCity(EndCity); AdjListi.TrainAdjListi.TrainNum.Cost=cost; AdjListi.TrainAdjListi.TrainNum.EndCity=j; AdjListi.TrainAdjListi.TrainNum.StartTime=StartTime; AdjListi.
27、TrainAdjListi.TrainNum.StopTime=EndTime; strcpy(AdjListi.TrainAdjListi.TrainN,train); AdjListi.TrainNum+; return 1; (7) 添加航班路线:int InsertFlight(char *flight,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost) int i,j; i=SeekCity(StartCity); j=SeekCity(EndCity); AdjListi.FlightAd
28、jListi.FlightNum.Cost=cost; AdjListi.FlightAdjListi.FlightNum.EndCity=j; AdjListi.FlightAdjListi.FlightNum.StartTime=StartTime; AdjListi.FlightAdjListi.FlightNum.StopTime=EndTime; strcpy(AdjListi.FlightAdjListi.FlightN,flight); AdjListi.FlightNum+; return 1; (8) 删除路线:int DelPath (char *name)
29、int 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.Fl
30、,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.Tr
31、ainNum-1;j+) AdjListi.Trainj.Cost=AdjListi.Trainj+1.Cost; AdjListi.Trainj.EndCity=AdjListi.Trainj+1.EndCity; strcpy(AdjListi.T,AdjListi.Trainj+1.name); AdjListi.Trainj.StartTime=AdjListi.Trainj+1.StartTime; AdjListi.Trainj.StopTime=AdjListi.Trainj+1.StopTime; AdjListi.TrainNum-; break; ret
32、urn 1; (9)打印最小费用路线:void Dijkstra_Output(int matxDij_MAXNDij_MAXN,int PreCityDij_MAXN,int p_end,int TravelType) int trackDij_MAXN; int i=0,j,k,min,tmp,end,cost=0; int startH, startM, endH, endM;/定义四个变量:startH 出发的小时,startM 出发的分钟, endH 到达的小时, endM 到达的分钟 j=p_end;tracki+=j; while (PreCityj>=0) cost+=m
33、atxPreCityjj; tracki+=j=PreCityj; printf("nTrack Way:"); if (!TravelType) for(i-;i>0;i-) printf("n%s:",CityNametracki); end=tracki-1;min=32767; for (k=0;k<AdjListtracki.TrainNum;k+) if (AdjListtracki.Traink.EndCity=end&&min>AdjListtracki.Traink.Cost) min=AdjListt
34、racki.Traink.Cost; tmp=k; printf("%s ",AdjListtracki.T); 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")
35、; 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); /printf("%2d:%2d-%2d:%2d",AdjListtracki.
36、Traintmp.StartTime/60,AdjListtracki.Traintmp.StartTime%60,AdjListtracki.Traintmp.StopTime/60,AdjListtracki.Traintmp.StopTime%60); else for(i-;i>0;i-) printf("n%s:",CityNametracki); end=tracki-1;min=32767; for (k=0;k<AdjListtracki.FlightNum;k+) /这句错了,AdjListtracki.Traink.EndCity改为AdjL
37、isttracki.Flightk.EndCity! /*if (AdjListtracki.Traink.EndCity=end&&min>AdjListtracki.Flightk.Cost) */ if (AdjListtracki.Flightk.EndCity=end&&min>AdjListtracki.Flightk.Cost) min=AdjListtracki.Flightk.Cost; tmp=k; printf("%s",AdjListtracki.F); startH = AdjListtracki.Flighttmp.StartTime / 60 ; startM = AdjListtracki.Flighttmp.StartTime % 60; endH = AdjListtracki.Flighttmp.StopTime / 60 ; endM = AdjListtracki.Flighttmp.StopTime % 60 ; if( !(startH/10) ) printf("0"); printf("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- CN119597696A 基于PCIe的数据传输方法、装置、设备及介质 (深圳云天励飞技术股份有限公司)
- 审计专业技术资格(初级)审计责任与风险题(带评分标准)
- 精算师考试精算师考试真题解析(完整版)
- 小学数学北师大版(新教材)四年级下看一看 课件(共15张)
- 导游证科目四真题卷
- 计算机技术与软件专业技术资格(高级)综合知识真题库(完整版)
- 2026新教材语文 第六单元 课外古诗词课件(共26张)初中语文统编版(2024)七年级上册
- 人工智能金融顾问系统
- 人工智能监管政策效应评估
- 八段锦行气导引基础科普
- 常见精神科疾病及治疗
- 阿仑膦酸钠临床推广幻灯20090310
- 售后维修服务单
- 黄酒的酿造 黄酒酒曲制备
- 施工现场五牌二图
- 《食品检验机构资质认定条件》内部审核检查表
- 铸造企业现场管理类隐患排查治理清单
- YS/T 582-2013电池级碳酸锂
- 中国农业银行现金管理项下委托贷款协议范本-
- 汽轮机危急遮断系统(ETS)课件
- 《空气动力学与飞行原理》空气动力学-课件
评论
0/150
提交评论