全国交通咨询模拟(数据结构Java课程设计)
全国交通资讯模拟数据结构课程设计报告
全国交通咨询模拟系统的设计与实现1.问题描述出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
2.需求分析(1) 提供对城市信息进行编辑( 如: 添加或删除) 的功能。
(2) 城市之间有两种交通工具:火车和飞机。
(3) 提供两种最优决策: 最快到达或最省钱到达。
全程只考虑一种交通工具。
(4) 旅途中耗费的总时间应该包括中转站的等候时间。
(5) 咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具, 输出信息: 最快需要多长时间才能到达或者最少需要多少旅费才能到达, 并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
3.概要设计因为全国交通咨询模拟中有众多城市之间的连接关系,为实现全国交通咨询系统的开发,采用图类型与邻接表类型来存储城市之间的信息。
下面给出他们的ADT的定义。
3.1 抽象数据类型定义如下:typedef struct unDiGraph{int numVerts; //结点costAdj cost; //邻接矩阵}unDiGraph,*UNG;基本操作:unDiGraph* CreateCostG()操作结果:构造带权(费用)图。
unDiGraph* CreateTimeG()操作结果:构造带权(时间)图。
构造飞机带权(费用)图。
PathMat *Floyed(unDiGraph *D)操作结果:Floyed函数求任意两点的最短路径。
3.2 系统功能模块设计全国交通咨询模拟系统由4个功能模块组成:添加城市、删除程序、采用火车出行、采用飞机出行下面给出功能模块图,如图3-1所示。
图3-1全国交通咨询模拟功能模块图3.3主要函数调用关系图(给出ADT内基本操作的那些函数之间的函数调用关系图)如图3-2所示。
数据结构课程设计全国交通模拟汇总
数据结构课程设计报告班级:191113学号:20111000611姓名:黄建钊指导老师:朱晓莲日期:2013年3月7.全国交通咨询模拟出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
要求:(1)提供对城市信息进行编辑(如添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
1.需求分析1、设计最短路径的算法及其需要信息的存储:本设计中最短路径的算法利用迪杰斯特拉算法,存储方法利用邻接矩阵存储。
2、该程序所做的工作的是模拟全国交通咨询,为旅客提供种最优决策的交通咨询。
此程序规定:在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个字符串类型;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入一个整型数据,在选择功能时,应输入与所选功能对应的一个整型数据。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,说明在途中经过的城市名称;程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供两种最优决策:最快到达、最省钱到达。
2.设计2.1设计思想本系统整体上分为存储系统和求最短路径两部分,存储系统运用到数组和结构体。
该系统分别存储火车列次,航班,出发点与目的地以及所需要走的路程和所用费用。
最短路径使用迪杰斯特拉算法编程求算得出最近或最便宜路径。
该算法主要分为三步:1、起始点(V0)与其相邻点的权值(即当前最短路径)。
数据结构课程设计全国交通咨询系统方案
工业应用技术学院课程设计任务书题目全国交通资询系统主要容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求: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指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。
数据结构课程设计全国交通模拟
数据结构课程设计报告班级:191113学号:20111000611姓名:黄建钊指导老师:朱晓莲日期:2013年3月7.全国交通咨询模拟出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
要求:(1)提供对城市信息进行编辑(如添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
1.需求分析1、设计最短路径的算法及其需要信息的存储:本设计中最短路径的算法利用迪杰斯特拉算法,存储方法利用邻接矩阵存储。
2、该程序所做的工作的是模拟全国交通咨询,为旅客提供种最优决策的交通咨询。
此程序规定:在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个字符串类型;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入一个整型数据,在选择功能时,应输入与所选功能对应的一个整型数据。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,说明在途中经过的城市名称;程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供两种最优决策:最快到达、最省钱到达。
2.设计2.1设计思想本系统整体上分为存储系统和求最短路径两部分,存储系统运用到数组和结构体。
该系统分别存储火车列次,航班,出发点与目的地以及所需要走的路程和所用费用。
最短路径使用迪杰斯特拉算法编程求算得出最近或最便宜路径。
该算法主要分为三步:1、起始点(V0)与其相邻点的权值(即当前最短路径)。
数据结构课程设计报告之模拟一个全国城市间的交通咨询程序文件
分类号编号华北水利水电学院North China Institute of Water Conservancy and Hydroelectric Power 课程设计题目:全国交通资讯系统院系信息工程学院专业计算机科学与技术专业姓名指导教师彬2013年6月28日目录1.需求分析 (1)问题描述 (1)1.1基本要求 (2)2概要设计 (3)2.1 数据结构 (3)2.2 程序模块 (5)3.详细设计 (6)3.1用到的各种函数 (6)3.2函数调用关系图 (8)3.3测试与分析 (8)4.用户说明书 (13)5.总结 (15)5.1明月的总结 (15)5.2璐璐的总结 (16)5.3吕竹青的总结 (17)参考文献: (18)附录:程序源代码 (18)1.需求分析问题描述设计、模拟一个全国城市间的交通咨询程序,为旅客提供三种最优咨询方案:(1)时间最短;(2)费用最小;(3)中转次数最少。
1.1基本要求1.1.1输入输出的形式和输入值的围在程序中输入城市名称时,需输入10个字母以的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据。
1.1.2 输出形式程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
1.1.3程序所能达到的功能程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达,显示编辑的全国交通系统。
1.1.4任务分配在本程序中,我们一共划分了三个模块。
管理员模块的初始化数据,城市信息的编辑,以及显示交通系统和整体的界面由明月完成。
航班班次以及列车车次添加删除以及数据结构的初步实现由吕竹青完成。
交通咨询模拟数据结构课程设计
数据结构课程设计报告题目:全国交通咨询模拟一.需求分析1.程序设计任务:从中国地图平面图中选取部分城市,抽象为程序所需要图的结点,并以城市间的列车路线和飞机路线,作为图结点中的弧信息,设计一个全国交通咨询模拟系统。
利用该系统实现两种最优决策:最快到达或最省钱到达。
2. 明确规定:(1)输入形式和输入值的范围:每条飞机弧或者火车弧涉及的信息量很多,包括:起始城市、目的城市、出发时间、到达时间、班次以及费用。
作为管理员要输入的信息包括以上信息,而作为用户或者客户,要输入的信息有起始城市和目的城市,并选择何种最优决策。
(2)输出形式:按用户提供的最优决策的不同而输出不同的信息,其中输出的所搭飞机或火车的班次及其起始地点和终点、起始时间和出发时间还有相关的最优信息,比如最快经多少时间到达、最省钱多少钱到达和最少经多少中转站到达。
(3)程序所能达到的功能a.该系统有供用户选择的菜单和交互性。
可以对城市、列车车次和飞机航班进行编辑,添加或删除。
b.建立一个全国交通咨询系统,该系统具备自动查找任意两城市间铁路、飞机交通的最短路径和最少花费及中转次数最少等功能。
c.初始化交通系统有两种方式,键盘和文档。
二.设计概要1. 算法设计(1)、总体设计(1) 数据存储:城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。
(2) 数据的逻辑结构:根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的等候时间)或旅费。
(3) 数据的存储结构:采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。
这里采用邻接表作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
添加、修改、删除功能可用菜单方式或命令提示方式。
数据结构课程设计全国铁路交通咨询模拟
数据结构课程设计全国铁路交通咨询模拟数据库课程设计—全国铁路咨询系统目录一.需求分析****************************************** 3二.概要设计****************************************** 6三.储存结构设计************************************** 8四.详细设计****************************************** 11五.用户手册****************************************** 17六.测试数据****************************************** 18七.心得体会****************************************** 26一、需求分析1、问题描述由于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省。
编制一个全国城市间的交通咨询程序,为旅客提供两种最优决策的交通咨询。
根据铁路的特征,数据的储存需要使用图的结构。
每个城市之间有不同的车次,每个车次的始发站、路过车站和终点站都不一样,因此两个城市之间就有指向明确的边,是一个有向图;而由于车次的不一样,因此发车时间,到站时间,价格等也会不一样;因此每两个点之间不止两条边,可能存在不同的多条边。
2、功能需求铁路咨询的对象是用户,因此,需要一个对用户友好的功能菜单,根据用户可能需要的实际需求,功能菜单中可能会包括以下要点:1:显示所有车站信息2: 显示所有车次信息(包括时刻表)3: 查询车站信息4: 查询两个城市之间的铁路信息5: 增加或删除车站6: 增加或删除铁路信息7: 增加、删除或修改时刻表、距离和价格8:寻找两城市间最省钱的一条路径9:寻找两城市间最省时间的一条路径10:寻找两城市间所有路径(按费用从低到高排序输出) 11:寻找两城市间所有路径(按所用时间从少到多排序输出) 12:退出咨询系统图的初始数据从文本中读入,文本是老师给的标准数据。
(完整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指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
模拟一个全国城市间的交通咨询程序数据结构课程设计报告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任务分配在本程序中,我们一共划分了三个模块。
管理员模块的初始化数据,城市信息的编辑,以及显示交通系统和整体的界面由李明月完成。
航班班次以及列车车次添加删除以及数据结构的初步实现由吕竹青完成。
2数据结构——全国交通咨询模拟系统实验报告
2数据结构——全国交通咨询模拟系统实验报告
实验目的:
实验环境:
本次实验的开发环境为Java编程语言,使用了面向对象的编程思想,采用了数据结构中的图和链表等数据结构。
实验内容:
1.设计交通工具类:
首先,根据系统需求,设计了交通工具类,该类用于表示交通工具的
基本信息,包括交通工具的名称、班次、票价等。
在该类中,使用了链表
数据结构来存储交通工具的班次信息。
2.设计城市类:
接下来,设计了城市类,用于表示各个城市的交通信息。
在该类中,
使用了图数据结构来表示城市之间的联通关系,每个城市作为图的一个节点,城市间的交通工具作为图的边。
实验结果:
经过测试,实验系统能够准确地输出起点城市到终点城市的最短路径
和最佳交通方案,用户可以根据输出信息来决定如何安排旅行计划。
实验总结:。
数据结构课程设计-全国交通咨询模拟系统 程序设计 源代码
数据结构课程设计-全国交通咨询模拟系统程序设计源代码一、程序界面A.关于程序1. 该程序以C语言为开发工具,运行该程序前请确保你地机器上已安装tc或turboc ,否则系统会提示:BGI Error: Graphics not initialized (use 'initgraph'>而无法使用该程序.遇到此情况请安装tc ,建议将其安装到C:目录下,以确保程序运行万无一失.2. 该软件完全支持鼠标,请放心使用.3. 该程序能将您输入地城市转换为象素坐标,显示在屏幕上,操作直观方便,选择城市时,用时标一点该城市即可,省去了输入地麻烦.如果您选择地两个城市间有路径地话,程序除了给您信息输出外,还会在地图上将此路径以不同颜色画出,更加直观.4. 该程序附带三个数据文件(num.txt,vex.txt,len.txt --此文件由系统默认>以供用户调试,用户还可自己创建文件,以备实验查询使用.B. 程序地使用用户打开程序,会看到命令行 : FILE CHANGE SHORTWAY MAP HELP ABOUT QUIT CLRSCR用户将鼠标放于某命令上会看到屏幕最下面有一行字在闪动,这是对命令地解释,如当鼠标访于FILE上时其下解释"press this button to open/creat a file" ,当鼠标空闲时在下面显示:"Please Enter Your Choice With Mouse Or Keyboard" ,提示用户进行命令选择.单机鼠标就会将某一功能打开从而进行某一操作2.用户运行程序时请先打开 FILE 菜单,该菜单有4个命令选项:[ 信息提示 ]1. 调用已存信息库文件(由用户提供>2. 创建新地信息库文件3. 调用演示信息库文件4. 退出程序[ 请输入你地选择(1/2/3/4> ]此时程序等待用户输入选择.输入正确后程序会自动打开地图由用户进行下一步操作.3. 对于其他命令,用户可由显示于屏幕下面地提示进行相关操作.二.程序内部设计及数据结构A. 数据地存放格式1.火车信息数据结构定义:typedef struct inf{ int num。
全国交通咨询模拟(数据结构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("到达地");。
数据结构课程设计报告之模拟一个全国城市间的交通咨询程序
分类号编号华北水利水电学院North China Institute of Water Conservancy and Hydroelectric Power 课程设计题目:全国交通资讯系统院系信息工程学院专业计算机科学与技术专业姓名指导教师杨彬2013年6月28日目录North China Institute of Water Conservancy and Hydroelectric Power 01.需求分析 (2)问题描述 (2)1.1基本要求 (2)2概要设计 (3)2.1 数据结构 (3)2.2 程序模块 (5)3.详细设计 (6)3.1用到的各种函数 (6)3.2函数调用关系图 (8)3.3测试与分析 (8)4.用户说明书 (13)5.总结 (15)5.1李明月的总结 (15)5.2刘璐璐的总结 (16)5.3吕竹青的总结 (17)参考文献: (18)附录:程序源代码 (18)1.需求分析问题描述设计、模拟一个全国城市间的交通咨询程序,为旅客提供三种最优咨询方案:(1)时间最短;(2)费用最小;(3)中转次数最少。
1.1基本要求1.1.1输入输出的形式和输入值的范围在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据。
1.1.2 输出形式程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
1.1.3程序所能达到的功能程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达,显示编辑的全国交通系统。
1.1.4任务分配在本程序中,我们一共划分了三个模块。
全国交通咨询模拟数据结构课程设计
数据结构课程设计报告题目:全国交通咨询模拟一.需求分析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){。
数据结构课程设计-应用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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、课程设计概述:使用语言: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("到达地");。