全国交通咨询模拟系统实验报告

合集下载

交通查询系统实验报告

交通查询系统实验报告

一、实验背景随着我国经济的快速发展和人民生活水平的不断提高,人们对出行的需求日益增长。

为了方便旅客了解和查询交通信息,提高出行效率,减少出行成本,本实验设计并实现了一个基于的交通查询系统。

二、实验目的1. 熟悉编程环境,掌握C#编程语言。

2. 了解数据库设计、开发及管理的基本方法。

3. 培养团队协作能力,提高实际项目开发能力。

4. 实现一个功能完善、界面友好、操作简便的交通查询系统。

三、实验内容1. 系统需求分析系统主要面向旅客,提供全国城际交通路线查询服务。

功能包括:(1)按城市查询:输入出发城市和终点城市,查询两地之间的交通信息。

(2)按班次查询:在已知班次的情况下,查询该班次的详细信息。

(3)普通查询:输入最简洁的查询方式,查询所有符合条件的交通信息。

(4)高级查询:根据用户特定条件,查询相关交通信息。

(5)交通信息更新:管理员可以对交通、城市及管理员信息进行管理。

2. 系统设计(1)系统架构设计本系统采用B/S(Browser/Server)架构,前端使用HTML、CSS和JavaScript,后端使用和C#编程语言。

数据库采用MySQL。

(2)数据库设计数据库包括以下表:1)城市表(City):存储城市信息,如城市名称、经纬度等。

2)交通路线表(Route):存储交通路线信息,如起点城市、终点城市、距离、预计时间等。

3)班次表(Schedule):存储班次信息,如班次编号、出发时间、到达时间、票价等。

4)管理员表(Admin):存储管理员信息,如管理员账号、密码等。

(3)功能模块设计1)用户登录模块:用户登录系统,进行相关操作。

2)交通信息查询模块:根据用户输入条件,查询交通信息。

3)交通信息更新模块:管理员对交通、城市及管理员信息进行管理。

4)首页模块:展示系统欢迎界面,提供相关功能链接。

3. 系统实现(1)前端实现使用HTML、CSS和JavaScript实现系统界面,包括登录界面、查询界面、更新界面等。

2数据结构——全国交通咨询模拟系统实验报告

2数据结构——全国交通咨询模拟系统实验报告

2数据结构——全国交通咨询模拟系统实验报告全国交通咨询模拟一、设计目的掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。

得到软件设计技能的训练。

二、问题描述交通咨询模拟。

根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。

三、基本要求1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;2、对城市间的交通工具:火车。

对列车时刻表进行编辑:里程、和列车班次的添加、修改、删除;3、提供两种最优决策:最快到达或最省钱到达。

全程只考虑一种交通工具,可以不考虑回程;4、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。

由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟列车何时到达何地。

四、具体实现1、思路(1) 数据存储。

城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。

在实验中本想用文本储存数据,但操作不熟悉,而是改用图的邻接矩阵储存原始信息,而后用数组进行添加删改(2) 数据的逻辑结构。

根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为无向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的时间)或旅费。

(3) 数据的存储结构。

采用邻接表和邻接矩阵都可作为数据的存储结构,这里建议采用邻接矩阵作为数据的存储结构。

(4) 用不同的功能模块对城市信息和交通信息进行编辑。

添加、修改、删除功能可用菜单方式或命令提示方式。

只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面,具体实现由学生自行设计,也可参考有关程序(届时在网上提供)。

这些工作有不小的工作量。

全国交通咨询模拟系统

全国交通咨询模拟系统

全国交通咨询模拟系统系统背景随着我国经济的快速发展,交通出行已经成为人们日常生活中不可或缺的一部分。

不仅高速公路、铁路、城市轨道交通、公共汽车等交通工具不断完善,而且智能化、自动化、先进化等新兴技术也在交通领域变得越来越普及。

但是在日常出行中,人们难免会遇到交通拥堵、事故等问题,对于这些问题,如果及时得到准确可靠的信息,将大大缩短人们的出行时间,帮助人们更快地解决问题。

因此,我们开发了一款全国交通咨询模拟系统,帮助人们快速获取各地交通信息、查询交通路线、实时交通情况等信息,缩短出行时间,提高出行效率,让人们更加便捷的出行。

系统功能1. 查询交通信息全国交通咨询模拟系统提供了各地铁路、航班、长途汽车的信息查询功能,用户可通过输入出发地和目的地信息,查询出该区域的所有交通信息。

同时提供了乘车时间和价格等信息,方便用户选择最优出行方式。

2. 实时交通情况查询全国交通咨询模拟系统为用户提供了实时交通情况查询功能,用户可通过输入出行路线,系统将返回该路线的实时情况,包括此时此刻的路况、车流量、拥堵情况、事故情况等,方便用户对出行进行最佳规划。

3. 路线规划全国交通咨询模拟系统提供了路线规划的功能,用户输入起点和终点的位置信息,系统将为用户快速规划出一条最优的路线。

此外,该系统还提供了多条路线的选择,用户可以根据自己的需求进行选择。

4. 路况预报全国交通咨询模拟系统还提供了路况预报的功能,即用户可以预先了解某段道路的车流量、拥堵情况等。

系统通过大数据分析和深度学习等技术,对路况进行精准预测,使用户能够提前规划出行。

5. 存储建议全国交通咨询模拟系统可为用户存储出行建议,用户可以按照自己的需求,将出行建议进行收藏、备份和删除,方便后续使用。

系统优势1. 数据准确性高全国交通咨询模拟系统通过各种渠道收集、整理和分析各地交通数据,确保提供给用户的是准确可靠的信息。

2. 使用简单该系统的使用非常简单,用户只需按照系统提示输入需要查询的信息,系统将自动返回相应的结果。

全国交通咨询模拟系统实验报告

全国交通咨询模拟系统实验报告

全国交通咨询模拟系统实验报告Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT一、问题描述全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。

例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。

编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。

(2)城市之间有两种交通工具:火车和飞机。

提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。

(3)提供两种最优决策:最快到达或最省钱到达。

全程只考虑一种交通工具。

(4)旅途中耗费的总时间应该包括中转站的等候时间。

(5)咨询以用户和计算机的对话方式进行。

由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。

二、1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下:班次辑结构拆分:而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这些数据进行了存储。

将每个信息量放在不同的文件中,可以更有效、直观地对这些数据进行处理。

流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是其他操作都是在路线添加好后进行的,并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用的是无限循环形式,即while(1)。

以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。

三、主控及功能模块层次结构:1、模块说明:本系统分为个模块1、)主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:基本操作:函数变量声明:#include <>#include <>#define ERR 0#define OK 1#define Dij_MAXN 33#define MAX_VERTEX_NUM 31#define MAX_STRING_NUM 10#define MAX_TRAFFIC_NUM 10const char CityFile[] ="D:\\";const char TrainFile[] ="D:\\";const char FlightFile[] ="D:\\";typedef short int CityType;typedef struct TrafficNode{char name[MAX_STRING_NUM]; rainNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].TrainNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Train[j].name,CityName[i],CityName[AdjList[i].Train[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Train[j].StartTime/60, AdjList[i].Train[j].StartTime%60,AdjList[i].Train[j].StopTime/60,AdjList[i].Train[j].StopTime%60,AdjList[i].Train[j].Cost);}}fclose(fp);total=0;fp=fopen(FlightFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].FlightNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Flight[j].name,CityName[i],CityName[AdjList[i].Flight[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Flight[j].StartTime/60, AdjList[i].Flight[j].StartTime%60,AdjList[i].Flight[j].StopTime/60,AdjList[i].Flight[j].StopTime%60,AdjList[i].Flight[j].Cost);}}fclose(fp);return 1;}(4)添加城市:int InsertCity (char *Name){strcpy(CityName[CityNum],Name);AdjList[CityNum].city=CityNum;AdjList[CityNum].FlightNum=0;AdjList[CityNum].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(CityName[i],CityName[i+1]);AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;for (j=0;j<AdjList[i].FlightNum;j++){AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost;AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity;strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name);AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime;}}CityNum--;return 1;}(6)添加火车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost){int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime;AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime;strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);AdjList[i].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);AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime;AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime;strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight);AdjList[i].FlightNum++;return 1;}(8)删除路线:int DelPath (char *name){int i,j,flag=0;for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++)if (strcmp(AdjList[i].Flight[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].FlightNum-1;j++){AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity;strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name); AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime;}AdjList[i].FlightNum--;break;}for (j=0;j<AdjList[i].TrainNum;j++)if (strcmp(AdjList[i].Train[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].TrainNum-1;j++){AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime;AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime;}AdjList[i].TrainNum--;break;}}return 1;}(9)打印最小费用路线:void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN],int PreCity[Dij_MAXN],intp_end,int TravelType){int track[Dij_MAXN];int i=0,j,k,min,tmp,end,cost=0;int startH, startM, endH, endM;rainNum;k++)if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost){min=AdjList[track[i]].Train[k].Cost;tmp=k;}printf("%s ",AdjList[track[i]].Train[tmp].name);startH = AdjList[track[i]].Train[tmp].StartTime/60 ;startM =AdjList[track[i]].Train[tmp].StartTime%60;endH = AdjList[track[i]].Train[tmp].StopTime/60 ;endM = AdjList[track[i]].Train[tmp].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("%d\n",endM);rain[tmp].StartTime/60,AdjList[track[i]].Train[tmp].StartTime%60,AdjList[track[i]].Tr ain[tmp].StopTime/60,AdjList[track[i]].Train[tmp].StopTime%60);}}else{for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].FlightNum;k++)rain[k].EndCity改为AdjList[track[i]].Flight[k].EndCity!/*if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){ */if(AdjList[track[i]].Flight[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){min=AdjList[track[i]].Flight[k].Cost;tmp=k;}printf("%s",AdjList[track[i]].Flight[tmp].name);startH =AdjList[track[i]].Flight[tmp].StartTime / 60 ;startM =AdjList[track[i]].Flight[tmp].StartTime % 60;endH =AdjList[track[i]].Flight[tmp].StopTime / 60 ;endM =AdjList[track[i]].Flight[tmp].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("%d\n",endM);light[tmp].StartTime / 60,AdjList[track[i]].Flight[tmp].StartTime %60,AdjList[track[i]].Flight[tmp].StopTime / 60,AdjList[track[i]].Flight[tmp].StopTime % 60);}}printf("\n%s: DESTINATION!",CityName[track[0]]);printf("\nMin Cost : %d\n",cost);}(10)找出最小费用路线void Dijkstra(int matx[Dij_MAXN][Dij_MAXN],int p_start,int p_end,int TravelType) {int PreCity[Dij_MAXN]; .\n");return -1;}fscanf(fp,"%d",&CityNum);for (i=0;i<CityNum;i++){fscanf(fp,"%s",&CityName[i]);AdjList[i].city=i;AdjList[i].TrainNum=0;AdjList[i].FlightNum=0;}fclose(fp);fp=fopen(TrainFile,"r");if (!fp){printf("\nError:Cannot Open Train File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Train[AdjList[j].TrainNum].Cost=cost;AdjList[j].TrainNum++;}fclose(fp);fp=fopen(FlightFile,"r");if (!fp){printf("\nError:Cannot Open Flight File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost;AdjList[j].FlightNum++;}fclose(fp);return 1;}(12)找出最快路线:int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,int TravelType){int i;if (City==EndCity){if (MinTime>CurTime-StartTime){for (i=0;i<=curPathNo;i++){MinPath[i].City=Path[i].City;MinPath[i].TraNo=Path[i].TraNo;curPath=curPathNo;}MinTime=CurTime-StartTime;}}else{curPathNo++;Path[curPathNo].City=City;if (!TravelType){for (i=0;i<AdjList[City].TrainNum;i++){if((AdjList[City].Train[i].StartTime>=(CurTime%1440))&&(AdjList[City].Train[i].StopT ime+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTim e+(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Train[i].StartTime<(CurTime%1440))&&(AdjList[City].Train[i].StopTi me+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTim e+(CurTime/1440+1)*1440,curPathNo,TravelType);}}}else{for (i=0;i<AdjList[City].FlightNum;i++){if((AdjList[City].Flight[i].StartTime>=CurTime)&&(AdjList[City].Flight[i].StopTime+(C urTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTi me+(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Flight[i].StartTime<CurTime)&&(AdjList[City].Flight[i].StopTime+(Cur Time/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTi me+(CurTime/1440+1)*1440,curPathNo,TravelType);}}}}return 1;}(13)计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType){int i;int startH, startM, endH, endM;ity=StartCity;if (!TravelType){for (i=0;i<AdjList[StartCity].TrainNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Train[i].StartTime;SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity,AdjList[StartCity].Train[i ].StopTime,0,TravelType);}}else{for (i=0;i<AdjList[StartCity].FlightNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Flight[i].StartTime;SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity,AdjList[StartCity].Flight[ i].StopTime,0,TravelType);}}if (MinTime==32767){printf("\nNo access to that destination!");return 0;}rain[MinPath[0].TraNo].StartTime;light[MinPath[0].TraNo].StartTime;printf("\nPath:\n");for (i=0;i<=curPath;i++){if (!TravelType)printf("%s : %s",CityName[MinPath[i].City],AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name); elseprintf("%s : %s",CityName[MinPath[i].City],AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name);startH =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime / 60 ;startM =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime % 60 ;endH =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime / 60 ;endM =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].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("%d\n",endM);rainNum){min=32767;end=AdjList[i].Train[j].EndCity;while(end==AdjList[i].Train[j].EndCity&&j<AdjList[i].TrainNum){if (AdjList[i].Train[j].Cost<min){min=AdjList[i].Train[j].Cost;}j++;}ma[i][end]=min;}}}else{for (i=0;i<CityNum;i++){min=32767;j=0;while (j<AdjList[i].FlightNum){min=32767;end=AdjList[i].Flight[j].EndCity;while(end==AdjList[i].Flight[j].EndCity&&j<AdjList[i].FlightNum){if (AdjList[i].Flight[j].Cost<min){min=AdjList[i].Flight[j].Cost;}j++;}ma[i][end]=min;}}}Dijkstra(ma,StartCity,EndCity,TravelType);return 1;}五、功能模块间函数的调用关系,如下图所示:1、主界面:2、添加城市:输入命令1后,按提示输入城市名,而后返回主界面原city文件:添加城市后的city文件:3、删除城市:输入命令2后,按提示输入城市名,而后返回主界面4、添加路线:输入命令3后,按提示依次输入起始站、终点站、类型、起始时刻、到达时刻、票价等信息,而后返回主界面添加路线后的train文件:5、删除路线:输入命令4后,按提示输入,而后返回主界面删除路线后的train文件:6、查找最小费用花费:输入命令5后,按提示输入起始城市、终点城市、类型,而后返回主界面结果正确!7、查找最小时间花费:输入命令6后,按提示输入城市名,而后返回主界面结果正确!8、退出:输入命令0后,退出系统七、课程设计小结:1、实验过程中的注意点1)遇到逻辑问题,然后设断点,调试跟踪看哪步出了问题.比如说全局变量和局部变量设置出现问题,导致运行过程各变量的取值不对。

交通系统仿真实验报告

交通系统仿真实验报告

道路交通系统仿真实验实验一 VISSIM班级:08交通工程学号:120081501131 姓名:王两全一、实验目的1.掌握用VISSIM绘制简单的路网;2.掌握如何给路网添加基本的路网元素(如:信号灯、路径决策、冲突区域、优先规则、公交站点等);3.掌握对仿真模型进行指标评价,包括行程时间、延误、排队长度以及相关参数的设置。

二、实验设备1.硬件要求:装有VISSIM的PC机一台;2.系统要求:能在Windows 2000、XP和VISTA环境下运行;三、实验要求在VISSIM中构建一个平面信号控制交叉口模型,不考虑行人和非机动车,具体要求见试卷。

四、实验内容与步骤1.绘制路网(1)根据实验要求导入背景图;(2)按照每车道宽3.5m设置比例尺参数,根据背景图绘制一个T形交叉口(北进口封闭),交叉口宽度:南北:45m、东西99m;(3)初步路网结果图.2.添加路网元素(1)对绘制好的路网标明车道方向;(2)输入车辆数:400辆/车道小时;(3)信号配时;(4)设置行驶路径决策;(5)设置一条跨越交叉口的公交线路并设置两种不同的公交站点:港湾式和路边式;(6)设置冲突区域。

(7)添加路网元素后的结果3.设置仿真评价指标(1)行程时间;创建时间检测,并在“评价->文件”进行行程时间检测设置。

(2)延误;(3)排队长度。

1.信号控制2.冲突区域通过该实验巩固了初步使用VISSIM对一个完整路网的构建,对Vissim 的各个功能有更深刻的了解。

但由于实验过程中可能有一些小细节出错了,导致两种控制方式的评价指标结果都一样,通过多次的调试仍然未找出错误的地方,这是该实验遗憾的地方。

理论上讲,该试验的交叉口可以看成是主干道与次干道的相交(东西为主干道,南北为次干道且),而且该交叉口的流量比较小,粗略判断应该是冲突区域控制会比信号控制更加优越。

同时,此次实验为我们以后自己动手进行交通仿真做了很好的铺垫。

交通仿真实习报告

交通仿真实习报告

交通仿真实习报告一、引言随着城市化进程的加速和人们对出行需求的不断提高,交通问题日益凸显。

为了解决实际交通问题,提高交通系统效率,我们进行了一次交通仿真实习。

本报告将详细介绍我们的仿真实习目的、方法、结果及结论。

二、仿真实习目的本次仿真实习的主要目的是通过模拟交通系统,深入了解交通流特性、交通拥堵形成原因、交通规划原则等,以期在实践中得到应用。

三、仿真实习方法我们采用了专业的交通仿真软件进行模拟实验。

我们构建了一个包含道路、交叉口、交通信号灯等基本交通设施的模型。

接着,我们设置了不同的交通流量和出行需求,观察交通运行情况。

同时,我们还通过调整交通信号灯的配时方案,研究其对交通流的影响。

四、仿真实习结果在模拟过程中,我们观察到了交通拥堵、车辆排队等现象。

通过数据分析,我们发现交通拥堵主要发生在道路节点处,如交叉口和交通信号灯处。

我们还发现交通信号灯配时不合理会加剧交通拥堵。

针对这些问题,我们提出了一些可能的解决方案,如优化交通信号灯配时、增加道路通行能力等。

五、结论与展望通过本次仿真实习,我们深入了解了交通系统的运行特性和存在的问题。

针对这些问题,我们提出了一些解决方案,以期在实际应用中得到改善。

然而,这只是初步的探索和研究,我们还需要在未来的学习和实践中不断深化和完善相关知识,为解决实际交通问题提供更有价值的参考。

仿真实习个人实习报告一、引言随着科技的发展和数字化时代的到来,仿真技术已经成为工程设计、生产规划和管理决策等方面的重要工具。

为了更好地掌握仿真技术的应用和实践,我参与了一次为期六周的仿真实习项目。

通过本次实习,我不仅了解了仿真模型的构建过程和基本原理,还深入学习了如何运用仿真技术解决实际问题。

以下是我对本次实习的总结和个人心得。

二、仿真实习概述在本次实习中,我参与的是一个生产流水线的仿真项目。

通过构建仿真模型,模拟生产线的运行过程,预测可能出现的瓶颈和问题,并制定相应的优化方案。

1、仿真模型的构建构建仿真模型是仿真的基础。

全国交通咨询模拟

一.实验目的交通咨询模拟的主要功能是可以列出从一个城市到另一个城市的所有路径,供所需要的人选择。

二.实验内容开始页面进入交通系统管理菜单页面,页面下面包括有:查询两城市间的最短距离,查询一个城市到其余城市的最短距离,查询两城市间的所有路径等。

最后调用相应的子函数,完成程序的编写。

此程序中除主函数外,有四个功能各异的子函数,其调用关系如图所示。

三.实验步骤(可选)本次调用的库函数为:#include <iostream>using namespace std;#include"string.h"# include "stdlib.h"以下为交通咨询管理系统所用的主要子函数。

用邻接矩阵作为数据的存储结构构建一个有向图,代码如下:void CreateMGraph(MGraph *G,int n,int e){//采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数int i,j,k,w;for(i=1;i<=n;i++) //输入顶点信息G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint; //初始化邻接矩阵Cout<<"输入%d条边的i、j及w:\n"<<e;for(k=1;k<=e;k++) //读入e条边,建立邻接矩阵{Cin>>i>>j>>w;G->arcs[i][j]=w;//权值}cout<<"有向图的存储结构建立完毕\n”;}用Dijkstra算法求一点到其余点的最短距离,代码如下:void Dijkstra(MGraph *G,int v1,int n)//用迪杰斯特拉算法求有向图G的v1顶点到其他顶点V的最短路径P[V]及其权D[V]//设G是有向图的邻接矩阵,若边<i,j>不存在,则G[i][j]=Maxint// S[v]为真当且仅当v∈s,即已求得从V1到v的最短路径。

全国交通咨询模拟系统实验报告

一、问题描述全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。

例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。

编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。

(2)城市之间有两种交通工具:火车和飞机。

提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。

(3)提供两种最优决策:最快到达或最省钱到达。

全程只考虑一种交通工具。

(4)旅途中耗费的总时间应该包括中转站的等候时间。

(5)咨询以用户和计算机的对话方式进行。

由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。

【测试数据】二、数据结构设计和核心算法设计描述:1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下:3、核心设计:根据上面的流程图和逻辑拆分,对这个问题有了一个比较直观,详细地了解。

并且从中也可得知路线的添加即数据的存储是这个系统进行运作的一个基础。

而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这些数据进行了存储。

将每个信息量放在不同的文件中,可以更有效、直观地对这些数据进行处理。

流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是其他操作都是在路线添加好后进行的,并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用的是无限循环形式,即while(1)。

以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。

三、主控及功能模块层次结构:1、模块说明:本系统分为个模块1、)主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:基本操作:函数变量声明:#include <stdio.h>#include <string.h>#define ERR 0#define OK 1#define Dij_MAXN 33#define MAX_VERTEX_NUM 31 #define MAX_STRING_NUM 10 #define MAX_TRAFFIC_NUM 10const 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 name[MAX_STRING_NUM]; //班次int StartTime,StopTime; //起止时间int EndCity; //该有向边指向的顶点在数组中的位置,即该城市编号int Cost; //票价} TrafficNodeDat;typedef struct VNode{CityType city;int TrainNum,FlightNum; //标记下面Train数组和Flight数组里元素个数TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; // int Cost; //遍历时到达该城市的耗费(时间或者费用)} VNodeDat;typedef struct PNode{int City;int TraNo;} PNodeDat;VNodeDat AdjList[MAX_VERTEX_NUM]; //System Infochar CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中的编号int CityNum; //城市数目PNodeDat Path[MAX_VERTEX_NUM]; //存储临时最小时间路径PNodeDat MinPath[MAX_VERTEX_NUM]; //存储搜索到当前的最小时间路径int MinTime,StartTime;int curPath;函数构成:int main(){char name[MAX_STRING_NUM]; char s_city[MAX_STRING_NUM]; char e_city[MAX_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: //添加城市InitSysData();printf("\n输入城市名:");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_city);printf("终点站城市名:");scanf("%s",&e_city);printf("类型(列车0,航班1):"); scanf("%d",&traveltype);printf("输入列车/飞机班次:");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){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: //删除路线InitSysData();printf("输入班次:");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("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&&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 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&&traveltype!=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****************************\n");printf("\nType In Your Command:");return 1;}(2)查找城市并返回城市序号:int SeekCity (char *name){int i;for (i=0;i<CityNum;i++){if (strcmp(name,CityName[i])==0){return i;}}return -1;}(3)储存信息到文件:int SaveSysInfo(){FILE *fp;int i,j,total;fp=fopen(CityFile,"w");fprintf(fp,"%d\n",CityNum);for (i=0;i<CityNum;i++){fprintf(fp,"%s\n",CityName[i]);}fclose(fp);total=0;fp=fopen(TrainFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].TrainNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].TrainNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Train[j].name,CityName[i],CityName[AdjList[i].Train[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Train[j].StartTime/60, AdjList[i].Train[j].StartTime%60,AdjList[i].Train[j].StopTime/60,AdjList[i].Train[j].StopTime%60,AdjList[i].Train[j].Cost);}}fclose(fp);total=0;fp=fopen(FlightFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].FlightNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Flight[j].name,CityName[i],CityName[AdjList[i].Flight[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Flight[j].StartTime/60, AdjList[i].Flight[j].StartTime%60,AdjList[i].Flight[j].StopTime/60,AdjList[i].Flight[j].StopTime%60,AdjList[i].Flight[j].Cost);}}fclose(fp);return 1;}(4)添加城市:int InsertCity (char *Name){strcpy(CityName[CityNum],Name);AdjList[CityNum].city=CityNum;AdjList[CityNum].FlightNum=0;AdjList[CityNum].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(CityName[i],CityName[i+1]);AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;for (j=0;j<AdjList[i].FlightNum;j++){AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost;AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name); AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime;}}CityNum--;return 1;}(6)添加火车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost){int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime;AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime;strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);AdjList[i].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);AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime; AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime; strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight); AdjList[i].FlightNum++;return 1;}(8)删除路线:int DelPath (char *name){int i,j,flag=0;for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++)if (strcmp(AdjList[i].Flight[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].FlightNum-1;j++){AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name); AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime;}AdjList[i].FlightNum--;break;}for (j=0;j<AdjList[i].TrainNum;j++)if (strcmp(AdjList[i].Train[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].TrainNum-1;j++){AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime;AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime;}AdjList[i].TrainNum--;break;}}return 1;}(9)打印最小费用路线:void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN],int PreCity[Dij_MAXN],int p_end,int TravelType){int track[Dij_MAXN];int i=0,j,k,min,tmp,end,cost=0;int startH, startM, endH, endM;//定义四个变量:startH 出发的小时,startM 出发的分钟, endH 到达的小时, endM 到达的分钟j=p_end;track[i++]=j;while (PreCity[j]>=0){cost+=matx[PreCity[j]][j];track[i++]=j=PreCity[j];}printf("\nTrack Way:");if (!TravelType){for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].TrainNum;k++)if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost){min=AdjList[track[i]].Train[k].Cost;tmp=k;}printf("%s ",AdjList[track[i]].Train[tmp].name);startH = AdjList[track[i]].Train[tmp].StartTime/60 ;startM =AdjList[track[i]].Train[tmp].StartTime%60;endH = AdjList[track[i]].Train[tmp].StopTime/60 ;endM = AdjList[track[i]].Train[tmp].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("%d\n",endM);//printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Train[tmp].StartTime/60,AdjList[track[i]].Train[tmp].StartTi me%60,AdjList[track[i]].Train[tmp].StopTime/60,AdjList[track[i]].Train[tmp].StopTime %60);}}else{for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].FlightNum;k++)//这句错了,AdjList[track[i]].Train[k].EndCity改为AdjList[track[i]].Flight[k].EndCity!/*if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){ */if(AdjList[track[i]].Flight[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){min=AdjList[track[i]].Flight[k].Cost;tmp=k;}printf("%s",AdjList[track[i]].Flight[tmp].name);startH = AdjList[track[i]].Flight[tmp].StartTime / 60 ;startM = AdjList[track[i]].Flight[tmp].StartTime % 60;endH =AdjList[track[i]].Flight[tmp].StopTime / 60 ;endM = AdjList[track[i]].Flight[tmp].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("%d\n",endM);//printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Flight[tmp].StartTime / 60,AdjList[track[i]].Flight[tmp].StartTime % 60,AdjList[track[i]].Flight[tmp].StopTime / 60,AdjList[track[i]].Flight[tmp].StopTime % 60);}}printf("\n%s: DESTINATION!",CityName[track[0]]);printf("\nMin Cost : %d\n",cost);}(10)找出最小费用路线void Dijkstra(int matx[Dij_MAXN][Dij_MAXN],int p_start,int p_end,int TravelType) {int PreCity[Dij_MAXN]; //PreCity[i]==-1,never used;//PreCity>0,the precity of City iint i,j,min,pre,pos;for (i=0;i<CityNum;i++){PreCity[i]=-1;}PreCity[p_start]=-2;while (PreCity[p_end]==-1){min=-1;for (i=0;i<CityNum;i++)if (PreCity[i]!=-1){for (j=0;j<CityNum;j++)if (PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min)){pre=i;pos=j;min=matx[i][j];}}PreCity[pos]=pre;}Dijkstra_Output(matx,PreCity,p_end,TravelType);}(11)初始化系统数据:int InitSysData (){FILE *fp;int i,j,hour,minute,num,cost;char stmp1[MAX_STRING_NUM];char stmp2[MAX_STRING_NUM];char stmp3[MAX_STRING_NUM];fp=fopen(CityFile,"r");if (!fp){printf("\nError:Cannot Open City File...\n"); return -1;}fscanf(fp,"%d",&CityNum);for (i=0;i<CityNum;i++){fscanf(fp,"%s",&CityName[i]);AdjList[i].city=i;AdjList[i].TrainNum=0;AdjList[i].FlightNum=0;}fclose(fp);fp=fopen(TrainFile,"r");if (!fp){printf("\nError:Cannot Open Train File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Train[AdjList[j].TrainNum].Cost=cost;AdjList[j].TrainNum++;}fclose(fp);fp=fopen(FlightFile,"r");if (!fp){printf("\nError:Cannot Open Flight File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost;AdjList[j].FlightNum++;}fclose(fp);return 1;}(12)找出最快路线:int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,int TravelType){int i;if (City==EndCity){if (MinTime>CurTime-StartTime){for (i=0;i<=curPathNo;i++){MinPath[i].City=Path[i].City;MinPath[i].TraNo=Path[i].TraNo;curPath=curPathNo;}MinTime=CurTime-StartTime;}}else{curPathNo++;Path[curPathNo].City=City;if (!TravelType){for (i=0;i<AdjList[City].TrainNum;i++){if((AdjList[City].Train[i].StartTime>=(CurTime%1440))&&(AdjList[City].Train[i].StopTi me+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTime+ (CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Train[i].StartTime<(CurTime%1440))&&(AdjList[City].Train[i].StopTime +(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTime+ (CurTime/1440+1)*1440,curPathNo,TravelType);}}}else{for (i=0;i<AdjList[City].FlightNum;i++){if((AdjList[City].Flight[i].StartTime>=CurTime)&&(AdjList[City].Flight[i].StopTime+(Cur Time/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTime +(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Flight[i].StartTime<CurTime)&&(AdjList[City].Flight[i].StopTime+(CurT ime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTime +(CurTime/1440+1)*1440,curPathNo,TravelType);}}}}return 1;}(13)计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType){int i;int startH, startM, endH, endM;//定义四个变量:startH 出发的小时,startM 出发的分钟, endH 到达的小时, endM 到达的分钟MinTime=32767;curPath=0;Path[0].City=StartCity;if (!TravelType){for (i=0;i<AdjList[StartCity].TrainNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Train[i].StartTime;SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity,AdjList[StartCity].Train[i].St opTime,0,TravelType);}}else{for (i=0;i<AdjList[StartCity].FlightNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Flight[i].StartTime;SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity,AdjList[StartCity].Flight[i].S topTime,0,TravelType);}}if (MinTime==32767){printf("\nNo access to that destination!");return 0;}// if (!TravelType)// StartTime=AdjList[StartCity].Train[MinPath[0].TraNo].StartTime;// else// StartTime=AdjList[StartCity].Flight[MinPath[0].TraNo].StartTime;printf("\nPath:\n");for (i=0;i<=curPath;i++){if (!TravelType)printf("%s : %s ",CityName[MinPath[i].City],AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name);elseprintf("%s : %s ",CityName[MinPath[i].City],AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name);startH = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime / 60 ;startM = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime % 60 ;endH = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime / 60 ;endM = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].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("%d\n",endM);//printf(" %2S:%2S-%2S:%2S\n",startH);}printf("%s: DESTINATION!",CityName[EndCity]);printf("\nTime Cost: %2d hour - %2d minute",MinTime/60,MinTime%60); return 1;}(14)计算最小费用路线:int CalcMinCost (int StartCity,int EndCity,int TravelType){int ma[Dij_MAXN][Dij_MAXN];int i,j,min,end;for (i=0;i<CityNum;i++)for (j=0;j<CityNum;j++)ma[i][j]=-1;if (TravelType==0){for (i=0;i<CityNum;i++){min=32767;j=0;while (j<AdjList[i].TrainNum){min=32767;end=AdjList[i].Train[j].EndCity;while(end==AdjList[i].Train[j].EndCity&&j<AdjList[i].TrainNum){if (AdjList[i].Train[j].Cost<min){min=AdjList[i].Train[j].Cost;}j++;}ma[i][end]=min;}}else{for (i=0;i<CityNum;i++){min=32767;j=0;while (j<AdjList[i].FlightNum){min=32767;end=AdjList[i].Flight[j].EndCity;while(end==AdjList[i].Flight[j].EndCity&&j<AdjList[i].FlightNum){if (AdjList[i].Flight[j].Cost<min){min=AdjList[i].Flight[j].Cost;}j++;}ma[i][end]=min;}}Dijkstra(ma,StartCity,EndCity,TravelType);return 1;}五、功能模块间函数的调用关系,如下图所示:六、调试结果: 1、主界面:2、添加城市:输入命令1后,按提示输入城市名,而后返回主界面CalcMinCost():Dijkstra(ma,StertCity,EndCity,TravelType)Dijkstra():Dijkstra_OutPut(mat x,PreCity,p_end,Trav elType)InsertTrain():SeekCity(StartCity) SeekCity(EndCity)InsertFlight():SeekCity(StartCity) SeekCity(EndCity)原city文件:添加城市后的city文件:3、删除城市:输入命令2后,按提示输入城市名,而后返回主界面4、添加路线:输入命令3后,按提示依次输入起始站、终点站、类型、起始时刻、到达时刻、票价等信息,而后返回主界面。

模拟一个全国城市间的交通咨询程序数据结构课程设计报告44页word

分类号编号华北水利水电学院North China Institute of Water Conservancy and Hydroelectric Power课程设计题目:全国交通资讯系统院系信息工程学院专业计算机科学与技术专业姓名指导教师杨彬2019年6月28日目录1.需求分析 (1)问题描述 (1)1.1基本要求 (1)2概要设计 (2)2.1 数据结构 (2)2.2 程序模块 (4)3.详细设计 (5)3.1用到的各种函数 (5)3.2函数调用关系图 (6)3.3测试与分析 (6)4.用户说明书 (9)5.总结 (9)5.1李明月的总结 (9)5.2刘璐璐的总结 (10)5.3吕竹青的总结 (11)参考文献: (12)附录:程序源代码 (12)1.需求分析问题描述设计、模拟一个全国城市间的交通咨询程序,为旅客提供三种最优咨询方案:(1)时间最短;(2)费用最小;(3)中转次数最少。

1.1基本要求1.1.1输入输出的形式和输入值的范围在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据。

1.1.2 输出形式程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。

1.1.3程序所能达到的功能程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达,显示编辑的全国交通系统。

1.1.4任务分配在本程序中,我们一共划分了三个模块。

管理员模块的初始化数据,城市信息的编辑,以及显示交通系统和整体的界面由李明月完成。

航班班次以及列车车次添加删除以及数据结构的初步实现由吕竹青完成。

C++数据结构-全国交通咨询模拟报告

数据结构课程设计报告班级:195182学号:20181003991姓名:钟欢日期:2019.12一、课程设计题目与要求1.课程设计题目:全国交通咨询模拟2.问题描述:出于不同目的的旅客对交通工具有不同的要求。

例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。

编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

3.基本要求:3.1提供对城市信息进行编辑(如添加或删除)的功能。

3.2城市之间有两种交通工具:火车和飞机。

提供对列车时刻表和飞机航班进行编辑(增加或删除)的功能。

3.3提供两种最优决策:最快到达或最省钱到达。

全程只考虑一种交通工具。

3.4旅途中耗费的总时间应该包括中转站的等候时间。

3.5咨询以用户和计算机的对话方式进行。

二、需求分析1.问题描述搭建一个全国交通咨询模拟系统,可以实现简单的人机互动从而达到咨询的效果。

需要完成的功能有,对城市、列车时刻表、航班时刻表进行编辑(手动/文件添加,删除),能够根据出发城市以及到达城市进行相关线路推荐(花费最少线路、耗时最短线路),其中整个线路的耗时总时长包括中转等待时间。

2.程序的功能:2.1维护功能:2.1.1航班操作2.1.2列车操作2.1.3更改密码2.2咨询功能2.2.1选择出行交通工具2.2.2选择要查询的信息:○1查询花费最小的路径○2查询耗时最短的路径2.2.3进行进一步的输入得到所需要的结果三、设计1.设计思想1.1数据结构设计1.1.1逻辑结构设计采用图结构来表示该全国交通网络,用一个结构体来表示时间,结构体内有标准化的(天,时,分)的相关表示以及操作,重载的运算符“-”。

全国交通网络中的城市用结点表示,两个城市之间的航线或者列车线用两个结点之间的边来表示。

城市结点中包含城市名字、城市编号、第一条航线/列车线以及航线/列车线的数目;边结点中包含到达城市名称,指向下一航线/列车线的指针,以及指向该边所指代航线/列车线信息的指针;航班线/列车线信息结点包含航班号/列车号,出发时间,到达时间,花费时间,花费金额。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、问题描述全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。

例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。

编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。

(2)城市之间有两种交通工具:火车和飞机。

提供对列车时刻表和 飞机航班进行编辑(增设或删除)的功能。

(3)提供两种最优决策:最快到达或最省钱到达。

全程只考虑一种 交通工具。

(4)旅途中耗费的总时间应该包括中转站的等候时间。

(5)咨询以用户和计算机的对话方式进行。

由用户输入起始站、终 点站、最优决策原则和交通工具,输出信息:最快需要多长时 间才能到达或者最少需要多少旅费才能到达,并详细说明依次 于何时乘坐哪一趟列车或哪一次班机到何地。

【测试数据】二、数据结构设计和核心算法设计描述:1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下:呼和浩特北京大连西宁 武汉南昌842 137 674 825 672 徐州397乌鲁木齐 哈尔滨 长春沈阳天津郑州 西安兰州 成都上海昆明 贵阳 株州 福州柳州广州 深圳南宁1892216 1145668 1100 967 639 907 349 676 511 242305704 651 622 367 409 255 607 675140 5342、逻辑结构拆分:3、核心设计:根据上面的流程图和逻辑拆分,对这个问题有了一个比较直观,详细地了解。

并且从中也可得知路线的添加即数据的存储是这个系统进行运作的一个基础。

而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这些数据进行了存储。

将每个信息量放在不同的文件中,可以更有效、直观地对这些数据进行处理。

流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是其他操作都是在路线添加好后进行的,并且为了每一项功能进行完后,系统可以交通工具 信息起止时间班次票价城市编号火车线路总数火车信息飞机信息路线信息飞机线路总数及时回到主交互界面,我采用的是无限循环形式,即while(1)。

以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。

三、主控及功能模块层次结构:1、模块说明:本系统分为个模块1、)主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:基本操作:TrafficNodeDat 交通工具信息Charname[MAX_STRING_NUM]班次Int starttime 出发时间Int starttime 到达时间Int cost 票价UNodeDat 路线信息Short int city 城市编号Int TrainNum 火车路线数int FlightNum 航班路线数TrafficNodeDatTrain[MAX_TRAFFIC_NUM]火车路线信息TrafficNodeDatFlight[MAX_TRAFFIC_航班路线信息NUM]函数变量声明:#include <stdio.h>#include <string.h>#define ERR 0#define OK 1#define Dij_MAXN 33#define MAX_VERTEX_NUM 31#define MAX_STRING_NUM 10#define MAX_TRAFFIC_NUM 10const 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 name[MAX_STRING_NUM]; //班次int StartTime,StopTime; //起止时间int EndCity; //该有向边指向的顶点在数组中的位置,即该城市编号int Cost; //票价} TrafficNodeDat;typedef struct VNode{CityType city;int TrainNum,FlightNum; //标记下面Train数组和Flight数组里元素个数TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; // int Cost; //遍历时到达该城市的耗费(时间或者费用)} VNodeDat;typedef struct PNode{int City;int TraNo;} PNodeDat;VNodeDat AdjList[MAX_VERTEX_NUM]; //System Infochar CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中的编号int CityNum; //城市数目PNodeDat Path[MAX_VERTEX_NUM]; //存储临时最小时间路径PNodeDat MinPath[MAX_VERTEX_NUM]; //存储搜索到当前的最小时间路径int MinTime,StartTime;int curPath;函数构成:int main(){char name[MAX_STRING_NUM];char s_city[MAX_STRING_NUM];char e_city[MAX_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: //添加城市InitSysData();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_city);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){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: //删除路线InitSysData();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("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&&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 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&&traveltype!=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****************************\n");printf("\nType In Your Command:");return 1;}(2)查找城市并返回城市序号:int SeekCity (char *name){int i;for (i=0;i<CityNum;i++){if (strcmp(name,CityName[i])==0)精品文库{return i;}}return -1;}(3)储存信息到文件:int SaveSysInfo(){FILE *fp;int i,j,total;fp=fopen(CityFile,"w");fprintf(fp,"%d\n",CityNum);for (i=0;i<CityNum;i++){fprintf(fp,"%s\n",CityName[i]);}fclose(fp);total=0;fp=fopen(TrainFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].TrainNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].TrainNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Train[j].name,CityName[i],CityName[AdjList[i].Train[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Train[j].StartTime/60,AdjList[i].Train[j].StartTime%60,AdjList[i].Train[j].StopTime/60,AdjList[i].Train[j].StopTime%60,精品文库AdjList[i].Train[j].Cost);}}fclose(fp);total=0;fp=fopen(FlightFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].FlightNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Flight[j].name,CityName[i],CityName[AdjList[i].Flight[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Flight[j].StartTime/60,AdjList[i].Flight[j].StartTime%60,AdjList[i].Flight[j].StopTime/60,AdjList[i].Flight[j].StopTime%60,AdjList[i].Flight[j].Cost);}}fclose(fp);return 1;}(4)添加城市:int InsertCity (char *Name){strcpy(CityName[CityNum],Name);AdjList[CityNum].city=CityNum;AdjList[CityNum].FlightNum=0;AdjList[CityNum].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(CityName[i],CityName[i+1]);AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;for (j=0;j<AdjList[i].FlightNum;j++){AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost; AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity;strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name);AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime;AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime;}}CityNum--;return 1;}(6)添加火车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost){int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime;AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime;strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);AdjList[i].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);AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime;AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime;strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight);AdjList[i].FlightNum++;return 1;}(8)删除路线:int DelPath (char *name){int i,j,flag=0;for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++)if (strcmp(AdjList[i].Flight[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].FlightNum-1;j++){AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity;strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name);AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime;AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime;}AdjList[i].FlightNum--;break;}for (j=0;j<AdjList[i].TrainNum;j++)if (strcmp(AdjList[i].Train[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].TrainNum-1;j++){AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime;AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime;}AdjList[i].TrainNum--;break;}}return 1;}(9)打印最小费用路线:void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN],int PreCity[Dij_MAXN],int p_end,int TravelType){int track[Dij_MAXN];int i=0,j,k,min,tmp,end,cost=0;int startH, startM, endH, endM;//定义四个变量:startH 出发的小时,startM 出发的分钟,endH 到达的小时,endM 到达的分钟j=p_end;track[i++]=j;while (PreCity[j]>=0){cost+=matx[PreCity[j]][j];track[i++]=j=PreCity[j];}printf("\nTrack Way:");if (!TravelType){for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].TrainNum;k++)if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost){min=AdjList[track[i]].Train[k].Cost;tmp=k;}printf("%s ",AdjList[track[i]].Train[tmp].name);startH = AdjList[track[i]].Train[tmp].StartTime/60 ;startM = AdjList[track[i]].Train[tmp].StartTime%60;endH = AdjList[track[i]].Train[tmp].StopTime/60 ;endM = AdjList[track[i]].Train[tmp].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("%d\n",endM);//printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Train[tmp].StartTime/60,AdjL ist[track[i]].Train[tmp].StartTime%60,AdjList[track[i]].Train[tmp].StopTime/60 ,AdjList[track[i]].Train[tmp].StopTime%60);}}else{for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].FlightNum;k++)//这句错了,AdjList[track[i]].Train[k].EndCity改为AdjList[track[i]].Flight[k].EndCity!/*if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Co st){ */if(AdjList[track[i]].Flight[k].EndCity==end&&min>AdjList[track[i]].Flight[k].C ost){min=AdjList[track[i]].Flight[k].Cost;tmp=k;}printf("%s",AdjList[track[i]].Flight[tmp].name);startH = AdjList[track[i]].Flight[tmp].StartTime / 60 ;startM = AdjList[track[i]].Flight[tmp].StartTime % 60;endH = AdjList[track[i]].Flight[tmp].StopTime / 60 ;endM = AdjList[track[i]].Flight[tmp].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("%d\n",endM);//printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Flight[tmp].StartTime / 60,AdjList[track[i]].Flight[tmp].StartTime % 60,AdjList[track[i]].Flight[tmp].StopTime / 60,AdjList[track[i]].Flight[tmp].StopTime % 60);}}printf("\n%s: DESTINATION!",CityName[track[0]]);printf("\nMin Cost : %d\n",cost);}(10)找出最小费用路线void Dijkstra(int matx[Dij_MAXN][Dij_MAXN],int p_start,int p_end,int TravelType){int PreCity[Dij_MAXN]; //PreCity[i]==-1,never used;//PreCity>0,the precity of City iint i,j,min,pre,pos;for (i=0;i<CityNum;i++){PreCity[i]=-1;}PreCity[p_start]=-2;while (PreCity[p_end]==-1){min=-1;for (i=0;i<CityNum;i++)if (PreCity[i]!=-1){for (j=0;j<CityNum;j++)if(PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min)){pre=i;pos=j;min=matx[i][j];}}PreCity[pos]=pre;}Dijkstra_Output(matx,PreCity,p_end,TravelType);}(11)初始化系统数据:int InitSysData (){FILE *fp;int i,j,hour,minute,num,cost;char stmp1[MAX_STRING_NUM];char stmp2[MAX_STRING_NUM];char stmp3[MAX_STRING_NUM];fp=fopen(CityFile,"r");if (!fp){printf("\nError:Cannot Open City File...\n");return -1;}fscanf(fp,"%d",&CityNum);for (i=0;i<CityNum;i++){fscanf(fp,"%s",&CityName[i]);AdjList[i].city=i;AdjList[i].TrainNum=0;AdjList[i].FlightNum=0;}fclose(fp);fp=fopen(TrainFile,"r");if (!fp){printf("\nError:Cannot Open Train File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3);strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute;fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute;fscanf(fp,"%d",&cost);AdjList[j].Train[AdjList[j].TrainNum].Cost=cost;AdjList[j].TrainNum++;}fclose(fp);fp=fopen(FlightFile,"r");if (!fp){printf("\nError:Cannot Open Flight File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3);strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute;fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute;fscanf(fp,"%d",&cost);AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost;AdjList[j].FlightNum++;}fclose(fp);return 1;}(12)找出最快路线:int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,int TravelType){int i;if (City==EndCity){if (MinTime>CurTime-StartTime){for (i=0;i<=curPathNo;i++){MinPath[i].City=Path[i].City;MinPath[i].TraNo=Path[i].TraNo;curPath=curPathNo;}MinTime=CurTime-StartTime;}}else{curPathNo++;Path[curPathNo].City=City;if (!TravelType){for (i=0;i<AdjList[City].TrainNum;i++){if((AdjList[City].Train[i].StartTime>=(CurTime%1440))&&(AdjList[City].Train[i].StopTime+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].S topTime+(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Train[i].StartTime<(CurTime%1440))&&(AdjList[City].Train[i] .StopTime+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].S topTime+(CurTime/1440+1)*1440,curPathNo,TravelType);}}}else{for (i=0;i<AdjList[City].FlightNum;i++){if((AdjList[City].Flight[i].StartTime>=CurTime)&&(AdjList[City].Flight[i].StopT ime+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i]. StopTime+(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Flight[i].StartTime<CurTime)&&(AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i]. StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType);}}}}return 1;}(13)计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType){int i;int startH, startM, endH, endM;//定义四个变量:startH 出发的小时,startM 出发的分钟,endH 到达的小时,endM 到达的分钟MinTime=32767;curPath=0;Path[0].City=StartCity;if (!TravelType){for (i=0;i<AdjList[StartCity].TrainNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Train[i].StartTime;SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity,AdjList[StartCity] .Train[i].StopTime,0,TravelType);}}else{for (i=0;i<AdjList[StartCity].FlightNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Flight[i].StartTime;SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity,AdjList[StartCity ].Flight[i].StopTime,0,TravelType);}}if (MinTime==32767){printf("\nNo access to that destination!");return 0;}// if (!TravelType)// StartTime=AdjList[StartCity].Train[MinPath[0].TraNo].StartTime;// else// StartTime=AdjList[StartCity].Flight[MinPath[0].TraNo].StartTime;printf("\nPath:\n");for (i=0;i<=curPath;i++){if (!TravelType)printf("%s : %s ",CityName[MinPath[i].City],AdjList[MinPath[i].City].Train[MinPath[i].TraNo ].name);elseprintf("%s : %s ",CityName[MinPath[i].City],AdjList[MinPath[i].City].Flight[MinPath[i].TraNo ].name);startH = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime / 60 ;startM = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime % 60 ;endH = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime / 60 ;endM = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].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("%d\n",endM);//printf(" %2S:%2S-%2S:%2S\n",startH);}printf("%s: DESTINATION!",CityName[EndCity]);printf("\nTime Cost: %2d hour - %2d minute",MinTime/60,MinTime%60);return 1;}精品文库(14)计算最小费用路线:int CalcMinCost (int StartCity,int EndCity,int TravelType){int ma[Dij_MAXN][Dij_MAXN];int i,j,min,end;for (i=0;i<CityNum;i++)for (j=0;j<CityNum;j++)ma[i][j]=-1;if (TravelType==0){for (i=0;i<CityNum;i++){min=32767;j=0;while (j<AdjList[i].TrainNum){min=32767;end=AdjList[i].Train[j].EndCity;while(end==AdjList[i].Train[j].EndCity&&j<AdjList[i].TrainNum){if (AdjList[i].Train[j].Cost<min){min=AdjList[i].Train[j].Cost;}j++;}ma[i][end]=min;}}}else{for (i=0;i<CityNum;i++){min=32767;j=0;精品文库while (j<AdjList[i].FlightNum){min=32767;end=AdjList[i].Flight[j].EndCity;while(end==AdjList[i].Flight[j].EndCity&&j<AdjList[i].FlightNum){if (AdjList[i].Flight[j].Cost<min){min=AdjList[i].Flight[j].Cost;}j++;}ma[i][end]=min;}}}Dijkstra(ma,StartCity,EndCity,TravelType);return 1;}五、功能模块间函数的调用关系,如下图所示:显示菜单:ShowMenu() 最短时间:InitSysData()SeekCity(name)CalcMinTime(startcity,endcity,traveltype)SaveSysInfo() 添加城市:InitSysData() InsertCity(Name) SaveSysInfo()SearchMinTime()DelCity():SeekCity(name)精品文库六、调试结果:1、主界面:删除城市:InitSysData()DelCity(Name)SaveSysInfo()删除路线:InitSysData()DelPath(name)SaveSysInfo()最小费用:InitSysData() SeekCity(name) SeekCity(name)Calcmincost(startci ty,endcity,traveltyp e)SaveSysInfo() 添加路线:InitSysData()InsertFlight(name,s_city,e_city,s_hour*60+s_ minute,e_hour*60+e_minute,cost)InsertFlight(name,s_city,e_city,s_hour*60+s_ minute,e_hour*60+e_minute,cost)SaveSysInfo()CalcMinCost():Dijkstra(ma,StertCity,EndCity,TravelType)Dijkstra():Dijkstra_OutPut(m atx,PreCity,p_end, TravelType) InsertTrain():SeekCity(StartCity)SeekCity(EndCity)InsertFlight():SeekCity(StartCity)SeekCity(EndCity)2、添加城市:输入命令1后,按提示输入城市名,而后返回主界面原city文件:添加城市后的city文件:3、删除城市:输入命令2后,按提示输入城市名,而后返回主界面4、添加路线:输入命令3后,按提示依次输入起始站、终点站、类型、起始时刻、到达时刻、票价等信息,而后返回主界面添加路线后的train文件:5、删除路线:输入命令4后,按提示输入,而后返回主界面删除路线后的train文件:城市、类型,而后返回主界面7、查找最小时间花费:输入命令6后,按提示输入城市名,而后返回主界面结果正确!8、退出:输入命令0后,退出系统七、课程设计小结:1、实验过程中的注意点1)遇到逻辑问题,然后设断点,调试跟踪看哪步出了问题.比如说全局变量和局部变量设置出现问题,导致运行过程各变量的取值不对。

相关文档
最新文档