=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-