校园导航系统课程设计报告.docx
- 文档编号:23730785
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:22
- 大小:369.51KB
校园导航系统课程设计报告.docx
《校园导航系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《校园导航系统课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
校园导航系统课程设计报告
石家庄铁道大学
题目石铁大校园导航系统
学院信息科学与技术学院
专业计算机科学与技术
学号********
学生姓名刘铸辉
指导教师姓名陈娜
日期:
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个函数
1 主函数main()
2 显示操作菜单函数menu()
3 景点名称及其简介设置函数picture(void)
4 图中任意景点相关信息查询函数checkscene(algraphg)
5 图中任意两个景点间的最短路径Dijkstra(algraphg)
6 任意两个景点间的全部路径alldistance(algraphg)
7 增加有关景点和道路的信息addscene(algraphg)
8 删除有关景点和道路的信息delscene(algraphg)
9 更新有关景点和道路的信息change(algraphg)
10 显示全景chang()
(2)各函数之间的关系
menu()
picture(void)
checkscene(algraphg)
Dijkstra(algraphg)
main()alldistance(algraphg)
addscene(algraphg)
delscene(algraphg)
change(algraphg)
chang()
四.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪代码,对主程序和其他模块也都需要写出伪代码算法。
(1)结点类型和指针类型
typedefstruct{
intadj;
int*info;
}sceneinfo;
typedefstructadjlist{
intnum;
char*sight;
char*description;
}adjlist;
typedefstructalgraph
{
adjlistver[MAXNUM];
sceneinfoarcs[MAXNUM][MAXNUM];
intvexnum,arcnum;
}algraph;
(2)图的基本操作
1 主菜单
//主菜单
intmenu(void)
{inti;
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);
}
2 景点名称及其简介
voidpicture(void)
{inti,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; } 3 图中任意景点相关信息查询 voidcheckscene(algraphg) {inti,j; charch; 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; } } 4 图中任意两个景点间的最短路径 voidDijkstra(algraphg) {charch; intpath1[MAXNUM]; intdist[MAXNUM]; ints[MAXNUM]; intmindis,i,j,u,n=p; intl,k; intv0,po; while (1) { sceneplace(); printf("请输入出发景点的序号: "); scanf("%d",&v0); printf("请输入目的景点的序号: "); scanf("%d",&po); for(i=0;i {dist[i]=g.arcs[v0][i].adj; s[i]=0; if(g.arcs[v0][i].adj! =INF) path1[i]=v0; else path1[i]=-1; } s[v0]=1;path1[v0]=0; for(i=0;i {mindis=INF; u=-1; for(j=0;j if(s[j]==0&&dist[j] {u=j; mindis=dist[j]; } s[u]=1; for(j=0;j if(s[j]==0) if(g.arcs[u][j].adj {dist[j]=dist[u]+g.arcs[u][j].adj; path1[j]=u; } } dispath(g,dist,path1,s,n,v0,po); printf("\n是否继续查询? (y|n): "); scanf("%s",&ch); if(ch=='N'||ch=='n') break; } } 5 任意两个景点间的全部路径 voidpath(algraphg,inti,intj,intk) { ints,ko; if(r[k]==j) { a++; printf("第%d条: ",a); for(s=0;s<=k-1;s++) {printf("%s",g.ver[r[s]].sight); printf("-->"); } printf("%s\n",g.ver[r[s]].sight); } s=0; while(s {if(s! =i) {ko=r[k]; if(g.arcs[ko][s].adj! =INF&&visited[s]==0) {visited[s]=1; r[k+1]=s; path(g,i,j,k+1); visited[s]=0; } } s++; } } voidalldistance(algraphg) {inti,j,k,l; charsh; while (1) {sceneplace(); printf("\n请选择出发景点的序号: "); scanf("%d",&i); printf("\n请选择目地景点的序号: "); scanf("%d",&j); for(k=0;k if(i==g.ver[k].num)i=k; for(l=0;l if(j==g.ver[l].num)j=l; printf("从%s到%s的所有游览路径有: \n",g.ver[i].sight,g.ver[j].sight); r[0]=i; for(k=0;k<1;k++) {visited[i]=0; a=0; path(g,i,j,0); } printf("继续查询? (y|n): "); scanf("%s",&sh); if(sh=='N'||sh=='n') break; } } 6 增加有关景点和道路的信息 voidaddscene(algraphg) { intj,i,b; charyi,mon[10],moh[100]; while (1) {sceneplace(); g.ver[p].num=p; printf("请输入新景点的名称: "); scanf("%s",mon); m.ver[p].sight=(char*)malloc(10); strcpy(m.ver[p].sight,mon); printf("\n请输入新景点的相关简介: "); scanf("%s",moh); m.ver[p].description=(char*)malloc(100); strcpy(m.ver[p].description,moh); g.vexnum=g.vexnum+1; for(j=0;j {m.arcs[p][j].adj=INF; m.arcs[j][p].adj=INF; } printf("\n请问有几个景点与该景点直接相通: "); scanf("%d",&i); printf("\n请输入与该景点相通的景点的序号及它们之间的距离: "); for(j=0;j {printf("\n请输入第%d个景点的序号: ",j+1); scanf("%d",&b); printf("\n请输入该两个景点之间的距离: "); scanf("%d",&g.arcs[p][b].adj); g.arcs[b][p].adj=g.arcs[p][b].adj; m.arcs[b][p].adj=g.arcs[p][b].adj; m.arcs[p][b].adj=m.arcs[b][p].adj; } printf("你输入的景点信息是: \n"); printf("%d\t%s\t%s\n\n",g.ver[p].num,m.ver[p].sight,m.ver[p].description); g.arcnum=g.arcnum+i; p=p+1; m.vexnum=p; sceneplace(); printf("是否继续添加? (y|n): "); scanf("%s",&yi); if(yi=='N'||yi=='n') break; } } 7 删除有关景点和道路的信息 voiddelscene(algraphg) {inti,j,k,l; charsh; while (1) { sceneplace(); printf("\n请输入你将要删除的景点序号: "); scanf("%d",&i); for(k=0;k if(i==g.ver[k].num)j=k; m.ver[j].sight=NULL; for(l=1;l {m.arcs[l][j].adj=INF; m.arcs[j][l].adj=INF; } m.vexnum=m.vexnum-1; sceneplace(); printf("删除继续? (y|n): "); scanf("%s",&sh); if(sh=='N'||sh=='n') break; } } 8 更新有关景点和道路的信息 voidchange(algraphg) {inti,b,j,th,fh,k; charsh,mon[10],moh[100]; while (1) { sceneplace(); printf("请输入你将要修改信息的景点序号: "); scanf("%d",&i); for(k=0;k if(i==g.ver[k].num)j=k; printf("-----------------------------------------\n"); printf("1.景点名称\t2.景点简介\t3.道路消息\n"); printf("-----------------------------------------\n"); printf("请输入你要进行的操作的序号: "); scanf("%d",&th); switch(th) {case1: printf("请输入新景点名称: "); scanf("%s",mon); g.ver[j].sight=mon; m.ver[j].sight=g.ver[j].sight; break; case2: printf("请输入新景点简介: "); scanf("%s",moh); m.ver[j].description=(char*)malloc(100); strcpy(m.ver[j].description,moh); break; case3: printf("请输入要修改的与该景点相通的景点的距离的序号个数: "); scanf("%d\n",&fh); for(k=0;k {printf("请输入要修改的第%d个景点的序号: ",j+1); scanf("%d\n",&b); printf("请重新输入该两个景点之间的距离: "); scanf("%d",&m.arcs[j][b].adj); m.arcs[b][j].adj=m.arcs[j][b].adj; } } sceneplace(); printf("继续修改? (y|n): "); scanf("%s",&sh); if(sh=='N'||sh=='n') break; } 9 显示全景 略 10 主函数 intmain() { picture(); printf("\n------------------------------校园导航系统----------------------------------------------\n"); sceneplace(); for(;;) { switch(menu()) {case1: checkscene(m);break; case2: Dijkstra(m);break; case3: alldistance(m);break; case4: addscene(m); break; case5: delscene(m); break; case6: change(m); break; case7: chang(m); break; case8: printf("感谢你使用辉哥校园导航系统! ! 辉哥又一次带大家拯救了世界! ! 再见! ! \n"); exit(0); default: printf("输入错误! ! 请重新输入你要进行的操作! ! \n"); } } } 五.调试分析 在调试删除修改功能过程中,删除的总是不正确,删除的结果显示,没有将要删除的景点删掉,最后发现删除的结点不正确,删除应该与输入的值和头结点next比较,而不是头结点。 还有就是删除结点不知道如何循环,最后又看看了记得笔记和书,才知道如何继续删除而不出错误。 六.使用说明 进入校园导航系统,首先看到的就是用户欢迎界面,然后根据提示: 1.图中任意景点的相关信息查寻;2.任意两个景点间的最短路径;3.任意两个景点间的所有路径;4.增加有关景点和道路的信息;5.删除更新有关景点和道路的信息;6.更新有关景点和道路的信息7.显示全景;8.退出该系统 如1,图中任意景点的相关信息查寻。 根据本系统提供的10个景点,输入景点编号,可以得到景点信息和景点介绍; 如2,任意两个景点间的最短路径。 提示依次输入出发景点序号和目的景点序号,录入完毕后,按回车输出最短游览路径,以及路径长度,并提示是否继续查询; 如3,任意两个景点间的所有路径。 提示依次输入出发景点序号和目的景点序号,录入完毕后,按回车输出所有游览路径,并记数路径条数,最后提示是否继续查询; 如4,增加有关景点和道路的信息。 提示依次输入1.新景点的名称;2新景点相关简介;3.有几个景点与该景点相通;4.依次输入相通景点的序号和两个景点间的距离,添加成功后,提示是否
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 校园 导航系统 课程设计 报告