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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

最便宜航空路线求解.docx

1、最便宜航空路线求解 学 号: 课 程 设 计题 目 最便宜航空线路求解学 院管理学院专 业信息管理与信息系统班 级姓 名指导教师2014年07月03日课程设计任务书学生: 专业班级: 信管 指导教师: 工作单位: 管理学院 题 目:最便宜航空线路求解初始条件:【问题描述】飞机是远途旅行必不可少的工具,但是高昂的价格也令人颇费思量,因此人们往往宁愿用时间来换金钱而选择较慢的交通工具。不过,当航班线路变得丰富之后,人们也发现很多时候选择直达航班往往并非最省钱的路径,比如飞往美国选择从国转机就比直飞要便宜多了(虽然这样有坠机的危险)。这样一来,当采用曲线行进能达到省钱也省时间的目的时,坐飞机还是可以

2、接受的。为了能够更好地解决路径的选择问题,我们模拟一下通过合适的算法来选出最优航空线路。参考flight.qunar./上的数据,自选至少10个城市和至少20条航线(不含中转),要求任意两城市间都可达(这并不意味着两个城市之间就一定有直飞航班,比如大陆到),且至少有2条可选飞行路线。预先定义每条航线的最高定价,航线票价每季度都有折扣机会,但并非必须。每条线路每季度的折扣率由随机函数产生,围是0.201.0(小数点后取两位)。要求完成的主要任务: (包括课程设计工作量及其技术要求、说明书撰写等具体要求)本程序不考虑机场建设费和燃油附加费,只计算机票价格,将其作为路径上的权值处理,耗费矩阵存储结构

3、自行选择。在真实的情形中,同一线路每天可能有许多航班,也可能每周只有一两趟航班,即便同一天的航班早晚价格也可能有所不同。为简便计,假定每条线路每天只有一趟航班,不考虑航空公司的差别。 时间安排:序号设计容所用时间1问题分析和任务定义0.5天2数据类型和系统设计0.5天3编码实现和静态检查3天4上机准备和上机调试2天5总结和整理设计报告1天合 计7天指导教师签名: 2014年 06月25日 系主任(或责任教师)签名: 2014年06月25日最便宜航空线路求解1. 需求分析1.1 基本要求(1)所有原始数据一律事先用文本文件保存,读入数据时从文件获取。(2)航班价格可以用随机函数生成,但建议从网上

4、直接复制真实数据。(3)可输出所有城市名称以及每一城市所有可直飞到达的城市列表。(4)可输出任一指定直飞线路(若没有则显示无直飞航班)四个季度的全票和折扣价格。(5)输入月份、起始城市和目的城市名称,程序能显示出最经济 的中转路线选择方案。1.2 输入 (1)从文件read.txt中读取不同城市之间(共10个城市)不同航线(共24条航线)的最高价格输入,四个季度有相同的最高价格。 (2)每条线路每季度的折扣率由随机函数产生,围是0.201.00(小数点后取两位),四个季度有不同的折扣。 (3)运行程序时需根据要求从键盘输入相应指令,保证程序的正确运行。1.3输出(1)输出所有城市名以及每一城市

5、所有可直飞到达的城市列表(按城市名拼音升序排列):始发地 可直飞目的地 首尔 首尔 台北 (2)输出指定线路四个季度的折扣和全价:输入:-台北输出:无直飞航班输入:-输出:季度 全票价格 折扣 折后价格(不计小数,四舍五入) 1 1240 6.5 806 2 1192 7.0 834 3 1475 4.6 679 4 1230 8.7 1070(3)输入月份、起始城市和目的城市名称,输出最佳方案:输入:5 -台北输出:最佳线路:-,1503,-台北,791,合计2294输入:7 -首尔输出:最佳线路:-,880,-首尔,773,合计1653输入:10 -输出:最佳线路:-,278,合计2781

6、.4测试数据文本文件read.txt容:(1)读文本文件read.txt。若文件名输入正确且文件无错误,则显示主菜单。若文件名输入错误或文件有错误,则显示“打开输入文件出错”。(2)根据主菜单提示选择需要执行的功能。若输入功能序号在04之间,则执行相应的功能。若输入功能序号不在04之间,则显示“出错啦!请在0-4之间选择!”和主菜单,需重新选择。(3)选择1,输出城市列表及相应代码。(4)选择2,输出所有城市名以及每一城市所有可直飞到达的城市列表(按城市名拼音升序排列)。(5)选择3,先显示城市列表及相应代码,方便后面的输入操作,根据提示“请输入起始城市和目的城市的代码,中间以空格隔开,围(1

7、- 10)”输入两个城市代码,若两城市间有直飞航班则显示指定线路四个季度的折扣和全价。若两城市间无直飞航班则显示“无直飞航班”。(6)选择4,显示“请输入月份(请在1-12之间选择):”若月份输入正确,则先显示城市列表及相应代码,方便后面的输入操作,根据提示“请输入起始城市和目的城市的代码,中间以空格隔开,围(1- 10)”输入两个城市代码,若代码输入正确,则显示最佳方案。若月份输入错误,则显示“输入出错”。若城市代码输入错误,则显示“出错啦!”。(7)选择0,则直接退出程序。(8)在每一个功能执行完后,都会提示继续执行还是返回主菜单。1.5无向带权费用图2. 概要设计2.1 抽象数据类型定义

8、本程序运用了关于图这种数据结构,它的抽象数据类型定义如下:typedef struct unDiGraph int numVerts; /结点 costAdj cost; /邻接矩阵unDiGraph,*UNG;基本操作:unDiGraph* CreateCostG()操作结果:构造带权(费用)图。PathMat *Floyed(unDiGraph *D) 操作结果:Floyed函数 求任意两点的最短路径。2.2 主程序流程及各程序模块之间的层次(调用)关系 pr(i,0) Floyed() Floyed() pr(Bcity,0) pr(Bcity,0) prn_pass(Bcity,Eci

9、ty) prn_pass(Bcity,Ecity) pr(Ecity,0) pr(Ecity,0)3. 详细设计3.1 数据类型(1)主界面包括1.查看城市 2.输出所有城市名及所有可直飞到达的城市列表(按城市名拼音升序排列) 3.输入起始城市和目的城市名称,输出指定线路四个季度的折扣和全价 4.输入月份、起始城市和目的城市名称,输出最佳方案 0.退出程序(2)程序的模块为#include #include #include /需引用的头文件#define INF 65535 /定义一个最大数为无穷值,表示两城市之间无直飞航班#define MAX 23typedef int costAdjM

10、AX+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:void Floyed(unDiGraph *D,unDiGraph *M) /Floyed函数 求任意两点的最短路径:void prn_pass(in

11、t i,int j) /为了求从i到j的最短路径,只需要调用如下的过程void f_money1()/输出所有城市名及所有可直飞到达的城市列表(按城市名拼音升序排列)void f_money2()/输入起始城市和目的城市名称,输出指定线路四个季度的折扣和全价 void f_money4()/输入月份、起始城市和目的城市名称,输出最佳方案int LineNumStat(FILE *fp)/统计文本文件的行数void main()/main函数3.2 伪码算法(1)pr() 选择城市begin0=hIf j=0 then h=iElse if j=1 input addi.aSwitch 条件选择

12、 print 城市名End(2)pri() 输出城市beginPrint 城市代码1=iWhile ia,0=b,1=hWuhan10,Beijing10,Xiamen10,Guangzhou10,Dalian10, Shanghai10,Changsha10,Shenzhen10,Zhengzhou10,Tianjin10G=(unDiGraph *)malloc(sizeof(unDiGraph)If !G then NULL1=iWhile ic_number+1 While j G-costij 初始化使G-costij为无穷。c_number =G-numVerts while(!f

13、eof(fp) fscanf fp,%f %f %f %f %f %f %f %f %f %f,&Wuhani,&Beijingi,&Xiameni,&Guangzhoui,&Daliani, &Shanghaii,&Changshai,&Shenzheni,&Zhengzhoui,&Tianjini for(0=j;jG-costj1 Beijingj-1=G-costj2 Xiamenj-1=G-costj3 Guangzhouj-1= G-costj4 Dalianj-1=G-costj5 Shanghaij-1=G-costj6 Changshaj-1=G-costj7 Shenzhe

14、nj-1=G-costj8 Zhengzhouj-1=G-costj9 Tianjinj-1=G-costj10 return(G);End(4) Floyed(unDiGraph *D,unDiGraph *M) 函数 Floyed函数求任意两点的最短路径Beginc_number=n1=iwhile(ijwhile(jcostij=Aij 初始化矩阵A。 M-costij=Cij -1=Pathij 初始化矩阵p, 置-1. for(0=k;ki;ij;j=n;j+) if(Aik+AkjAij K= Pathij 若i经过k到j比i到j小,则令 Aij=Aik+Akj Aij=Bij e

15、lse Aij=Bij print最短路径为:End(5)prn_pass(int i,int j) 输出最短路径所经过的点Begin If ( Pathij!=-1)递归调用prn_pass(i,Pathij)调用pr(Pathij,0)End(6)f_money1( ) 输出方式1函数 Begin l 1=hdo Print 始发地 可直飞目的地 Print Print 天津 Print Print Print 天津 Print 天津 Print 天津 Print Print Print Print 1.继续输出所有城市名以及每一城市所有可直飞到达的城市列表 2.返回主菜单 清选择. in

16、put l 输入1或2选择是否继续。 1=hEnd(7) f_money2( ) 输出方式2函数Begin1=hBcity,Ecity/起始成市和终点城市 l money4 i,j s,wdiscount4while(h=1) print请输入起始城市和目的城市的代码,中间以空格隔开,围(1- %d,c_numberinput Bcityinput Ecity 输入起始城市和终点城市的代码。 if (!(0Bcity&Bcityc_number+1)&(0Ecity&Ecity5000|LBcityEcity10000) then print无直飞航班 else Print季度 全票价格 折扣

17、 折后价格(不计小数,四舍五入)n srand(unsigned)time(NULL)随机种子 for (0=j;ji; i w w/100=s break; s=discountj for(0=i;i moneyiPrint %d %d %.2lf %.lfn,i+1,BBcityEcity,discounti,moneyi); Print“打折前的费用是%d元n,LBcityEcity Print 1.继续输入起始城市和目的城市名称,输出指定线路四个季度的折扣和全价n 2.返回主菜单n 清选择. input l 输入1或2选择是否继续。 1=h End(8) f_money3( ) 输出方

18、式3函数Begin1=hBcity,Ecity起始成市和终点城市 L money i,j s,wdiscount4 M month quarterdo Print请输入月份(请在1-12之间选择): Input month if(month=12|month=1) Print输入出错!n exit(1); pri()输出城市列表及相应代码。 print请输入起始城市和目的城市的代码,中间以空格隔开,围(1- %d,c_numberinput Bcityinput Ecity 输入起始城市和终点城市的代码。 if (!(0Bcity&Bcityc_number+1)&(0Ecity&Ecity5

19、000) print无航班n else srand(unsigned)time(NULL随机种子 for (0=j;ji; i w w/100=s break; s=discountj if(1=monthm 1=quarter Print你选择的是%d月,位于第%d季度,折扣是%.2lfn,month,quarter,m else if(4=monthm 2=quarter Print你选择的是%d月,位于第%d季度,折扣是%.2lfn,month,quarter,m else if(7=monthm 3=quarter Print你选择的是%d月,位于第%d季度,折扣是%.2lfn,mon

20、th,quarter,m else if (10=monthm 4=quarter Print你选择的是%d月,位于第%d季度,折扣是%.2lfn,month,quarter,m (float)m*BBcityEcity=money Print 最佳线路: pr(Bcity,0) 显示起始城市。 prn_pass(Bcity,Ecity) 调用prn_pass函数,显示最短路径经过的城市。 pr(Ecity,0) 显示终点城市。 Print 合计: Print %.lfn,money Print 1.继续输入月份、起始城市和目的城市名称,输出最佳方案n 2.返回主菜单n 清选择. input

21、l 输入1或2选择是否继续。 1=h End4. 调试分析4.1 问题与解决办法(1)声明变量语句的位置我在运行的过程中一直出现这个错误(见下图),系统报错说未定义变量,但我确实定义过了,后来通过在网上XX资料才知道要把声明变量的语句得放到函数的最前面,而printf要放在所有变量声明语句后面。修改程序之后,那些错误果然没有了。(2)文本文件的读取 程序在读取文本文件时总说打开文件出错,原因是read.txt中含有非法字符,删去即可。而且在程序末尾要记得调用函数fclose(),关闭文件。(3)把从文本文件读取的数据保存到数组中编写这一部分的时候总是出现错误,主要是对指向数组的指针认识不清,通

22、过这次编程对它有了更深的了解。(4)scanf(%s,&addi.a) 和 printf(%s ,addi-10.a)在编写程序阶段,我最开始编写这两个函数的时候是scanf(%c,&addi.a) printf(%c ,addi-10.a) ,当时没有看清addi.a最初的定义,它其实是一个字符数组,所以在运行的时候老出错,后面慢慢研究和调试才知道在输入和输出的格式占位符应该用%s.(5)随机函数的编写我以前几乎没接触过随机函数,所以对其不是很了解。刚开始的时候都不会写,后来在网上找实例,才知道其用法。而且根据题目的要求产生折扣的围是0.201.0(小数点后取两位),所以要产生有小数围的不同

23、随机数,就要用时间作为产生随机数的种子,并且通过取余运算和除以整数100来确定随机数的围。另外还需引用以下头文件:# include # include 4.2 算法的时空分析(1)时间复杂度: Floyed函数T(n)=O(n2+n3)(2)空间复杂度:本程序的空间复杂度均为S(n)=(n2); 即存放n2个节点数据辅助空间。4.3 经验和体会(1)c语言的学习实践很重要。自学习C语言以来,我们就没怎么练习上机实践能力,所以对于代码的敏感度不够,一个错误出现了,不是很容易发现。在这次课程设计中,我就犯了很多高手认为很基础的错误,比如说:printf函数的用法,变量声明的位置,还有就是指针数组

24、的用法。犯错误是不可避免的,但是我们要认真地去发现错误和修改错误。我在运行后,知道自己的程序有错误,我首先一步一步慢慢看,慢慢分析,在整个程序中找不出来就将该部分分离出去进行测试,这样,就很容易找到问题所在了。(2)编写c语言程序必须要细心,特别注意标点符号的书写。同一个error可能要改个几遍才能改好,由于平时编程经历少的缘故,总感觉有些吃力,要解决这一问题就要自己找题目练习,而不是仅仅依赖于老师每次实验和考试。另外通过程序的编写还发现自己在c语言编程方面存在不足,要继续加强练习。(3)要善于利用身边的资源。资源既包括网络资源也包括人力资源。遇到一个问题先要通过网络查找解决办法,如果还是不能解决就要学会请教别人,毕竟身边有很多技术牛人和学长学姐,他们都给我很耐心地解答,让我很感动的同时也受益匪浅。 (4)通过这次课设对弗洛伊德算法有了更深刻的了解。本次课程设计的问题归根到底是求最短路问题,用弗洛伊德算法求任意两点最短路径的过程比用迪杰斯特算法算n次的形式上更加简单,时间复杂度为O(n2+n3),是一个简便的算法。5. 用户使用说明5.1 使用程序的操作步骤运行程序后输入存储输入数据的文件名,用户会看到程序的主菜单,根据标

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

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