数据结构课程设计全国交通咨询系统方案

合集下载

课程设计全国交通咨询模拟系统

课程设计全国交通咨询模拟系统

19级数据结构课程设计题目及要求一、课程设计目的《数据结构》是计算机专业一门重要的专业技术基础课程,是一门关键性核心课程。

《数据结构》课程的目标是使学生学会分析研究计算机加工对象的特性,选择合适的数据结构和存储表示,以及编制相应的实现算法,培养和提高学生程序设计的能力。

《数据结构》课程也是一门实践性较强的课程,设置实践环节是十分重要的。

本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。

题目八:全国交通咨询模拟系统【问题描述】出于不同目的的旅客对交通工具有不同的要求。

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

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

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

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

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

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

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

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

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

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

四、设计工作要求1、课程设计完成基本的功能要求本次课程设计可以从以下的题目中任选其一,每个题目基本实现的要求是:(1)有菜单功能(2)有读写数据存盘功能(3)有数据图形显示或动画显示。

2、课程设计完成成品要求(1)程序设计书(Word格式)●包括程序设计目标●问题描述●需求分析●概要设计●详细设计●源程序清单(要求格式整齐400行以上,要有注释说明)●软件说明书(给出软件如何使用,使用时的注意事项)●测试报告(每个函数的功能测试,输入条件,输出结果)●课程设计总结。

交通咨询系统设计方案数据结构课程设计方案任务书

交通咨询系统设计方案数据结构课程设计方案任务书

交通资讯系统1.系统需求分析1.1问题描述在交通网络非常发达的今天,人们出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也很感兴趣。

对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。

图中顶点表示城市,边表示城市之间的交通关系。

设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到达另外一个城市顶点之间的最短路径(里程)的问题。

1.2功能要求1.交通资讯系统提供用户三种决策方案:一是建立交通网络图的存储结构。

二是某个城市到达其余各城市的最短路径。

三是实现两个城市之间最短路径的问题。

主要目的是给用户提供路径咨询。

2.本系统规定:(1)在程序中输入城市名称时,需输入0到5的城市代号(2)在选择功能是,应输入与所选功能对应的一个整形数据。

(3)程序的输出信息主要是:城市代号,某城市到达其余各城市的最短路径,两城市之间最短路径2.概要设计2.1系统总体设计2.2各模块的功能void main() 主函数void Dijkstr()采用狄克斯特拉算法求从顶点v到其余个顶点的最短路径void DisPath()由path计算最短路径void Ppath()输出各条最短路径void Floyd()采用弗洛伊德算法求所有顶点之间的最短路径void DisPath2()由path计算最短路径void Ppath2()输出各条最短路径2.3相关数据结构设计1.数据结构typedef int InfoType。

typedef struct {char cityname。

int no。

InfoType info。

}VertexTypeo typedef struct {int edges[MAXV][MAXV]。

int n,e。

VertexType vxs[MAXV]。

}MGraph o2.数据库结构:下表构成该系统的基本数据库3,详细设计1.1采用c语言定义相关的数据结构本系统定义了整形int,字符型char,还有结构体定义,建立图的存储结构首先定义交通图的存储结构,邻接矩阵是表示图形中顶点之间相邻关系的矩阵.设 G=(V ,E)是具有n(n>0)个顶点的图,则邻接矩阵具有如下定义的n 阶方阵Wij 若 vi/vj 且<vi,vj>£E(G)A[i][j]= y8 其他一个图的邻接矩阵表示是唯一的,除了许用一个二维数组存储顶点之间相邻关系的 邻接矩阵外,通常还需要使用一个具有n 个元素的一维数组来存储顶点信息3.2函数调用关系图3.2.1主函数A[][MAXV] = {{INF,5,INF,7,INF,INF},{INF,INF,4,INF,INF,INF ), {8,INF,INF,INF,INF,9},{INF,INF,5,INF,INF,6},{INF,INF,INF,5,INF,INF}, {3,INF,INF,INF,1,INF}}。

数据结构课程设计报告--交通咨询系统

数据结构课程设计报告--交通咨询系统

数据结构设计报告姓名:专业:指导教师:目录摘要 (3)第1章概述 (4)1.1系统实现的目标 (4)1.2系统实现方案 (4)1.3系统实现环境 (4)1.4具体的开发方法 (4)第2章系统设计 (5)2.1系统功能设计 (5)2.2数据设计 (5)2.3界面的设计 (5)第3章系统实现 (9)参考文献 (15)摘要设计、实现一个全国大城市间的交通咨询程序,为旅客提供三种最优决策方案:一是建立交通网络图的存储结构,二实现两个城市间的最短路经问题。

程序所具有的功能特色本程序主要目的是为了给用户提供路径咨询。

实现了帮助用户了解全国各大城市间往来的最短路径问题,第二,可以提供用户查询各大城市的相关信息。

本程序最大的特点是支持用户自己添加城市信息及城市,或添加城市的路径,既就有可扩展性该程序所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。

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

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

(3)程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。

第1章概述1.1 系统实现的目标通过进行课程设计,了解并初步掌握设计、实现较大系统的完整过程,包括:系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。

应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。

大数据结构课程设计交通咨询系统设计

大数据结构课程设计交通咨询系统设计

设计题目<二>:交通咨询系统设计P160 一、设计要求 1 .问题描述根据不同目的的旅客对交通工具有不同的要求。

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

模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。

2.需求分析二、概要设计1.主界面设计(图“交通咨询系统”主菜单)2.存储结构设计本系统采用图结构类型存储抽象交通咨询系统的信息typedef struct TrafficNodetmp = k;}printf("%s", AdjList[track[i]].Train[tmp].name);pri ntf("%2d:%2d-%2d:%2d",AdjList[track[i]].Trai n[tmp].StartTime / 60,AdjList[track[i]].Train[tmp].StartTime % 60,AdjList[track[i]].Trai n[tmp].StopTime / 60,AdjList[track[i]].Trai n[tmp].StopTime % 60);else{for (i--; i>0; i--) um;[k++)ghar name[MAX_STRlNG_NUM];jajnN{printf("\n%s:", CityName[track[i]]);end = track[i - 1]; min = 32767;for (k = 0; k<AdjList[track[i]].FlightNum; k++)if (AdjList[track[i]].Train[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);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);}void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType){int PreCity[Dij_MAXN]; 添加城市在主菜单下,用户输入 1,添加城市名称(图添加城市)2.删除城市在主菜单下,用户输入2,删除已添加城市名称(图删除城市)3.添加交通路线在主菜单下,用户输入3,已添加城市名称。

(完整word版)数据结构课程设计-全国交通咨询系统

(完整word版)数据结构课程设计-全国交通咨询系统

X X 学院计算机系《数据结构》课程设计报告书全国交通咨询模拟系统的设计与实现学生姓名:学号:年级专业及班级:指导老师及职称:讲师专业:计算机科学与技术专业提交日期:2011年6月全国交通咨询模拟系统的设计与实现学生:指导老师:(怀化学院计算机系,怀化418008)摘要:该课程设计主要实现了对全国火车及飞机信息的修改和查询,其中主要包括:管理员对火车、飞机信息的操作,其中又包含对两种交通方式的增加和删除操作.旅客用户对两种交通信息的查询,其中飞机信息和火车信息都包含了对两个站点间最短路径方式的查询、最少花费方式的查询以及城市中所有的交通信息的查询.关键词:全国交通咨询;1前言为了完成数据结构的课程设计,为了巩固自己数据结构的知识,也是为了提高自己的编程能力和逻辑思维能力,我选了这道全国交通咨询模拟系统的设计与实现一题。

在对其需求进行分析之后,按照需求分析,逐步完成其各部分的功能实现.对于总的方面来讲,管理员功能实现并不难,而难点在于用户功能中的算法及数据结构中的知识以及编程的细微方面,下面将详细介绍本课程设计的内容.2需求分析2.1 范围2.1。

2 系统概述1.软件名称:全国交通咨询系统V1.02.软件功能:主要的功能有:管理员增删和修改城市站点信息、飞机路线信息、火车路线信息。

3.用户:查询最小耗费路线、查询最短时间路线、查询城市所有路线.4.开发者:2.1.3 文档概述需求分析采用在面向对象的方法,主要使用结构体struct的方法来进行实际的编程,在文档中主要采E—R图和对功能的简单描述的方法来表述系统的需求。

本需求分析的审查者是老师,所以主要是写给老师看的,用来说明我对这个系统的分析情况。

2.2 引用文件无2.3 需求概述2.3。

1 系统目标本系统的总体目标是通过使用该系统,管理员可以对飞机或者火车的信息的简单管理,也方便外出旅客在不同的需求下(如:最少的花费和最短的路程),快速浏览到所要的信息。

数据结构课程设计全国交通咨询系统

数据结构课程设计全国交通咨询系统

.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。

该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。

该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。

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

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

基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。

主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。

对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。

在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。

尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。

即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。

为此开发一个交通择优系统是十分必要的。

采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。

数据结构课程设计交通咨询系统设计

数据结构课程设计交通咨询系统设计

四、详细设计 1.数据类型定义
(1)全局变量的定义 typedef short int CityType;//CityType 定义短整形的变量 typedef struct TrafficNode { char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为
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++) if (AdjList[track[i]].Train[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); 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); } 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 i

数据结构课程设计全国交通咨询系统

数据结构课程设计全国交通咨询系统

数据结构课程设计全国交通咨询系统数据结构课程设计全国交通咨询系统随着交通工具的快速发展,现代人的出行方式更加灵活便捷,交通行业也变得越来越重要。

然而,随之而来的交通拥堵、安全问题和出行效率等问题亟待解决。

因此,交通咨询系统的开发应运而生。

本文介绍一个数据结构课程设计项目——全国交通咨询系统,该系统旨在为用户提供便捷、全面的交通出行信息和服务。

该系统主要包括以下方面的功能:1. 城市选择及路线查询功能用户可选择目的地城市,系统将返回该城市的基本信息,以及从用户当前位置到目的地的交通路线和方案,并提供相应的时间和费用信息。

2. 交通工具查询功能用户可在系统中查询各种交通工具的班次、价格、车次和到达时间等相关信息,以便用户做出最优出行方案。

3. 路况信息查询该系统可实时获取交通状况信息,并展示给用户最新的路况信息。

此外,当用户选择出行方式时,系统可根据实时路况为用户提供最佳出行方案。

4. 预订和购票该系统可为用户提供方便的预订和购票服务。

用户可在线预订和购买机票、火车票和长途汽车票等交通工具,并选择合适的座位和时间。

5. 旅游景点推荐功能该系统可根据用户的出行方案提供适宜的旅游景点推荐。

用户可在系统中了解这些景点的详细信息和交通时间,以便更好地规划自己的行程。

该全国交通咨询系统的实现需要多种数据结构的支持,例如图、树、堆栈、链表、哈希表等。

下面分别讨论每个功能的实现方法和相关数据结构。

1. 城市选择及路线查询功能城市选择及路线查询功能需要通过图的遍历来实现。

图是由顶点和边组成的集合,可以用来表示城市及它们之间的相互关系。

在本系统中,每个城市可以看做一个顶点,每条连接两个城市的路径被视为一条边。

为了实现城市选择及路线查询功能,需要对图进行遍历。

在这个系统中,广度优先搜索算法(BFS)是最佳选择,因为BFS可以给出最近的解决方案。

2. 交通工具查询功能交通工具查询功能需要通过树来实现。

树是由节点和边组成的集合,可以用来表示各种结构化数据。

数据结构--交通咨询系统

数据结构--交通咨询系统

数据结构--交通咨询系统数据结构--交通咨询系统一、引言交通咨询系统是为了方便用户获取交通相关信息而设计的一种软件系统。

本文档旨在说明交通咨询系统的设计和实现细节,包括系统的功能需求、系统架构、核心算法以及数据结构的选择等方面内容。

二、功能需求1、用户注册与登录功能a:用户可以通过注册功能创建账户;b:用户可以通过登录功能进行身份验证。

2、交通信息查询功能a:用户可以根据起点和终点查询交通路线;b:用户可以查询公交、地铁、火车、飞机等交通工具的时刻表;c:用户可以查询附近交通站点或机场、车站的详细信息。

3、交通信息推荐功能a:根据用户的历史查询记录和个人偏好,系统可以推荐适合的交通方案;b:根据用户的位置信息,系统可以推荐附近的交通站点或机场、车站。

4、系统设置功能a:用户可以选择系统界面的主题风格;b:用户可以设置提醒功能,以接收相关交通信息的通知。

三、系统架构1、前端设计a:用户界面设计:包括登录、注册、查询、推荐、设置等功能的界面设计;b:用户交互设计:实现用户与系统之间的信息交互。

2、后端实现a:数据库设计:设计用户、交通路线、交通工具、交通站点等相关数据表;b:服务器端设计:负责处理用户请求、数据存储和计算等任务;c:算法设计:设计合适的算法用于交通信息查询和推荐。

四、核心算法1、最短路径算法a:使用Dijkstra算法计算起点到终点的最短路径;b:考虑交通工具的运行时间、换乘时间等因素。

2、推荐算法a:使用协同过滤算法根据用户的历史查询记录和个人偏好进行交通方案推荐;b:使用基于位置的推荐算法根据用户的位置信息推荐附近的交通站点或机场、车站。

五、数据结构选择1、图结构a:使用图结构来表示交通路线和交通站点之间的关系;b:利用图的搜索算法来实现最短路径算法。

2、队列和栈a:使用队列和栈来处理用户的查询请求和系统的任务调度。

六、附件本文档涉及的附件包括系统的界面原型设计图、数据库设计文档、算法设计文档等。

全国交通咨询模拟(数据结构Java课程设计)

全国交通咨询模拟(数据结构Java课程设计)

一、课程设计概述:使用语言:java编译环境:java虚拟机二、课程设计题目一[实验内容]全国交通咨询模拟[问题描述]1、管理员可以添加、修改、删除各交通路线信息。

2、用户查询从某一地点到另一地点的信息,提供查询转车次数最少、花费最少、所用时间最少的相关信息。

[需求分析]1、管理员和用户拥有不同的操作界面。

管理员从键盘输入个交通路线并保存在trainInformation.txt中。

2、对文件trainInformation.txt中的数据进行处理,要求具有如下功能:①、城市信息进行编辑。

②、对列车时刻表进行编辑(增设或删除)的功能。

③、提供三种最优决策:最省钱到达,转车最少。

④、提供各列车详细信息。

3、界面美观[概要设计]class MoneyLeast{}//求出两站点花费最少的路径class TrainContral{}//从文件中读出列车的所有信息或者将列车的信息写入到文件class TrainGraph{}//列车航线交通图class AdmFrame{}//管理员登陆界面class SearchInFrame{}//用户查询信息和显示信息界面[存储结构]class City{//城市存储private String cityName;}class Train {//列车存储private String trainID;private City startCity;private City endCity;private Date startDate;private Date endDate;private int money;}[详细设计]---City----/*** 城市的对象* 城市有城市名* 实现序列化* 重写equals方法和toString方法*/package com.consel;import java.io.Serializable;//实现序列化的接口public class City implements Serializable {private static final long serialVersionUID = 5612649006026227701L;private String cityName;public City(String cityName) {this.cityName = cityName;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}@Overridepublic String toString() {return cityName;}@Overridepublic boolean equals(Object obj) {if (obj instanceof City) {City temp = (City) obj;if (this.cityName.equals(temp.cityName)) {return true;}}return false;}}----MoneyLeast-----/*** MoneyLeast 查找从花费最少的路径,及乘车路径* 使用的是普里姆算法*/package com.consel;public class MoneyLeast {final static int maxMoney = 10000;int n;int[] s;//s用来存储n个节点的标记int minMoney, u = 0;//t为列车信息图,c为起始城市,数组money是用来存储最少花费的路径,path是用来存储节点的上一节点public void leastMoney(TrainGraph t, City c, int[] money, City[] path) throws Exception {n = t.getNumOfVer();s = new int[n];for (int i = 0; i < n; i++) {money[i] = t.getMoney(c, t.city.get(i));s[i] = 0;if (money[i] < maxMoney) {path[i] = c;} else {path[i] = null;}}s[t.city.indexOf(c)] = 1;for (int i = 0; i < n; i++) {minMoney = maxMoney;for (int j = 0; j < n; j++) {if (s[j] == 0 && money[j] < minMoney) {u = j;minMoney = money[j];}}if (minMoney == maxMoney) {return;}s[u] = 1;City city = t.city.get(u);for (int j = 0; j < n; j++) {if (s[j] == 0 && t.getMoney(city, t.city.get(j)) < maxMoney &&money[u] + t.getMoney(city, t.city.get(j)) < money[j]) {money[j] = money[u] + t.getMoney(city, t.city.get(j));path[j] = city;}}}}}----MoneyTest-----package com.consel;import java.util.Iterator;import java.util.Stack;public class MoneyTest {MoneyLeast ml = new MoneyLeast();TrainGraph tg = new TrainGraph();int[] money;City[] path;public Stack<Train> st = new Stack<Train>();public MoneyTest() {int n = tg.city.size();money = new int[n];path = new City[n];for (int i = 0; i < n; i++) {money[i] = tg.maxMoney;path[i] = null;}}public Stack findMoneyLeast(City c1,City c2) throws Exception{ml.leastMoney(tg, c1,money, path);Stack<City> s = new Stack();s.add(c2);while (!c2.equals(c1)) {City c3 = path[tg.city.indexOf(c2)];s.add(c3);TrainContral ct = new TrainContral();ct.trainRead();Iterator<Train> i = ct.train.iterator();while(i.hasNext()){Train temp = i.next();if(temp.getStartCity().equals(c3) && temp.getEndCity().equals(c2)){st.add(temp);}}c2 = c3;}return s;}}----Train-----/*** Train 序列化,存储列车的信息,包括ID,起始站,终点站,发车时间,到站时间,价格*/package com.consel;import java.util.*;import java.io.Serializable;public class Train implements Serializable {private static final long serialVersionUID = 5612649006026227700L;private String trainID;//列车号private City startCity;//起始站private City endCity;//终点站private Date startDate;//发车时间private Date endDate;//到站时间private int money;//价格public Train(String trainID, City startCity, City endCity, Date startDate, Date endDate, int money) {this.trainID = trainID;this.startCity = startCity;this.endCity = endCity;this.startDate = startDate;this.endDate = endDate;this.money = money;/*** @return the trainID*/public String getTrainID() { return trainID;}/*** @return the money*/public int getMoney() {return money;}/*** @return the startCity*/public City getStartCity() { return startCity;}/*** @return the endCity*/public City getEndCity() { return endCity;}/*** @return the startDate */public Date getStartDate() { return startDate;}/*** @return the endDatepublic Date getEndDate() {return endDate;}}-----TrainContral------/*** TrainContral 从文件trainInformation.txt中读出各列车信息或将各列车信息写入到文件trainInformation.txt中*/package com.consel;import java.io.*;import java.util.*;public class TrainContral {File filename = new File("config/trainInformation.txt");ObjectInputStream ois;ObjectOutputStream oos;public List<Train> train = new ArrayList<Train>();/** 从trainInformation.txt读出所有列车的信息* 并存储于链表train中*/public void trainRead() {try {ois = new ObjectInputStream(new FileInputStream(filename));//文件输入流train = (List<Train>) ois.readObject();} catch (FileNotFoundException ex) {ex.printStackTrace();} catch (IOException ex) {ex.printStackTrace();} catch (ClassNotFoundException ex) {ex.printStackTrace();} finally {try {ois.close();// 关闭文件输入流} catch (Exception exx) {exx.printStackTrace();}}}/*** 将链表t中的所有火车信息写入到trainInformation.txt中* @param t*/public void trainWrite(List<Train> t) {try {oos = new ObjectOutputStream(new FileOutputStream(filename));// 文件输出流oos.writeObject(t);} catch (FileNotFoundException ex) {ex.printStackTrace();} catch (IOException ex) {ex.printStackTrace();} finally {try {oos.flush();//关闭文件缓冲流oos.close();//关闭文件流} catch (Exception exx) {exx.printStackTrace();}}}}------TrainGraph-------/*** TrainGraph 表示所有列车的信息* 查找以一个城市作为起点站,可以到达的另一个城市*/package com.consel;import java.util.*;public class TrainGraph {final static int maxMoney = 10000;List<City> city = new ArrayList<City>();TrainContral tc = new TrainContral();int[][] edges;public List<Train> train;Stack stack1 = new Stack();public Stack<City> stack = new Stack();/*临时保存路径节点的栈*/ public ArrayList<Stack> sers = new ArrayList();/*存储路径的集合*/public int getNumOfVer() {return city.size();}public TrainGraph() {//构造方法tc.trainRead();//从文件中读出所有列车的信息int n = tc.train.size();train = tc.train;Iterator it = train.iterator();/*** 存储交通路线中所有涉及到的城市*/while (it.hasNext()) {Train t = (Train) it.next();City c1 = t.getStartCity();City c2 = t.getEndCity();int x = city.indexOf(c1);int y = city.indexOf(c2);if (x < 0) {}if (y < 0) {city.add(c2);}}edges = new int[city.size()][city.size()];for (int i = 0; i < city.size(); i++) {for (int j = 0; j < city.size(); j++) {edges[i][j] = 0;}}it = tc.train.iterator();while (it.hasNext()) {Train t = (Train) it.next();City c1 = t.getStartCity();City c2 = t.getEndCity();int x = city.indexOf(c1);int y = city.indexOf(c2);edges[x][y] = 1;}}//以c为起始站的第一个终点站public int getFirstNeighbor(City c) throws Exception { int n = city.indexOf(c);if (n >= 0) {return getFirstNeighbor(n);}return - 1;}//查找邻接的城市private int getFirstNeighbor(int v) throws Exception { if (v < 0 || v > city.size()) {throw new Exception("参数错误!");}for (int col = 0; col < city.size(); col++) {if (edges[v][col] > 0) {}}return -1;}//查找下一个邻接城市public int getNextNeighbor(City c1, City c2) throws Exception { int m = city.indexOf(c1);int n = city.indexOf(c2);if (m >= 0 && n >= 0) {return getNextNeighbor(m, n);}return -1;}//查找下一个邻接城市private int getNextNeighbor(int v1, int v2) throws Exception { if (v1 < 0 || v1 > city.size() || v2 < 0 || v2 > city.size()) {throw new Exception("参数错误!");}for (int col = v2 + 1; col < city.size(); col++) {if (edges[v1][col] > 0) {return col;}}return -1;}//返回从c1到c2直达所花费的钱public int getMoney(City c1, City c2) throws Exception { int m = city.indexOf(c1);int n = city.indexOf(c2);if (m < 0 || n < 0) {throw new Exception("城市C1或C2错误!");} else {Iterator<Train> i = train.iterator();boolean flag = false;while (i.hasNext()) {temp = i.next();if (temp.getStartCity().equals(c1) && temp.getEndCity().equals(c2)) { flag = true;break;}}if (flag) {return temp.getMoney();} else {return maxMoney;}}}private boolean isCityInStack(City city) {//判断节点是否在栈中Iterator<City> it = stack.iterator();while (it.hasNext()) {City node1 = it.next();if (city.equals(node1)) {return true;}}return false;}// 存储一条通路private void savePath() {Stack<City> temp = new Stack();Iterator<City> i = stack.iterator();while (i.hasNext()) {City c = i.next();temp.add(c);}sers.add(temp); /*转储*/}// 查找从startCity到endCity的所有路径public void getPaths(City startCity, City endCity) throws Exception {stack.push(startCity);int n = getFirstNeighbor(startCity);if (n >= 0) {City c = city.get(n);getPaths(startCity, endCity, c, startCity);while (c != null) {n = getNextNeighbor(startCity, c);if (n > 0) {c = city.get(n);getPaths(startCity, endCity, c, startCity);} else {c = null;}}}}// 用递归的方法求startCity到endCity的路径currentCity是当前的城市,perCity是currentCity的上一个城市private boolean getPaths(City startCity, City endCity, City currentCity, City perCity) throws Exception {City nCity = null;if (currentCity != null && perCity != null && currentCity.equals(perCity)) { return false;}if (currentCity != null) {stack.push(currentCity);if (currentCity.equals(endCity)) {savePath();stack.pop();return true;} else {int n = getFirstNeighbor(currentCity);if (n >= 0) {nCity = city.get(n);} else {nCity = null;}while (nCity != null) {if (perCity != null && (nCity.equals(startCity) || perCity.equals(nCity) || isCityInStack(nCity))) {n = getNextNeighbor(currentCity, nCity);if (n >= 0) {nCity = city.get(n);} else {nCity = null;}continue;}if (getPaths(startCity, endCity, nCity, currentCity)) {if (!stack.isEmpty()) {stack.pop();}}n = getNextNeighbor(currentCity, nCity);if (n >= 0) {nCity = city.get(n);} else {nCity = null;}}if (!stack.isEmpty()) {stack.pop();}return false;}} else {return false;}}}-----AdmFrame-------/** 管理员登陆界面* 用户名为:Adm* 口令为:123456*/package com.desgin;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class AdmFrame {ImageIcon img = new ImageIcon("config/Adm.gif");JLabel background = new JLabel(img);JFrame admFrame = new JFrame();JLabel user = new JLabel("用户名:");JTextField userInput = new JTextField(20);JLabel passWord = new JLabel("口令:");JPasswordField passWordIn = new JPasswordField(20);JPanel panel = new JPanel();JButton login = new JButton("登陆");JButton exit = new JButton("退出");public AdmFrame() {admFrame.setLayout(null);admFrame.setTitle("Administrator");admFrame.setSize(img.getIconWidth(), img.getIconHeight() + 20);admFrame.setLocationRelativeTo(null);admFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);panel.setLayout(new GridLayout(2, 2, 20, 20));panel.add(user);user.setHorizontalAlignment(JTextField.RIGHT);passWord.setHorizontalAlignment(JTextField.RIGHT);panel.add(userInput);panel.add(passWord);panel.add(passWordIn);panel.setBounds(40, 50, 250, 60);JPanel tempPanel = new JPanel();tempPanel.add(login);tempPanel.add(exit);tempPanel.setBounds(130, 130, 200, 40);admFrame.add(panel);admFrame.add(tempPanel);admFrame.add(background);background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());admFrame.setVisible(true);admFrame.setResizable(false);exit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}});login.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (userInput.getText().trim().equals("") || passWordIn.getText().trim().equals("")) {JOptionPane.showMessageDialog(null, "请输入用户名或口令!","Warning", JOptionPane.WARNING_MESSAGE);} else if (userInput.getText().equals("Adm") && passWordIn.getText().equals("123456")) {admFrame.dispose();AdmMainWindow amw = new AdmMainWindow();amw.setVisible(true);} else {JOptionPane.showMessageDialog(null, "用户名或口令错误,请重新输入!","用户名或口令错误", JOptionPane.ERROR_MESSAGE);}}});}public static void main(String[] args) {AdmFrame af = new AdmFrame();}}-----AdmMFListener-------/** 管理员登陆后的界面监听器* 对添加、修改、删除作出相应的变化*/package com.desgin;import com.consel.*;import com.consel.TrainContral;import java.awt.event.*;import java.util.*;import javax.swing.JOptionPane;public class AdmMFListener extends MouseAdapter {AdmMainWindow amw;public AdmMFListener(AdmMainWindow amw) {this.amw = amw;}/** 鼠标点击事件监听*/@Overridepublic void mouseClicked(MouseEvent e) {if (e.getSource() == amw.add) {ChangeDialog cd = new ChangeDialog(amw, "添加", true);cd.setVisible(true);}if (e.getSource() == amw.change) {int selectedRow = amw.table.getSelectedRow();if (selectedRow > -1) {ChangeDialog cd = new ChangeDialog(amw, "添加", true,(String) amw.table.getValueAt(selectedRow, 0));cd.setVisible(true);} else {JOptionPane.showMessageDialog(null, "请选中要修改对象","Warnnig", JOptionPane.WARNING_MESSAGE);}}if (e.getSource() == amw.exit) {amw.dispose();}if (e.getSource() == amw.delete) {int selectedRow = amw.table.getSelectedRow();if (selectedRow > -1) {TrainContral tc = new TrainContral();tc.trainRead();Iterator<Train> i = tc.train.iterator();while (i.hasNext()) {Train temp = i.next();if (temp.getTrainID().equals(amw.table.getValueAt(selectedRow, 0))) {i.remove();tc.trainWrite(tc.train);break;}}amw.table.setModel(new AdmTable());} else {JOptionPane.showMessageDialog(null, "请选中要删除对象","Warnnig", JOptionPane.WARNING_MESSAGE);}}}}------AdmMainWindow-------/*** 管理员管理列车信息的主界面* 显示所有列车的相关信息*/package com.desgin;import javax.swing.*;public class AdmMainWindow extends JFrame {JTable table;JScrollPane jsp;AdmTable model = new AdmTable();JButton change = new JButton("修改");JButton add = new JButton("添加");JButton delete = new JButton("删除");JButton exit = new JButton("退出");AdmMFListener amfl;public AdmMainWindow() {this.setTitle("Administrator");this.setSize(400, 300);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);amfl = new AdmMFListener(this);table = new JTable(model);jsp = new JScrollPane(table);JPanel panel = new JPanel();panel.add(add);add.addMouseListener(amfl);panel.add(change);change.addMouseListener(amfl);panel.add(delete);delete.addMouseListener(amfl);panel.add(exit);exit.addMouseListener(amfl);this.add(jsp, "Center");this.add(new JLabel(" "), "North");this.add(panel, "South");}}-----AdmTable------/** Table的一个模式* 从文件中读取列车的信息,添加到table中* 显示在主界面中*/package com.desgin;import com.consel.*;import java.text.SimpleDateFormat;import java.util.*;import javax.swing.table.*;public class AdmTable extends AbstractTableModel {TrainContral tc = new TrainContral();Vector rowData, columnNames;List<Train> train;SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");public AdmTable() {tc.trainRead();train = tc.train;init(train);}private void init(List<Train> train) {columnNames = new Vector();columnNames.add("列车号");columnNames.add("出发地");columnNames.add("到达地");columnNames.add("发车时间");columnNames.add("到站时间");columnNames.add("票价");rowData = new Vector();boolean flag = true;Iterator i = train.iterator();while (i.hasNext()) {Train c = (Train) i.next();Vector hang = new Vector();hang.add(c.getTrainID());hang.add(c.getStartCity());hang.add(c.getEndCity());hang.add(formatter.format(c.getStartDate()));hang.add(formatter.format(c.getEndDate()));hang.add(c.getMoney() + "元");rowData.add(hang);}}// 返回行数public int getRowCount() {return this.rowData.size();}//返回列数public int getColumnCount() {return this.columnNames.size();}//返回rowIndex,column处的值public Object getValueAt(int rowIndex, int column) { return ((Vector) this.rowData.get(rowIndex)).get(column); }//返回表头@Overridepublic String getColumnName(int arg0) {return (String) this.columnNames.get(arg0);}}----ChangeDialog-----/** 管理员修改或者添加航线的信息的UI界面*/package com.desgin;import com.consel.*;import java.awt.*;import java.awt.event.*;import java.util.*;import java.util.Iterator;import javax.swing.*;public class ChangeDialog extends JDialog implements ActionListener {JTextField t1 = new JTextField(15);JTextField t2 = new JTextField(15);JTextField t3 = new JTextField(15);JTextField t41 = new JTextField(5);JTextField t42 = new JTextField(5);JTextField t51 = new JTextField(5);JTextField t52 = new JTextField(5);JTextField t6 = new JTextField(15);AdmMainWindow amw;JButton save = new JButton("保存");JButton exit = new JButton("取消");//添加时的构造方法public ChangeDialog(AdmMainWindow amw, String s, boolean b) { super(amw, s, b);this.amw = amw;this.setSize(300, 275);this.setResizable(false);JPanel p1 = new JPanel();p1.setLayout(new GridLayout(7, 1, 8, 8));p1.add(new JLabel("列车号: ", SwingConstants.CENTER));p1.add(t1);p1.add(new JLabel("出发地: ", SwingConstants.CENTER));p1.add(t2);p1.add(new JLabel("到达地: ", SwingConstants.CENTER));p1.add(t3);p1.add(new JLabel("发车时间: ", SwingConstants.CENTER));JPanel panel1 = new JPanel();panel1.add(t41);panel1.add(new JLabel(":"));panel1.add(t42);p1.add(panel1);p1.add(new JLabel("到站时间: ", SwingConstants.CENTER));JPanel panel2 = new JPanel();panel2.add(t51);panel2.add(new JLabel(":"));panel2.add(t52);p1.add(panel2);p1.add(new JLabel("票价: ", SwingConstants.CENTER));p1.add(t6);p1.add(new JLabel("", SwingConstants.CENTER));JPanel pane2 = new JPanel();pane2.add(save);pane2.add(exit);p1.add(pane2);this.add(p1);save.addActionListener(this);exit.addActionListener(this);}//修改时的构造方法public ChangeDialog(AdmMainWindow amw, String s, boolean b, String x) { super(amw, s, b);this.amw = amw;this.setSize(300, 275);this.setResizable(false);JPanel p1 = new JPanel();p1.setLayout(new GridLayout(7, 1, 8, 8));TrainContral tc = new TrainContral();tc.trainRead();Iterator<Train> i = tc.train.iterator();Train temp = null;while (i.hasNext()) {temp = i.next();if (temp.getTrainID().equals(x)) {break;}}p1.add(new JLabel("列车号: ", SwingConstants.CENTER)); p1.add(t1);p1.add(new JLabel("出发地: ", SwingConstants.CENTER)); p1.add(t2);p1.add(new JLabel("到达地: ", SwingConstants.CENTER)); p1.add(t3);p1.add(new JLabel("发车时间: ", SwingConstants.CENTER)); JPanel panel1 = new JPanel();panel1.add(t41);panel1.add(new JLabel(":"));panel1.add(t42);p1.add(panel1);p1.add(new JLabel("到站时间: ", SwingConstants.CENTER)); JPanel panel2 = new JPanel();panel2.add(t51);panel2.add(new JLabel(":"));panel2.add(t52);p1.add(panel2);p1.add(new JLabel("票价: ", SwingConstants.CENTER));p1.add(t6);p1.add(new JLabel("", SwingConstants.CENTER));JPanel pane2 = new JPanel();pane2.add(save);pane2.add(exit);p1.add(pane2);this.add(p1);save.addActionListener(this);exit.addActionListener(this);t1.setText(temp.getTrainID());t2.setText(temp.getStartCity().toString());t3.setText(temp.getEndCity().toString());t41.setText(temp.getStartDate().getHours() + "");t42.setText(temp.getStartDate().getMinutes() + "");t51.setText(temp.getEndDate().getHours() + "");t52.setText(temp.getEndDate().getMinutes() + "");t6.setText(temp.getMoney() + "");}//监听器,对保存、退出按钮进行监听public void actionPerformed(ActionEvent e) {if (e.getSource() == exit) {this.dispose();}if (e.getSource() == save) {TrainContral tc = new TrainContral();tc.trainRead();Date d1 = new Date();d1.setHours(Integer.parseInt(t41.getText().trim()));d1.setHours(Integer.parseInt(t42.getText().trim()));Date d2 = new Date();d2.setHours(Integer.parseInt(t51.getText().trim()));d2.setHours(Integer.parseInt(t52.getText().trim()));Train t = new Train(t1.getText().trim(),new City(t2.getText().trim()),new City(t3.getText().trim()),d1,d2,Integer.parseInt(t6.getText().trim()));Iterator<Train> i = tc.train.iterator();while(i.hasNext()){Train temp = i.next();if(t.getStartCity().equals(temp.getStartCity()) && t.getEndCity().equals(temp.getEndCity())){i.remove();}}tc.train.add(t);tc.trainWrite(tc.train);this.dispose();amw.table.setModel(new AdmTable());}}}-----MainWindow----/** 用户界面测试*/package com.desgin;public class MainWindow {UserFrame uf = new UserFrame();public static void main(String[] args) {MainWindow m = new MainWindow();m.uf.jf.setVisible(true);}}-----MoreDialog-------/** 显示详细信息*/package com.desgin;import com.consel.*;import java.awt.Color;import java.awt.event.*;import java.text.SimpleDateFormat;import java.util.*;import javax.swing.*;public class MoreDialog extends JDialog {SearchInFrame sif;JButton back = new JButton("返回");TrainGraph tg = new TrainGraph();JTable table;Vector colName = new Vector();Vector rowData = new Vector();SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");JButton exit = new JButton("退出");public MoreDialog(SearchInFrame sif, String string, boolean b) { super(sif.mainFrame, string, b);this.sif = sif;this.setSize(300, 275);this.setLocationRelativeTo(null);//设置窗口居中int rowCount = sif.infTable.getSelectedRow();String str = (String) sif.infTable.getValueAt(rowCount, 1);colName.add("列车号");colName.add("起始站");colName.add("终点站");colName.add("发车时间");colName.add("到站时间");colName.add("票价");try {TrainGraph tg = new TrainGraph();tg.getPaths(new City(sif.start), new City(sif.end));Iterator<Stack> iter = tg.sers.iterator();Stack<City> temp = new Stack();while (iter.hasNext()) {if (!temp.isEmpty()) {temp.removeAllElements();}Stack stack = iter.next();Vector hang = new Vector();String s = "";while (!stack.isEmpty()) {City c = (City) stack.pop();if (!(c.getCityName().equals(sif.start) || c.getCityName().equals(sif.end))) {s = c.getCityName() + " " + s;}temp.push(c);}if (s.equals("")) {s += "无";}if (s.equals(str)) {break;}}City eCity = null;City sCity = null;if (!temp.isEmpty()) {sCity = temp.pop();}while (!temp.isEmpty()) {eCity = temp.pop();Iterator<Train> i = tg.train.iterator();while (i.hasNext()) {Train t = i.next();if (t.getStartCity().equals(sCity) && t.getEndCity().equals(eCity)) {Vector hang = new Vector();hang.add(t.getTrainID());hang.add(t.getStartCity());hang.add(t.getEndCity());hang.add(formatter.format(t.getStartDate()));hang.add(formatter.format(t.getEndDate()));hang.add(t.getMoney() + "元");rowData.add(hang);}}sCity = eCity;}} catch (Exception ex) {ex.printStackTrace();}table = new JTable(rowData, colName);JScrollPane jsp = new JScrollPane(table);this.add(jsp);exit.setBackground(Color.lightGray);exit.setBounds(0, 0, 10, 10);exit.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {System.exit(0);}});this.add(exit, "South");table.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {int selectedRow = table.getSelectedRow();if (selectedRow > 0) {table.setSelectionForeground(Color.RED);}}});}}------MyMonitor-----/** 用户界面的监听器* 查询、退出的相关操作*/package com.desgin;import java.awt.event.*;import javax.swing.JOptionPane;public class MyMonitor extends MouseAdapter {UserFrame uf;public MyMonitor(UserFrame uf) {super();this.uf = uf;}@Overridepublic void mousePressed(MouseEvent e) {if (e.getSource() == uf.exit) {System.exit(0);}if (e.getSource() == uf.search) {if (uf.start.getText().trim().equals("") || uf.end.getText().trim().equals("")) { JOptionPane.showMessageDialog(null, "请正确输入起始站和终点站!","Warnnig", JOptionPane.WARNING_MESSAGE);} else {uf.sif = new SearchInFrame(uf.start.getText().trim(),uf.end.getText().trim());uf.sif.mainFrame.setVisible(true);uf.jf.dispose();}}}}----MyTable-----/** 用户界面显示在table中的列车信息的模板*/package com.desgin;import com.consel.*;import java.util.*;import javax.swing.table.*;public class MyTable extends AbstractTableModel {TrainContral tc = new TrainContral();Vector rowData, columnNames;String startCity, endCity;SearchInFrame sf;int n;List<Train> train;//构造方法public MyTable(String startCity, String endCity, SearchInFrame sf, int n) { this.sf = sf;this.startCity = startCity;this.endCity = endCity;tc.trainRead();train = tc.train;this.n = n;init(train);}public void init(List<Train> train) {columnNames = new Vector();columnNames.add("出发地");columnNames.add("中转站");columnNames.add("到达地");。

(完整word版)数据结构课程设计_____全国交通咨询系统

(完整word版)数据结构课程设计_____全国交通咨询系统

数据结构课程设计设计题目:全国交通网络咨询系统陈敏 指导教师:太原 学院级: 计算机科学与技术 号: 132054103 名:刘海静四、五、六、七、八、课程设计题目需求分析测试数据概要设计调用关系图程序代码测试结果心得体会及总结目录1414全国交通网络咨询系统、课程设计题目数据结构课程设计二、需求分析1、实现功能对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能; 对城市间的交通工具:火车。

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

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

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

2、设计思路(1)数据存储。

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

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

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

(3)数据的存储结构。

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

这里建议采用邻接 删除功能可用菜单方 但要注意人机界面, (4)用不同的功能模块对城市信息和交通信息进行 编辑。

添加、修改、 式或命令提示方式。

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

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

(5)最优决策功能模块①读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对 方城市到达该元素所代表城市的所有信息; 所代表的城市有交通联系的城市(代码、 表头数组中的元素所对应的单链表存放与该元素 里程、列车车次)。

全国交通咨询模拟数据结构课程设计

全国交通咨询模拟数据结构课程设计

数据结构课程设计报告题目:全国交通咨询模拟一.需求分析1.程序设计任务:从中国地图平面图中选取部分城市,抽象为程序所需要图(de)结点,并以城市间(de)列车路线和飞机路线,作为图结点中(de)弧信息,设计一个全国交通咨询模拟系统.利用该系统实现两种最优决策:最快到达或最省钱到达.2. 明确规定:(1)输入形式和输入值(de)范围:每条飞机弧或者火车弧涉及(de)信息量很多,包括:起始城市、目(de)城市、出发时间、到达时间、班次以及费用.作为管理员要输入(de)信息包括以上信息,而作为用户或者客户,要输入(de)信息有起始城市和目(de)城市,并选择何种最优决策.(2)输出形式:按用户提供(de)最优决策(de)不同而输出不同(de)信息,其中输出(de)所搭飞机或火车(de)班次及其起始地点和终点、起始时间和出发时间还有相关(de)最优信息,比如最快经多少时间到达、最省钱多少钱到达和最少经多少中转站到达.(3)程序所能达到(de)功能a.该系统有供用户选择(de)菜单和交互性.可以对城市、列车车次和飞机航班进行编辑,添加或删除.b.建立一个全国交通咨询系统,该系统具备自动查找任意两城市间铁路、飞机交通(de)最短路径和最少花费及中转次数最少等功能.c.初始化交通系统有两种方式,键盘和文档.二.设计概要1.算法设计(1)、总体设计(1) 数据存储:城市信息(城市名、代码)、交通信息(城市间(de)里程、各航班和列车时刻)存储于磁盘文件.建议把城市信息存于文件前面,交通信息存于文件(de)后面,用fread和fwrite函数操作.(2) 数据(de)逻辑结构:根据设计任务(de)描述,其城市之间(de)旅游交通问题是典型(de)图结构,可看作为有向图,图(de)顶点是城市,边是城市之间所耗费(de)时间(要包括中转站(de)等候时间)或旅费.(3) 数据(de)存储结构:采用邻接表和邻接矩阵都可作为数据(de)存储结构,但当邻接边不多时,宜采用邻接表,以提高空间(de)存储效率.这里采用邻接表作为数据(de)存储结构.(4) 用不同(de)功能模块对城市信息和交通信息进行编辑.添加、修改、删除功能可用菜单方式或命令提示方式.只要能方便(de)对城市信息和交通信息进行管理即可,但要注意人机界面.(5) 最优决策功能模块(fast or province).①读入城市信息和交通信息,用邻接表生成含权网络,表头数组中(de)元素存放城市名及对方城市到达该元素所代表城市(de)所有信息;表头数组中(de)元素所对应(de)单链表存放与该元素所代表(de)城市有交通联系(de)城市(代码、里程、航班、列车车次).②根据具体最优决策(de)要求,用Dijkstra算法求出出发城市到其它各城市(de)最优值(最短时间或最小(de)费用),搜索过程中所经过城市(de)局部最优信息都保存在邻接表(de)表头数组中.其目(de)城市所代表(de)元素中就保存了所需(de)最优决策结果.这过程中,要用队列或栈保存局部最优决策值(局部最短(de)时间或最省(de)费用)变小(de)城市,其相应(de)初始值可为∞,并在表头数组对应(de)城市元素中保存响应(de)信息.开始时,栈(队列)中只有出发地城市,随着对栈(队列)顶(首)城市有交通联系(de)城市求得决策值(最短时间或最小(de)费用),若该值是局部最优值且该城市不在栈(队列)中,则进栈(队列),直至栈(队列)为空,本题采用队列实现.③输出结果:从目(de)城市出发,搜索到出发城市,所经过(de)城市均入栈(队列),再逐一出栈栈(队列)中(de)城市,输出保存在表头数组中对应城市(de)信息(对方城市(de)出发信息,里程、时间、费用等)及最终结果.即输出依次于何时何地乘坐几点(de)飞机或火车于何时到达何地;最终所需(de)最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间.(6) 主程序可以有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作.(2).详细设计思想:本题所要求(de)交通系统是一个有向带权图结构,考虑到要求该系统有动态增加飞机和列车航班(de)功能,因而采用邻接表(de)形式存储:对每个顶点建立一个单链表,单链表中(de)子结点表示以该顶点连接(de)弧,单链表中子结点(de)顺序可以按权值递增(de)顺序排列,表头结点按顺序存储.题目中提到要提供三种策略,最快到达,最省钱到达和最少中转次数策略,前两种策略采用迪杰斯特拉算法思想,其中最快到达(de)权值为到达两城市所需(de)最短时间,最省钱到达(de)权值为到达两城市所需(de)费用,后一种采用广度优先算法(de)思想,只需求(de)两城市所在(de)层数,就可以求(de)到达两城市所需(de)最少中转次数.迪杰斯特拉(Dijkstra)算法(de)基本思想是:设置两个顶点(de)集合S和T=V-S,集合S中存放已找到最短路径(de)顶点,集合T存放当前还未找到最短路径(de)顶点.初始状态时,集合S中只包含源点v0,然后不断从集合T中选取到顶点v0路径长度最短(de)顶点u加入到集合S中,集合S 每加入一个新(de)顶点u,都要修改顶点v0到集合T中剩余顶点(de)最短路径长度值,集合T中各顶点新(de)最短路径长度值为原来(de)最短路径长度值与顶点u(de)最短路径长度值加上u到该顶点(de)路径长度值中(de)较小值.此过程不断重复,直到集合T(de)顶点全部加入到S中为止.下面讨论基于邻接表(de)存储结构求两点间最短路径(de)方法:根据迪杰斯特拉(Dijkstra)算法所依据(de)原理:若按长度递增(de)次序生成从源点V0到其它顶点(de)最短路径,则当前正在生成(de)最短路径上除终点以外,其余顶点(de)最短路径均已生成(将源点(de)最短路径看作是已生成(de)源点到其自身(de)长度为0(de)路径).按照这一思想,构造以下算法:设S=S’=U={},建立数组PATH[n],用来存储V0到各终点(de)最短路径,初值均置为空集.建立数组BOOL F[n],F[i]表示序号为i(de)表头结点(de)单链表中所有子结点已或未全部找到,初值置为FALSE.建立数组float dist[n],dist[i]表示序号为i(de)表头结点到V0(de)最短权值(这里是时间或费用),显然dist[V0]=0,其他顶点(de)dist初值置为∞.建立数组BOOL IS[n],IS[i]表示序号为i(de)顶点是否在S 中,初值均置为FALSE.(1)VX=V0;最短(de)最短路径为PATH[0]=[V0] (2)S=S+VX ;(集合(de)并计算) IS[VX]=TRUE ; S ’=S ’+VX ;(3)对S ’中(de)所有顶点: {do{ 由邻接表中该表头结点开始依次找单链表(de)下一子结点(沿链域指针依次访问);While (“命令” = “退出”){接受命令(用户输入要实现功能); 进入各个处理命令函数;} }2. 函数和过程(de)调用关系图四.调试分析:⑴调试过程中遇到(de)问题是如何解决(de)以及对设计与实现(de)回顾讨论和分析:在调试(de)过程中碰到了一下问题:a. 引用形参应用不当;b. 文件操作中遇到读入错误或找不到文件;解决方案:a. 对引用形参了解(de)不是很透彻,导致错误,通过查阅相关书籍如C++ Primer 和请教编程能力较高(de)人,最终解决问题.b. 通过参考谭浩强编着(de)C程序设计中(de)文件操作,文件格式和相关文件路径(de)设置,最终解决问题.⑵算法(de)时空分析(包括基本操作和其他算法(de)时间复杂度和空间复杂度(de)分析)和改进设想:⑶经验和体会:通过本次课程设计,我学到了一种程序设计方法,就是结构化程序设计方法,在程序设计过程中,我尝试按如下方法进行结构化程序设计:(1)自顶向下;(2)逐步细化;(3)模块化设计(4)结构化编码.这种设计方法(de)过程是将问题求解由抽象逐步具体化(de)过程,而且,用这种方法便于验证算法(de)正确性.本次课程设计所使用(de)是较为复杂(de)抽象数据类型——图,而且在弧(de)基础上增加了许多信息,如添加了时间,费用等等,这无疑给编程加大了难度,同时也是相当(de)具有挑战性.在编程(de)过程中,我用到了全局数组,我将数组放在工程(de)头文件里面,编译(de)时候报错,说是多重定义.最终放弃了创建工程,而选择了单个文件进行编译和运行,结果顺利通过.同时,在文件操作方面我也曾遇到问题,就是在程序对文件进行读取(de)时候报错,无法读取文件,最后查询有关C(de)工具书,原来是文件路径问题,借助工具书最终解决了文件操作方面(de)问题.总之,这次课程设计是对这一个学期以来对数据结构学习成果(de)一个验证,同时也是理论与实践很好(de)结合,既对学过(de)数据结构进行了巩固,也对我(de)编程能力奠定了坚实(de)基础.五.用户使用说明:1)打开并运行程序,按任意键进入操作主界面,按提示进行相关操作;2)按“1”进入管理员界面,按“2”进入用户咨询界面,按“3”显示交通系统,按“4”则退出.3)进入管理员界面可键入“1”初始化交通系统,并选择文档初始化方式(如果是第一次使用该系统建议使用文档初始化交通系统,免得自己进行繁冗(de)初始化操作).其余可按提示进行相关操作,不难掌握.4)进入用户咨询界面,可根据用户需要进行相关(de)选择,或是选择“1”(最少旅行费用);或是选择“2”(最少旅行时间),又或者是选择“3”(最少旅行中转次数)等.5)进入显示交通系统界面,根据用户选择则可显示城市、飞机航班、列车车次等信息.或者返回上一级菜单.六.附录——源程序define MAX_VERTEX_NUM 18define NULL 0define MAX_ARC_SIZE 100define MAX_ROUTE_NUM 5include<>include<>include<>include<>define False 0define True 1define INFINITY 10000typedef struct{int number;float expenditure;int begintime[2];int arrivetime[2];}Vehide;typedef struct{Vehide stata[MAX_ROUTE_NUM];int last;}infolist;typedef struct ArcNode{int adjvex;struct ArcNode nextarc;infolist info;}ArcNode;typedef struct VNode{char cityname[10];ArcNode planefirstarc,trainfirstarc; }VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,planearcnum,trainarcnum; }ALGraph;typedef struct Node{int adjvex;int route;struct Node next;}Node;typedef struct QNode{int adjvex;struct QNode next;}QNode;typedef struct{QNode front;QNode rear;}LinkQueue;typedef struct TimeNode{int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode child[MAX_ROUTE_NUM]; }TimeNode,TimeTree;struct arc{int co;char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[MAX_ARC_SIZE];char city[MAX_VERTEX_NUM][10];int TTime[2];int time[2];int time1[2];int time2[2];int c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM];void Administer(ALGraph G);void cityedit(ALGraph G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue Q,infolist (arcs)[MAX_VERTEX_NUM]);void createtrainfile();int DeleteplaneArc(ALGraph G);void DeleteQueue(LinkQueue Q,int x);int DeletetrainArc(ALGraph G);void DeleteVertex(ALGraph G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph G);void EnterQueue(LinkQueue Q,int x);void EntertrainArc(ALGraph G);void EnterVertex(ALGraph G);void ExpenditureDispose(int k,infolist (arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float M,int final);void flightedit(ALGraph G);void initgraph(ALGraph G);void InitQueue(LinkQueue Q);int IsEmpty(LinkQueue Q);int LocateVertex(ALGraph G,char v);void MinExpenditure(infolist arcs,float expenditure,int route);void MinTime(infolist arcs,int time,int route);void PrintGraph(ALGraph G);int save(ALGraph G);void TimeDispose(int k,infolist (arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,int (T)[2],int final);void TimeTreeDispose(Node head,infolist (arcs)[MAX_VERTEX_NUM]);void trainedit(ALGraph G);void TransferDispose(int k,infolist (arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1);void UserDemand(ALGraph G);void VisitTimeTree(TimeTree p);int main(){ALGraph G;int i;printf("\n\n\n\n\n\n\n\n");printf("\n");printf("~~~~~ 学院:信息科学与技术学院~~~~~\n");printf("~~~~~ 专业:通信工程~~~~~\n");printf("~~~~~ 姓名:~~~~~\n");printf("~~~~~ 学号:0 ~~~~~\n");printf("\n");printf("\n");printf("请按任何键以继续……");getchar();system("cls");printf("\n\n\n\n\n\n\n 请选择程序功能:\n");printf(" \n");printf(" 1=管理员管理 \n");printf(" 2=用户咨询 \n");printf(" 3=显示交通系统 \n");printf(" 4=退出 \n");printf(" \n");printf(" 选择");scanf("%d",&i);getchar();while(i=4){switch(i){case 1:Administer(&G);break;case 2:UserDemand(G);break;case 3:PrintGraph(&G);break;}system("cls");printf("\n\n\n\n\n\n\n\n 请选择程序功能:\n" );printf(" \n");printf(" 1=管理员管理\n");printf(" 2=用户咨询\n");printf(" 3=显示交通系统\n");printf(" 4=退出\n");printf(" \n");printf(" 选择");scanf("%d",&i);getchar();}return 1;}void Administer(ALGraph G){int i;system("cls");printf("\n\n\n\n\n\n\n\n 请选择管理项目:\n");printf(" \n");printf(" 1=初始化交通系统\n");printf(" 2=城市编辑\n");printf(" 3=飞机航班编辑\n");printf(" 4=列车车次编辑\n");printf(" 5=返回上一级菜单\n");printf(" \n");printf(" 选择");scanf("%d",&i);getchar();while(i=5){switch(i){case 1:initgraph(G);break;case 2:cityedit(G);break;case 3:flightedit(G);break;case 4:trainedit(G);break;}system("cls");printf("\n\n\n\n\n\n\n\n\n 请选择管理项目:\n");printf(" \n");printf(" 1=初始化交通系统\n");printf(" 2=城市编辑\n");printf(" 3=飞机航班编辑\n");printf(" 4=列车车次编辑\n");printf(" 5=返回上一级菜单\n");printf(" \n");printf(" 选择");scanf("%d",&i);getchar();}}void initgraph(ALGraph G){int i;system("cls");printf("\n\n\n\n\n\n\n\n\n 请选择初始化方式:\n");printf(" \n");printf(" 1=键盘\n");printf(" 2=文档\n");printf(" \n");printf(" 选择");scanf("%d",&i);getchar();switch(i){case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;}}void createcityfile(){int i=0;int j;char flag='y';FILE fp;printf("\n请输入城市名称(de)信息:\n"); while(flag=='y'||flag=='Y'){printf("城市名称:");gets(city[i]);i++;printf("继续输入(Y/N)");scanf("%c",&flag);getchar();}printf("\n");if((fp=fopen("","wb"))==NULL){printf("无法打开文件\n");return;}for(j=0;j<i;j++)fprintf(fp,"%10s",city[j]);fclose(fp);}void createplanefile(){int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE fp;flag='y';count=0;while(flag=='Y'||flag=='y') {printf("请输入飞机航班(de)信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目(de)城市:");gets(vh);printf("航班费用:");scanf("%f",&money);getchar();printf("起飞时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) {printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}a[count].co=code;strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++;printf("继续输入(Y/N)");scanf("%c",&flag);getchar();printf("\n");}if((fp=fopen("","wb"))==NULL)printf("\n无法打开文件\n");fprintf(fp,"%d",count);for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)=1) printf("\n文件写入错误\n");fclose(fp);}void createtrainfile(){int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE fp;flag='y';count=0;while(flag=='y'||flag=='Y'){printf("请输入列车车次(de)信息:\n"); printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目(de)城市:");gets(vh);printf("车次费用:");scanf("%f",&money);getchar();printf("发车时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) {printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) {printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}a[count].co=code;strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++;printf("继续输入(Y/N)");scanf("%c",&flag);getchar();printf("\n");}if((fp=fopen("","wb"))==NULL)printf("\n无法打开文件\n");fprintf(fp,"%d",count);for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)=1) printf("\n文件写入错误\n");fclose(fp);}int LocateVertex(ALGraph G,char v){int j,k;j=-1;for(k=0;k<G->vexnum;k++)if(strcmp(G->vertices[k].cityname,v)==0) {j=k;break;}return(j);}void CreateGraph(ALGraph G){int i,j,k;int arc_num;int count1,count2;int m,t;ArcNode p,q;FILE fp;i=0;if((fp=fopen("","rb"))==NULL){printf("\n无法打开文件\n");return;}while(feof(fp)){fscanf(fp,"%10s",city[i]);i++;}fclose(fp);j=0;while(j<i){strcpy(G->vertices[j].cityname,city[j]); G->vertices[j].planefirstarc=NULL;G->vertices[j].trainfirstarc=NULL;j++;}G->vexnum=i;if((fp=fopen("","rb"))==NULL)printf("\n无法打开文件\n");k=0;fscanf(fp,"%d",&count1);while(k<count1){if(fread(&a[k],sizeof(struct arc),1,fp)=1) printf("\n文件读入错误\n");k++;}fclose(fp);k=0;arc_num=0;while(k<count1){i=LocateVertex(G,a[k].vt);j=LocateVertex(G,a[k].vh);q=G->vertices[i].planefirstarc;m=0;while(q=NULL){if(q->adjvex==j){t=q->+1;q->[t].number=a[k].co;q->[t].expenditure=a[k].mo;q->[t].begintime[0]=a[k].bt[0]; q->[t].begintime[1]=a[k].bt[1];q->[t].arrivetime[0]=a[k].at[0];q->[t].arrivetime[1]=a[k].at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode)malloc(sizeof(ArcNode));p->adjvex=j;p->[0].number=a[k].co;p->[0].expenditure=a[k].mo;p->[0].begintime[0]=a[k].bt[0];p->[0].begintime[1]=a[k].bt[1];p->[0].arrivetime[0]=a[k].at[0];p->[0].arrivetime[1]=a[k].at[1];p->=0;p->nextarc=G->vertices[i].planefirstarc; G->vertices[i].planefirstarc=p;arc_num++;}k++;}G->planearcnum=arc_num;if((fp=fopen("","rb"))==NULL){printf("\n无法打开文件\n");return;}k=0;fscanf(fp,"%d",&count2);while(k<count2){if(fread(&a[k],sizeof(struct arc),1,fp)=1) printf("\n文件读入错误\n");k++;}fclose(fp);k=0;arc_num=0;while(k<count2){i=LocateVertex(G,a[k].vt);j=LocateVertex(G,a[k].vh);q=G->vertices[i].trainfirstarc;m=0;while(q=NULL){if(q->adjvex==j){t=q->+1;q->[t].number=a[k].co;q->[t].expenditure=a[k].mo;q->[t].begintime[0]=a[k].bt[0]; q->[t].begintime[1]=a[k].bt[1]; q->[t].arrivetime[0]=a[k].at[0]; q->[t].arrivetime[1]=a[k].at[1]; q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode)malloc(sizeof(ArcNode));p->adjvex=j;p->[0].number=a[k].co;p->[0].expenditure=a[k].mo;p->[0].begintime[0]=a[k].bt[0];p->[0].begintime[1]=a[k].bt[1];p->[0].arrivetime[0]=a[k].at[0];p->[0].arrivetime[1]=a[k].at[1];p->=0;p->nextarc=G->vertices[i].trainfirstarc; G->vertices[i].trainfirstarc=p;arc_num++;}k++;}G->trainarcnum=arc_num;}int save(ALGraph G){int i,j,k,t;ArcNode q;FILE fp;j=0;while(j<G->vexnum){strcpy(city[j],G->vertices[j].cityname); j++;}i=0;if((fp=fopen("","wb"))==NULL)printf("\n错误,无法打开文件\n");while(i<G->vexnum){fprintf(fp,"%10s",city[i]);i++;}fclose(fp);k=0;for(i=0;i<G->vexnum;i++){q=G->vertices[i].planefirstarc;while(q=NULL){for(t=0;t<=q->;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname); a[k].co=q->[t].number;a[k].mo=q->[t].expenditure;a[k].bt[0]=q->[t].begintime[0];a[k].bt[1]=q->[t].begintime[1];a[k].at[0]=q->[t].arrivetime[0];a[k].at[1]=q->[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("","wb"))==NULL){printf("\n无法打开文件\n");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)=1)printf("\n文件写入错误\n");i++;}fclose(fp);k=0;for(i=0;i<G->vexnum;i++){q=G->vertices[i].trainfirstarc;while(q=NULL){for(t=0;t<=q->;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname); a[k].co=q->[t].number;a[k].mo=q->[t].expenditure;a[k].bt[0]=q->[t].begintime[0];a[k].bt[1]=q->[t].begintime[1];a[k].at[0]=q->[t].arrivetime[0];a[k].at[1]=q->[t].arrivetime[1]; k++;}q=q->nextarc;}}if((fp=fopen("","wb"))==NULL){printf("\n无法打开文件\n");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)=1) printf("\n文件写入错误\n");i++;}fclose(fp);return 1;}void cityedit(ALGraph G){int i;printf("\n请选择城市编辑项目:\n");printf("1=增加城市\n2=删除城市\n"); printf("选择");scanf("%d",&i);getchar();if(i==1)EnterVertex(G);if(i==2)DeleteVertex(G);}void EnterVertex(ALGraph G){char v[10],c;int i;printf("\n请输入新增城市(de)名称:"); gets(v);i=LocateVertex(G,v);if(i>=0&&i<G->vexnum){printf("\n错误此城市已存在\n");return;}else{printf("\n确认(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=G->vexnum;strcpy(G->vertices[i].cityname,v); G->vertices[i].planefirstarc=NULL; G->vertices[i].trainfirstarc=NULL; G->vexnum=i+1;save(G);}elsereturn;}}void DeleteVertex(ALGraph G){int i,j,k,n;char v[10],c;ArcNode p,q,m;printf("\n请输入删除(de)城市:");gets(v);printf("\n确认(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){n=0;while(n<G->vexnum&&strcmp(G->vertices[n].cityname,v)=0) n++;if(n==G->vexnum)printf("\n错误无法找到此城市\n");else{i=LocateVertex(G,v);p=G->vertices[i].planefirstarc;while(p=NULL){q=p;p=p->nextarc;free(q);}p=G->vertices[i].trainfirstarc;while(p=NULL){q=p;p=p->nextarc;free(q);}for(j=i;j<G->vexnum-1;j++){strcpy(G->vertices[j].cityname,G->vertices[j+1].cityname); G->vertices[j].planefirstarc=G->vertices[j+1].planefirstarc;G->vertices[j].trainfirstarc=G->vertices[j+1].trainfirstarc;}G->vertices[j].planefirstarc=NULL;G->vertices[j].trainfirstarc=NULL;for(k=0;k<G->vexnum-1;k++){p=G->vertices[k].planefirstarc;while(p=NULL){if(p->adjvex>i){p->adjvex=p->adjvex-1;q=p;p=p->nextarc;}else if(p->adjvex==i){if(p==G->vertices[k].planefirstarc){m=p;G->vertices[k].planefirstarc=p->nextarc; p=p->nextarc;free(m);}else{q->nextarc=p->nextarc; m=p;p=p->nextarc;free(q);}}else{q=p;p=p->nextarc;}}}for(k=0;k<G->vexnum-1;k++){p=G->vertices[k].trainfirstarc; while(p=NULL){if(p->adjvex>i){p->adjvex=p->adjvex-1;q=p;}else if(p->adjvex==i){if(p==G->vertices[k].trainfirstarc){m=p;G->vertices[k].trainfirstarc=p->nextarc; p=p->nextarc;free(m);}else{q->nextarc=p->nextarc;m=p;p=p->nextarc;free(q);}}else{q=p;}}}}G->vexnum--;save(G);}elsereturn;}void flightedit(ALGraph G){int i;printf("\n请选择飞机航班编辑项目:\n"); printf("1=新增航班\n2=删除航班\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EnterplaneArc(G);if(i==2)DeleteplaneArc(G);}void trainedit(ALGraph G){int i;printf("\n请选择列车车次编辑项目:\n"); printf("1=新增车次\n2=删除车次\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EntertrainArc(G);if(i==2)DeletetrainArc(G);}void EnterplaneArc(ALGraph G){int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode p,q;printf("\n请输入新增飞机航班(de)信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目(de)城市:");gets(vh);printf("航班费用:");scanf("%f",&money);getchar();printf("起飞时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) {printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) {printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}printf("\n确认(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){printf("\n错误无法找到起始城市\n");return;}if(j==-1){。

数据结构--交通咨询系统

数据结构--交通咨询系统

数据结构--交通咨询系统目录1 概述 (2)1.1 问题描述 (2)1.2 实现意义 (2)2 系统分析 (2)2.1 需求分析 (2)2.1.1程序的功能 (2)2.1.2输入输出的要求 (2)2.2 设计思想 (2)2.3 设计要求 (3)3 概要设计 (3)3.1用邻接矩阵建立交通网络模块 (3)3.2 查询任意两个顶点之间的最短路径 (4)3.3 查询一个城市到其他所有城市的最短路径 (5)4 详细设计 (5)4.1 用邻接矩阵构造图结构函数CreateMGraph() (5) 4.2 费洛伊德Floyd() (6)4.3 迪杰斯特拉Dijkstra() (6)4.4 主要函数流程图及其函数调用 (7)4.4.1 主要函数流程图 (7)4.4.2 一个城市到其他城市的路径调用 (8)4.4.3 任意两个城市之间路径调用 (8)5 运行与测试 (8)5.1 有向图存储结构的建立模块的输出 (9)5.2 单源路径迪杰斯特拉算法模块的输出 (10)5.3 费洛伊德算法模块的输出 (10)6 总结与心得 (10)参考文献 (11)附录 (11)1 概述1.1 问题描述在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其它出行时,不仅关心节省费用,而且对里程和所需时间等问题也感兴趣。

对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。

图中顶点表示城市之间的交通关系。

这个交通系统可以回答旅客提出的各种问题。

比如任意一个城市到其他城市的最短路径,任意两个城市之间的最短路径问题。

1.2 实现意义便于人们的日常出行,且更好地满足了用户的出行需求。

这种最短路径问题的计算方法既简单又便于实现,同时大大提高了计算机的运行速率。

2 系统分析2.1 需求分析2.1.1程序的功能(1)用户自己可以建立不同的路径之间的关系网(2)可以查询某个城市到达其余各城市的最短路径。

数据结构--交通咨询系统

数据结构--交通咨询系统

数据结构--交通咨询系统正文:1. 介绍本文档是关于交通咨询系统的数据结构设计的文档。

交通咨询系统是一个为用户提供交通信息和路线推荐的系统。

本文档将详细介绍系统的整体架构、数据结构设计,以及每个模块的功能和实现细节。

2. 系统架构交通咨询系统采用三层架构,包括前端界面层、业务逻辑层和数据存储层。

前端界面层负责与用户交互,接收用户输入的咨询请求。

业务逻辑层对用户的咨询请求进行处理,调用相应的算法和数据结构进行路线推荐。

数据存储层用于存储用户和路线的信息。

3. 用户管理模块用户管理模块负责用户的注册、登录和个人信息管理。

用户信息包括用户名、密码等基本信息。

用户个人信息管理包括修改密码、修改个人资料等功能。

4. 路线查询模块路线查询模块实现根据用户的出发地和目的地查询最短路径。

该模块使用图的最短路径算法,如Dijkstra算法或A算法,来计算最短路径。

在查询结果中,系统将显示最短路径的详细信息,包括交通工具、路程时间和费用等。

5. 路线推荐模块路线推荐模块实现根据用户的偏好和实时交通情况推荐路线。

该模块根据用户的出发地和目的地,以及用户的偏好(如最短时间、最少换乘、最少步行等)进行路线推荐。

同时,系统还考虑实时交通情况,如拥堵状况和公共交通工具的运行情况。

6. 数据存储模块数据存储模块负责存储用户和路线的信息。

用户信息包括用户名、密码和个人资料等。

路线信息包括出发地、目的地、交通工具信息、路程时间和费用等。

数据存储模块可以采用关系型数据库或者NoSQL数据库进行实现。

7. 界面设计系统的前端界面设计应简洁明了,方便用户操作和查看信息。

界面应有搜索框用于用户输入出发地和目的地,并且提供选项供用户选择偏好和实时交通情况。

附件:1. 数据库表设计:包括用户表和路线表的字段定义和关系。

2. 界面原型设计:包括系统的前端界面设计和交互流程。

法律名词及注释:1. 用户:使用交通咨询系统的个人或组织。

2. 用户信息:用户在注册和登录时提供的个人信息,包括用户名和密码。

交通咨询系统设计数据结构课程设计

交通咨询系统设计数据结构课程设计

交通咨询系统设计数据结构课程设计一、引言随着城市人口的增加和交通需求的不断增长,交通咨询系统变得越来越重要。

交通咨询系统可以提供准确的交通信息,帮助用户规划最佳的出行路线,减少交通拥堵和时间浪费。

本文将介绍一个交通咨询系统的设计,重点关注其数据结构的设计与实现。

二、系统需求分析在设计交通咨询系统的数据结构之前,首先需要对系统的需求进行分析。

用户使用该系统可以进行以下几个方面的咨询:1. 路线规划:根据用户提供的起点和终点,系统可以返回最佳的路线规划方案。

2. 实时交通信息:系统可以提供实时的交通信息,包括道路拥堵情况、车流量、事故等。

3. 公交查询:用户可以查询公交车的实时位置、到站时间等信息。

4. 地点搜索:用户可以根据关键词搜索附近的地点,如餐厅、加油站等。

三、数据结构设计基于以上需求,我们可以设计以下数据结构来实现交通咨询系统:1. 地点信息表:包含地点的名称、经度、纬度等信息。

可以使用哈希表或者树结构来存储地点信息,以便快速查询。

2. 道路网络图:采用图的数据结构来表示道路网络,每个路口和道路分别表示图的顶点和边。

可以使用邻接矩阵或者邻接表来实现图。

3. 路线规划表:记录用户查询的起点和终点,以及最佳路线的详细信息。

可以使用链表或者数组来实现路线规划表。

4. 交通信息表:记录道路的实时交通信息,包括车流量、拥堵情况等。

可以使用哈希表或者树结构来存储交通信息。

5. 公交车信息表:记录公交车的实时位置、到站时间等信息。

可以使用链表或者数组来实现公交车信息表。

四、系统实现在设计完数据结构之后,需要实现相应的算法来支持系统的功能。

以下是几个重要的算法:1. 路线规划算法:可以使用Dijkstra算法或者A*算法来实现最短路径的计算。

2. 地点搜索算法:可以使用字符串匹配算法或者正则表达式来实现关键词搜索。

3. 实时交通信息更新算法:可以使用定时任务或者事件驱动的方式来更新交通信息。

4. 公交车位置更新算法:可以使用定时任务或者事件驱动的方式来更新公交车位置信息。

数据结构课程设计:交通资讯系统

数据结构课程设计:交通资讯系统

目录一、实验目的: (2)二、实验要求: (2)三、总体设计: (2)四、详细设计: (3)五、程序代码: (4)六、测试 (16)七、总结: (22)参考文献 (22)交通咨询系统一、实验目的:1、充分了解并掌握最短路径问题及其应用。

学习迪杰斯特拉算法和弗洛伊德算法。

2、根据有向图的存储结构解决实际问题。

3、了解程序模块化的过程。

4、给用户提供路径咨询。

实现了帮助用户了解全国各大城市间往来的最短路径问题。

5、可以提供用户查询各大城市的相关信息。

二、实验要求:设计一个交通咨询系统,能让旅客在任一个城市顶点到另一个城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。

(城市名称用数字代替)。

本程序可以在TC2.0和VC6.0中运行。

三、总体设计:本程序页面清晰,功能明确,主要分为两个部分,即交通查询部分和管理员管理部分。

交通查询部分又分为城市信息、城市路径、最短路径查询3个模块,而其中最短路径查询系统又分为2个城市之间的最短路径和1个城市到其它各城市之间路径的查询。

而管理员管理的部分则包括交通查询里面的功能以及添加城市、添加城市间的路径、删除城市以及删除两个城市之间的路径等部分。

四、详细设计:详细设计全国交通信息咨询系统的存储结构:struct city_info /*城市信息结构*/{ char name[20];char info[100];}cities[SIZE_city];struct way_info /*路径信息结构*/{ int start_id;int end_id;int dist;}ways[SIZE_way];struct path_info /*路径查询结构*/{ int count;int path[SIZE_city];};typedef struct Graph{ char vexs[SIZE_city];/*顶点*/ int arcs[SIZE_city][SIZE_c ity];/*邻接矩阵*/ int vexnum;/*顶点数*/ int arcnum; /*弧数*/ }Graph;划分本程序采用自顶向下的编程模式,分为7个主模块,即考虑到7种算法的实现:1、显示全国各地城市相关信息的算法;void ShowCity();初始条件:void ReadCitiesFile();void ReadW aysFile();读取数据成功,操作结果:根据用户查询城市的名字,输出城市的特色;2、添加城市及城市相关信息的算法;void AddView();初始条件:构造了结构体数组views[VIEW_SIZE];操作结果:添加一个城市顶点到views数组中,并将数据输出到VIE WS文件中保存。

数据结构课程设计-应用java实现全国交通咨询系统

数据结构课程设计-应用java实现全国交通咨询系统

6.用户使用说明双击打开界面,在起始站和终点站所在文本框输入对应名称,选择最优决策和交通工具,点击查询,若起始站或终点站有一个不存在,都会跳出对应的提示信息,若起始站和终点站都存在,点击查询按钮就会显示对应的信息。

也可以点击帮助,就会弹出帮助信息的对话框。

如果想删除或添加火车列表或飞机航班表,点击编辑按钮,选中要操作的选项,点击开始编辑。

若是选择删除,就在弹出的对话框中输入对应起始站和终点站名,点击删除即可,然后便会弹出提示信息。

若是添加,就在对应的文本域按照规则添加信息,点击添加即可,也可以点击添加帮助按钮查看细节。

编辑完重启即可查询刚编辑完的信息。

7.测试结果1.测试数据本次测试所用测试数据如下:火车列表:G005--->北京--->上海--->8:00--->12:00--->400D002--->北京--->广州--->8:00--->15:30--->1100G309--->沈阳--->北京--->5:00--->12:00--->300T001--->兰州--->北京--->8:00--->13:00--->500G002--->沈阳--->上海--->12:00--->15:30--->800G329--->广州--->桂林--->5:00--->12:00--->400T001--->桂林--->成都--->8:00--->13:00--->500Z509--->上海--->广州--->16:00--->17:30--->520飞机列表:P004--->上海--->北京--->10:00--->15:00--->600P005--->厦门--->广州--->9:00--->12:00--->300P005--->北京--->厦门--->9:00--->12:00--->163P001--->兰州--->北京--->8:00--->13:00--->500P005--->广州--->武汉--->9:00--->12:00--->560P101--->上海--->厦门--->13:00--->16:30--->830由此可列出火车图和飞机图如下:2.测试查询截图:(1)双击打开界面(2)输入起始站和终点站,选择最快捷火车(3)点击查询(4)选择最省钱(5)更换终点站(6)跟换最优决策(7)多中转站(8)终点站不存在(9)起始站不存在(10)起始站终点站都不存在(11)交通工具选用飞机最优选择:最快捷(12)最优选择改为:最省钱(13)多中转站3.编辑信息(1)点击编辑信息按钮(2)下拉框一览(3)选中删除飞机航班表,点击开始编辑,弹出对话框如下(4)查看未删除前的文档(5)输入起始站终点站(6)点击删除,弹出对话框(7)查看文档,对应的信息不见了(8)重新输入查询(9)点击编辑信息选中添加(10)点击开始编辑,弹出对话框(11)查看未添加前的火车列表(12)点击添加帮助(13)输入信息(14)点击添加(15)关闭添加界面后稍等片刻,查看火车列表文档,输入的信息已经写入到文档中(16)回到主界面查询输入的信息3.帮助按钮4.分析经过分析,以上输出的信息基本正确,基本功能也可以实现,但是还存在个别问题尚未解决,由于编者能力有限,至今仍未解决。

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

工业应用技术学院课程设计任务书题目全国交通资询系统主要容:设计了一个方便用户查询交通咨询系统。

该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。

该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。

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

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

基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。

主要参考资料:[1] 春葆.数据结构程序设计[M].:清华大学,2002,03[2] 王黎,袁永康战略[M].:清华大学,2002,01[3] 谭浩强.C程序设计第二版[M].:清华大学,2003,03[4] 任哲.MFC Windows程序设计[M].:清华大学,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。

对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。

在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。

尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。

即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。

为此开发一个交通择优系统是十分必要的。

采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。

同时使乘客能通过网络进行称心的交通工具的选择,这也是交通网络优选智能决策的体现。

交通信息的咨询和管理是交通部门管理工作中异常重要的一个环节,因此,运用交通资询管理系统对春运时减轻乘客购票压力、舒缓紧的城际拥堵有重要意义。

关键字:错综复杂;智能化;最优方式;择优系统摘要 (I)目录 (II)第一章概述 (1)1.1 性能需求 (1)1.2 功能需求 (2)第二章概要设计 (3)2.1 功能模块设计 (3)2.2 算法分析与设计 (3)第三章详细设计 (5)3.1 管理员功能模块设计 (5)3.2 计算最少费用功能模块设计 (9)3.3 测试与分析 (17)第四章全国交通咨询系统的运行 (21)4.1 程序主界面 (21)4.2 管理员登录主界面 (21)4.3 用户界面登录界面 (24)4.4 显示交通系统界面 (27)结束语 (30)参考文献 (31)附录 (32)第一章概述数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。

因此,主要有三个方面的容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。

通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

在当今信息时代,信息技术己成为当代知识经济的核心技术。

我们时刻都在和数据打交道。

比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。

实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。

数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

通过此次课程设计主要达到以下目的:1、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4、训练用系统的观点和软件开发一般规进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

1.1 性能需求在现代,随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。

对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作,况且,受经济危机的影响,也使人们愈发珍惜包里的人民币。

在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。

尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。

即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。

显然,靠传统的交通信息咨询、管理方式已不能适应时代的发展,同时也很难旅客的需求。

今天这种传统的管理方法必然会被以计算机为基础的交通信息总揽、智能咨询所代替。

同时这种传统的管理方式反映出很多问题:第一,当要查询某两个城市之间的全部交通方式要各种查找,很繁琐;第二,随着周围经济环境的变化,每次查询的票价和线路又会由于各种原因而产生变化,更新的不及时或者票价的错误都会造成乘客陷入麻烦;第三,随着动车、高铁等各种新型交通方式的加入,一个庞大的信息统计如果占用大量人力、物力、存储资源,显然不能适应时代需要。

基于以上情况,开发一个交通择优系统是十分必要的。

开发一个交通择优系统,采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。

同时使乘客能通过网络进行称心的交通工具的选择,这也是交通网络优选智能决策的体现。

交通信息的咨询和管理是交通部门管理工作中异常重要的一个环节,因此,运用交通资询管理系统对春运时减轻乘客购票压力、舒缓紧的城际拥堵有重要意义。

1.2 功能需求设计了一个方便用户查询交通咨询系统,这个系统功能比较强大。

该程序所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。

1、在程序中输入城市名称时,需输入10个字母以的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据;2、程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地;3、程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。

第二章 概要设计2.1 功能模块设计交通咨询管理系统通过主控模块进入系统并提示相应功能供用户选择。

用户选择后进入到各个功能模块,实现管理员管理、用户咨询、交通信息总览功能,管理员管理时可依据不同对系统信息进行增减,使用户在咨询时得到依据最少旅行时间、旅行费用、最少中转站的购票依据,为用户购票选择提供智能决策。

也可通过显示模块对系统中存储的全部信息进行总览和查询。

基于此,提供以上功能。

如下图2.1所示:图2.1 交通咨询查询系统模块图2.2 算法分析与设计系统用到的抽象数据类型定义:1.ADT Graph{数据对象V :一个集合,该集合中的所有元素具有相同的特性最 少 中 转 站 主控模块系 统 初 始 化 城 市 编 辑 飞 机 航 班 编辑 显 示 飞 机 航 班 显 示 城 市 交通咨询管理系统用户资询模块 管理员管理模块 交通信息总览模块 最少旅行时间 最 少 旅 行 费用 列车车次编辑 显示 列 车 车 次数据关系R:R={VR} VR={<x,y>|P(x,y)^(x,y属于V)}基本操作:(1)initgraph(&G);(2)CreateGraph(&G);(3)EnterVertex(&G);(4)DeleteVertex(&G);(5)EnterplaneArc(&G);(6)DeleteplanArc(&G);(7)EntertrainArc(&G);(8)DeletetrainArc(&G);}ADT Graph2.ADT LinkQueue{数据元素:可以是任意类型的数据,但必须属于同一个数据对象关系:队列中数据元素之间是线性关系。

基本操作:(1)InitQueue(&Q);(2)IsEmpty(&Q);(3)EnterQueue(&Q,x);(4)DeleteQueue(&Q,&y);}ADT LinkQueue3.ADT TimeTree{数据对象D:一个集合,该集合中的所有元素具有相同的特性数据关系R:若D为空,则为空树。

若D中仅含有一个数据元素,则R为空集,否则R={H},H为如下二元关系:(1)在D中存在唯一的称为根的数据元素root,它在关系H中没有前驱;(2)除root以外,D中每个结点在关系H下有且仅有一个前驱;(3)CreateTimeTree(p,i,j,&Q,infolist arcs);(4)CopyTimeTree(p,q);(5)VisitTimeTree(p);}ADT TimeTree第三章详细设计3.1 管理员功能模块设计设计思想:本系统的管理员模块,当我们从键盘输入有关图的顶点及弧的信息后,用显示图的函数验证,DOS中显示的图的信息与从键盘输入的信息相同,表明交通系统可以从键盘正确输入信息。

通过管理员模块的操作,我们可以对系统的相关信息进行修改与添加。

如下图3.1所示:图3.1 管理员模块流程图详细功能:本系统实现并建立了有关图的3个文本文件(city.txt,plan.txt,train.txt),在交通系统程序中,选择从文本文件输入图的信息后,用显示操作验证,表明文本文件的容可以正确调入图的结构体中,说明交通系统可以从文本文件中读取信息。

当从键盘或文本文件初始化交通图后,测试增加或删除城市结点,增加或删除航班或列车弧,修改信息完毕后返回上一级菜单。

相关文档
最新文档