应用数据结构课设最短航空路线求解报告讲义Word文档格式.docx
- 文档编号:18205919
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:36
- 大小:459.40KB
应用数据结构课设最短航空路线求解报告讲义Word文档格式.docx
《应用数据结构课设最短航空路线求解报告讲义Word文档格式.docx》由会员分享,可在线阅读,更多相关《应用数据结构课设最短航空路线求解报告讲义Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
编码实现和静态检查
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<
windows.h>
stdio.h>
#include<
stdlib.h>
time.h>
#defineINF65535//定义一个最大数定为无穷值
#defineMAX23
typedefintcostAdj[MAX+1][MAX+1];
//图邻接矩阵从1开始记数
intPath[MAX+1][MAX+1];
//图的定义
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()输出城市
Print城市代码
1=>
i
Whilei<
=c_number
Printi
调用pr()函数
}
(3)CreateTimeF()飞机的时间的存贮和编辑功能函数
Begin
a,0=>
b,1=>
G=(unDiGraph*)malloc(sizeof(unDiGraph)
If!
GthenNULL
c_number+1
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=>
break;
case0:
0=>
default:
print选择出错
}
}
t+1=>
f
while(t--)
m[t+1].f_time=>
cost[n[t+1].f_time][x[t+1].f_time]
F=>
return(G);
(4)Floyed(unDiGraph*D,unDiGraph*M)函数Floyed函数求任意两点的最短路径
c_number=>
n
while(i<
=n)
1=>
j
while(j<
=n)
{
D->
cost[i][j]=>
A[i][j]初始化矩阵A。
M->
C[i][j]
-1=>
Path[i][j]初始化矩阵p,置-1.
for(k=1;
k<
=n;
k++)为逐步加入的中间结点
{
for(i=1;
i<
i++)i为A中行号
{
for(j=1;
j<
j++)
if(A[i][k]+A[k][j]<
A[i][j])
then{A[i][k]+A[k][j]=>
A[i][j]
C[i][k]+C[k][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{
}
print最短路径为:
(5)prn_pass(inti,intj)输出最短路径所经过的点
Begin
If(Path[i][j]!
=-1)
递归调用prn_pass(i,Path[i][j])
调用pr(Path[i][j],0)
(6)f_time(intm)飞机最短时间路径函数
while(h==1)
print请输入起始城市和目的城市的代码,中间以空格隔开,范围(1--%d)"
c_number
inputBcity
inputEcity输入起始城市和终点城市的代码。
if(!
((0<
Bcity&
&
Bcity<
c_number+1)&
(0<
Ecity&
Ecity<
Bcity!
=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选择是否继续。
(7)year_month()函数选择折扣
srand((unsigned)time(NULL))随机种子
调用pri()输出城市列表及相应代码。
print请输入年份:
inputyear
=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]
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)随机函数的编写
因为我们使用随机函数的次数很少,所以对其不时很了解。
刚开始的时候都不会写,后来在网上找实例,才知道其用法
/*需引用的头文件*/
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.附录
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];
typedefstructc_edit
chara[10];
}c_edit;
c_editadd[10];
intpr(inti,intj)
{
inth=0;
if(j==0){
h=i;
elseif(j==1)
scanf("
add[i].a);
switch(h)//运用switch语句。
case(0):
printf("
"
);
break;
case
(1):
printf("
成都"
case
(2):
西安"
break;
case(3):
郑州"
case(4):
武汉"
case(5):
株洲"
case(6):
贵阳"
case(7):
北京"
case(8):
天津"
case(9):
上海"
case(10):
徐州"
default:
printf("
add[i-10].a);
return1;
//输出城市列表及相应代码
voidpri()
inti;
城市及其代码\n\n\n"
**********************************************************\n"
for(i=1;
=c_number;
i);
."
pr(i,0);
\n"
**********************************************************\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);
c_number+1;
for(j=1;
G->
cost[i][j]=INF;
//初始化使G->
numVerts=c_number;
cost[1][6]=G->
cost[6][1]=3;
cost[1][2]=G->
cost[2][1]=2;
cost[2][3]=G->
cost[3][2]=1;
cost[3][4]=G->
cost[4][3]=2;
cost[4][5]=G->
cost[5][4]=4;
cost[5][6]=G->
cost[6][5]=3;
cost[3][7]=G->
cost[7][3]=6;
cost[7][8]=G->
cost[8][7]=1;
cost[8][10]=G->
cost[10][8]=2;
G-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用 数据结构 课设最短 航空 路线 求解 报告 讲义