应用数据结构课设最短航空路线求解报告.docx

上传人:b****6 文档编号:7067254 上传时间:2023-01-16 格式:DOCX 页数:36 大小:459.36KB
下载 相关 举报
应用数据结构课设最短航空路线求解报告.docx_第1页
第1页 / 共36页
应用数据结构课设最短航空路线求解报告.docx_第2页
第2页 / 共36页
应用数据结构课设最短航空路线求解报告.docx_第3页
第3页 / 共36页
应用数据结构课设最短航空路线求解报告.docx_第4页
第4页 / 共36页
应用数据结构课设最短航空路线求解报告.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

应用数据结构课设最短航空路线求解报告.docx

《应用数据结构课设最短航空路线求解报告.docx》由会员分享,可在线阅读,更多相关《应用数据结构课设最短航空路线求解报告.docx(36页珍藏版)》请在冰豆网上搜索。

应用数据结构课设最短航空路线求解报告.docx

应用数据结构课设最短航空路线求解报告

学号:

0120803490426

课程设计

 

题目

航空线路最短路径求解

学院

管理学院

专业

信息管理与信息系统

班级

0804班

姓名

祝黎

指导教师

施亚能

 

2010

07

09

课程设计任务书

学生姓名:

祝黎专业班级:

信管0804

指导教师:

施亚能工作单位:

管理学院

题目:

航空线路最短路径求解

初始条件:

定义10个城市(自行选择)和至少20条航线(不含中转),要求任意两城市间都可达且至少有2条可选飞行路线。

预先定义每条航线的最高定价,航线票价每季度都会有折扣机会,但并非必须,每季度的折扣率由随机函数产生,范围是0.3、0.4、0.5、……、0.9、1.0。

用户从键盘上输入年份,确定该年各季度各航线票价的折扣情况以后,输入月份、起始城市和目的城市名称,程序能显示出最经济的路线选择方案。

要求完成的主要任务:

(包括课程设计工作量及其技术要求、说明书撰写等具体要求)

依题意可知每个结点的度不小于2,航线最高票价可参考实际情况,从网上直接搜索。

本程序不考虑机场建设费和燃油附加费,只计算机票价格,将其作为路径上的权值处理,耗费矩阵存储结构自行选择。

时间安排:

序号

设计内容

所用时间

1

问题分析和任务定义

0.5天

2

数据类型和系统设计

0.5天

3

编码实现和静态检查

3天

4

上机准备和上机调试

2天

5

总结和整理设计报告

1天

合计

7天

指导教师签名:

施亚能2010年07月03日

系主任(或责任教师)签名:

2010年07月09日

1.需求分析

该程序是一个航空最短路径求解的程序,其中程序中定义10个城市和24条航线(不含中转),任意两城市间都可达且至少有2条可选飞行路线。

程序预先用邻接表定义并存储了每条航线的最高定价,航线票价每季度都会有折扣机会,每季度的折扣率由随机函数产生,范围是0.3、0.4、0.5、……、0.9、1.0。

用户从键盘上输入年份,确定该年各季度各航线票价的折扣情况以后,输入月份,系统就输出相应的折扣,用户再输入起始城市和目的城市名称,程序能显示出最经济的路线选择方案。

程序拥有很清晰的人机界面,其中包括1.查看城市:

将预先存储和管理员后来添加的城市一一输出。

2.选择最短时间路线:

每一条航线都对应一个预先定义的时间,该操作会为用户选择花时最短的路线,并附带该路线所需费用。

3.选择最节约费用路线:

每一天航线都预先定义存储了对应的费用,当用户选择对应的月份后,系统会输出相应的折扣,该操作会为用户选择花费最少的航线,并附带该路线所需时间。

4.管理员程序:

当然一个好的程序肯定不是一个死程序,也就是它可以随时修改,该操作又包含了4个子操作:

(1)添加城市

(2)添加或编辑飞机费用(3)添加或编辑飞机时间(4)返回主菜单。

5.退出程序。

本程序运用了图的知识,构造了无向带权费用图和无向带权时间图。

(如图1,图2所示)

图1无向带权费用图图2无向带权时间图

部分截图

1.主菜单截图

2.查看城市

3.最低费用查询

4.最短时间查询

5.添加城市

6.飞机花费编辑

2.概要设计

1.数据结构

本程序运用了关于图这种数据结构,它的抽象数据类型定义如下:

typedefstructunDiGraph

{

intnumVerts;//结点

costAdjcost;//邻接矩阵

}unDiGraph,*UNG;

基本操作:

unDiGraph*CreateCostG()

操作结果:

构造带权(费用)图。

unDiGraph*CreateTimeG()

操作结果:

构造带权(时间)图。

PathMat*Floyed(unDiGraph*D)

操作结果:

Floyed函数求任意两点的最短路径。

2.主程序流程

 

Floyed()pr(i,0)add_city()Floyed()

pr(Bcity,0)edit_fline()pr(Bcity,0)

prn_pass(Bcity,Ecity)edit_fhour()prn_pass(Bcity,Ecity)

pr(Ecity,0)pr(Ecity,0)

3.详细设计

1.程序模块

1.程序是用dos版做的界面。

2.主界面包括

1.查看城市2.选择飞机最短时间路线3.选择飞机最节约费用路线

4.管理员程序确5.退出本程序

3.程序的模块为

#include

#include

#include

#include

#defineINF65535//定义一个最大数定为无穷值

#defineMAX23

typedefintcostAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数

intPath[MAX+1][MAX+1];//图邻接矩阵从1开始记数

typedefstructunDiGraph

{

intnumVerts;//结点

costAdjcost;//邻接矩阵

}unDiGraph,*UNG;//图的定义

costAdjB,L;

voidpr(inti)//选择城市

voidpri()//输出城市

unDiGraph*CreateCostG()//构造带权(费用)图返回首地址G:

unDiGraph*CreateTimeG()//构造带权(时间)图返回首地址G:

unDiGraph*CreateFlyG()//飞机的相关信息

voidFloyed(unDiGraph*D,unDiGraph*M)//Floyed函数求任意两点的最短路径:

voidprn_pass(inti,intj)//为了求从i到j的最短路径,只需要调用如下的过程

voidf_time()//求最少时间路径。

voidf_money()//求最少花费路径

voidadministrator()//管理员功能

voidmain()//main函数

2.伪码算法

(1)pr()选择城市

begin

0=>h

Ifj=0thenh=i

Elseifj=1inputadd[i].a

Switch条件选择print城市名

End

 

(2)pri()输出城市

begin

Print城市代码

1=>i

Whilei<=c_number

{

Printi

调用pr()函数

}

End

 

(3)CreateTimeF()飞机的时间的存贮和编辑功能函数

Begin

0=>a,0=>b,1=>h

G=(unDiGraph*)malloc(sizeof(unDiGraph)

If!

GthenNULL

1=>i

Whilei

{

Whilej

INF=>G->cost[i][j]初始化使G->cost[i][j]为无穷。

}

c_number=>G->numVerts

为各条航线赋权值(时间值)

if(o)thenwhile(h==1)

{

t+1=>t

调用pri()函数

print飞机时间编辑

print请输入开始城市的代码

inputa

print请输入结尾城市的代码

inputb

printf请输入你的两地时间

inputm[t].f_time

a=>n[t].f_time

b=>x[t].f_time

print请选择\

print1:

继续更改城市时间

print0:

返回上一级菜单

inputh

switch(h){

case1:

1=>h

break;

case0:

0=>h

break;

default:

{

print选择出错

}

}

t+1=>f

while(t--)

{

m[t+1].f_time=>G->cost[n[t+1].f_time][x[t+1].f_time]

}

F=>t

return(G);

}

End

 

(4)Floyed(unDiGraph*D,unDiGraph*M)函数Floyed函数求任意两点的最短路径

Begin

c_number=>n

1=>i

while(i<=n)

{

1=>j

while(j<=n)

{

D->cost[i][j]=>A[i][j]初始化矩阵A。

M->cost[i][j]=>C[i][j]

-1=>Path[i][j]初始化矩阵p,置-1.

}

}

for(k=1;k<=n;k++)为逐步加入的中间结点

{

for(i=1;i<=n;i++)i为A中行号

{

for(j=1;j<=n;j++)

if(A[i][k]+A[k][j]

then{A[i][k]+A[k][j]=>A[i][j]

C[i][k]+C[k][j]=>C[i][j]

K=>Path[i][j]若i经过k到j比i到j小,则令A[i][j]=A[i][k]+A[k][j]。

A[i][j]=>B[i][j]

C[i][j]=>L[i][j]

}

else{

A[i][j]=>B[i][j]

C[i][j]=>L[i][j]

}

}

}

print最短路径为:

End

(5)prn_pass(inti,intj)输出最短路径所经过的点

Begin

If(Path[i][j]!

=-1)

{

递归调用prn_pass(i,Path[i][j])

调用pr(Path[i][j],0)

}

End

(6)f_time(intm)飞机最短时间路径函数

Begin

1=>h

while(h==1)

{

print请输入起始城市和目的城市的代码,中间以空格隔开,范围(1--%d)",c_number

inputBcity

inputEcity输入起始城市和终点城市的代码。

if(!

((0

=Ecity))

thenprint出错啦!

!

!

Floyed(CreateTimeF(0),CreateCostF(0))调用Floyed函数。

pr(Bcity,0)显示起始城市。

prn_pass(Bcity,Ecity)调用prn_pass函数,显示最短路径经过的城市。

pr(Ecity,0)显示终点城市。

if(B[Bcity][Ecity]>5000||L[Bcity][Ecity]>10000)

thenprint两地间还没有线路通过

else

{

(float)m/10*L[Bcity][Ecity]=>money

Print“打折前的费用是%d元\n",L[Bcity][Ecity]

Print"飞机花的费用是%d元\n",(int)money

Print"飞机花的最短时间是%d小时\n",B[Bcity][Ecity]

}

Print1.继续最少花费查找\n2.返回主菜单\n清选择...

inputl输入1或2选择是否继续。

1=>h

}

End

(7)year_month()函数选择折扣

Begin

srand((unsigned)time(NULL))随机种子

调用pri()输出城市列表及相应代码。

print请输入年份:

inputyear

for(i=1;i<=12;i++)

{

rand()%(10-3+1)+3=>discount[i-1]产生3~10之间的随机数

print"%2d月的折扣是:

",i

printf"%2d折\n",discount[i-1]

}

Print请选择月份....(请在1-12之间选择)

Inputmonth

if(1<=month<=12)

thenprint"你选择的是%d月,折扣是%d\n",month,discount[month-1]

else

print输入出错,请重新输入!

returndiscount[month-1]

End

4.调试分析

1.问题与解决办法

(1)scanf("%s",&add[i].a)和printf("%s",add[i-10].a)

在编写程序阶段,我最开始编写这两个函数的时候是scanf("%c",&add[i].a)printf("%c",add[i-10].a),当时没有看清add[i].a最初的定义,它其实是一个字符数组,所以在运行的时候老出错,后面慢慢研究和调试才知道在输入和输出的格式占位符应该用%s.

(2)printf中中文与变量一起输出的例子

例如printf("请输入起始城市和目的城市的代码,中间以空格隔开,范围(1--"%d")", c_number);

我在调试的时候,系统一直报错,当时我看了半天都没看出错误在哪,后来通过网上查阅资料,请教学长和不断地调试验证,终于知道%d之间的引号应该去掉,因为printf的第一个参数是一个字符串。

(3)声明变量语句的位置

我在运行的过程中一直出现这个错误(见下图),系统报错说未定义变量,但我确实定义过了,后来请教高年级的学长才知道要把声明变量的语句得放到函数的最前面,而printf要放在 所有变量声明语句后面。

修改程序之后,那些错误果然没有了。

(4)随机函数的编写

因为我们使用随机函数的次数很少,所以对其不时很了解。

刚开始的时候都不会写,后来在网上找实例,才知道其用法

#include

#include/*需引用的头文件*/

srand((unsigned)time(NULL));/*随机种子*/

n=rand()%(x-y+1)+y;/*产生y~x之间的随机数*/

然后我就借用此函数构造了随机打折的函数,但是在构造的过程中,我又忽略了一个问题,那就是随机函数只能产生整数随机数,我最开始的目的是构造0.3~1之间的随机数,所以定义的变量时float型,后来运行不通过,仔细思考之后才知道该随机函数只能产生3~10之间的数,修改变量定义之后就可以运行成功了。

2.时间复杂度

1.构造带权图CreateFlyGCreateCostG和CreateTimeG:

T(MAX)=O((MAX)2)

2.Floyed函数Floyed:

T(n)=O(n2+n3)

3.显示路径函数prn_pass:

T(n)=O(n)

3.空间复杂度

本程序的空间复杂度均为S(n)=(n2);即存放n2个节点数据辅助空间。

4.经验和体会

自学习C语言以来,我们就没怎么练习上机实践能力,所以对于代码的敏感度不够,一个错误出现了,不是很容易发现。

在这次课程设计中,我就犯了很多高手认为很基础的错误,比如说:

printf函数的用法,变量声明的位置,还有就是指针数组的用法。

犯错误是不可避免的,但是我们要认真地去发现错误和修改错误。

我在运行后,知道自己的程序有错误,我首先一步一步慢慢看,慢慢分析,在整个程序中找不出来就将该部分分离出去进行测试,这样,就很容易找到问题所在了。

当然请教别人也是一个学习的方法,如果自己很长时间也找不出错误,何不请教高年级的学长呢。

在这次的课程设计中,我也请教过大三的学长还有老师,虽然他们只是给了提示,但真的是我懂了不少。

5.用户使用说明

运行程序,用户会看到该程序的主界面。

由用户输入数字,选择相应的操作。

1.查看城市输出所有的城市及其代码。

2.选择最短时间路线输出所有的城市及其代码请输入年份输出每月对应的折

扣请选择月份....(请在1-12之间选择)请输入起始城市和目的城市的代码,中间以空格隔开,范围(1--%d)输出最短路径和飞机最短时间及花费

3.选择最低花费路线输出所有的城市及其代码请输入年份输出每月对应的折

扣请选择月份....(请在1-12之间选择)请输入起始城市和目的城市的代码,中间以空格隔开,范围(1--%d)输出最短路径和飞机最低花费及时间

4.管理员程序输出管理员程序子菜单请选择

(1)增加城市请输入要增加的个数请输入你要增加的城市名城市增加完毕

(2)添加或编辑飞机费用输出所有的城市及其代码飞机花费编辑请输入开始和结尾城市代码请输入两地花费

(3)添加或编辑飞机时间输出所有的城市及其代码飞机时间编辑请输入开始和结尾城市代码请输入两地时间

(4)返回主菜单

5.退出程序

6.测试结果

1.开始界面

2.查看城市(这是原始存储的城市)

3.最短时间查询。

以输入年份2009为例,选择1月,对应的折扣是4折,起始城市是1,目的城市是2最短路径是成都西安打折前的费用是840元,打折后336元,最短时间是2个小时

4.选择2,返回主菜单,选择3.选择最节约费用路线,以输入2010年为例,对应的折扣如下图,选择2月份,折扣是6折,起始城市是1,目的城市是2,最短路径是成都西安打折前的费用是840元,打折后的最少费用是336元,花费的时间是2小时。

5.返回主菜单,4.添加城市。

界面如下。

6.添加或编辑飞机费用

7.添加城市后,进行最少费用查询

7.附录

#include

#include

#include

#include/*需引用的头文件*/

#defineINF65535//定义一个最大数定为无穷值

#defineMAX23

staticintc_number=10;

staticintk=0;

staticintv=0,z=0,r=0,t=0;

typedefstructzhu

{

intf_cost;

intf_time;

}zhu;

zhum[20],x[20],n[20];

typedefintcostAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数

intPath[MAX+1][MAX+1];//图邻接矩阵从1开始记数

typedefstructunDiGraph

{

intnumVerts;//结点

costAdjcost;//邻接矩阵

}unDiGraph,*UNG;//图的定义

typedefstructc_edit

{

chara[10];

}c_edit;

c_editadd[10];

costAdjB,L;

intpr(inti,intj)

{

inth=0;

if(j==0){

h=i;

}

elseif(j==1)

{

scanf("%s",&add[i].a);

}

switch(h)//运用switch语句。

{

case(0):

printf("");

break;

case

(1):

printf("成都");

break;

case

(2):

printf("西安");

break;

case(3):

printf("郑州");

break;

case(4):

printf("武汉");

break;

case(5):

printf("株洲");

break;

case(6):

printf("贵阳");

break;

case(7):

printf("北京");

break;

case(8):

printf("天津");

break;

case(9):

printf("上海");

break;

case(10):

printf("徐州");

break;

default:

printf("%s",add[i-10].a);

}

return1;

}

//输出城市列表及相应代码

voidpri()

{

inti;

printf("城市及其代码\n\n\n");

printf("**********************************************************\n");

for(i=1;i<=c_number;i++)

{

printf("%d",i);

printf(".");

pr(i,0);

}

printf("\n");

printf("**********************************************************\n\n\n\n\n\n");

}

//构造带权(时间)图返回首地址G:

unDiGraph*CreateTimeF(into)//飞机的时间的存贮和编辑功能

{

unDiGraph*G;

inti,j;

inta=0,b=0,f,h=1;

if(!

(G=(unDiGraph*)malloc(sizeof(unDiGraph))))//为G分配存储空间。

{

return(NULL);

}

for(i=1;i

{

for(j=1;j

{

G->cost[i][j]=INF;//初始化使G->cost[i][j]为无穷。

}

}

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[3][7]=G->cost[7][3]=6;

G->cost[7][8]=G->cost[8][7]=1;

G->cost[8][10]=G->cost[10][8]=2;

G->c

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1