校园导游系统程序课程设计报告报告.docx
《校园导游系统程序课程设计报告报告.docx》由会员分享,可在线阅读,更多相关《校园导游系统程序课程设计报告报告.docx(32页珍藏版)》请在冰豆网上搜索。
校园导游系统程序课程设计报告报告
1、需求分析
设计一个校园导游系统程序,为来访的客人提供各种服务的信息查询。
(1).设计工商学院校园无向图,所含的景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2).为来访客人提供图中任意景点相关信息的查询。
(3).为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
2、设计思路
校园旅游模型是由景点和景点之间的路径组成的,所以这完全可以用数据结构中的图来模拟。
用图的结点代表景点,用图的边代表景点之间的路径。
所以首先应设计一个图类。
结点值代表景点信息,边的权值代表景点间的距离。
结点值及边的权值用顺序表存储,所以需要设计一个顺序表类。
本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。
计算路径长度和最短路线时可用弗洛伊德(Floyd)算法实现。
最后用switch选择语句选择执行浏览景点信息或查询最短路径。
3算法设计
3.1概要设计
3.1.1程序中包含的模块
(1)主程序模块
主函数:
voidmain(void)
voidcmd(void)cmd修改显示框大小,字体背景颜色,初始化景点,景点信息打印菜单,
MGraphInitGraph(void);//初始化图。
MGraph*CreatUDN(MGraph*G);//初始化图形接受用户输入
voidMenu(void);//菜单函数
voidBrowser(MGraph*G);//浏览函数
voidShortestPath_DIJ(MGraph*G);
voidFloyd(MGraph*G);//查询图中任意两个景点间的所有路径
voidSearch(MGraph*G);//查找函数
intLocateVex(MGraph*G,char*v);//迪杰斯特拉算法计算起点各顶点间短路径,
voidprint(MGraph*G);//输出函数
(2)查询模块
景点信息查询:
voidintroduce()
最短路径查询:
要查找的两景点的最短距离:
用floyd算法求两个景点的最短路径:
(3)打印模块:
voidprint(MGraph*G);
3.1.2模块间的调用关系
主函数main()调用voidcmd(void)调用menu并且用switch设置开关语句。
3.2详细设计
3.2.1定义符号变量
#defineINFINITY1000/*穷*/
#defineMAX_VERTEX_NUM40/*定义全局变量*/
创建两个类存储景点信息和存储景点道路和长度
typedefstructArCell//邻接矩阵
{
intadj;//存储路径长度
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct//图顶点表示主要景点存放景点编号、名称、简介等信息
{
charname[20];
intnum;
charintroduction[60];//简介
}infotype;
typedefstruct//图中的边表示景点间的道路,存放路径长度等信息。
{
infotypevexs[MAX_VERTEX_NUM];//顶点信息域
AdjMatrixarcs;
intvexnum,/*顶点数*/arcnum;//边个数
}MGraph;
MGraphb;
3.2.2自定义函数原型说明
给出函数声明
voidcmd(void);
MGraphInitGraph(void);
voidMenu(void);
voidBrowser(MGraph*G);
voidShortestPath_DIJ(MGraph*G);
voidFloyd(MGraph*G);
voidSearch(MGraph*G);
intLocateVex(MGraph*G,char*v);
MGraph*CreatUDN(MGraph*G);
voidprint(MGraph*G);
3.2.3定义各顶点之间的距离:
for(i=0;ifor(j=0;jG.arcs[i][j].adj=INFINITY;
G.arcs[0][1].adj=80;/*路径度*/
G.arcs[0][2].adj=180;
G.arcs[0][6].adj=200;
G.arcs[1][11].adj=120;
G.arcs[1][2].adj=100;
G.arcs[2][5].adj=50;
G.arcs[3][4].adj=60;
G.arcs[4][9].adj=140;
G.arcs[5][9].adj=250;
G.arcs[5][7].adj=150;
G.arcs[6][7].adj=190;
G.arcs[6][9].adj=150;
G.arcs[8][7].adj=130;
G.arcs[8][6].adj=50;
G.arcs[10][12].adj=100;
G.arcs[9][10].adj=150;
G.arcs[3][4].adj=190;
G.arcs[5][13].adj=150;
G.arcs[14][7].adj=350;
G.arcs[2][3].adj=190;
G.arcs[2][9].adj=150;
G.arcs[2][11].adj=120;
G.arcs[0][8].adj=120;
G.arcs[1][2].adj=50;
G.arcs[10][12].adj=170;
G.arcs[12][15].adj=160;
for(i=0;ifor(j=0;jG.arcs[j][i].adj=G.arcs[i][j].adj;
returnG;
3.2.4界面菜单设计:
菜单选择
voidMenu()
{
printf("\n武汉工商学院院导游图\n");
printf("┏━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃1.浏览校园全景┃\n");
printf("┃2.查看所有游览路线┃\n");
printf("┃3.确定两景点之间最短距离┃\n");
printf("┃4.查看景点信息┃\n");
printf("┃5.退出导游系统┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━┛\n");
printf("Option-:
");
}
Menu();
scanf("%d",&i);
while(i!
=5)
{
switch(i)
{
case1:
system("cls");Browser(&b);Menu();break;
case2:
system("cls");ShortestPath_DIJ(&b);Menu();break;
case3:
system("cls");Floyd(&b);Menu();break;
case4:
system("cls");Search(&b);Menu();break;
case5:
exit
(1);break;
default:
break;
}
3.2.6介绍景点:
voidBrowser(MGraph*G)
{
intv;
printf("┏━━┳━━━━━━━━━━┳━━━━━━━━━┓\n");
printf("┃编号┃景点名称┃简介┃\n");
printf("┗━━┻━━━━━━━━━━┻━━━━━━━━━┛\n");
for(v=0;vvexnum;v++)printf("┃%-4d┃%-20s┃%-60s\n",G->vexs[v].num,G->vexs[v].name,G->vexs[v].introduction);
printf("┗━━┻━━━━━━━━━━┻━━━━━━━━━┛\n");
}
3.2.7要查找的两个景点的最短距离:
用floyd算法求两个景点的最短路径
voidFloyd(MGraph*G)//查询图中任意两个景点间的所有路径。
{intv,u,i,w,k,j,flag=1,p[20][20][20],D[20][20];
for(v=0;vvexnum;v++)
for(w=0;wvexnum;w++)
{D[v][w]=G->arcs[v][w].adj;
for(u=0;uvexnum;u++)
p[v][w][u]=0;
if(D[v][w]{p[v][w][v]=1;p[v][w][w]=1;}
}
for(u=0;uvexnum;u++)
for(v=0;vvexnum;v++)
for(w=0;wvexnum;w++)
if(D[v][u]+D[u][w]{D[v][w]=D[v][u]+D[u][w];
for(i=0;ivexnum;i++)
p[v][w][i]=p[v][u][i]||p[u][w][i];}
while(flag)
{printf("请输入出发地编号:
");
scanf("%d",&k);
if(k<0||k>G->vexnum)
{printf("景点编号存!
\n请输入出发地编号:
");
scanf("%d",&k);}
printf("请输入目的地编号:
");
scanf("%d",&j);
if(j<0||j>G->vexnum)
{printf("景点编号存!
\n请输入目的地编号:
");
scanf("%d",&j);}
if(k>=0&&kvexnum&&j>=0&&jvexnum)
flag=0;}
printf("%s",G->vexs[k].name);
for(u=0;uvexnum;u++)
if(p[k][j][u]&&k!
=u&&j!
=u)
printf("-->%s",G->vexs[u].name);
printf("-->%s",G->vexs[j].name);
printf("总路线%dm\n",D[k][j]);}
3.2.8查看所有游览路线
迪杰斯特拉算法计算单源最短路径,引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v0到每个终点vi的最短路径的长度。
若从v到vi有弧,则D为弧上的权值;否则置D为∞。
4测试分析
4.1主程序界面
主程序从voidmain()开始运行voidcmd(void)cmd修改显示框大小,字体背景颜色,初始化景点,景点信息的赋值初始化无向邻接图b=InitGraph();调用menu菜单函数打印菜单,提示用户输入选择功能。
图4-1.主程序界面
4.2浏览景点信息
输出浏览比较简单就是把原来的景点信息利用for循环输出,intv=0;v小于最多的景点个数输出景点信息。
依次输出。
图4-2浏览景点信息
4.3查看所有游览线路
查看所有路线是使用voidShortestPath_DIJ(MGraph*G)//迪杰斯特拉算法计算起点各顶点间短路径,然后利用for循环输出计算的结果。
输入景点不正确时会输出景点不存在请重新输入景点编号。
图4-3:
查看所有游览路线
4.4确定两景点之间最短距离
利用voidFloyd(MGraph*G)//函数利用循环嵌套查询图中存在的任意两个景点间的最短路径再利用循环输出,如果景点不存在将会输出景点不存在请输入出发地(目的地)编号。
图4-4:
确定两景点之间最短距离
4.5查看景点信息
利用voidSearch(MGraph*G)//函数,查看景点信息查找景点编号,当输入景点编号不在范围时输出“景点编号不存在请重新输入编号:
”输入正确时输出景点信息。
图4-5:
查看景点信息
5系统功能及实现
5.1主程序界面
定义一个I,然后,调用InitGraph()函数初始化图,再调用menu()函数,再输入选择,利用switch开关语句,用户选择,需要的功能,实现想要的.。
图5-1.主程序界面
5.2浏览景点信息
定义v;用for循环for(v=0;i图5-2浏览景点信息
5.3查找所有游览线路
查找路径利用,迪杰斯特拉算法,第1重循环for(x=0;xvexnum;x++)//第1重循环条件成立时执行p[w][x]=p[v][x];不成立时结束循环。
图5-:
3-1:
查找所有游览路线
第2重循环for(w=0;wvexnum;w++)循环条件成立的时候执行if(!
final[w]&&(min+G->arcs[v][w].adj{D[w]=min+G->arcs[v][w].adj;第一重循环p[w][w]=1;}循环不成立时循环结束
图5-:
3-2:
查找所有游览路线
第3重循环定义一个w,利用for循环for(w=0;wvexnum;w++)当循环体成立时if(!
final[w])if(D[w]final[v]=1;第2重for循环}循环条件不成立循环终止结束跳出到第四重循环执行i++.
图5-:
3-3:
查找所有游览路线
第4重for循环定义I,利用for(i=0;ivexnum;i++)循环条件成立的时候执行{min=INFINITY;以及第3重for循环里面的代码直到循环条件不成立,循环结束然后利用for输出查找结果如图5-3-4
图5-3-4:
查看所有游览路线(第4重循环)
这是查看所有路线功能里的输出循环,定义v,i整型变量然后利用for(v=0;vvexnum;v++)
判断if(v0!
=v)如果成立执行{printf("%s",G->vexs[v0].name);}然后执行
第二重for(w=0;wvexnum;w++)
{if(p[v][w]&&w!
=v0){printf("-->%s",G->vexs[w].name);}
t++;}
if(t>G->vexnum&&v0!
=v)printf("总路线%dm\n\n",D[v]);第1重循环结束后跳到第1重v++直到外重循环循环条件不成立循环结束
图5-3-5:
查看所有游览路线
5.4确定两景点之间最短距离
利用多个for循环嵌套,计算出路径,计算出路径长度,当最外重循环不成立时循环结束.利用for循环输出
图5-4-2:
确定两景点之间最短距离
6总结
经过近两周的课程设计,总的来说收获还是很大的!
首先代码能力明显提高,有了想法基本都能顺利表达出来;再者就是数据结构的选择使用能力也有了很大的提高!
虽说平时的试验课我们也有用各种数据做题,但那些都是很明确的知道该做什么操作,存什么,我们的发挥空间不大一般照做就行,然而这次实习我们却在自主的选择判断,这本身就是一个很大的提高!
还有就是算法方面的学习有了初步进阶,如最短路径,这样比较简单的图论算法能比较熟练的写出来。
但是还是有很多的只是不了解!
收获真的很多,但是最大的收获可能就是对编程的兴趣吧,在一次次的改错,一次次的完成想要的效果后,越写越有感觉!
当然还收获了无知,更确切的说是自知,原来我们现在什么也不算,还有很多有用的只是等着我们去学习!
7参考文献
[1]谭浩强.C程序设计(第四版)[M].北京:
清华大学出版社,2010:
293-326.
[2]苏小红,孙志岗,陈惠鹏.C语言大学实用教程(第三版)[M].北京:
电子工业出版社,2012:
240-280.
[3]林锐.高质量C++/C编程指南[M].北京:
清华大学出版社2001.7:
245-278.
[4]陈朔鹰,陈英.C语言程序设计习题集(第二版)[M].北京:
人民邮电出版社,2003.2:
320-360.
[5]谭浩强.C语言程序设计题解与上机指导[M].北京:
清华大学出版社,2000.11:
12-60.
[6]塞奇威克.算法:
C语言实现[M].北京:
机械工业出版社,2009:
213-225.
[7]里斯.深入理解C指针[M].北京:
人民邮电出版社,2014:
103-122.
[8]陈正冲.C语言深度解剖(第2版)[M].北京:
北京航空航天大学出版社,2012:
34-42.
[9]贾宗璞.C语言程序设计[M].江苏:
中国矿业大学出版社,2007.6:
112-135.
[10]周海燕,赵重敏,齐华山.C语言程序设计[M].北京:
科学出版社,2001:
165-187.
8附录
#defineINFINITY100000000/*穷*/
#defineMAX_VERTEX_NUM40
#defineMAX40
#include
#include
#include
#include
typedefstructArCell
{
intadj;//路径度
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
typedefstruct//图顶点表示主要景点存放景点编号、名称、简介等信息
{
charname[20];
intnum;
charintroduction[60];//简介
}infotype;
typedefstruct//图中的边表示景点间的道路,存放路径长度等信息。
{
infotypevexs[MAX_VERTEX_NUM];//顶点信息域
AdjMatrixarcs;
intvexnum,/*顶点数*/arcnum;//边个数
}MGraph;
MGraphb;
voidcmd(void);
MGraphInitGraph(void);
voidMenu(void);
voidBrowser(MGraph*G);
voidShortestPath_DIJ(MGraph*G);
voidFloyd(MGraph*G);
voidSearch(MGraph*G);
intLocateVex(MGraph*G,char*v);
MGraph*CreatUDN(MGraph*G);
voidprint(MGraph*G);
/******************************************************/
voidmain(void)
{
system("color0f");
system("modecon:
cols=150lines=140");
cmd();
}
/******************************************************/
voidcmd(void)
{
inti;
b=InitGraph();
Menu();
scanf("%d",&i);
while(i!
=5)
{
switch(i)
{
case1:
system("cls");Browser(&b);Menu();break;//1.浏览校园全景
case2:
system("cls");ShortestPath_DIJ(&b);Menu();break;//2.查看所有游览路线
case3:
system("cls");Floyd(&b);Menu();break;//3.确定两景点之间最短距离
case4:
system("cls");Search(&b);Menu();break;//4.查看景点信息
case5:
exit
(1);break;
default:
break;
}
printf("请重新输入(1-5):
");
scanf("%d",&i);
}
}
MGraphInitGraph(void)//初始化
{
MGraphG;
inti,j;
G.vexnum=16;
G.arcnum=40;
for(i=0;iG.vexs[i].num=i;
strcpy(G.vexs[0].name,"唐人街");
strcpy(G.vexs[0].introduction,"学校门口小吃街");
strcpy(G.vexs[1].name,"校大门");
strcpy(G.vexs[1].introduction,"学校大门是学校的门面");
strcpy(G.vexs[2].name,"校综合楼");
strcpy(G.vexs[2].introduction,"全体教师办公场所楼高12层各种设施齐全");
strcpy(G.vexs[3].name,"体育馆足球场");
strcpy(G.vexs[3].introduction,"体育馆一楼为室内羽毛球乒乓球馆,室外为塑胶跑道,晚上散步");
strcpy(G.vexs[4].name,"医务室");
strcpy(G.vexs[4].introduction,"体育馆一楼为医用费用较贵.");
strcpy(G.vexs[5].name,"外语楼");
strcpy(G.vexs[5].introduction,"校第二教学楼,共7层环形环境优美,适宜学习");
strcpy(G.vexs[6].name,"5号宿舍楼");
strcpy(G.vexs[6].introduction,"多个学院女生宿舍楼位于弘德楼旁边");
strcpy(G.vexs[7].name,"湖边小树林");
strcpy(G.vexs[7].introduction,"绿树荫阴,适宜休息晨读还有小情侣约会");
strcpy(G.vexs[8].name,"弘德楼");
strcpy(G.vexs[8].introduction,"全校最高建筑物弘德楼一楼与二楼是学生第一食堂");
strcpy(G.vexs[9].name,"图书馆");
strcpy(G.vexs[9].introduction,"藏书145万册,设施优良一楼有咖啡厅环境优雅2楼设有电子阅览室");