ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:459.36KB ,
资源ID:7067254      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7067254.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(应用数据结构课设最短航空路线求解报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、应用数据结构课设最短航空路线求解报告 学 号: 0120803490426课 程 设 计题 目航空线路最短路径求解学 院管理学院专 业信息管理与信息系统班 级0804班姓 名祝黎指导教师施亚能2010年07月09日课程设计任务书学生姓名: 祝黎 专业班级: 信管0804 指导教师: 施亚能 工作单位: 管理学院 题 目:航空线路最短路径求解初始条件:定义10个城市(自行选择)和至少20条航线(不含中转),要求任意两城市间都可达且至少有2条可选飞行路线。预先定义每条航线的最高定价,航线票价每季度都会有折扣机会,但并非必须,每季度的折扣率由随机函数产生,范围是0.3、0.4、0.5、0.9、1.0

2、。用户从键盘上输入年份,确定该年各季度各航线票价的折扣情况以后,输入月份、起始城市和目的城市名称,程序能显示出最经济的路线选择方案。要求完成的主要任务: (包括课程设计工作量及其技术要求、说明书撰写等具体要求)依题意可知每个结点的度不小于2,航线最高票价可参考实际情况,从网上直接搜索。本程序不考虑机场建设费和燃油附加费,只计算机票价格,将其作为路径上的权值处理,耗费矩阵存储结构自行选择。时间安排:序号设计内容所用时间1问题分析和任务定义0.5天2数据类型和系统设计0.5天3编码实现和静态检查3天4上机准备和上机调试2天5总结和整理设计报告1天合 计7天指导教师签名: 施亚能 2010年 07月

3、03日系主任(或责任教师)签名: 2010年 07月09日1. 需求分析该程序是一个航空最短路径求解的程序,其中程序中定义10个城市和24条航线(不含中转),任意两城市间都可达且至少有2条可选飞行路线。程序预先用邻接表定义并存储了每条航线的最高定价,航线票价每季度都会有折扣机会,每季度的折扣率由随机函数产生,范围是0.3、0.4、0.5、0.9、1.0。用户从键盘上输入年份,确定该年各季度各航线票价的折扣情况以后,输入月份,系统就输出相应的折扣,用户再输入起始城市和目的城市名称,程序能显示出最经济的路线选择方案。程序拥有很清晰的人机界面,其中包括1.查看城市:将预先存储和管理员后来添加的城市一

4、一输出。 2.选择最短时间路线:每一条航线都对应一个预先定义的时间,该操作会为用户选择花时最短的路线,并附带该路线所需费用。3.选择最节约费用路线:每一天航线都预先定义存储了对应的费用,当用户选择对应的月份后,系统会输出相应的折扣,该操作会为用户选择花费最少的航线,并附带该路线所需时间。4.管理员程序:当然一个好的程序肯定不是一个死程序,也就是它可以随时修改,该操作又包含了4个子操作:(1)添加城市 (2)添加或编辑飞机费用 (3)添加或编辑飞机时间 (4)返回主菜单。5.退出程序。本程序运用了图的知识,构造了无向带权费用图和无向带权时间图。(如图1,图2所示) 图1 无向带权费用图 图2 无

5、向带权时间图 部分截图1.主菜单截图2.查看城市3.最低费用查询4.最短时间查询5.添加城市6.飞机花费编辑2. 概要设计1.数据结构本程序运用了关于图这种数据结构,它的抽象数据类型定义如下:typedef struct unDiGraph int numVerts; /结点 costAdj cost; /邻接矩阵unDiGraph,*UNG;基本操作:unDiGraph* CreateCostG()操作结果:构造带权(费用)图。unDiGraph* CreateTimeG()操作结果:构造带权(时间)图。PathMat *Floyed(unDiGraph *D)操作结果:Floyed函数 求

6、任意两点的最短路径。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

7、 #define INF 65535 /定义一个最大数定为无穷值#define MAX 23typedef int costAdjMAX+1MAX+1;/图邻接矩阵从1开始记数int PathMAX+1MAX+1;/图邻接矩阵从1开始记数typedef struct unDiGraph int numVerts; /结点 costAdj cost; /邻接矩阵unDiGraph,*UNG; /图的定义costAdj B,L;void pr(int i)/选择城市void pri()/输出城市unDiGraph *CreateCostG()/构造带权(费用)图 返回首地址G:unDiGraph

8、*CreateTimeG()/构造带权(时间)图 返回首地址G:unDiGraph *CreateFlyG()/飞机的相关信息void Floyed(unDiGraph *D,unDiGraph *M) /Floyed函数 求任意两点的最短路径:void prn_pass(int i,int j) /为了求从i到j的最短路径,只需要调用如下的过程voidf_ time()/求最少时间路径。void f_money()/求最少花费路径void administrator()/管理员功能void main()/main函数2.伪码算法(1)pr() 选择城市begin0=hIf j=0 then

9、h=iElse if j=1 input addi.aSwitch 条件选择 print 城市名End(2)pri() 输出城市beginPrint 城市代码1=iWhile ia,0=b,1=hG=(unDiGraph *)malloc(sizeof(unDiGraph)If !G then NULL1=iWhile ic_number+1 While j G-costij 初始化使G-costij为无穷。c_number =G-numVerts 为各条航线赋权值(时间值)if (o) then while(h=1) t+1=t调用pri()函数 print飞机时间编辑 print请输入开始

10、城市的代码 input a print请输入结尾城市的代码 input b printf请输入你的两地时间 input mt.f_time a =nt.f_time b= xt.f_time print请选择 print 1:继续更改城市时间 print 0:返回上一级菜单 input h switch(h) case 1: 1=h break; case 0: 0=h break; default: print选择出错 t+1 =fwhile (t-) mt+1.f_time =G-costnt+1.f_timext+1.f_timeF=t return(G);End(4) Floyed(u

11、nDiGraph *D,unDiGraph *M) 函数 Floyed函数求任意两点的最短路径Beginc_number=n1=iwhile(ijwhile(jcostij=Aij 初始化矩阵A。 M-costij=Cij -1=Pathij 初始化矩阵p, 置-1. for(k=1;k=n;k+) 为逐步加入的中间结点 for(i=1;i=n;i+) i为A中行号 for(j=1;j=n;j+) if(Aik+AkjAij Cik+Ckj=Cij K= Pathij 若i经过k到j比i到j小,则令Aij=Aik+Akj。 Aij=Bij Cij=Lij else Aij=Bij Cij=Li

12、j print最短路径为:End(5) prn_pass(int i,int j) 输出最短路径所经过的点Begin If ( Pathij!=-1)递归调用prn_pass(i,Pathij)调用pr(Pathij,0)End(6) f_time(int m) 飞机最短时间路径函数Begin1=hwhile(h=1) print请输入起始城市和目的城市的代码,中间以空格隔开,范围(1- %d),c_numberinput Bcityinput Ecity 输入起始城市和终点城市的代码。 if (!(0Bcity&Bcityc_number+1)&(0Ecity&Ecity5000|LBcit

13、yEcity10000) then print两地间还没有线路通过 else (float)m/10*LBcityEcity= money Print“打折前的费用是%d元n,LBcityEcity Print 飞机花的费用是%d元n,(int)money Print 飞机花的最短时间是%d小时n,BBcityEcity Print 1.继续最少花费查找n 2.返回主菜单n 清选择. input l 输入1或2选择是否继续。 1=h End(7) year_month()函数 选择折扣Begin srand(unsigned)time(NULL) 随机种子调用 pri() 输出城市列表及相应代

14、码。 print请输入年份: input year for(i=1;idiscounti-1 产生310之间的随机数 print %2d月的折扣是: ,i printf %2d折n,discounti-1 Print 请选择月份.(请在1-12之间选择) Input month if(1=month=12) then print 你选择的是%d月,折扣是%dn,month,discountmonth-1 else print 输入出错,请重新输入! return discountmonth-1End4. 调试分析1.问题与解决办法(1)scanf(%s,&addi.a) 和 printf(%s

15、 ,addi-10.a)在编写程序阶段,我最开始编写这两个函数的时候是scanf(%c,&addi.a) printf(%c ,addi-10.a) ,当时没有看清addi.a最初的定义,它其实是一个字符数组,所以在运行的时候老出错,后面慢慢研究和调试才知道在输入和输出的格式占位符应该用%s.(2)printf 中中文与变量一起输出的例子例如printf(请输入起始城市和目的城市的代码,中间以空格隔开,范围(1-%d),c_number);我在调试的时候,系统一直报错,当时我看了半天都没看出错误在哪,后来通过网上查阅资料,请教学长和不断地调试验证,终于知道%d之间的引号应该去掉,因为print

16、f的第一个参数是一个字符串 。(3)声明变量语句的位置我在运行的过程中一直出现这个错误(见下图),系统报错说未定义变量,但我确实定义过了,后来请教高年级的学长才知道要把声明变量的语句得放到函数的最前面,而printf要放在所有变量声明语句后面。修改程序之后,那些错误果然没有了。(4)随机函数的编写因为我们使用随机函数的次数很少,所以对其不时很了解。刚开始的时候都不会写,后来在网上找实例,才知道其用法# include # include /*需引用的头文件*/srand(unsigned)time(NULL); /*随机种子*/n=rand()%(x-y+1)+y; /*产生yx之间的随机数*

17、/然后我就借用此函数构造了随机打折的函数,但是在构造的过程中,我又忽略了一个问题,那就是随机函数只能产生整数随机数,我最开始的目的是构造0.31之间的随机数,所以定义的变量时float型,后来运行不通过,仔细思考之后才知道该随机函数只能产生310之间的数,修改变量定义之后就可以运行成功了。2.时间复杂度1.构造带权图CreateFlyG CreateCostG和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)

18、; 即存放n2个节点数据辅助空间。4.经验和体会自学习C语言以来,我们就没怎么练习上机实践能力,所以对于代码的敏感度不够,一个错误出现了,不是很容易发现。在这次课程设计中,我就犯了很多高手认为很基础的错误,比如说:printf函数的用法,变量声明的位置,还有就是指针数组的用法。犯错误是不可避免的,但是我们要认真地去发现错误和修改错误。我在运行后,知道自己的程序有错误,我首先一步一步慢慢看,慢慢分析,在整个程序中找不出来就将该部分分离出去进行测试,这样,就很容易找到问题所在了。当然请教别人也是一个学习的方法,如果自己很长时间也找不出错误,何不请教高年级的学长呢。在这次的课程设计中,我也请教过大三

19、的学长还有老师,虽然他们只是给了提示,但真的是我懂了不少。5. 用户使用说明运行程序,用户会看到该程序的主界面。由用户输入数字,选择相应的操作。1.查看城市 输出所有的城市及其代码。2.选择最短时间路线 输出所有的城市及其代码 请输入年份 输出每月对应的折扣 请选择月份.(请在1-12之间选择) 请输入起始城市和目的城市的代码,中间以空格隔开,范围(1- %d) 输出最短路径和飞机最短时间及花费3. 选择最低花费路线 输出所有的城市及其代码 请输入年份 输出每月对应的折扣 请选择月份.(请在1-12之间选择) 请输入起始城市和目的城市的代码,中间以空格隔开,范围(1- %d) 输出最短路径和飞

20、机最低花费及时间4. 管理员程序 输出管理员程序子菜单 请选择 (1)增加城市 请输入要增加的个数 请输入你要增加的城市名 城市增加完毕 (2)添加或编辑飞机费用 输出所有的城市及其代码 飞机花费编辑 请输入开始和结尾城市代码 请输入两地花费 (3)添加或编辑飞机时间 输出所有的城市及其代码 飞机时间编辑 请输入开始和结尾城市代码 请输入两地时间 (4)返回主菜单5.退出程序6. 测试结果1.开始界面2.查看城市(这是原始存储的城市)3.最短时间查询。以输入年份2009为例,选择1月,对应的折扣是4折,起始城市是1,目的城市是2最短路径是 成都 西安 打折前的费用是840元,打折后336元,最

21、短时间是2个小时4.选择2,返回主菜单,选择3.选择最节约费用路线,以输入2010年为例,对应的折扣如下图,选择2月份,折扣是6折,起始城市是1,目的城市是2,最短路径是 成都 西安 打折前的费用是840元,打折后的最少费用是336元,花费的时间是2小时。5.返回主菜单,4.添加城市。界面如下。6.添加或编辑飞机费用7.添加城市后,进行最少费用查询7. 附录#include #include # include # include /*需引用的头文件*/#define INF 65535 /定义一个最大数定为无穷值#define MAX 23static int c_number=10;sta

22、tic int k=0;static int v=0,z=0,r=0,t=0;typedef struct zhu int f_cost; int f_time;zhu;zhu m20,x20,n20;typedef int costAdjMAX+1MAX+1;/图邻接矩阵从1开始记数int PathMAX+1MAX+1;/图邻接矩阵从1开始记数typedef struct unDiGraph int numVerts; /结点 costAdj cost; /邻接矩阵unDiGraph,*UNG; /图的定义typedef struct c_editchar a10;c_edit;c_edit

23、 add10;costAdj B,L;int pr(int i,int j) int h=0;if (j=0) h=i;else if (j=1) scanf(%s,&addi.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) :

24、printf(贵阳 ); break; case(7) : printf(北京 ); break; case(8) : printf(天津 ); break; case(9) : printf(上海 ); break; case(10) : printf(徐州 ); break; default: printf(%s ,addi-10.a); return 1;/输出城市列表及相应代码void pri() int i; printf( 城市及其代码 nnn); printf(*n); for (i=1;i=c_number;i+) printf(%d,i); printf(.); pr(i,0

25、); printf(n); printf(*nnnnnn);/构造带权(时间)图 返回首地址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;ic_number+1;i+) for(j=1;jcostij=INF;/初始化使G-costij为无穷。 G-numVerts=c_number; G-cost16=G-cost61=3; G-cost12=G-cost21=2; G-cost23=G-cost32=1; G-cost34=G-cost43=2; G-cost45=G-cost54=4; G-cost56=G-cost65=3; G-cost37=G-cost73=6; G-cost78=G-cost87=1; G-cost810=G-cost108=2; G-c

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

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