西安郵電
数据结构设计报告
题 目: 校园导游咨询系统
院系名称:
计算机学院
设计起止时间:2011年11月28日~2011年12月9日
一. 设计目的
1.设计一个校园导游系统,为来客查询校园的各种信息 2.熟练掌握图的知识、加深课堂所学用于实践
二. 设计内容
1、设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
2、为来访客人提供图中任意景点相关信息的查询。
3、为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
三.概要设计
1、校园全景一览图、显示出校园的平面图。
2、提供校园中任意景点问路查询,即求任意两个景点之间的所有路径。
3、提供校园图中多个景点的最佳访问路线查询,即求途径这过个景点的最佳(短)路径。
1.功能模块图;
void Map();//校园地图
void CreateGraph();//创建图
void OutputPlace();//输出景点列表 void SearchPlace();//查询景点信息 void SearchPath();//查询最短路径 void Shortpath(int i);//计算最短路径
void Output(int sight1,int sight2);//输出函数
2.各个模块详细的功能描述。
Map();//显示校园整体的地图、包含学校各景点的详细位置 CreateGraph();//创建图、主要用来保存各景点信息
OutputPlace();//输出景点列表、供选择景点信息查询时使用 SearchPlace();//查询景点信息、景点的名称及介绍 SearchPath();//查询最短路径、两景点间最短距离
Shortpath(int i);//计算两景点间最短路径
Output(int sight1,int sight2);//输出两景点最短路径及信息
四.详细设计
1.功能函数的调用关系图
Main() CreateGraph()
Map() SearchPath() SearchPlace() Outputplace() Shortpath(i); Output(i,j); 2.各功能函数的数据流程图
全局变量:
Graph G;
int path[NUM][NUM]; int D[NUM];
3.重点设计及编码
重点设计:求最短路径 编码:
void Shortpath(int num)//迪杰斯特拉算法最短路径 {
int v,w,i,t;//i、w和v为计数变量//t表示景点个数 int final[NUM]; //标志数组、用来存放顶点的信息 int min;//记录权值、最终输出路径 for(v=0;v printf(\"\\\\\\从%s到%s的最短路径是:\\n\\n\\\\\\.vertex[sight2].name);//输出提示信息 //输出sight1到sight2的最短路径长度,存放在D[]数组中 printf(\"\%s\ //输出景点一的名称 d=sight1; //将景点一的编号赋值给d for(c=0;c 五.测试数据及运行结果 1.正常测试数据和运行结果 1、系统主界面 2、校园全景浏览 3、景点信息查询 4、最短路径查询 2.异常测试数据及运行结果 1、异常数据① 2、异常数据② 六.调试情况,设计技巧及体会 1.改进方案 系统还有部分漏洞未能修复、不够绝对的稳定、还需改进! 本次课程设计仅完成了要求的基本功能、由于平时掌握的不够好以及时间关系未能完成选作功能、这是一大缺陷!另外通过本次课程设计也更好的掌握了平时所学的知识、通过实践学到了许多课本上没有的知识! 2.体会 以后要加强动手时间能力、多与同学交流算法精髓! 在编写程序中尽量做到独立完成、对于自己想要完成的问题要主动编程完成、这样自己是一个很大的提升、也能学到很多的知识、熟练编程! 七.参考文献 1、数据结构-----C语言描述(主编:耿国华)高等教育出版社 2、数据结构(C语言版) 编著:严蔚敏、吴伟民 清华大学出版社 八.附录: #include #define FALSE 0 #define TURE 1 typedef struct ArcNode { int length; //路径长度 } ArcNode, *ArcLink; //边结点的定义 typedef struct VertexNode { int number; //景点的编号 char *name; //景点的名称 char *info; //景点的简介 } VertexNode; //顶点结点的定义 typedef struct Graph { VertexNode vertex[NUM]; ArcNode arc[NUM][NUM]; int vexnum,arcnum; //图的顶点数,边数 } Graph; //图的定义 void Map();//校园地图 void CreateGraph();//创建图 void OutputPlace();//输出景点列表 void SearchPlace();//查询景点信息 void SearchPath();//查询最短路径 void Shortpath(int i);//计算最短路径 void Output(int sight1,int sight2);//输出函数 Graph G; int path[NUM][NUM]; int D[NUM]; void CreateGraph()//创建图 { int i,j; G.vexnum=14; G.arcnum=28; for(i=1;i void Map()//学校地图 { printf(\"\\n\\n\"); system(\"cls\"); printf(\"\\\\\\┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓\\n\"); printf(\"\\\\\\┃ 西安邮电学院校园图 ┃\\n\"); printf(\"\\\\\\┃ 注:此图按正门布局而画,方位并非上北下南左西右东! ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃ ┏━━━┓ ┃\\n\"); printf(\"\\\\\\┃ ╔═══╦══┫旭日苑┣═══════╗ ┃\\n\"); printf(\"\\\\\\┃ ║ ║ ┗┳━┳┛ ║ ┃\\n\"); printf(\"\\\\\\┃ ║ ║ ║ ║ ║ ┃\\n\"); printf(\"\\\\\\┃ ┏┻┓ ┏┻┓ ║┏┻━━━━┓ ┏━┻━┓ ┃\\n\"); printf(\"\\\\\\┃ ┃体┃ ┃体┃ ║┃ 土操场 ┃ ┃ 美食 ┃ ┃\\n\"); printf(\"\\\\\\┃ ┃育┣═┫育┃ ║┃ ┃ ┃ 广场 ┃ ┃\\n\"); printf(\"\\\\\\┃ ┃场┃ ┃馆┣══╬╋━━━━━┫ ┃ ┃ ┃\\n\"); printf(\"\\\\\\┃ ┗┳┛ ┗┳┛ ║┃ 篮球场 ┣═┻━┳━┛ ┃\\n\"); printf(\"\\\\\\┃ ║ ║ ║┃ ┃ ║ ┃\\n\"); printf(\"\\\\\\┃ ║ ║ ║┗━━━━━┛ ║ ┃\\n\"); printf(\"\\\\\\┃ ║┏━━╩━━┓║ ┏━┻━━┓ ┃\\n\"); printf(\"\\\\\\┃ ╔╩┫ 图书馆 ┣╬══════╦═┫洗浴中心┃ ┃\\n\"); printf(\"\\\\\\┃ ║ ┗━━┳━━┛║ ║ ┗━━━━┛ ┃\\n\"); printf(\"\\\\\\┃┏┻━┓ ║ ║ ┏━┻━━━┓ ┃\\n\"); printf(\"\\\\\\┃┃大学┃ ║ ║ ┃ 实 ┃ ┃\\n\"); printf(\"\\\\\\┃┃生活┃ ║ ║ ┃ 验 ┃ ┃\\n\"); printf(\"\\\\\\┃┃动中┣══╬═══╬════┫ 楼 ┃ ┃\\n\"); printf(\"\\\\\\┃┃ 心 ┃ ║ ║ ┗━━┳━━┛ ┃\\n\"); printf(\"\\\\\\┃┗━┳┛ ║ ║ ║ ┃\\n\"); printf(\"\\\\\\┃ ║ ┏┻━┓ ║ ┏━━┻━━┓ ┃\\n\"); printf(\"\\\\\\┃ ║ ┃喷泉┣═╬════┫ 教学楼 ┃ ┃\\n\"); printf(\"\\\\\\┃ ║ ┗┳━┛ ║ ┗━━┳━━┛ ┃\\n\"); printf(\"\\\\\\┃┏━┻━┓ ║ ║ ║ ┏━━━┓ ┃\\n\"); printf(\"\\\\\\┃┃行政楼┣═╩═══╬═══════╝ ┃ 南 ┃ ┃\\n\"); printf(\"\\\\\\┃┗━━━┛ ┏━━┻━━┓ ┃东╋西┃ ┃\\n\"); printf(\"\\\\\\┃ ┃ 学校正门 ┃ ┃ 北 ┃ ┃\\n\"); printf(\"\\\\\\┃ ┗━━━━━┛ ┗━━━┛ ┃\\n\"); printf(\"\\\\\\┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛\\n\"); } void Outputplace()//输出校园景点名称 { printf(\"\\\\\\┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\\n\"); printf(\"\\\\\\┃ 西安邮电学院学校景点一览表 ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━┳━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃1.学校正门 ┃2.行政楼 ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃3.教学楼 ┃4.喷泉 ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃5.实验楼 ┃6.大学生活动中心 ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃7.图书馆 ┃8.洗浴中心 ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃9.体育馆 ┃10.体育场 ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃11.土操场 ┃12.篮球场 ┃\\n\"); printf(\"\\\\\\┣━━━━━━━━━━━━╋━━━━━━━━━━━━┫\\n\"); printf(\"\\\\\\┃13.美食广场 ┃14.旭日苑 ┃\\n\"); printf(\"\\\\\\┗━━━━━━━━━━━━┻━━━━━━━━━━━━┛\\n\"); } void SearchPlace()//查询景点信息 { int i,num; char c='y'; while(c=='y') { system(\"cls\"); Outputplace(); printf(\"\\\\\\请输入您要查找的景点编号:\"); scanf(\"%d\ getchar(); system(\"cls\"); if(num>0 && num<=G.vexnum) //判定信息输入正确 { for(i=1;i<=G.vexnum;i++) if(num==G.vertex[i].number) { printf(\"\\n\\\\\\景点编号:%d\\n\ printf(\"\\\\\\景点名称:%s\\n\ printf(\"\\\\\\景点简介:%s\\n\\n\ } } else printf(\"\\\\\\信息输入有误!\\n\"); num=0; printf(\"\\n\\\\\\是否继续查询景点信息(y/n):\"); c=getchar(); getchar(); } system(\"cls\"); } void SearchPath()//查询最短路径 { int i,j; char c='y'; while(c=='y') { system(\"cls\"); Outputplace(); printf(\"\\n\\n\\\\\\初始景点编号(1->14):\"); scanf(\"%d\ printf(\"\\\\\\最终景点编号(1->14):\"); scanf(\"%d\ getchar(); if(i>G.vexnum || i<=0 || j>G.vexnum || j<0 || i==j) printf(\"\\\\\\输入信息错误!\\n\\n\"); else { Shortpath(i); Output(i,j); } printf(\"\\n\\\\\\是否继续查询最短路径(y/n):\"); c=getchar(); getchar(); } system(\"cls\"); } void Shortpath(int num)//迪杰斯特拉算法最短路径 { int v,w,i,t;//i、w和v为计数变量//t表示景点个数 int final[NUM]; //标志数组、用来存放顶点的信息 int min;//记录权值、最终输出路径 for(v=0;v void Output(int sight1,int sight2) // 输出函数 { int a,b,c,d,q=0;//a、b、c和d为计数变量//q控制计数变量、用于换行 a=sight2; //将景点二赋值给a if(a!=sight1) // 如果景点二不和景点一输入重合,则进行... { printf(\"\\\\\\从%s到%s的最短路径是:\\n\\n\\\\\\.vertex[sight2].name);//输出提示信息 //输出sight1到sight2的最短路径长度,存放在D[]数组中 printf(\"\%s\ //输出景点一的名称 d=sight1; //将景点一的编号赋值给d for(c=0;c void main() { int x; system(\"color 2B\"); system(\"mode con: cols=170 lines=160\");//调整屏幕显示大小 CreateGraph(); printf(\"\\n\\n\\n\\n\\n\\\\\\\欢迎使用西安邮电学院校园导游系统\\n\\n\\n\"); while(1) { //Map(); printf(\"\\n\\n\"); printf(\"\\\\\\\┏━━━━━━━━━━┓\\n\"); printf(\"\\\\\\\┃1. 校园全景浏览 ┃\\n\"); printf(\"\\\\\\\┃2. 景点信息查询 ┃\\n\"); printf(\"\\\\\\\┃3. 最短路径查询 ┃\\n\"); printf(\"\\\\\\\┃0. 退出系统 ┃\\n\"); printf(\"\\\\\\\┗━━━━━━━━━━┛\\n\"); printf(\"\\n\\\\\\\请选择您需要的操作(0-3):\"); scanf(\"%d\ getchar(); switch(x) { case 1: system(\"cls\");printf(\"\\\\\\\校园全景浏览:\"); Map();break; case 2: system(\"cls\");printf(\"\\\\\\\景点信息查询:\"); SearchPlace();break; case 3: system(\"cls\");printf(\"\\\\\\\最短路径查询:\"); SearchPath();break; case 0: printf(\"\\n\\\\\\\\");exit(0); default: system(\"cls\");printf(\"\\\\\\\输入信息错误,请重新输入!\\n\"); break; } } } 因篇幅问题不能全部显示,请点此查看更多更全内容