标准文案
国交通模拟系统课程设计报告
姓名: 唐文龙 班级: 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.3.2 pri函数流程图
标准文案
实用文档
图4 pri函数流程图 3.3.3 增加城市流程图
标准文案
实用文档
图5 增加城市函数流程图
4 系统实现
本节介绍了系统实现的开发环境,包括硬件环境,软件环境,以及运行界面展示。最后显示了该系统实现后每个功能的实现结果
标准文案
实用文档
4.1开发环境
1.硬件环境
电脑型号: 组装机. 处理器: Pentium G630 2.7GHz 主板: 技嘉H61m—ds2 内存: 4G
显卡: HD Graphics Family 2.软件环境
操作系统: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 #include #define INF 65535 //定义一个最大数定为无穷值 #define MAX 23 static 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< //输出城市列表及相应代码 void pri() { int i; cout<<\" 城市及其代码\"< unDiGraph *CreateCostG(int o)//火车的花费的存贮和编辑功能 { unDiGraph *G; int i,j; int a=0,b=0,f,h=1; if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。 标准文案 实用文档 { return(NULL); } for(i=1;i G->numVerts=c_number; G->cost[1][6]=G->cost[6][1]=96; G->cost[1][2]=G->cost[2][1]=84; G->cost[2][3]=G->cost[3][2]=51; G->cost[3][4]=G->cost[4][3]=53; G->cost[4][5]=G->cost[5][4]=40; G->cost[5][6]=G->cost[6][5]=90; G->cost[5][8]=G->cost[8][5]=67; G->cost[5][7]=G->cost[7][5]=67; G->cost[6][7]=G->cost[7][6]=60; G->cost[7][9]=G->cost[9][7]=25; G->cost[3][11]=G->cost[11][3]=69; G->cost[11][12]=G->cost[12][11]=13; G->cost[12][10]=G->cost[10][12]=67; G->cost[3][10]=G->cost[10][3]=34; G->cost[13][10]=G->cost[10][13]=65; G->cost[13][5]=G->cost[5][13]=118; G->cost[14][11]=G->cost[11][14]=43; G->cost[14][2]=G->cost[2][14]=110; G->cost[14][3]=G->cost[3][14]=60; if (o) { while(h==1) { v=v+1; pri(); cout<<\"火车花费编辑\"< cout<<\"请输入结尾城市的代码\"< cout<<\"请输入你的两地花费\"< 实用文档 cin>>m[v].c_cost; n[v].c_cost=a; x[v].c_cost=b; cout<<\"请选择\"< switch(h) { case 1: h=1; break; case 0: h=0; break; default:{ cout<<\"选择出错\"< while (v--) { G->cost[n[v].c_cost][x[v].c_cost]=m[v].c_cost; } v=f; return(G); } //构造带权(时间)图 返回首地址G: unDiGraph *CreateTimeG(int o)//火车的时间的存贮和编辑功能 { unDiGraph *G; 标准文案 实用文档 int i,j; int a=0,b=0,f,h=1; if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。 { return(NULL); } for(i=1;i G->numVerts=c_number; G->cost[1][6]=G->cost[6][1]=9; G->cost[1][2]=G->cost[2][1]=8; G->cost[2][3]=G->cost[3][2]=5; G->cost[3][4]=G->cost[4][3]=5; G->cost[4][5]=G->cost[5][4]=4; G->cost[5][6]=G->cost[6][5]=9; G->cost[5][7]=G->cost[7][5]=6; G->cost[5][8]=G->cost[8][5]=6; G->cost[6][7]=G->cost[7][6]=6; G->cost[7][9]=G->cost[9][7]=2; G->cost[3][11]=G->cost[11][3]=6; G->cost[11][12]=G->cost[12][11]=1; G->cost[12][10]=G->cost[10][12]=6; G->cost[3][10]=G->cost[10][3]=3; G->cost[13][10]=G->cost[10][13]=6; G->cost[13][5]=G->cost[5][13]=11; G->cost[14][11]=G->cost[11][14]=3; G->cost[14][2]=G->cost[2][14]=7; G->cost[14][3]=G->cost[3][14]=3; if (o) { while(h==1) { z=z+1; pri(); cout<<\"火车时间编辑\"< cout<<\"请输入结尾城市的代码\"< 实用文档 cin>>b; cout<<\"请输入你的两地时间\"< cout<<\"请选择\"< switch(h) { case 1: h=1; break; case 0: h=0; break; default:{ cout<<\"选择出错\"< while (z--) { G->cost[n[z].c_time][x[z].c_time]=m[z].c_time; } z=f; return(G); } unDiGraph *CreateTimeF(int o)//飞机的时间的存贮和编辑功能 { unDiGraph *G; int i,j; 标准文案 实用文档 int a=0,b=0,f,h=1; if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。 { return(NULL); } for(i=1;i G->numVerts=c_number; G->cost[1][6]=G->cost[6][1]=3; G->cost[1][2]=G->cost[2][1]=2; G->cost[2][3]=G->cost[3][2]=1; G->cost[3][4]=G->cost[4][3]=2; G->cost[4][5]=G->cost[5][4]=4; G->cost[5][6]=G->cost[6][5]=3; G->cost[5][7]=G->cost[7][5]=6; G->cost[5][8]=G->cost[8][5]=6; G->cost[6][7]=G->cost[7][6]=6; G->cost[7][9]=G->cost[9][7]=2; G->cost[3][11]=G->cost[11][3]=6; G->cost[11][12]=G->cost[12][11]=1; G->cost[12][10]=G->cost[10][12]=2; G->cost[3][10]=G->cost[10][3]=3; G->cost[13][10]=G->cost[10][13]=6; G->cost[13][5]=G->cost[5][13]=4; G->cost[14][11]=G->cost[11][14]=1; G->cost[14][2]=G->cost[2][14]=3; G->cost[14][3]=G->cost[3][14]=1; if (o) { while(h==1) { t=t+1; pri(); cout<<\"飞机时间编辑\"< cout<<\"请输入结尾城市的代码\"< 实用文档 cin>>b; cout<<\"请输入你的两地时间\"< cout<<\"请选择\"< switch(h) { case 1: h=1; break; case 0: h=0; break; default:{ cout<<\"选择出错\"< while (t--) { G->cost[n[t].f_time][x[t].f_time]=m[t].f_time; } t=f; return(G); } unDiGraph *CreateCostF(int o)//飞机花费的存贮和编辑功能 { 标准文案 实用文档 unDiGraph *G; int i,j; int a=0,b=0,f,h=1; if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。 { return(NULL); } for(i=1;i G->numVerts=c_number; G->cost[1][6]=G->cost[6][1]=960; G->cost[1][2]=G->cost[2][1]=840; G->cost[2][3]=G->cost[3][2]=501; G->cost[3][4]=G->cost[4][3]=530; G->cost[4][5]=G->cost[5][4]=400; G->cost[5][6]=G->cost[6][5]=900; G->cost[5][8]=G->cost[8][5]=670; G->cost[5][7]=G->cost[7][5]=670; G->cost[6][7]=G->cost[7][6]=600; G->cost[7][9]=G->cost[9][7]=200; G->cost[3][11]=G->cost[11][3]=690; G->cost[11][12]=G->cost[12][11]=310; G->cost[12][10]=G->cost[10][12]=670; G->cost[3][10]=G->cost[10][3]=340; G->cost[13][10]=G->cost[10][13]=650; G->cost[13][5]=G->cost[5][13]=1180; G->cost[14][11]=G->cost[11][14]=340; G->cost[14][2]=G->cost[2][14]=700; G->cost[14][3]=G->cost[3][14]=400; 标准文案 实用文档 if (o) { while(h==1) { r=r+1; pri(); cout<<\"飞机花费编辑\"< cout<<\"请输入结尾城市的代码\"< cout<<\"请输入你的两地花费\"< cout<<\"请选择\"< switch(h) { case 1: h=1; break; case 0: h=0; break; default:{
因篇幅问题不能全部显示,请点此查看更多更全内容