




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 #include #define err 0 #define ok 1 #define dij_maxn 33 #defin
6、e 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 char namemax_string_num; /班次 int starttime,stoptime; /起止时间 int endc
7、ity; /该有向边指向的顶点在数组中的位置,即该城市编号 int cost; /票价 trafficnodedat; typedef struct vnode citytype city; int trainnum,flightnum; /标记下面train数组和flight数组里元素个数 trafficnodedat trainmax_traffic_num; /数组成员为结构体,记录了到达城市、起止时间、票价和班次 trafficnodedat flightmax_traffic_num; / int cost; /遍历时到达该城市的耗费(时间或者费用) vnodedat; typede
8、f 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 minpathmax_vertex_num; /存储搜索到当前的最小时间路径 int mintime,starttime; int curpath
9、; 函数构成: 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,&command); / switch (command) case 0: /退出 return 0; case 1: /添加城市 initsysdat
10、a(); printf(n输入城市名:); scanf(%s,&name); insertcity(name); savesysinfo(); printf(system info save ok!n); break; case 2: /删除城市 initsysdata(); printf(n输入城市名:); scanf(%s,&name); delcity(name); savesysinfo(); printf(system info save ok!n); break; case 3: /添加路线 initsysdata(); printf(起始站城市名:); scanf(%s,&s_c
11、ity); printf(终点站城市名:); scanf(%s,&e_city); printf(类型(列车0,航班1):); scanf(%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(票价:);scanf(%d,&cost); if (traveltype) insertf
12、light(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: /删除路线 initsysdata(); printf(输入班次:); scanf(%s,&name); delpath(name); savesysinfo(); print
13、f(system info save ok!n); break; case 5: /最小耗费 initsysdata(); printf(n起始城市:); scanf(%s,&name); startcity=seekcity(name); if (startcity0) printf(error city name:no such city!n); break; printf(终点城市:); scanf(%s,&name); endcity=seekcity(name); if (endcity0) printf(error city name:no such city!n); break;
14、 printf(类型(列车0,航班1) :); scanf(%d,&traveltype); if (traveltype!=0&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 (startcity0) printf(error city name:n
15、o such city!n); break; printf(终点城市:); scanf(%s,&name); endcity=seekcity(name); if (endcity0) printf(error city name:no such city!n); break; printf(类型(列车0,航班1) :); scanf(%d,&traveltype); if (traveltype!=0&traveltype!=1) printf(error input!); break; calcmintime(startcity,endcity,traveltype); printf(n)
16、; break; 四、主函数中的各个调用的函数代码具体如下:(1) 显示菜单:int showmenu() printf(n*menu*n); printf(1: 添加城市n2: 删除城市n3: 添加交通路线n4: 删除交通路线n5: 查询最小费用路线n6: 查询最快路线n0: 退出); printf(n*n); printf(ntype in your command:); return 1; (2) 查找城市并返回城市序号:int seekcity (char *name) int i; for (i=0;icitynum;i+) if (strcmp(name,citynamei)=0)
17、 return i; return -1; (3)储存信息到文件:int savesysinfo() file *fp;int i,j,total; fp=fopen(cityfile,w); fprintf(fp,%dn,citynum); for (i=0;icitynum;i+) fprintf(fp,%sn,citynamei); fclose(fp);total=0; fp=fopen(trainfile,w); for (i=0;icitynum;i+) total+=adjlisti.trainnum; fprintf(fp,%dn,total); for (i=0;icityn
18、um;i+) for (j=0;jadjlisti.trainnum;j+) fprintf(fp,%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);
19、 fclose(fp);total=0; fp=fopen(flightfile,w); for (i=0;icitynum;i+) total+=adjlisti.flightnum; fprintf(fp,%dn,total); for (i=0;icitynum;i+) for (j=0;jadjlisti.flightnum;j+) fprintf(fp,%s %s %s , adjlisti.f, citynamei, citynameadjlisti.flightj.endcity); fprintf(fp,%2d:%2d %2d:%2d %dn, adjli
20、sti.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.flightnum=0; adjlistcitynum.
21、trainnum=0; citynum+; return 1; (5)删除城市:int delcity (char *name) int city,i,j; city=seekcity(name); for (i=city;icitynum-1;i+) strcpy(citynamei,citynamei+1); adjlisti.flightnum=adjlisti+1.flightnum; adjlisti.trainnum=adjlisti+1.trainnum; for (j=0;jadjlisti.flightnum;j+) adjlisti.flightj.cost=adjlist
22、i+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)添加火车路线:int inserttrain (char *train,cha
23、r *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.trainadjlisti.trainnum.stoptime=endt
24、ime; 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.flightadjlisti.flightnum.cost=cost; adjlisti
25、.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) int i,j,flag=0; for (i=0;icitynum;i+
26、) for (j=0;jadjlisti.flightnum;j+) if (strcmp(adjlisti.f,name)=0) flag=1; break; if (flag) for (;jadjlisti.flightnum-1;j+) adjlisti.flightj.cost=adjlisti.flightj+1.cost; adjlisti.flightj.endcity=adjlisti.flightj+1.endcity; strcpy(adjlisti.f,adjlisti.flightj+1.name); adjlisti.fl
27、ightj.starttime=adjlisti.flightj+1.starttime; adjlisti.flightj.stoptime=adjlisti.flightj+1.stoptime; adjlisti.flightnum-; break; for (j=0;jadjlisti.trainnum;j+) if (strcmp(adjlisti.t,name)=0) flag=1;break; if (flag) for (;j=0) cost+=matxprecityjj; tracki+=j=precityj; printf(ntrack way:); i
28、f (!traveltype) for(i-;i0;i-) printf(n%s:,citynametracki); end=tracki-1;min=32767; for (k=0;kadjlisttracki.traink.cost) min=adjlisttracki.traink.cost; tmp=k; printf(%s ,adjlisttracki.t); starth = adjlisttracki.traintmp.starttime/60 ; startm = adjlisttracki.traintmp.starttime%60; endh = a
29、djlisttracki.traintmp.stoptime/60 ; endm = adjlisttracki.traintmp.stoptime%60 ; if( !(starth/10) ) printf(0); 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,ad
30、jlisttracki.traintmp.starttime/60,adjlisttracki.traintmp.starttime%60,adjlisttracki.traintmp.stoptime/60,adjlisttracki.traintmp.stoptime%60); else for(i-;i0;i-) printf(n%s:,citynametracki); end=tracki-1;min=32767; for (k=0;kadjlisttracki.flightk.cost) */ if (adjlisttracki.flightk.endcity=end&minadjl
31、isttracki.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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州六盘水市参加第十三届贵州人才博览会事业单位人才引进261人模拟试卷及答案详解(名校卷)
- 2025中心医院快速石蜡技术考核
- 大学课件说明
- 秦皇岛市人民医院医务处副处长资格评审
- 2025广东江门新会区会城街道今古洲社区公益性岗位招聘1人考前自测高频考点模拟试题参考答案详解
- 2025北京海关所属事业单位招聘5人考前自测高频考点模拟试题附答案详解(突破训练)
- 2025第二人民医院微创手术设备使用维护考核
- 张家口市人民医院学术论文撰写与投稿水平专家评议
- 石家庄市中医院鼻骨骨折复位术考核
- 北京市人民医院人事档案管理与保密制度知识考核试题
- 基层工会届中调整选举主持词
- 中药新药研发与创新
- 联化科技(临海)有限公司年产800吨二酰胺酯、500吨甲氧苯硼酸、1000吨LT228等九个项目环境影响报告
- 人教PEP版四年级上册英语-Unit-3-Part-B-Let's-learn-and-write-说课稿
- 丽江区域地质报告 -报告
- 偏瘫患者业务查房课件
- JJG 1036-2022电子天平
- 杆塔基础分坑
- 中医正骨八法-课件
- 外研版八年级上册英语课文(全册)
- 博山区规模企业名单
评论
0/150
提交评论