公交路线查询课程设计.docx
《公交路线查询课程设计.docx》由会员分享,可在线阅读,更多相关《公交路线查询课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
公交路线查询课程设计
《算法与数据结构》课程设计报告
题目:
公交线路
专业:
软件工程
班级:
1003
学号:
41
姓名:
简
指导教师:
魏
完成日期:
2012年06月17日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计内容
建立某城市(如福州)主要公交线路图
查询站点路线
三、课程设计过程
[基本要求]
输入任意两站点,给出最佳的乘车线路和转车地点。
如:
该城市共有n条公交线路,m个公交站点。
其中,公交线路1经过编号为1,2,4,7的站点,公交线路2经过编号为3,5,7,8,的站点,则从站点2到站点8的最佳乘车线路是:
乘坐公交线路1从站点2到站点7再乘坐公交线路2到站点8。
[测试数据]
该城市共有3条公交线路,6个公交站点,其中:
第1条公交线路经过站点:
1,2
第2条公交线路经过站点:
2,3,4
第3条公交线路经过站点:
4,5
用图的最短路径算法实现(转乘次数最少)
2.概要设计
1)为了实现上述程序功能,需要定义图数据类型:
typedefstruct//图的定义
{charname[MAX_VERTEX_NUM];
intvexs[MAX_VERTEX_NUM];
intvexnum,arcnum;//顶点信息弧的信息
intln,l,n;//ln是路线数,l是路线,n是站点数,d是站点,nu路径数
intvexno[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//顶点:
路线,路线中的站点数
intarclin[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//弧:
站点-站点,,存的是权值
}mgraph;
基本操作:
voidcreate(mgraph&g)
输入路线,站点信息,站点间关系
操作结果:
创建公交线路图,
voidfloyd(mgraphg,intv,intw)
计算最少换乘路径。
并输出,且相应查找各所需换乘车信息,并计算换乘次数
操作结果:
显示所查询站的路线,换乘车次,及换乘最少路径
Menu()
操作结果:
在屏幕上显示操作菜单
voidvisit(mgraphg,intv,intw)
查找站点信息并输出
操作结果:
输出所查询站点信息
intmain()
有个switch,可以对Menu里的功能进行选择操作,
操作结果:
各个其他函数进行实现
2)本程序包含5个函数:
①主函数main()
②建设公交图函数voidcreate(mgraph&g)
③显示操作菜单函数menu()
④计算最小路径算法函数voidfloyd(mgraphg,intv,intw)
⑤查找显示站点信息的函数voidvisit(mgraphg,intv,intw)
各函数间关系如下:
mean
Maincraete
floyd
visit
3.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。
对主程序和其他模块也都需要写出伪码算法。
1)图的定义
typedefstruct
{charname[MAX_VERTEX_NUM];
intvexs[MAX_VERTEX_NUM];
intvexnum,arcnum;
intln,l,n;
intvexno[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
intarclin[MAX_VERTEX_NUM][MAX_VERTEX_NUM];}mgraph;
2)公交路线建设到查询的基本操作
建图:
:
voidcreate(mgraph&g)
{inti,j,k,e,d;
printf("请输入公交站数和路径数:
");
scanf("%d,%d,",&g.vexnum,&g.arcnum);
printf("请输入公交站点和其站名:
");
for(d=1;d<=g.vexnum;d++)
scanf("%d,%c",&g.vexs[d],&g.name[d]);
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
g.arclin[i][j]=infi;
printf("请输入可达两站点的编号:
\n");
for(k=1;k<=g.arcnum;k++)
{
scanf("%d,%d",&i,&j);
g.arclin[i][j]=1;
g.arclin[j][i]=1;
}
printf("请输入公交路线数:
");
scanf("%d",&g.ln);
for(k=1;k<=g.ln;k++)
{printf("请输入路线和所含站点数:
");
scanf("%d,%d",&g.l,&g.n);
printf("请输入此路线的所含站点:
");
for(e=1;e<=g.n;e++)
{
scanf("%d",&j);
if(jg.vexno[g.l][j]=g.l;}}
}
Floyd算法:
求最少换乘路径:
voidfloyd(mgraphg,intv,intw)//floyd算法算出各点间的最小路径
{Intpath[MAX_VERTEX_NUM][MAX_VERTEX_NUM],a[MAX_VERTEX_NUM],b[MAX_VERTEX_NUM];
inti,j,k,/*u,temp,*/top=0,top1=0;
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
{if(i==j)
path[i][j]=0;
elseif(g.arclin[i][j]path[i][j]=i;
else
path[i][j]=0;}
for(k=1;k<=g.vexnum;k++)
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
if(g.arclin[i][k]+g.arclin[k][j]{g.arclin[i][j]=g.arclin[i][k]+g.arclin[k][j];
path[i][j]=path[k][j];}
//计算结束,开始判断输出所要了解的信息
if(path[v][w]==v)
{printf("%d-->%d\n",v,w);
for(i=1;i<=MAX_VERTEX_NUM;i++)
{if(i==g.vexno[i][v]&&i==g.vexno[i][w])
printf("您只需要乘坐く%d路つ车,此两站能有直达车!
\n\n",g.vexno[i][v]);}}
Elseif(path[v][w])
{intf=0;
printf("%d",v);
a[++top]=w;
b[++top1]=w;
while(path[v][w]!
=v)
{k=path[v][w];
a[++top]=k;
b[++top1]=k;
w=k;}
while(top)
{++f;intu=a[top--];
printf("-->");
printf("%d",u);}
for(i=1;i<=MAX_VERTEX_NUM;i++)
if(i==g.vexno[i][v]&&i==g.vexno[i][b[top1]])
//用判断两站点所在的路线是否同一条,若同一条,则输出这条路线
printf("\n这两站没有直达车,您需要乘坐公交路线为:
く%d路",g.vexno[i][v]);
while(top1-1)
{intt=b[top1];
for(i=1;i<=MAX_VERTEX_NUM;i++)
{
if(i==g.vexno[i][t+1]&&g.vexno[i][t])
printf("-%d路つ",i);
}
--top1;
}
printf("\n");
printf("您需要转乘次数为:
%d次!
\n\n",f);
printf("\n");
}
else
printf("此俩站点不存在通车路径!
!
请做其它操作,谢谢!
\n\n");
}
voidvisit(mgraphg,intv,intw)//对于站点的信息的输出
{for(inti=1;i<=g.vexnum;i++)
for(intj=1;j<=g.vexnum;j++)
{if(i==v&&j==w)
{printf("此两站点信息为:
");
printf("%c,%c\n",g.name[i],g.name[j]);}}printf("最少换乘路径为:
");
}
功能选择菜单:
:
voidmenu()
{printf("#################ぃぃぃ1:
建设公交线路图!
ぃぃぃ#################\n");
printf("#################ぃぃぃ2:
查询您所需要了解的线路!
ぃぃぃ#################\n");
printf("#################ぃぃぃ3:
退出!
ぃぃぃ#################\n");
}
4.调试分析
在调试的过程中会出现括号的缺失,或者是功能的不可行,最大难题就是路线方面,经过调试,检查语句合法与否,实现功能的程序是否符合逻辑,一步步完善直到实现要求的所有功能。
5.用户使用说明
程序名为bus.exe,运行环境为DOS。
程序执行后显示
在输入序号后输入数字选择执行不同的功能。
要求首先先建设公交线路图,在建完图之后会用矩阵输出你所以建设的信息。
每执行一次功能,就会显示执行的结果,有包含所以需要查询的站点信息,最少换乘路线,及所以需要搭乘的车路。
选择1:
显示“首先请先建设公交线路图:
”,
要求输入站点个数,通车路径数,站点信息,各站点间的关系,公车线路数,每条公车线路所以含站点。
选择2:
显示“请输入待查任意两个站点v和w:
”,
要求输入等查询的两个两个站点编号,执行并输出有关站点,路径,换乘信息
选择3:
显示“是否继续?
Y(请输入1),N(请输入0)\n”,
要求输入1或0,1可以继续,0可以退出并结束运行
6.测试结果
程序名为Bus.exe,运行环境为DOS。
程序执行后显示
在输入序号后输入数字选择执行不同的功能。
要求首先先建设公交线路图,在建完图之后会用矩阵输出你所以建设的信息。
每执行一次功能,就会显示执行的结果,有包含所以需要查询的站点信息,最少换乘路线,及所以需要搭乘的车路。
选择1:
建图
选择2:
查询
有直达车:
没有通车
有路线且需要转车。
要求输入两个站点编号,经过FLOYD计算后,输出两站点信息,并输出最少换乘路线及换乘的公交。
选择3:
退出程序
7.附录
#include
#include
#defineMAX_VERTEX_NUM100
intvisited[MAX_VERTEX_NUM];//访问标志数组
#defineinfi9999
//typedefstruct
//{
//int
//charname[30];
//};
typedefstruct//图的定义
{charname[MAX_VERTEX_NUM];
intvexs[MAX_VERTEX_NUM];
intvexnum,arcnum;//顶点信息弧的信息
intln,l,n;//ln是路线数,l是路线,n是站点数,d是站点,nu路径数
intvexno[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//顶点:
路线,路线中的站点数
intarclin[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//弧:
站点-站点,,存的是权值
}mgraph;
voidcreate(mgraph&g)//输出邻接矩阵g
{
inti,j,k,e,d;//k为循环变量,e为内循环的变量,i,j为路线,站点变量
printf("请输入公交站数和路径数:
");
scanf("%d,%d,",&g.vexnum,&g.arcnum);
printf("请输入公交站点和其站名:
");
for(d=1;d<=g.vexnum;d++)
scanf("%d,%c",&g.vexs[d],&g.name[d]);
/*printf("g:
%c",g.name[d]);*/
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
g.arclin[i][j]=infi;
printf("请输入可达两站点的编号:
\n");
for(k=1;k<=g.arcnum;k++)
{
scanf("%d,%d",&i,&j);
g.arclin[i][j]=1;
g.arclin[j][i]=1;
}
printf("请输入公交路线数:
");
scanf("%d",&g.ln);
/*printf("\n%d\n",ln);*/
for(k=1;k<=g.ln;k++)//建立线路与站点的关系
{printf("请输入路线和所含站点数:
");
scanf("%d,%d",&g.l,&g.n);
printf("请输入此路线的所含站点:
");
for(e=1;e<=g.n;e++)
{
scanf("%d",&j);
if(jg.vexno[g.l][j]=g.l;
}
}
}
voidfloyd(mgraphg,intv,intw)//floyd算法算出各点间的最小路径
{
intpath[MAX_VERTEX_NUM][MAX_VERTEX_NUM],a[MAX_VERTEX_NUM],b[MAX_VERTEX_NUM];//a[]对于输出路径用来暂存路经站点,b[]对于公交线路输出用来暂存公交路线前一序号站点
inti,j,k,/*u,temp,*/top=0,top1=0;
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
{if(i==j)
path[i][j]=0;
else
if(g.arclin[i][j]path[i][j]=i;
else
path[i][j]=0;
}
for(k=1;k<=g.vexnum;k++)
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
if(g.arclin[i][k]+g.arclin[k][j]{g.arclin[i][j]=g.arclin[i][k]+g.arclin[k][j];
path[i][j]=path[k][j];
}
//计算结束,开始判断输出所要了解的信息
if(path[v][w]==v)
{
printf("%d-->%d\n",v,w);
for(i=1;i<=MAX_VERTEX_NUM;i++)
{
if(i==g.vexno[i][v]&&i==g.vexno[i][w])
{
printf("您只需要乘坐く%d路つ车,此两站能有直达车!
\n\n",g.vexno[i][v]);
}
}
}
else
if(path[v][w])
{
intf=0;
printf("%d",v);
a[++top]=w;
b[++top1]=w;
while(path[v][w]!
=v)
{
k=path[v][w];
a[++top]=k;
b[++top1]=k;
w=k;
}
while(top)
{
++f;intu=a[top--];
printf("-->");
printf("%d",u);
}
for(i=1;i<=MAX_VERTEX_NUM;i++)
if(i==g.vexno[i][v]&&i==g.vexno[i][b[top1]])//用判断两站点所在的路线是否同一条,若同一条,则输出这条路线
printf("\n这两站没有直达车,您需要乘坐公交路线为:
く%d路",g.vexno[i][v]);
while(top1-1)
{intt=b[top1];
for(i=1;i<=MAX_VERTEX_NUM;i++)
{
if(i==g.vexno[i][t+1]&&g.vexno[i][t])
printf("-%d路つ",i);
}
--top1;
}
printf("\n");
printf("您需要转乘次数为:
%d次!
\n\n",f);
printf("\n");
}
else
printf("此俩站点不存在通车路径!
!
请做其它操作,谢谢!
\n\n");
}
voidvisit(mgraphg,intv,intw)//对于站点的信息的输出
{//stringa="福建工程学院(鳝溪)",b="程浦头(学生街)",c="大学城(福建中医药大学)",d="火车站(北)",e="汽车站(南)",f="下院(鼓山)";
for(inti=1;i<=g.vexnum;i++)
for(intj=1;j<=g.vexnum;j++)
{
if(i==v&&j==w)
{
printf("此两站点信息为:
");
printf("%c,%c\n",g.name[i],g.name[j]);
}
}/*printf("您需要乘公交车为%d路车\n",);*/
printf("最少换乘路径为:
");
}
voidmenu()
{
printf("#################ぃぃぃ1:
建设公交线路图!
ぃぃぃ#################\n");
printf("#################ぃぃぃ2:
查询您所需要了解的线路!
ぃぃぃ#################\n");
printf("#################ぃぃぃ3:
退出!
ぃぃぃ#################\n");
}
intmain()
{printf("------*********------ぃ软工03班41号简欢您迎来到本界面ぃ------*********------\n");
mgraphg;intw,v,i,j;
inta;
intchoice=1;
while(choice)
{
menu();
printf("请输入需要操作的序号(1-3):
");
scanf("%d",&a);
switch(a)
{
case1:
fflush(stdin);
printf("首先请先建设公交线路图:
\n");
create(g);
printf("ぃぃぃぃぃぃぃぃぃぃ交通车情况表示如下矩阵图ぃぃぃぃぃぃぃぃぃぃぃぃ\n");//输出用于建线路存放的矩阵
for(i=1;i<=g.vexnum;i++)
{
for(j=1;j<=g.vexnum;j++)
{
if(g.arclin[i][j]==infi)
printf("%s","*");//表示两站点间不可达
else
printf("%d",g.arclin[i][j]);
}
printf("\n");
}
printf("1代表通车,*代表不通车!
\n");//向运行者注释矩阵中数据所表示的信息
printf("公交线路图建成功!
!
\n\n");
break;
case2:
printf("请输入待查任意两个站点v和w:
");
scanf("%d,%d",&v,&w);
visit(g,v,w);
floyd(g,v,w);
break;
case3:
printf("是否继续?
Y(请输入1),N(请输入0)\n");
scanf("%d",&choice);
break;
default:
printf("输入错误,请重新输入:
\n");
break;