全国交通模拟系统课程设计报告姓名:唐文龙班级: 2班学号: 411417080216学院:华信学院专业:计算机科学与技术指导:日期:2013.06.20目录1 需求分析 (1)1.1 概述 (1)1.2 数据需求 (1)1.3 功能性需求 (1)1.4 其他需求 (1)2 概要设计 (2)3 详细设计 (4)3.1 记录的定义 (4)3.2 子程序说明 (5)3.3 子程序的算法说明 (5)3.3.1主函数流程图 (6)4 系统实现 (7)4.1开发环境 (8)4.2运行界面 (9)4.3测试用例 (10)5 总结 (11)6.参考文献 (11)附录:源程序 (11)1 需求分析出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
1.1 概述程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供两种最优决策:最快到达、最省钱到达。
1.2 数据需求输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据;在选择功能时,应输入与所选功能对应的一个整型数据。
1.3 功能性需求总体功能描述(1) 提供对城市信息进行编辑的功能。
(2) 城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑的功能。
(3) 提供两种最优决策: 最快到达或最省钱到达。
全程只考虑一种交通工具,不考虑回程;(4) 旅途中耗费的总时间应该包括中转站的等候时间。
(5) 咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具, 输出信息: 最快需要多长时间才能到达或者最少需要多少旅费才能到达。
1.4 其他需求(1)具有可靠性,可用性。
(2)简单,便捷。
(3)清晰,易懂。
2 概要设计采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。
划分出来的模块相对独立但又相关,且容易理解。
图1 模块1(1) 数据存储。
城市信息、交通信息存储于磁盘文件。
(2) 数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间或旅费。
图2.模块2(3) 数据的存储结构。
这里建议采用邻接表作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
(5) 最优决策功能模块。
①读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对方城市到达该元素所代表城市的所有信息;表头数组中的元素所对应的单链表存放与该元素所代表的城市有交通联系的城市。
②根据具体最优决策的要求,用Dijkstra算法求出出发城市到其它各城市的最优值,搜索过程中所经过城市的局部最优信息都保存在邻接表的表头数组中。
其目的城市所代表的元素中就保存了所需的最优决策结果。
③输出结果。
从目的城市出发,搜索到出发城市,所经过的城市均入栈,再逐一出栈栈中的城市,输出保存在表头数组中对应城市的信息及最终结果。
即最终所需的最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间。
(6) 主程序可以有系统界面、菜单;在程序运行过程中可以反复操作。
3 详细设计3.1 结构体的定义本程序运用了关于图这种数据结构。
他的抽象数据类型定义如下:typedef struct unDiGraph{int numVerts; //结点costAdj cost; //邻接矩阵}unDiGraph,*UNG;基本操作:unDiGraph* CreateCostG()操作结果:构造带权(费用)图。
unDiGraph* CreateTimeG()操作结果:构造带权(时间)图。
PathMat *Floyed(unDiGraph *D)操作结果:Floyed函数求任意两点的最短路径。
3.2基本操作typedef struct unDiGraph{int numVerts; //结点costAdj cost; //邻接矩阵}unDiGraph,*UNG; //图的定义costAdj B,L;void pr(int i)//选择城市void pri()//输出城市unDiGraph *CreateCostG()操作结果:构造带权(费用)图返回首地址G:unDiGraph *CreateTimeG()操作结果:构造带权(时间)图返回首地址G:unDiGraph *CreateFlyG()操作结果:飞机的相关信息void Floyed(unDiGraph *D,unDiGraph *M)操作要求:图G存在操作结果:Floyed函数求任意两点的最短路径void prn_pass(int i,int j) /基本操作:为了求从i到j的最短路径,只需要调用如下的过程void time()操作结果:求最少时间路径。
void money()操作结果:求最少花费路径void administrator()操作结果:管理员功能void main()//main函数3.3 算法说明利用Floyed函数求带权图两点之间的最短路径。
通过对带权费用图和带权时间图求最短路径,就可以最短道从一城市到另一城市之间最省时间和最省费用的走法3.3.1主函数流程图3.3.2 pri函数流程图图4 pri函数流程图3.3.3增加城市流程图图5 增加城市函数流程图4 系统实现本节介绍了系统实现的开发环境,包括硬件环境,软件环境,以及运行界面展示。
最后显示了该系统实现后每个功能的实现结果4.1开发环境1.硬件环境电脑型号:组装机.处理器: Pentium G630 2.7GHz主板:技嘉H61m—ds2内存: 4G显卡: HD Graphics Family2.软件环境操作系统:Windows XP.开发软件:Microsoft Visual C++ 6.0.4.2运行界面图6 主菜单界面图7 查看城市图8 石家庄到北京火车图9 石家庄到北京飞机图10 管理员界面图11 飞机花费编辑4.3测试用例时间的最少花费和最短时间的铁路乘车路线。
例如:在最短时间路线选择时,如果输入11(北京)和8(广州),系统就会自动给出最短路径为:北京郑州武汉株洲广州。
当输入出错时,系统会提示出错信息,并返回输入窗口让用户重新输入。
5. 总结.构造带权图CreateFlyG CreateCostG和CreateTimeG:T(MAX)=O((MAX)2)通过实习让我了解到任何事情只有努力之后才能完成的更好。
6.参考文献[1] 许卓群等,《数据结构》,高等教育出版社,2000年[2] 刘坤起.张有华.数据结构题型.题集.题解[M].科学出版社 2005年11月附录.源程序#include <windows.h>#include <stdio.h>#include <crtdbg.h>#include <string.h>#include<iostream.h>#include <malloc.h>#define INF 65535 //定义一个最大数定为无穷值#define MAX 23static int c_number=14;static int k=0;static int v=0,z=0,r=0,t=0;typedef struct zhu{int c_cost;int c_time;int f_cost;int f_time;}zhu;zhu m[20],x[20],n[20];typedef int costAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数int Path[MAX+1][MAX+1];//图邻接矩阵从1开始记数typedef struct unDiGraph{int numVerts; //结点costAdj cost; //邻接矩阵}unDiGraph,*UNG; //图的定义typedef struct c_edit{char a[10];}c_edit;c_edit add[10];costAdj B,L;int pr(int i,int j){int h=0;if (j==0){h=i;}else if (j==1){cin>>add[i].a;}switch(h)//运用switch语句。
{case(0):cout<<"";break;case(1) : cout<<"成都 "; break;case(2) : cout<<"西安 ";break;case(3) : cout<<"郑州 ";break;case(4) : cout<<"武汉 ";break;case(5) : cout<<"株洲 ";break;case(6) : cout<<"贵阳 ";break;case(7) : cout<<"柳州 ";break;case(8) : cout<<"广州 ";break;case(9) : cout<<"南宁 ";break;case(10) : cout<<"徐州 ";break;case(11) : cout<<"北京 ";break;case(12) : cout<<"天津 ";break;case(13) : cout<<"上海 ";break;case(14) : cout<<"石家庄 ";break;default:cout<<add[i-14].a;}return 1;}//输出城市列表及相应代码void pri(){int i;cout<<" 城市及其代码"<<endl<<endl<<endl;cout<<" *********************************************************"<<endl; for (i=1;i<=c_number;i++){cout<<i<<".";pr(i,0);}cout<<endl<<"*********************************************************"<<endl<<endl<<endl<< endl<<endl<<endl;}//构造带权(费用)图返回首地址G:unDiGraph *CreateCostG(int o)//火车的花费的存贮和编辑功能{unDiGraph *G;int i,j;int a=0,b=0,f,h=1;if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。