软件综合实习 校园导游.docx
《软件综合实习 校园导游.docx》由会员分享,可在线阅读,更多相关《软件综合实习 校园导游.docx(11页珍藏版)》请在冰豆网上搜索。
![软件综合实习 校园导游.docx](https://file1.bdocx.com/fileroot1/2022-12/16/62024f1a-c90e-4353-b27e-8b3f6102ea93/62024f1a-c90e-4353-b27e-8b3f6102ea931.gif)
软件综合实习校园导游
1.实验题目
《校园导游咨询平台》
2.需求分析
编写一个校园导游程序,为来访的客人提供各种信息查询服务。
(1)所设计的校园平面图所含景点不少与10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)能够为来访客人提供图中任意景点相关信息的查询以及图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
(3)提供图中任意景点问路查询,即求任意两个景点之间的所有路径。
(4)提供校园图中多个景点的最佳访问路线查询,即求途经这多个景点的最佳(短)路径。
(5)测试数据自行设定。
3.概要设计
(1)本程序主要思路:
程序实现功能有景点介绍,以及查询任意两景点的最短距离和途经的景点,最后打印输出两景点以及途径的所有景点。
用introduce函数介绍各景点的信息,用floyed算法确定两景点的最短距离和途经景点。
(2)Floyd算法:
主要是将问题分解,先找出最短的距离,然后在考虑如何找出对应的行进路线。
对于校园里任意两个景点i,j,由i到j的最短距离有两种情况,一是经过景点k,二是不经过景点k(k=1,2,3,4...,n),所以检查ij的距离d(ij)是否等于与i到k的距离d(ik)与k到j的距离相等,如果相等则d(ij)为最短距离,如果不相等,则重复检查这一过程,最后当查完所有的k时,d(ij)里面存放的就是i到j之间的最短距离了。
(3)本程序主要程序有:
主函数voidmain(),
景点介绍voidintroduce(),
查找两景点的最短路径,intshortestdistance(),
求两点景点的路径voidfloyed(),
打印输出两景点的路径和最短距离voiddisplay(inti,intj)
(4)用path[][]记录从i到j的最短路径上点j的前驱景点的序号
{
shortest[i][j]=shortest[i][k]+shortest[k][j];
path[i][j]=k;
path[j][i]=k;
}
(6)把i到j的路径上所有经过的景点按逆序打印出来
while(path[i][j]!
=0)
printf("<-%d",path[i][j]);
if(ij=path[i][j];
else
i=path[j][i];
}
printf("<-%d",a);
printf("\n");
printf("%d->%d最短距离是:
%5d米\n\n",a,b,shortest[a][b]);
把i到j的路径上所有经过的景点按顺序打印出来
printf("%d",a);
while(path[i][j]!
=0){
printf("->%d",path[i][j]);
if(ij=path[i][j];
else
i=path[j][i];
}
printf("->%d",b);
printf("\n");
printf("(%d->%d)最短距是:
%5d\n\n",a,b,shortest[a][b]);
4.详细设计
程序代码如下:
#include
#include
#defineINT_MAX800
#definen12
inta[n][n];
intshortest[n][n];
intpath[n][n];
voidintroduce();
intshortestdistance();
voidfloyed();
voiddisplay(inti,intj);
voidmain()
{
inti,j;
chark;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
a[i][j]=INT_MAX;
a[1][3]=a[3][1]=300;
a[2][3]=a[3][2]=300;
a[2][4]=a[4][2]=400;
a[3][10]=a[10][3]=350;
a[1][10]=a[10][1]=650;
a[2][10]=a[10][2]=650;
a[4][10]=a[10][4]=750;
a[1][4]=a[4][1]=600;
a[4][5]=a[5][4]=400;
a[4][9]=a[9][4]=350;
a[5][9]=a[9][5]=600;
a[5][7]=a[7][5]=200;
a[5][6]=a[6][5]=400;
a[6][7]=a[7][6]=600;
a[7][8]=a[8][7]=700;
a[8][6]=a[6][8]=300;
a[1][1]=a[2][2]=a[3][3]=a[4][4]=a[5][5]=0;
a[6][6]=a[7][7]=a[8][8]=a[9][9]=a[10][10]=0;
while
(1)
{printf("================欢迎使用桂林理工大学校园导游咨询平台!
=================\n");
printf("********************************\n");
printf("**1.景点信息查询**\n");
printf("**2.景点最短路径查询**\n");
printf("**3.退出系统**\n");
printf("********************************\n");
printf("==================================================================\n");
printf("学校景点列表:
\n");
printf("1:
学校正门\n");
printf("2:
中国移动营业厅\n");
printf("3:
1号食堂\n");
printf("4:
图书馆\n");
printf("5:
2号食堂\n");
printf("6:
雁园\n");
printf("7:
校医室\n");
printf("8:
8栋实验楼\n");
printf("9:
行政楼\n");
printf("10:
7号教学楼\n");
printf("===================================================================\n");
printf("请选择服务:
");
scanf("\n%c",&k);
switch(k)
{
case'1':
printf("进入景点信息查询:
");
introduce();
break;
case'2':
printf("进入最短路径查询:
");
shortestdistance();
break;
case'3':
exit(0);
default:
printf("输入信息错误!
请输入正确信息\n");
break;
}
}
}
voidintroduce()
{
inta;
printf("您想查询哪个景点的详细信息?
请输入景点编号:
");
scanf("%d",&a);
getchar();
printf("\n");
switch(a)
{
case1:
printf("1:
学校正门\n\n一巨石屹立在中央,雄伟壮观,极具我校特色。
\n\n");break;
case2:
printf("2:
中国移动营业厅\n\n中国移动营业厅,学校里面的所有相关移动业务都可以在这里办理。
\n\n");break;
case3:
printf("3:
1号食堂\n\n1号组团学生老师就餐的地方。
\n\n");break;
case4:
printf("4:
图书馆\n\n学校信息资源中心,内有大量的图书。
\n\n");break;
case5:
printf("5:
2号食堂\n\n2号食堂为学校新建的食堂,里面的饭菜更美味。
\n\n");break;
case6:
printf("6:
雁园\n\n里面环境优雅,是师生交流的好地方。
\n\n");break;
case7:
printf("7:
校医室\n\n我校新建的校医院,内部医疗设施齐全。
\n\n");break;
case8:
printf("8:
8栋实验室\n\n存有大量教学环节需要用到的各学科实验的器材。
\n\n");break;
case9:
printf("9:
行政楼\n\n学校行政会议以及办公的地方。
\n\n\n");break;
case10:
printf("10:
7号教学楼\n\n信息学院主要办公楼。
\n\n");break;
default:
printf("景点编号输入错误!
请输入正确的1->10数字编号!
\n\n");break;
}
}
intshortestdistance()
{
inti,j;
printf("请输入要查询1->10中两个景点数字编号并用','间隔:
");
scanf("%d,%d",&i,&j);
if(i>n||i<=0||j>n||j<0)
{
printf("输入信息错误!
\n\n");
printf("请输入正确要查询1->10中两个景点数字编号并用','间隔:
\n");
scanf("%d,%d",&i,&j);
}
else
{
floyed();
display(i,j);
}
return1;
}
voidfloyed()
{
inti,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
shortest[i][j]=a[i][j];
path[i][j]=0;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))
{
shortest[i][j]=shortest[i][k]+shortest[k][j];
path[i][j]=k;
path[j][i]=k;
}
}
voiddisplay(inti,intj)
{
inta,b;
a=i;
b=j;
printf("您要查询的两景点间最短路径是:
\n\n");
if(shortest[i][j]!
=INT_MAX)
{
if(i{
printf("%d",b);
while(path[i][j]!
=0)
{
printf("<-%d",path[i][j]);
if(ij=path[i][j];
else
i=path[j][i];
}
printf("<-%d",a);
printf("\n");
printf("%d->%d最短距离是:
%5d米\n\n",a,b,shortest[a][b]);
}
else
{
printf("%d",a);
while(path[i][j]!
=0)
{
printf("->%d",path[i][j]);
if(ij=path[i][j];
else
i=path[j][i];
}
printf("->%d",b);
printf("\n");
printf("(%d->%d)最短距离是:
%5d\n\n",a,b,shortest[a][b]);
}
}
else
printf("输入错误!
不存在此路!
\n\n");
printf("\n");
}
5.调试分析与测试结果
=============欢迎使用桂林理工大学校园导游咨询平台!
===============
***********************************
**1.景点信息查询**
**2.景点最短路径查询**
**3.退出系统**
***********************************
===================================================================
学校景点列表:
1.学校正门
2.中国移动营业厅
3.1号食堂
4.图书馆
5.2号食堂
6.雁园
7.校医室
8.8栋教学楼
9.行政楼
10.7号教学楼
=====================================================================请选择服务:
1
进入景点信息查询:
您想查询哪个景点的详细信息?
请输入景点编号:
2
2:
中国移动营业厅
中国移动营业厅,学校里面的所有相关移动业务都可以在这里办理。
============欢迎使用桂林理工大学校园导游咨询平台!
=============
***********************************
**1.景点信息查询**
**2.景点最短路径查询**
**3.退出系统**
***********************************
=====================================================================
学校景点列表:
1.学校正门
2.中国移动营业厅
3.1号食堂
4.图书馆
5.2号食堂
6.雁园
7.校医室
8.8栋教学楼
9.行政楼
10.7号教学楼
=====================================================================请选择服务:
2
进入最短路径查询:
请输入要查询1-〉10中两景点数字编号并用“,”间隔:
2,4
4<-2
2->4最短距离是:
400米
6.使用说明
XpWin7均可运行,编译器为VC6.0,输入两景点时注意要用逗号“,”隔开。