校园导航系统课程设计报告材料
题目石铁大校园导航系统
学院信息科学与技术学院
专业计算机科学与技术
学号 20112840 学生姓名铸辉
指导教师娜
日期:2013-8-31
一.题目与要求
实习一
校园导游程序
[ 问题描述]
用无向网表示学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够回答有关景
点介绍、游览路径等问题。游客通过终端可询问:
(1 )从某一景点到另一景点的最短路径。
(2 )游客从公园进入,选取一条最佳路线。
(3 )使游客可以不重复地浏览各景点,最后回到出口(出口就在入口旁边)。
[ 基本要求]
(1 )将导游图看作一带权无向图,顶点表示公园的各个景点,边表示各景点之间的
道路,边上的权值表示距离.为此图选择适当的数据结构。
(2 )把各种路径都显示给游客,由游客自己选择浏览路线。
(3 )画出景点分布图于屏幕上。
[ 实现提示]
(1 )构造一个无向图G 并用邻接矩阵来存储。
(2 )利用迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径用二维数组p[i][]
来记录,最短路径长度就用一维数组d[i] 存放;i 的围:0 ~20 。
(3 )一维数组have[] 是用来记录最短路径出现顶点的顺序。
(4 )根据起点和终点输出最短路径和路径长度。
二.需求分析
本校园导航系统由C语言编写,主要掌握最短路径的实现方法,以及构造无向图G并用邻接矩阵来存储,掌握迪杰斯特拉算法来算最短路径。
1.输入的形式和输出的围:
2.输出的形式:
3.程序所能到达的功能:
A.图中任意景点的相关信息查询
B.任意两个景点间的最短路径
C.任意两个景点间的所有路径
D.增加有关景点和道路的信息
E.删除更新有关景点和道路的信息
F.更新有关景点和道路的信息
G.显示全景
H.退出该系统
三.概要设计
(1)本程序包含了10个函数
①主函数main()
②显示操作菜单函数 menu()
③景点名称及其简介设置函数 picture(void)
④图中任意景点相关信息查询函数 checkscene(algraph g)
⑤图中任意两个景点间的最短路径 Dijkstra(algraph g)
⑥任意两个景点间的全部路径 alldistance(algraph g)
⑦增加有关景点和道路的信息 addscene(algraph g)
⑧删除有关景点和道路的信息 delscene(algraph g)
⑨更新有关景点和道路的信息 change(algraph g)
⑩显示全景 chang()
(2)各函数之间的关系
menu()
picture(void)
checkscene(algraph g)
Dijkstra(algraph g)
main() alldistance(algraph g)
addscene(algraph g)
delscene(algraph g)
change(algraph g)
chang()
四.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪代码,对主程序和其他模块也都需要写出伪代码算法。
(1)结点类型和指针类型
typedef struct {
int adj;
int *info;
}sceneinfo;
typedef struct adjlist{
int num;
char *sight;
char *description;
}adjlist;
typedef struct algraph
{
adjlist ver[MAXNUM];
sceneinfo arcs[MAXNUM][MAXNUM];
int vexnum,arcnum;
} algraph;
(2)图的基本操作
①主菜单
//主菜单
int menu(void)
{ int i;
printf("\n-------------------------欢迎来到莱震德瑞hui 校园导航系统!!-----------------------------------------------------\n");
printf("1.图中任意景点的相关信息查寻\n");
printf("2.任意两个景点间的最短路径\n");
printf("3.任意两个景点间的所有路径\n");
printf("4.增加有关景点和道路的信息\n");
printf("5.删除更新有关景点和道路的信息\n");
printf("6.更新有关景点和道路的信息\n");
printf("7.显示全景\n ");
printf("8.退出该系统\n ");
printf("---------------------------让辉哥带大家在铁道大学翱翔吧!!------------------------------------------------------\n");
printf("请输入你要进行的操作:");
scanf("%d",&i);
return(i);
}
②景点名称及其简介
void picture(void)
{ int i,j;
m.vexnum=11;
m.arcnum=16;
for(i=0;i m.ver[i].num=i; m.ver[0].sight="xiaomen"; m.ver[1].sight="学校大门,一教"; m.ver[2].sight="图书馆"; m.ver[3].sight="操场"; m.ver[4].sight="体育馆"; m.ver[5].sight="青春苑"; m.ver[6].sight="办公楼"; m.ver[7].sight="第一实验楼"; m.ver[8].sight="第九实验楼"; m.ver[9].sight="第九宿舍楼"; m.ver[10].sight="家属院"; m.ver[1].description="进入学校大门就可以看见一教,一教西面是二教和三教"; m.ver[2].description="自习和阅读的心灵家园,后身是第二实验楼"; m.ver[3].description="跑道和足球场"; m.ver[4].description="室篮球场和游泳场"; m.ver[5].description="学生活动中心和综合餐厅"; m.ver[6].description="办公中心,包括开元楼和春晖楼"; m.ver[7].description="挨着医院和综合教学楼,物理实验"; m.ver[8].description="计算机和电工实验,西邻机械学院"; m.ver[9].description="生活区中心,西邻超市水房澡堂,东临一,二三食堂"; m.ver[10].description="教职工住处,在学校最北面"; for(i=0;i for(j=0;j m.arcs[i][j].adj=INF; m.arcs[1][2].adj=m.arcs[2][1].adj=100; m.arcs[1][3].adj=m.arcs[3][1].adj=300; m.arcs[2][6].adj=m.arcs[6][2].adj=500; m.arcs[3][5].adj=m.arcs[5][3].adj=600; m.arcs[1][4].adj=m.arcs[4][1].adj=220; m.arcs[4][5].adj=m.arcs[5][4].adj=600; m.arcs[4][9].adj=m.arcs[9][4].adj=450; m.arcs[4][6].adj=m.arcs[6][4].adj=650; m.arcs[5][7].adj=m.arcs[7][5].adj=300; m.arcs[6][8].adj=m.arcs[8][6].adj=600; m.arcs[10][9].adj=m.arcs[9][10].adj=100; m.arcs[7][10].adj=m.arcs[10][7].adj=250; m.arcs[7][9].adj=m.arcs[9][7].adj=280; m.arcs[8][9].adj=m.arcs[9][8].adj=400; m.arcs[8][4].adj=m.arcs[4][8].adj=100; } ③图中任意景点相关信息查询 void checkscene(algraph g) { int i,j; char ch; while(1) { sceneplace(); printf("请输入你要查询的景点的编号:"); scanf("%d",&i); if(i>p || i<0) printf("输入错误!!\n"); else {for(j=0;j<=p;j++) { if(i==j) { printf("你要查询的景点的相关信息如下:\n"); printf("%d\t\t%s\n",g.ver[i].num,g.ver[i].sight); printf("%s\n",g.ver[i].description); } } } printf("是否继续查询?(y|n):"); scanf("%s",&ch); if(ch=='N'||ch=='n') break; } } ④图中任意两个景点间的最短路径 void Dijkstra(algraph g) { char ch; int path1[MAXNUM]; int dist[MAXNUM]; int s[MAXNUM]; int mindis,i,j,u,n=p; int l,k; int v0,po; while(1) { sceneplace();