1、一、问题描述全国交通咨询模拟:处于对不同目得得旅客对交通工具有不同得要求.例如,因公出差得旅客希望在旅途中得时间尽可能短,出门旅游得游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间得交通咨询程序,为旅客提供两种或三种最优决策得交通咨询。【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)得功能. (2)城市之间有两种交通工具:火车与飞机。提供对列车时刻表与 飞机航班进行编辑(增设或删除)得功能。 (3)提供两种最优决策:最快到达或最省钱到达.全程只考虑一种 交通工具 ()旅途中耗费得总时间应该包括中转站得等候时间。 ()咨询以用户与计算机得对话方式进行。由用户输入
2、起始站、终 点站、最优决策原则与交通工具,输出信息:最快需要多长时 间才能到达或者最少需要多少旅费才能到达,并详细说明依次 于何时乘坐哪一趟列车或哪一次班机到何地。徐州397乌鲁木齐哈尔滨长春沈阳天津郑州西安兰州成都上海昆明贵阳株州福州柳州广州深圳南宁189221611456681100967639907349676511242305704651622367409255607675140【测试数据】呼与浩特北京137674西宁大连534842武汉825南昌672二、 数据结构设计与核心算法设计描述:1、 根据题目中得基本要求分析,可以创建系统概念模型,流程设计框图如下: 班次2、逻辑结构拆分:
3、 起止时间城市编号交通工具 信息 票价飞机线路总数火车线路总数火车信息路线信息飞机信息3、 核心设计:根据上面得流程图与逻辑拆分,对这个问题有了一个比较直观,详细地了解.并且从中也可得知路线得添加即数据得存储就是这个系统进行运作得一个基础而为了便于数据得存储、添加、删除等操作,我选择了储存文件对这些数据进行了存储。将每个信息量放在不同得文件中,可以更有效、直观地对这些数据进行处理。流程图中得个主要功能模块在主函数中,采用输入选项进入子菜单,但就是其她操作都就是在路线添加好后进行得,并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用得就是无限循环形式,即while(1)。 以邻接表作
4、交通图得存储结构,表示边得结点内除含有邻接点得信息外,包括交通工具、路程中消耗得时间与花费以及出发与到达得时间等多项属性。三、 主控及功能模块层次结构:1、 模块说明:本系统分为个模块1、)主函数 2、)添加城市 3、)查找城市并返回序号、)删除城市5、)添加列车6、)添加航班、)删除列车或航班、)找出最小费用路线9、)初始化系统数据(读入内存)1、)找出最快路线、)计算最快路线耗费得时间并打印1、)计算最小费用路线、)主界面1、)存储信息到文件1、)退出、下面就是各模块示意图:基本操作: TraficNdDat 交通工具 信息Chr eMAXTRINGNUM 班次 Int strttime
5、出发时间 Int strti 到达时间 nt cst 票价 UodeDa 路线 信息 Sotint c 城市编号 IntainNu 火车路线数 it ligtNu 航班路线数 ficodeDat ranMA_AFFIC_NM 火车路线信息 raficNodeDat FlighMTAFIC_U 航班路线信息函数变量声明:inlue stdio、h#include srng、h#efieERR 0 #define OK1 #dein Dij_MAXN 33 #define AXVER_NUM 31 defne MAX_SRING_NM1dine MAX_TRAFI_U 10 con char it
6、File :cit、xt”;cotcr TrinFl=D:tan、txt”; const ar ightFil D:ft、x”; typeef hor int CityType;typdefstruct rficode haameMAX_STGNU; /班次 int tartTe,StopTie; /起止时间 ntdCi;/该有向边指向得顶点在数组中得位置,即该城市编号 int Cost;/票价 rffcNodeDat; tyedf sructVNde CitTy city; intriNu,lihtNu; /标记下面Trai数组与Fligt数组里元素个数 Trafidt TraiMAX_RF
7、FICNUM;/数组成员为结构体,记录了到达城市、起止时间、票价与班次 TffiNdeDat FightMAX_TAFF_M; / int Cost; /遍历时到达该城市得耗费(时间或者费用)VNodeDat; ypdef strut Pode it Cit; int T; PNodeDat; VNodeDatAdjistA_VET_N; /ytem nfo chr ityameMXVTE_UMAXSRING_M; /城市名,采用第一下标为该城市在本程序中得编号 nt CityNum; /城市数目PNodeDt PthAXVEREX_NUM;/存储临时最小时间路径NodeDatMnPathMA
8、_VE_NUM; 存储搜索到当前得最小时间路径 intMnTie,StartTime; int crath;函数构成: i n() r naeM_STRINGNU; hr s_ciyMAXSTIG_M; care_cityAX_TRING_NUM; it an,ost; int startty,endity,travely; in s_h,s_mine,e_or,e_minute; while(1) ShowMe(); /显示菜单 cnf(”d,a); / swith (man) case : /退出 retn0; cae 1:/添加城市 Intata(); prntf(”输入城市名:”);
9、scn(”%s,nam); InsrCity(nam); SaeysIfo(); prinf(”Syte Inf Sae OK!); brak; cse 2: 删除城市 IitSysDta(); printf(n输入城市名:); can(s”,name); et(name); SveSyInfo(); prinf(”Sysm Info Sae K!n); be; case:/添加路线 InitDaa(); prinf(”起始站城市名:); scanf(”%s,&sit); rnf(终点站城市名:”); af(%,e_cit); pritf(”类型(列车0,航班1):); caf(”d,&tra
10、veltp); prit(”输入列车/飞机班次:”); canf(%”,&nme); rintf(起始时刻(0:0,24小时制):”); sc(%d:%2d”,s_hour,s_miut); pri(”到达时刻(0:00,24小时制):”); scaf(”2d:2d”,e_hour,&e_minute); ritf(”票价:);scaf(,&cost); if (traelype) Inserligh(nae,scity,e_cit,our*60+s_mite,e_ur*60+e_minute,cost); els InsertTain(nae,s_it,_iy,s_hour*6+s_inut
11、e,e_hour0+_minut,cost); SaveSysInfo(); prntf(System Ino Sve OK!n”); brea; as 4:/删除路线 IntSysData(); pint(输入班次:”); cnf(”%s”,nm); eath(ame); SaveSysnfo(); rntf(Syse In Save OK!n”); eak; as5:/最小耗费 IniSysata(); pritf(”n起始城市:); scanf(s”,&ame); starttySekCit(nae); if (srtity0) prinf(”rrr Cty ame:No suh ci!
12、n); brk; pritf(”终点城市:); scanf(”%s,&name); endcit=eekity(na); if (ndcity0) printf(”Error ity Name:No uchity!n”); break; prinf(类型(列车0,航班1) :”); snf(”%d”,traveltype); if(tavltype!=0trelyp!1) prnf(”Erornpu!); brk; CalcMnCost(startty,endcit,travetype); rintf(n”); break; case 6: /最短时间路线 itDat(); prin(”n起始
13、城市:); sca(”,ame); statciy=SeekCity(name); if (starcity0) rinf(”Eror Cty Nam:N uh city!n); rea; prntf(”终点城市:”); scaf(”%,name); endcty=Seekity(nae); i (endcity0) printf(rt Nm:Nouch ity!n”); rek; print(”类型(列车0,航班):”); canf(d”,&travlype); if (raeltype!0&tveltpe!=) prntf(”EroInpu!); rak; CalMinime(startc
14、ty,ndcit,taveltpe); pintf(n”); ek; 四、主函数中得各个调用得函数代码具体如下:(1) 显示菜单:t ShwMenu() pin(”n*EN*n”); intf(1:添加城市n2: 删除城市n3: 添加交通路线4:删除交通路线n5: 查询最小费用路线n6: 查询最快路线n0: 退出); printf(”n*n”); pntf(”nyI Yu nd:”); retrn1; (2) 查找城市并返回城市序号:tekity (car nae) nt i; o (;CityNm;i+) if (strcmp(ame,CitNami)=) rturn i; etrn1; (
15、3)储存信息到文件:it SavSsInfo() FILE *p;int i,j,otl; fp=en(Cile,”w”); pintf(p,%dn,CyNm); for (i=0;iCtyNum;i+) prinf(fp,%sn”,CyNami); fcose(p);total=0; f=fpen(TinFl,w); or (=0;iCityum;i+) totl+=AjLst、Trinum; fpntf(p,%d,ttal); for (=0;iCityNum;i+) r(=;Adjisti、raiNum;j+) fpintf(p,”% %s ”, Ajisi、ranj、name, CtN
16、amei, CityNamedjList、Tain、EnCity); fpritf(fp,”2:2 d: %d,AdListi、Tr、SartTme60, Adjsi、Traj、Startme6, AjListi、Tranj、StopTime/60, AdjListi、Tranj、SoTime%0, AdjList、aij、ost); fcose();total=; pfen(FlghFile,”w”); fo (i0;iCtyNm;i+) total+AdjListi、FlightNm; fprin(f,n”,toal); fr(=0;iiyNum;i+) for (j=0;jAdjiti、
17、FightNm;j+) fprint(fp,”% % s ”,Adjii、Flightj、name, am, CityNameAjisti、Flightj、EdCt); fprnt(f,2d:%d 2d:d %n, AdjListi、Flightj、Startm/6, AdjLsti、Flightj、SarTm%0, jList、Fliht、Spie/0, Adjsti、Fightj、StpTime60, Lis、Fligh、Cot); fse(fp);retrn ; (4)添加城市:it Inrtity (chNae) trpy(CityNaeiNum,Nm); AdjistCiu、city
18、=Citum; djListCityum、Flighum=0; AdjLitCitNum、TrainNum0; CityNm+; retun1;(5)删除城市:n DelCiy (char *Nam) it ity,i,j; ciy=Sekity(ame); fr(icity;iCitNum1;i+) strcp(ityamei,CityNamei+); AjListi、FlihtNum=Adjsti+、FlightN; Adjist、ranNum=AdjListi+1、TranNum; or (j=;jAjList、ihtNu;j+) AjLiti、Fihtj、Cost=AListi+1、F
19、ihj、Cot; AdjList、Fihtj、nCtdjist+1、Fghtj、ECity; strcpy(Ajist、Flij、name,AdjListi1、Flih、name); Adjit、Fihj、SartTime=AdjList1、ightj、SrtTime; AjListi、Fghtj、StpTimedLsti+1、Flihj、SpTie; CitNu-; reurn 1; (6)添加火车路线:nt IsertTrain (chartrin,char StartCity,char EdCity,nttarime,intEndTime,t cost) int ,; =Sekit(ta
20、rCity); jSeeCiy(EnCiy); AdjList、anAdjListi、ranNum、Cost=ost; dLiti、ranAdisti、Trim、Citj; AdjLs、rainAdjLsti、inNm、tatTim=Strtime; AdList、TaindjLisi、TrainNum、StpTie=EndTime; srcp(AdLst、TrinAdListi、TinNum、ame,trai); Adjisti、Tinum+; rern 1; (7) 添加航班路线:nt Inligt(char *flht,char*artCiy,char *Enty,it StartTe,
21、int Endime,intcost) in i,; i=Seeit(StrtCity); jSeekCity(EndCy); AjListi、FlihAdjLis、FligtNu、Cstcost; AjLsti、lghtAdjLsti、FiNum、Endit=j; Adii、FighAdjList、FlightN、StartTime=SarTime; djLiti、FlghtAdjList、FitNm、StopieEnime; strcpy(Adjisi、FlghtjLiti、FlitNum、nae,flight); Lisi、FightNum; retr 1; (8) 删除路线:int l
22、Path (char*nm) int ,j,flag=0; f(i0;iCtyum;+) fr (j0;dLti、Flihtum;j+) if (srm(Adjisi、Flighj、nam,me)=0) lag=; brek; if (lag) (;jAdLst、ihtNu;j+) AdjLisi、Flight、t=AjLsi、Flighj+、Cot; AdListi、Fight、EndCity=AdjListi、Flgt1、ndCity; srcy(djLsti、Fghj、ame,Adjiti、Fligj+1、nae); Ajisti、lightj、StrtTiedjLti、Flightj+
23、1、StartTime; AdjList、lightj、pTie=djti、Fightj1、StopTim; djisti、FlightNu-; rea; for (j0;AdListi、TanNm;j+) f(strcm(AdjLis、Trainj、nme,name)=0) a1;break; i (fag) fr (;jAdjLisi、TainNum-1;j+) Adjit、ainj、ot=AdjListi、Trainj+、Cos; Adisti、Tranj、EndCity=Adjis、ainj+1、Edity; scpy(AjLsti、Tinj、name,djLst、Trinj+1、name); Adjsti、Tain、tartm=AdList、Trainj、StatTie; Listi、Trainj、Stopm=AdLst、Taij+1、SpTime; AdjList、Tainu-; reak; reurn 1; (9)打印最小费用路线:voidijkt