校园导航系统
数据结构课程设计
前言
现代社会,新兴科技日新月异,信息千变万化,人们在渴望得到最多最
广的信息的同时又渴望得到信息的路径能越来越简单,易操作,而且能在简易的操作中得到更多的信息。这就要求信息咨询系统的开发者在开发之时能尽可能的全面理解客户的想法要求,而且在开发的时候能更简易的操作和更新,这种思想都符程序设计的开发思想。
本次设计任务是设计学校的平面图,至少包括10个以上的场所,每两个
场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径),其实就是数据结构中图类的问题。将校园景点作为图的结点,将景点间的路径作为图的边,路径距离作为边的权值。这样一来,求两景点间最短路径的问题就抽象成了求图中一结点到另一结点的问题。
关键字:校园导航 数据结构 C语言
目录
1引言 .................................................................................................................. 4
2程序设计 ........................................................................................................... 4
2.1设计时间 . ........................................................................................................................ 4
2.2设计目的 . ........................................................................................................................ 4
2.3设计任务 . ........................................................................................................................ 4
2.4需求分析 . ........................................................................................................................ 4
2.5概要设计 . ........................................................................................................................ 5
2.5.1. 设计思路和主要步骤 .............................................................................................. 5
2.5.2程序流程图 .............................................................................................................. 6
2.6详细设计 . ........................................................................................................................ 6
2.6.1学校整体局部 .......................................................................................................... 6
2.6.2打印图 . ..................................................................................................................... 8
2.6.3导航函数 .................................................................................................................. 9
2.6.4查找路径 ................................................................................................................ 10
2.6.5记录最短路径 ........................................................................................................ 11
3调试分析 .......................................................................................................... 11
4附录 ................................................................................................................. 15
总结 .................................................................................................................... 21
参考文献 . ............................................................................................................ 22
1引言
本概要设计说明书基于之前建立的软件需求设计基础上,对“蚌埠学院校园导航系
统”做出概要分析。主要解决了实现该系统需求的程序模块设计问题。包括如何把该系
统划分成若干个模块、决定各个模块之间的接口、模块之间传递的信息,以及数据结构、
模块结构的设计等。在以下的概要设计报告中将对在本阶段中对系统所做的所有概要设
计进行详细的说明。
2程序设计
2.1设计时间
2015-06-01—2015-06-15
2.2设计目的
1. 加深对《数据结构》这门课程的进一步理解与巩固
2. 通过课程设计,培养自己的编程能力以及团队协作能力
3. 加强自己对实际问题的分析能力,以及如何更好的将一些经典的算法应
用于实际
2.3设计任务
该导航系统为参观者提供校园主要建筑的基本信息及各建筑间的距离,
同时通过该系统计算出所在位置到目的地的最短路径。
2.4需求分析
1. 程序体现的功能:
(1) main()——主函数
(2) navigate()——导航函数
(3) pri()——打印校园平面图函数
(4) visit()——递归查找路线函数
2. 正确输入与输出形式:
如:
执行建筑查询功能:
① 输入为:sod
输出为:该建筑所在的坐标为7 8
种有花草和一些艺术标记物
② 输入为:ld
输出为:该位置没有找到
你找的建筑没有找到
执行导航功能:
输入为:请输入你所在位置:gym
输入你要的目的地:sod
输出为:打印并给出所有可能走通的线路,
计算出两地间的最短路径(距离)
执行显示最短路径功能:
输入为:请输入你所在位置:sod
输入你要的目的地:office
输出为:其中最短路径为:
平面图中包含最短线路图,
其行走的距离为450米
2.5概要设计
2.5.1. 设计思路和主要步骤
按照需求分析,首先我们先要把学校的整体布局给设计出来,即用一个
二维数组char arr[17][22]表示学校的整体布局,并将每个建筑物用特殊的符
号表示:/*2为墙壁 ■ A 办公楼▤ c 教学区● g 草坪▣ p 操场▓ 0 路 b
图书馆★ M 门□ m 食堂○h 为宿舍☆ T 为体育馆▢ l 为实验室 ╳*/,
然后要打印出学校的整体布局, 设计一个pri (char ,int )打印出学校的整体
布局。
在学校里,最重要的是校园的导航系统,这样可以使人耳目一新的知
道某个地方的某个地方的路径,所以设计校园导航函数是必须的,因此我们
设计void navigate(int x)函数,在图的应用中,一个最重要的知识就是求最短
路径, 我们并没有用迪杰斯特拉的算法和弗洛伊德算法来实现这个功能,
而是利用了迷宫求解问题中的递归意义来实现求最短路径的功能void
visit(int qiX,int qiY ,int zhX,int zhY , int x) 用于查找某地点到某地点的所有路
径,然后进行比较,将最短路径用函数void fuzhi(将最短路径存放在一个数
组中) 。
2.5.2程序流程图
2.6详细设计
按照需求分析中的需求,和概要设计中的各流程图的模块,进行详细设计,
完善各流程的代码,详细设计如下:
2.6.1学校整体局部
char arr[17][22]={
/*2为墙壁 ■ A办公楼▤ c教学区● g草坪▣ p操场▓ 0 路 b图书馆
★ M门□ m 食堂○h 为宿舍☆ T为体育馆▢ l为实验室 ╳*/
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16 17 18 19 20 21
{'2','2','2','2','2','2','2','2','2','2','2','2','2','M','2','2',
'2','2','2','2','2','2'},
{'2','A','A','A','0','c','c','c','c','c','c','c','c','0','2','p',
'p','p','p','p','p','2'},
{'2','A','A','A','0','c','c','c','c','c','c','c','c','0','2','p',
'p','p','p','p','p','2'},
{'2','A','A','A','0','c','c','c','c','c','c','c','c','0','2','p',
'p','p','p','p','p','2'},
{'2','A','A','A','0','0','0','0','0','0','0','0','0','0','2','p',
'p','p','p','p','p','2'},
{'2','A','A','A','0','g','g','g','g','g','g','g','g','0','2','2',
'2','0','2','2','2','2'},
{'M','0','0','0','0','g','g','g','g','g','g','g','g','0','0','0',
'0','0','0','0','m','2'},
{'2','l','l','l','0','0','0','0','0','0','0','0','0','0','h','h',
'h','h','h','0','m','2'},
{'2','l','l','l','0','b','b','b','b','b','b','b','b','0','h','h',
'h','h','h','0','m','2'},
{'2','l','l','l','0','b','b','b','b','b','b','b','b','0','0','0',
'0','0','0','0','m','2'},
{'2','l','l','l','0','b','b','b','b','b','b','b','b','0','h','h',
'h','h','h','0','0','2'},
{'2','0','0','0','0','b','b','b','b','b','b','b','b','0','h','h',
'h','h','h','0','m','2'},
{'2','T','T','T','0','b','b','b','b','b','b','b','b','0','0','0',
'0','0','0','0','m','2'},
{'2','T','T','T','0','b','b','b','b','b','b','b','b','0','h','h',
'h','h','h','0','m','2'},
{'2','T','T','T','0','b','b','b','b','b','b','b','b','0','h','h',
'h','h','h','0','m','2'},
{'2','T','T','T','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','M'},
{'2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2',
'2','2','2','2','2','2'},
};
4.3.2:校园建筑信息
struct Construct construct[]={
{3,4,"office",
"-------------------------------------\n|一层为经管系办公室 |\n|二层为外语系办公室 |\n|三层为文教系办公室
|\n|四层为计算机科学与技术系办公室 |\n|五楼为数理系办公室 |\n-------------------------------------\n"},
//办公室
{4,8,"classroom","学生上课的主要区域"},//教学楼A
{1,13,"northDoor","是学生经常出入的门,人流量较大"},//北门
{5,17,"playground","体育课上课的场所,学生健身的去处。"},//操场
{6,1,"westDoor","是学校的正门, 前方有一个面具很多的停车区"},//西门
{7,8,"sod","种有花草和一些艺术标记物"},//草坪
{9,4,"lab","学生动手实践的教室"},//实验室
{9,7,"library","开放时间为:每天的8:00~21:00\n是老师和学生学习的
好去处"},//图书馆
{9,16,"Whostel","女生宿舍楼"},//宿舍楼A
{7,19,"SdiningRoom","靠近女生宿舍的食堂, 饭菜口味比较可口\n人流量
较大, 但只在供餐时间较短"},//食堂A
{12,16,"Mhostel","男生宿舍楼"},//宿舍楼B
{15,16,"Thostel","教师公寓楼"},//宿舍楼C
{13,19,"TdiningRoom ","靠近男生宿舍楼, 供餐时间较长, 随时去随时有饭
"},//食堂B
{14,4,"gym","内部体育设施齐全, 在里面可以打篮球、打排球、打羽毛球等
等"},//体育馆
{15,20,"eastDoor","学校正门,老师班车出入。"},//东门
{-1,-1,"No found","你找的建筑没有找到"},
};
2.6.2打印图
void pri(char a[17][22],int bushu){
int i,j;
for(i=0;i
for(j=0;j
switch(a[i][j]){
case '2':printf("■");break;
case 'A':printf("▤");break;
case 'c':printf("●");break;
case 'g':printf("▣");break;
case 'p':printf("▓");break;
case '0':printf(" ");break;
case 'b':printf("★");break;
case 'M':printf("□");break;
case 'm':printf("○");break;
case 'h':printf("☆");break;
case 'T':printf("▢");break;
case 'l':printf("╳");break;
case '1':printf("╬");break;
}
}
printf("\n");
}
if(bushu>0){
printf("其行走的距离为%d米\n",bushu*50);
}
printf("备注:\n■为墙壁, ▤办公楼 ,●为教学区, ▣ 为草坪, ▓为操场,\n");
printf("★为图书馆, □为门, ○为食堂, ▤为宿舍, ▢为体育馆\n╳为实验室\n");
}
2.6.3导航函数
void navigate(int x){
shortbushu=1000; /*用于记录最短步数*/
struct Construct * qi;
struct Construct * zh;
int qiX, qiY,zhX,zhY;
int c;
int i=1 ;
while(i==1){
printf("请输入你所在位置:");
qi=selectName(15);
if((-1)==qi->x) {
printf("是否重新输入你所在地:(1/0)\n");
scanf("%d",&c);
if(c==1){
i=1;
}else{
return;
}
}
else
i=0;
};
i=1;
while(i==1){
printf("输入你要的目的地:");
zh=selectName(15);
if((-1)==zh->x) {
printf("是否重新输入你的目的地:(1/0)\n");
scanf("%d",&c);
if(c==1){
i=1;
}else{
return;
}
}
else
i=0;
}
qiX=qi->x;
qiY=qi->y;
zhX=zh->x;
zhY=zh->y;
num=1;
visit(qiX,qiY,zhX,zhY,x);
printf("其中最短路径为:\n");
pri(jilu,shortbushu);
}
2.6.4查找路径
void visit(int qiX,int qiY,int zhX,int zhY, int x){ //x为标志,用于控制要不要显示所有的路径 当其非0是显示所有的路径
char n=arr[qiX][qiY];
arr[qiX][qiY]='1';
bushu++;
if(qiX==zhX&&qiY==zhY){
if(x){
printf ("第%d条线路\n",(num++));
pri(arr,bushu);
}
if(shortbushu>bushu){
shortbushu=bushu;
fuzhi();
}
}
if(arr[qiX][qiY+1]=='0') visit(qiX,qiY+1,zhX,zhY,x);
if(arr[qiX+1][qiY]=='0') visit(qiX+1,qiY,zhX,zhY,x);
if(arr[qiX][qiY-1]=='0') visit(qiX,qiY-1,zhX,zhY,x);
if(arr[qiX-1][qiY]=='0') visit(qiX-1,qiY,zhX,zhY,x);
arr[qiX][qiY]=n;
bushu--;
}
2.6.5记录最短路径
void fuzhi(){ int i,j; for(i=0;i
}
}
}
3调试分析
4附录
程序源代码:
#include
#include
#include
char jilu[17][22];/*用于记录最短路径*/
void fuzhi();/*用于给最短路径赋值*/
int shortbushu=1000; /*用于记录最短步数*/
int num=1;/*记录多少条路*/
int bushu=0;/*记录走了多远*/
struct Construct selectName(int *a,int n);/*根据名字查询位置*/
void navigate(int x);/*导航*/
void pri(char [][22],int);//打印图
void add();//增加建筑信息
void visit(int ,int,int,int,int);//递归查找路线
char arr[17][22]={
/*2为墙壁 ■ A 办公楼▤ c 教学区● g 草坪▣ p 操场▓ 0 路 b 图
书馆★ M 门□ m 食堂○h 为宿舍☆ T 为体育馆▢ l 为实验室 ╳*/
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21
{'2','2','2','2','2','2','2','2','2','2','2','2','2','M','2','2','2','2','2','2','2','2'},
{'2','A','A','A','0','c','c','c','c','c','c','c','c','0','2','p','p','p','p','p','p','2'},
{'2','A','A','A','0','c','c','c','c','c','c','c','c','0','2','p','p','p','p','p','p','2'},
{'2','A','A','A','0','c','c','c','c','c','c','c','c','0','2','p','p','p','p','p','p','2'},
{'2','A','A','A','0','0','0','0','0','0','0','0','0','0','2','p','p','p','p','p','p','2'},
{'2','A','A','A','0','g','g','g','g','g','g','g','g','0','2','2','2','0','2','2','2','2'},
{'M','0','0','0','0','g','g','g','g','g','g','g','g','0','0','0','0','0','0','0','m','2'},
{'2','l','l','l','0','0','0','0','0','0','0','0','0','0','h','h','h','h','h','0','m','2'},
{'2','l','l','l','0','b','b','b','b','b','b','b','b','0','h','h','h','h','h','0','m','2'},
{'2','l','l','l','0','b','b','b','b','b','b','b','b','0','0','0','0','0','0','0','m','2'},
{'2','l','l','l','0','b','b','b','b','b','b','b','b','0','h','h','h','h','h','0','0','2'},
{'2','0','0','0','0','b','b','b','b','b','b','b','b','0','h','h','h','h','h','0','m','2'},
{'2','T','T','T','0','b','b','b','b','b','b','b','b','0','0','0','0','0','0','0','m','2'},
{'2','T','T','T','0','b','b','b','b','b','b','b','b','0','h','h','h','h','h','0','m','2'},
{'2','T','T','T','0','b','b','b','b','b','b','b','b','0','h','h','h','h','h','0','m','2'},
{'2','T','T','T','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','M'},
{'2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2'},
};
struct Construct{
int x;
int y;
char name[25];
char miaoshu[10000];
};
struct Construct construct[]={
{3,4,"office",
"-------------------------------------\n|一层为经管系办公室 |\n|二层为外语系办公室 |\n|三层为文教系办公室 |\n|四层为计算机科学与技术系办公室 |\n|五楼为数理系办公室 |\n-------------------------------------\n"},
//办公室
{4,8,"classroom","学生上课的主要区域"},//教学楼A
{1,13,"northDoor","是学生经常出入的门,人流量较大"},//北门
{5,17,"playground","体育课上课的场所,学生健身的去处。"},//操场
{6,1,"westDoor","是学校的正门, 前方有一个面具很多的停车区"},//西门
{7,8,"sod","种有花草和一些艺术标记物"},//草坪
{9,4,"lab","学生动手实践的教室"},//实验室
{9,7,"library","开放时间为:每天的8:00~21:00\n是老师和学生学习的好
去处"},//图书馆
{9,16,"Whostel","女生宿舍楼"},//宿舍楼A
{7,19,"SdiningRoom","靠近女生宿舍的食堂, 饭菜口味比较可口\n人流量
较大, 但只在供餐时间较短"},//食堂A
{12,16,"Mhostel","男生宿舍楼"},//宿舍楼B
{15,16,"Thostel","教师公寓楼"},//宿舍楼C
{13,19,"TdiningRoom "," 靠近男生宿舍楼, 供餐时间较长, 随时去随时有饭
"},//食堂B
{14,4,"gym","内部体育设施齐全, 在里面可以打篮球、打排球、打羽毛球
等等"},//体育馆
{15,20,"eastDoor","学校正门,老师班车出入。"},//东门
{-1,-1,"No found","你找的建筑没有找到"},
};
void ar(){
int m,n;
for(m=0;m
for(n=0;n
printf("%c",arr[m][n]);
}
printf("\n");
}
}
struct Construct * selectName(int n)/*根据名字查询位置*/{
int i;
char name[15];
scanf("%s",&name);
for(i=0;i
if(strcmp(construct[i].name,name)==0){
return & construct[i];
}
}
printf("给位置没有找到\n");
return & construct[15];
}
int main(){
int i;
int n=15;
struct Construct * jianzhu;
while(1){
printf("欢迎来到蚌埠学院, 我们将为你提供贴心的导航服务\n"); printf("*********************************************\n"); printf(" 1. 学校整体布局\n");
printf(" 2. 建筑查询\n");
printf(" 3. 导航\n");
printf(" 4. 显示最短路径\n");
printf(" 5. 退出\n");
printf("*********************************************\n"); scanf("%d",&i);
switch(i){
case 1:
printf("查询位置\n");
pri(arr,0);
break;
case 2:
printf("请输入查询建筑的名称:\n");
jianzhu=selectName(n);
if(-1!=jianzhu->x)
printf("该建筑所在的坐标为%d %d\n",jianzhu->x,jianzhu->y); printf("%s\n",jianzhu->miaoshu);
break;
case 3:
printf("导航\n");
navigate(1);
break;
case 4:
printf("其中最短路径为:\n");
navigate(0);
//pri(jilu,shortbushu);
break;
case 5:
printf("退出");
exit(0);
}
};
return 0;
}
void navigate(int x){
shortbushu=1000; /*用于记录最短步数*/
struct Construct * qi;
struct Construct * zh;
int qiX, qiY,zhX,zhY;
int c;
int i=1 ;
while(i==1){
printf("请输入你所在位置:");
qi=selectName(15);
if((-1)==qi->x) {
printf("是否重新输入你所在地:(1/0)\n");
scanf("%d",&c);
if(c==1){
i=1;
}else{
return;
}
}
else
i=0;
};
i=1;
while(i==1){
printf("输入你要的目的地:");
zh=selectName(15);
if((-1)==zh->x) {
printf("是否重新输入你的目的地:(1/0)\n");
scanf("%d",&c);
if(c==1){
i=1;
}else{
return;
}
}
else
}
qiX=qi->x;
qiY=qi->y;
zhX=zh->x;
zhY=zh->y;
num=1;
visit(qiX,qiY,zhX,zhY ,x);
printf("其中最短路径为:\n");
pri(jilu,shortbushu);
}
/*2为墙壁 ■ A 办公楼▤ c 教学区● g 草坪▣ p 操场▓ 0 路 b 图书馆★ M 门 □ m 食堂○h 为宿舍▤ T 为体育馆▢*/
void pri(char a[17][22],int bushu){
int i,j;
for(i=0;i
for(j=0;j
switch(a[i][j]){
case '2':printf("■");break;
case 'A':printf("▤");break;
case 'c':printf("●");break;
case 'g':printf("▣");break;
case 'p':printf("▓");break;
case '0':printf(" ");break;
case 'b':printf("★");break;
case 'M':printf("□");break;
case 'm':printf("○");break;
case 'h':printf("☆");break;
case 'T':printf("▢");break;
case 'l':printf("╳");break;
case '1':printf("╬");break;
}
}
printf("\n");
}
if(bushu>0){
printf("其行走的距离为%d米\n",bushu*50);
}
printf("备注:\n■为墙壁, ▤办公楼 , ●为教学区, ▣ 为草坪, ▓为操场,\n");
printf("★为图书馆, □为门, ○为食堂, ▤为宿舍, ▢为体育馆\n╳为实验室\n");
}
void visit(int qiX,int qiY,int zhX,int zhY, int x){ //x为标志,用于控制要不要显示所有的路径 当其非0是显示所有的路径
char n=arr[qiX][qiY];
arr[qiX][qiY]='1';
bushu++;
if(qiX==zhX&&qiY==zhY){
if(x){
printf ("第%d条线路\n",(num++));
pri(arr,bushu);
}
if(shortbushu>bushu){
shortbushu=bushu;
fuzhi();
}
}
if(arr[qiX][qiY+1]=='0') visit(qiX,qiY+1,zhX,zhY,x);
if(arr[qiX+1][qiY]=='0') visit(qiX+1,qiY,zhX,zhY ,x);
if(arr[qiX][qiY-1]=='0') visit(qiX,qiY-1,zhX,zhY,x);
if(arr[qiX-1][qiY]=='0') visit(qiX-1,qiY,zhX,zhY ,x);
arr[qiX][qiY]=n;
bushu--;
}
void fuzhi(){
int i,j;
for(i=0;i
for(j=0;j
jilu[i][j]=arr[i][j];
}
}
}
总结
此次课程设计相对于我来说,难度较大,相对于这个学期写的那些小算法来说,这个课程设计能充分发挥出学习数据结构后的能力;而相对于之前做的设计性实验,又有了实际的应用,现实应用度增加。
从接触C 语言编程到现在,我就觉得:编程不是简简单单的写出程序,更多的是处理出现的语法和逻辑错误。在这次课程设计中,我深刻的体会到
编程不是一种简单的事,编程不但需要耐心,更需要细心。编出大体的程序架构,花费了我的时间并不多,但我很多时间是用在调试和测试数据上!有些现在看着简单的语法错误,一时竟然无从下手。我想,这和我C 语言基础薄弱有很大关系,以后要加强认识。
总的来说,这次课程设计,让我学了很多,总结了很多!
参考文献
[1] 严蔚敏,吴伟民. 数据结构(C 语言版)[M]. 北京 清华大学出版社,2007
[2] 谭浩强.C 程序设计(第三版) [M]. 北京 清华大学出版社,2007
[3] 谭浩强.C 程序设计题解与上机指导(第三版)[M]. 北京 清华大学出版社,2007
[4] 严蔚敏,吴伟民,米 宁. 数据结构题集(C 语言版)[M]. 北京 清华大学出版社,2007
[5] 互联网的相关信息和内容