数据结构(C++)课程设计
题 目: 校园导游咨询* 姓 名: 学 号: 院 系: 专业年级:
2014年7月8日
《校园导游咨询*》设计报告
目录
一、
设计题目.......................................................................................................... 2
二、 需求分析.......................................................................................................... 2
三、 概要设计.......................................................................................................... 6
四、 详细设计........................................................................................................ 11
五、 调试分析........................................................................................................ 14
六、 测试结果........................................................................................................ 14
七、 附录:程序设计源代码................................................................................ 21
—1—
《校园导游咨询*》设计报告
一、 设计题目
校园导游咨询*
二、 需求分析
1) 运行环境(软、硬件环境)
电脑型号 X64 兼容 台式电脑
处理器 英特尔 第二代酷睿 ***************四核 主板 华硕 P8H61-M LX (英特尔 H61 芯片组) 内存 8 GB ( 威刚 DDR3 1333MHz )
主硬盘 西数 WDC WD10EALX-009BA0 ( 1 TB / 7200 转/分 ) 显卡 ATI Radeon HD 6700 Series ( 512 MB / ATI ) 显示器 SGW5600 PL2208HD ( 21.7 英寸 ) 光驱 华硕 DRW-24D1ST a DVD刻录机
声卡 瑞昱 ALC887 @ 英特尔 6 Series Chipset 高保真音频 网卡 瑞昱 RTL8168E PCI-E Gigabit Ethernet NIC / 华硕
操作系统:Windows 7 Ultimate (x86) sp1 编程环境:Microsoft Visual Studio 2012
2) 输入的形式和输入值的范围
内容 景点代号 景点名称 景点简介 X坐标 Y坐标 形式 int string string int int 范围 自然数 所有字符 所有字符 正整数 正整数 3) 输出的形式描述
内容 景点代号 形式 int 范围 自然数 —2—
《校园导游咨询*》设计报告
景点名称 景点简介 X坐标 Y坐标 最短路径 图像 string string int int jpg 所有字符 所有字符 正整数 正整数 4) 功能描述
以我校南汇校区部分景点、进行抽象化,生成了具有15个顶点、18条边的图,以邻接表与邻接矩阵复合形式储存在内存中,主要有以下功能:
a. b. c. d. e.
查询景点的信息,包括基本信息和拓展的周围节点信息;
景点导航,给出起点、终点,规划出最短路径和风景最佳路径; 修改景点,道路信息,包括添加景点、添加道路、修改景点功能; 开发人员工具,包括邻接表、邻接矩阵的查看DFS深度优先遍历、BFS广度优先遍历
显示地图,打开预制的地图文件查看
5) 测试数据
初始地图信息:
—3—
《校园导游咨询*》设计报告
景点景点名称 编号 景点介绍 X坐标 Y坐标 0 1 2 3 4 学校的北入口 2 学校北侧图书馆 12 经管学院楼 26 公共机房 12 具有足球场、篮球场、健身26 房等 5 行政楼 计算机学院楼及其他行政办12 公 6 教师活动中心 又称H楼,具有桌球、乒乓12 球、会议室、舞厅等 7 雕塑 校园雕塑 26 8 南校门 学校南入口 2 9 至诚楼 办理学生事务处 12 10 大礼堂 学校大型文艺演出、讲座场26 所 11 南图书馆 学校南侧的图书馆 12 12 大学生文化活团委、学生会、社联所在处 12 动中心 13 风帆广场 绿地广场,景色优美 26 14 南运动场 具有足球场、篮球场、羽毛12 球场等 比例尺:1:9.15(即:坐标与实际地理单位相差9.15倍)
距离邻接矩阵:
北校门 北图书馆 崇德楼 奋进楼 北运动场 14 14 14 28 28 32 39 39 50 50 50 52 12 58 70
—4—
《校园导游咨询*》设计报告
0
—5—
《校园导游咨询*》设计报告
三、 概要设计
1) 抽象数据类型定义描述
(对各类的成员及成员函数进行抽象描述,参见书或ppt及实验) Site类 Data: 编号Code 景点名称SiteName 景点介绍Introduction 景点X坐标
景点Y坐标 Operation: 构造函数
输入: 编号,名称,介绍,X坐标,Y坐标 前置条件: 无
动作: 初始化Site类元素 输出: 无 后置条件: 无 SetSite
输入: 编号,名称,介绍,X坐标,Y坐标 前置条件: 无
动作: 赋值Site类元素 输出: 无 后置条件: 无
ArcNode类 Data : 邻接点下标值Adjvx
指向下一个边结点的指针 *nextarc; 风景等级sceneLevel; 距离distance; Operation: 构造函数
输入: Adjvx, *nextarc, sceneLevel; 前置条件: 无
动作: 初始化ArcNode类 输出: 无 后置条件:无
—6—
《校园导游咨询*》设计报告
VertexNode类 Data : 节点内容vex
节点首指针*firstarc Operation: 无 Road类 Data : Site型节点1,节点2
距离Distance 风景等级
Bool型是否是机动车道carAviliable; Operation: SetRoad 构造函数
输入: 节点1,节点2,风景等级 前置条件: 存在Site对象 动作: 初始化Road类 输出: 无 后置条件:无
BGraph 类 Data :
邻接表adjlist[] Int 距离矩阵 Int 风景值矩阵 Operation: 构造函数 输入:
前置条件: 动作: 输出:
后置条件:无
addSite函数
输入:景点名称,景点信息,景点X坐标,景点Y坐标前置条件:顶点表已建立
动作:添加邻接表顶点、修改邻接矩阵
—7—
《校园导游咨询*》设计报告
输出:无 后置条件:无
addRoad函数
输入:景点1名称,景点2名称,风景等级 前置条件:顶点表已建立
动作:添加邻接表的边表,修改邻接矩阵 输出:无 后置条件:无
ShowInfo函数 输入: 无
前置条件:函数已初始化 动作: 输出当前图信息 输出: 顶点数、边数 后置条件:无
pGraph函数 输入: 无
前置条件:函数已初始化 动作: 输出邻接表 输出: 邻接表 后置条件:无
pMatrix 输入:无
前置条件:函数已初始化 动作: 输出邻接矩阵 输出: 邻接矩阵 后置条件:无
searchByName 输入:景点名称
前置条件: 图已初始化 动作: 搜索符合名称的节点 输出: 节点site型 后置条件:无
DFSTraverse函数 输入: 无
—8—
《校园导游咨询*》设计报告
前置条件:图已初始化 动作: 深度优先遍历 输出: 遍历路径 后置条件:无
BFSTraverse函数 输入: 无
前置条件:图已初始化 动作: 广度优先遍历 输出: 遍历路径 后置条件:无
FindPath函数
输入: 节点1,节点2 前置条件:图已初始化 动作: 计算最短路径
输出:路径经过点、路径产长度、每一步的方向 后置条件:无
2) 功能模块设计(如主程序模块设计)
1. 主程序模块:连接各种功能子模块,使用循环等待用户操作,完
成程序的基本操作实现功能。
2. 菜单显示模块:生成每个菜单的显示界面,使程序更简单清晰
3. 用户操作功能模块,由主程序直接调用的函数模块,将功能具象
化
4. 系统工具函数模块,提供如判断字符串是否为纯数字、计算两点
之间距离等功能,将常用功能独立化,方便重复使用
—9—
《校园导游咨询*》设计报告
3) 模块层次调用关系图
开始 欢迎画面 构造初始数据 选择界面 1.查询景点信息 2.景点导航 3.修改景点或道路界面 4.开发人员工具 5.显示地图 0. 退出系统 1.添加景点 2.添加道路 3.修改景点信息 0.返回上级菜单 1.查看邻接表 2.查看邻接矩阵 3.DFS 4.BFS 0.返回上级菜单 结束画面 结束 —10—
《校园导游咨询*》设计报告
四、 详细设计
实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
BGraph::构造函数(传入Site a[], Road b[],int n, int e)//传入顶点类数组a,边类数组b,顶点数、边数 {
//初始化距离矩阵
新建整形二维数组dis[][],长度、宽度均为MAXSIZE,全部赋值为UR 循环次数为(边表数目) {
当 (下一个指针存在) { }
将E的权值放入矩阵中制定位置 指针后移
顶点数=n; 边数=e;
A[]赋值给Adjlist[]成员变量vex 插入边a[i][j] 插入边a[j][i]
//初始化风景矩阵
新建整形二维数组scn[][],长度、宽度均为MAXSIZE,全部赋值为0 循环次数为(边表数目) { }
void BGraph::添加景点 {
bool 旗标=false;
当 (下一个指针存在) { }
将E的权值放入矩阵中制定位置 指针后移
顶点数自增
—11—
《校园导游咨询*》设计报告
整形数据 下标1,下标2,风景等级 String型数据 temp 景点 型数据 n
如果顶点数目到达最大值 提示用户 否则
{ 输入需要添加的景点名
调用 通过景点名返回景点型变量函数,赋值给n 输入景点信息
输入景点坐标
修改距离邻接矩阵、风景邻接矩阵 }
void BGraph::添加边() { 输入节点1,节点2
查询节点1、节点2的下标advx
在adjlist[]中节点1、节点2互相添加一条到对方的边 修改邻接距离矩阵 修改邻接风景矩阵 边数自增
}
Site BGraph::通过景点名称查找景点(string name) { 声明 int型指针 num_s,num_e,num_d 输入景点名
在adjlist[]中查找是否有景点名为name的景点 若不存在
输出 不存在 否则
返回该adjlist[]的vex }
void BGraph::导航() { { 用户输入 导航原则 若导航原则为距离优先 t1=\"最短路程距离 \";
t2=\"m\";
—12—
《校园导游咨询*》设计报告
将距离邻接矩阵二维数组复制给临时变量数组temp[][]
若导航原则为风景优先
t1=\"最优风景总值\";
t2=\"\";
将风景等级邻接矩阵二维数组复制给临时变量数组temp[][]
输出\"请输入起点\"
输入给 name1;
查询name1对应下标值,赋值给num_s
输出\"请输入终点\" 输入给 name2;
查询name2对应下标值,赋值给num_d 动态生成num_e
声明一个长宽为maxsize的二维数组D
声明一个长宽为maxsize的二维数组path
循环赋值
{ 将权值数组temp[][]赋值给D[][]
将权值存在的元素在path数组中对应位置设置为i 不存在的设置为-1
若path中存在比当前路径更小的路径
更新为新的路径
}
输出起点 当path中还存在下一个点 { 输出当前指向顶点名称
计算当前点与前一点的位置关系,存到t 计算当前点与前一个点的距离,存到d
输出\"【向\"< } 不存在了的话 输出\"->结束\" Path指针后移一位 } —13— 《校园导游咨询*》设计报告 五、 调试分析 (包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。) 在本次设计中,对于求两点之间的最短路径方法花费了最多时间,之前对于迪杰斯特拉算法和弗洛伊德算法的不熟料导致在运用上不能非常得心应手,产生了诸多问题。 在计算的时间、空间复杂度上,在尽可能减少占用空间和所需时间上,努力减少了循环层数,编写析构函数及时释放了空间。 通过本次试验,我较好的掌握了C++编写技术、数据结构中图的各类应用及VS2012界面、操作、调试技术,为未来的工作学习打下了更好的基础。 六、 测试结果 —14— 《校园导游咨询*》设计报告 —15— 《校园导游咨询*》设计报告 —16— 《校园导游咨询*》设计报告 —17— 《校园导游咨询*》设计报告 —18— 《校园导游咨询*》设计报告 —19— 《校园导游咨询*》设计报告 —20— 《校园导游咨询*》设计报告 七、 附录:程序设计源代码 20121764周桐-校园导游咨询系统.cpp // 20121764.cpp : 定义控制台应用程序的入口点。 // #include \"stdafx.h\" #include \"ArcNode.h\" #include \"Site.h\" #include \"BGraph.h\" void main(){ system(\"color F1\"); int f=1;//循环判断器 string st; int select;//选择器 //**********初始化校园地图信息************ //初始化景点 Site site[15]; site[0].setSite(0,\"北校门\",\"学校的北入口\",2,14); site[1].setSite(1,\"北图书馆\",\"学校北侧图书馆\",12,14); site[2].setSite(2,\"崇德楼\",\"经管学院楼\",26,14); site[3].setSite(3,\"奋进楼\",\"公共机房\",12,28); site[4].setSite(4,\"北运动场\",\"具有足球场、篮球场、健身房等\",26,28); site[5].setSite(5,\"行政楼\",\"计算机学院楼及其他行政办公\",12,32); site[6].setSite(6,\"教师活动中心\",\"又称H楼,具有桌球、乒乓球、会议室、舞厅等\",12,39); site[7].setSite(7,\"雕塑\",\"校园雕塑\",26,39); site[8].setSite(8,\"南校门\",\"学校南入口\",2,50); site[9].setSite(9,\"至诚楼\",\"办理学生事务处\",12,50); site[10].setSite(10,\"大礼堂\",\"学校大型文艺演出、讲座场所\",26,50); site[11].setSite(11,\"南图书馆\",\"学校南侧的图书馆\",12,52); site[12].setSite(12,\"大学生文化活动中心\",\"团委、学生会、社联所在处\",12,58); site[13].setSite(13,\"风帆广场\",\"绿地,景色优美\",26,58); site[14].setSite(14,\"南运动场\",\"具有足球场、篮球场、羽毛球场等\",12,70); //初始化道路 Road road[18]; road[0].setRoad(site[0],site[1],5); road[1].setRoad(site[1],site[2],2); road[2].setRoad(site[1],site[3],3); road[3].setRoad(site[2],site[4],3); —21— 《校园导游咨询*》设计报告 road[4].setRoad(site[3],site[4],2); road[5].setRoad(site[3],site[5],1); road[6].setRoad(site[5],site[6],3); road[7].setRoad(site[6],site[7],6); road[8].setRoad(site[4],site[7],1); road[9].setRoad(site[6],site[9],3); road[10].setRoad(site[7],site[10],6); road[11].setRoad(site[8],site[9],6); road[12].setRoad(site[9],site[10],4); road[13].setRoad(site[9],site[11],5); road[14].setRoad(site[11],site[12],4); road[15].setRoad(site[10],site[13],10); road[16].setRoad(site[12],site[13],10); road[17].setRoad(site[12],site[14],4); BGraph school(site,road,15,18); ShellExecute(NULL,TEXT(\"open\"),TEXT(\"地图.jpg\"),NULL,NULL,SW_SHOWNOACTIVATE);//显示Welcome_Vision(); while (1) { main_menu(school);//调用主界面 cin>>st; if (IsDigit(st)) { select=stringToNum case 1:findSite(school);break;//进入查询景点信息界面 case 2:guide(school);break;//进入景点导航界面 case 3:alterSiteRoadView(school);break;//进入修改景点或道路子菜单 case 4:developView(school);break;//进入开发人员工具界面 case 5:ShellExecute(NULL,TEXT(\"open\"),TEXT(\"地case 0: system(\"cls\"); cout<<\"退出系统后,用户自定义的景点、道路将被清空,是否确认退出?确认cin>>st; if(st==\"1\") f=0;break;//判断器清零,退出系统 地图图片 图.jpg\"),NULL,NULL,SW_SHOWNORMAL);break;//显示地图 输入[1],暂不退出输入其他内容\"< 《校园导游咨询*》设计报告 default:cout<<\"您的输入有误!请重新输入!\"< else {cout<<\"您的输入有误!请重新输入!\"< exit_view(); } ArcNode.h #pragma once class ArcNode { public: int adjvex; //邻接点下标值 ArcNode *nextarc; //指向下一个边结点的指针 int sceneLevel; int distance; public: ArcNode(void); ArcNode(int adjvex0,int sceneLevel0,int distance0); ~ArcNode(void); }; ArcNode.cpp #include \"stdafx.h\" #include \"ArcNode.h\" //无参构造函数 ArcNode::ArcNode(void) { nextarc=NULL; } //带参构造函数,传入顶点下标、景色等级、距离 ArcNode::ArcNode(int adjvex0,int sceneLevel0,int distance0) { adjvex=adjvex0; —23— 《校园导游咨询*》设计报告 } sceneLevel=sceneLevel0; distance=distance0; nextarc=NULL; ArcNode::~ArcNode(void) { } BGraph.h #pragma once #include \"stdafx.h\" #include \"Site.h\" #include \"VertexNode.h\" #include \"Road.h\" const int MaxSize=20; class BGraph { public: }; BGraph(Site a[],Road b[], int n, int e); //构造函数,初始化一个有n个顶点e条边的图 void addSite(); void addRoad(); ~BGraph(); //析构函数,释放邻接表中各边表结点的存储空间 void pGraph();//输出邻接表 void pMatrix();//输出邻接矩阵 void showInfo(); Site searchByName(string name); //根据景点名搜索 void DFSTraverse(int v,int visited[]);//深度优先遍历 void BFSTraverse(int v,int visited[]);//广度优先遍历 void findPath(); VertexNode adjlist[MaxSize]; int dis[MaxSize][MaxSize];//距离邻接矩阵 int scn[MaxSize][MaxSize];//风景邻接矩阵 int vertexNum, arcNum; //图的顶点数和边数 public: //存放顶点表的数组 BGraph.cpp —24— 《校园导游咨询*》设计报告 #include \"stdafx.h\" #include \"BGraph.h\" #include \"Site.h\" #include //********带参构造函数********** BGraph::BGraph(Site a[], Road b[],int n, int e)//传入顶点类数组a,边类数组b,顶点数、边数 { int i,k; ArcNode *E; int adv1=-1,adv2=-1,scLv=0; string n1,n2; vertexNum=n; arcNum=e; for(i=0;i for(k=0;k E=new ArcNode; E->distance=b[k].distance; E->adjvex=b[k].s2.code; E->nextarc=adjlist[b[k].s1.code].firstarc; E->sceneLevel=b[k].scnLv; adjlist[b[k].s1.code].firstarc=E; //再插入边 E->distance=b[k].distance; E->adjvex=b[k].s1.code; E->nextarc=adjlist[b[k].s2.code].firstarc; E->sceneLevel=b[k].scnLv; adjlist[b[k].s2.code].firstarc=E; //******初始化距离邻接矩阵********** int a[MaxSize][MaxSize]={}; for(int i=0;i 《校园导游咨询*》设计报告 for(int j=0;j } for(int i=0;i E=adjlist[i].firstarc; while (E) { b=E->adjvex; a[i][b]=E->distance; E=E->nextarc; } } for(int i=0;i } } //******初始化风景邻接矩阵********** int sc[MaxSize][MaxSize]={}; for(int i=0;i } for(int i=0;i E=adjlist[i].firstarc; while (E) { —26— 《校园导游咨询*》设计报告 b=E->adjvex; sc[i][b]=10-E->sceneLevel; E=E->nextarc; } } for(int i=0;i } } //***********添加节点************ void BGraph::addSite() { bool flag=false; int adv1=-1,adv2=-1,scLv=0; string temp; Site n; if(vertexNum==MaxSize) cout<<\"顶点数已满!\"< cout<<\"请输入要添加的景点名称:\"; cin>>temp; for(int i=0;i } } while(flag); n.siteName=temp; n.code=vertexNum+1; —27— 《校园导游咨询*》设计报告 cout<<\"请输入景点信息:\"; cin>>n.introduction; flag=true; while(flag) { cout<<\"请输入景点X坐标:\"; cin>>temp; if(!IsDigit(temp)&&stringToNum n.px=stringToNum } } flag=true; while(flag) { cout<<\"请输入景点Y坐标:\"; cin>>temp; if(!IsDigit(temp)&&stringToNum n.py=stringToNum } } vertexNum++; adjlist[vertexNum-1].vex=n; adjlist[vertexNum-1].firstarc=NULL; //修改距离邻接矩阵、风景邻接矩阵 for(int i=0;i 《校园导游咨询*》设计报告 } scn[i][vertexNum-1]=0; dis[vertexNum-1][vertexNum-1]=0; } } //**************添加边********* void BGraph::addRoad() { int scne; Site a,b; ArcNode *E; int adv1=-1,adv2=-1,scLv=0; string n1,n2; cout<<\"请输入节点1:\"; cin>>n1; a=searchByName(n1); cout<<\"请输入节点2:\"; cin>>n2; b=searchByName(n2); cout<<\"风景等级(1~10):\"; cin>>scne; adv1=a.code; adv2=b.code; E=new ArcNode; E->distance=caculateDistance(a,b); E->adjvex=adv2; E->nextarc=adjlist[adv2].firstarc; E->sceneLevel=scne; adjlist[adv1].firstarc=E; dis[adv1][adv2]=E->distance; scn[adv1][adv2]=E->sceneLevel; //再插入边 E->distance=caculateDistance(a,b); E->adjvex=adv1; E->nextarc=adjlist[adv1].firstarc; E->sceneLevel=scne; adjlist[adv2].firstarc=E; dis[adv2][adv1]=E->distance; —29— 《校园导游咨询*》设计报告 } scn[adv2][adv1]=E->sceneLevel; arcNum++; //***********邻接表析构函数********* BGraph::~BGraph() { } //******邻接表输出函数******** void BGraph::pGraph() { } //*********显示当前图的信息************ void BGraph::showInfo() { } //*********根据景点名搜索景点,返回Site型数据************ Site BGraph::searchByName(string name) cout<<\"当前共有\"< while(E) { } cout< for(int i=0;i E=adjlist[i].firstarc; while(E) { q=E; E=E->nextarc; delete q; } 等级:\"< cout< 《校园导游咨询*》设计报告 { while(1) { int i=0; for(i=0;i } cout<<\"景点名称输入有误!请重新输入!\"< } } //*********深度优先遍历************ void BGraph::DFSTraverse(int v,int visited[]) //深度优先遍历 { if ( v>vertexNum) cout<< \"出错\"< p=adjlist[v].firstarc; while (p) //依次搜索顶点v的邻接点j { j=p->adjvex; if (visited[j]==0) DFSTraverse(j,visited); p=p->nextarc; } } //*********广度优先遍历************ void BGraph::BFSTraverse(int v,int visited[]) { if ( v>vertexNum) {cout<< \"出错\";exit(0);} //顶点输入错误则抛出异常 int front,rear,j; ArcNode * p; //生成一个边表结点p int Q[MaxSize]; front=rear=-1; —31— 《校园导游咨询*》设计报告 //初始化队列, 假设队列采用顺序存储且不会发生溢出 cout< p=p->nextarc; } } } //************输出距离邻接矩阵************ void BGraph::pMatrix() { for(int i=0;i //**************导航*********** void BGraph::findPath() { int num_s; int num_e; int newnum; int temp[MaxSize][MaxSize]; string t; string t1,t2; string name1,name2; —32— 《校园导游咨询*》设计报告 int f=1;//循环判断器 string st; while (f) { cout<<\"景点导航,请选择导航原则,1为距离最短,2为景色最优\"< if(!IsDigit(t)) cout<<\"您的输入有误!请重新输入!\"< for(int i=0;i f=0; break; case 2: t1=\"最优风景总值\"; t2=\"\"; for(int i=0;i f=0; break; default:cout<<\"您的输入有误!请重新输入!\"< } cout<<\"请输入起点\"< newnum=searchByName(name1).code; num_s=newnum; cout<<\"请输入终点\"< —33— 《校园导游咨询*》设计报告 newnum=searchByName(name2).code; num_e=newnum; int D[MaxSize][MaxSize]; int path[MaxSize][MaxSize]; for(int i=0;i } } for(int k=0;k } } } cout < 《校园导游咨询*》设计报告 cout<<\"【向\"< } else cout<<\"->结束\"< } Function.cpp #include \"stdafx.h\" #include \"ArcNode.h\" #include \"Site.h\" #include \"BGraph.h\" //计算两直连点距离 int caculateDistance(Site a,Site b) { if (a.px!=b.px&&a.py!=b.py) return UR; else return(abs((a.px-b.px)+(a.py-b.py))); } //********判断字符串是否是纯数字********* bool IsDigit(string str) { for(unsigned int i=0;i } } return true; } //********判断两点之间方向关系********** string direction(Site a,Site b)//源点a,目的点b { string t=\"\\0\"; if((a.py)==(b.py)) { —35— 《校园导游咨询*》设计报告 } } if(a.px>b.px) t=\"东\"; t=\"西\"; else else { } return t; if(a.py>b.py) t=\"南\"; t=\"北\"; else Menu.cpp #include \"stdafx.h\" void main_menu(BGraph &school) { system(\"cls\"); cout<<\" ╔════════════════════════╗\"< 《校园导游咨询*》设计报告 } cout<<\" ║ ║\"< void alterSiteRoadView(BGraph &school) { int f=1;//循环判断器 string st; int select;//选择器 while (f) { system(\"cls\"); cout<<\" ╔════════════════════════╗cout<<\" ║ ☆☆上海电力学院校园导游咨询系统☆☆ ║cout<<\" ╠------------------------------------------------╣system(\"cls\"); cout<<\" ╔════════════════════════╗\"< 《校园导游咨询*》设计报告 \"< if (IsDigit(st)) { select=stringToNum case 1:addSite(school);break;//进入添加景点界面 case 2:addRoad(school);break;//进入添加道路界面 case 3:alterSite(school);break;//进入修改景点信息 界面 case 0:f=0;break;//返回上级菜单 default:cout<<\"您的输入有误!请重新输入!\"< 《校园导游咨询*》设计报告 } } } } else {cout<<\"您的输入有误!请重新输入!\"< void addRoadView() { } void alterSiteView() { } //*********************修改景点或道路********************** void developView(BGraph &school) { int f=1;//循环判断器 string st; system(\"cls\"); cout<<\" ╔════════════════════════╗\"< 《校园导游咨询*》设计报告 int select;//选择器 while (f) { system(\"cls\"); cout<<\" ╔════════════════════════╗cout<<\" ║ ☆☆上海电力学院校园导游咨询系统☆☆ ║\"< —40— 《校园导游咨询*》设计报告 } } cout<<\" ╚════════════════════════╝cin>>st; if (IsDigit(st)) { } else {cout<<\"您的输入有误!请重新输入!\"< case 1:showAdjlist(school);break;//进入查看邻接表界面 case 2:showMatrix(school);break;//进入查看邻接矩阵界面 case 3:DFS(school);break;//进入DFS深度优先遍历 界面 case 4:BFS(school);break;//进入BFS广度优先遍历界面 case 0:f=0;break;//返回上级菜单 default:cout<<\"您的输入有误!请重新输入!\"< void showMatrixView() { } void DFSView() system(\"cls\"); cout<<\" ╔════════════════════════╗\"< 《校园导游咨询*》设计报告 { } void BFSView() { } //***********************开发人员工具******************** void exit_view() { } system(\"cls\"); cout< #pragma once #include \"Site.h\" class Road { public: Site s1,s2; int distance; int scnLv; bool carAvilable; void setRoad(Site ts1,Site ts2,int tscnLv); —42— 《校园导游咨询*》设计报告 }; Road(void); ~Road(void); Road.cpp #include \"stdafx.h\" #include \"Road.h\" void Road::setRoad(Site ts1,Site ts2,int tscnLv) { } Road::Road(void) { } Road::~Road(void) { } s1=ts1; s2=ts2; distance=caculateDistance(s1,s2); scnLv=tscnLv; Site.h #pragma once #include \"stdafx.h\" #include int code;//编号 string siteName;//景点名称 string introduction;//介绍 int px,py;//坐标 void setSite(int code0,string siteName0,string introduction0,int x,int y); Site(void); Site(int code0,string siteName0,string introduction0,int x,int y);//代号,景点名称, public: —43— 《校园导游咨询*》设计报告 介绍,x坐标,y坐标 ~Site(void); }; Site.cpp #include \"stdafx.h\" #include \"Site.h\" Site::Site(void) { code=-1; siteName='\\0'; introduction='\\0'; px=-1; py=-1; } Site::Site(int code0,string siteName0,string introduction0,int x,int y) { code=code0; siteName=siteName0; introduction=introduction0; px=x; py=y; } void Site::setSite(int code0,string siteName0,string introduction0,int x,int y) { code=code0; siteName=siteName0; introduction=introduction0; px=x; py=y; } Site::~Site(void) { } Stdafx.h // stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 —44— 《校园导游咨询*》设计报告 // 特定于项目的包含文件 // #pragma once #include \"targetver.h\" #include //*********用户函数声明********** void findSite(BGraph &school); void guide(BGraph &school); void addSite(BGraph &school); void addRoad(BGraph &school); void alterSite(BGraph &school); void showAdjlist(BGraph &school); void showMatrix(BGraph &school); void DFS(BGraph &school); void BFS(BGraph &school); //功能函数声明 bool IsDigit(string str); int caculateDistance(Site a,Site b); template Type stringToNum(const string& str) { istringstream iss(str); Type num; iss >> num; return num; } string direction(Site a,Site b); //*********常量声明********** const double R=9.15;//比例尺 const int UR=999;//设定不可达数值 —45— 《校园导游咨询*》设计报告 //*********界面声明********** void Welcome_Vision(); void main_menu(BGraph &school); void findSiteView(); void guideView(); void alterSiteRoadView(BGraph &school); void addSiteView(); void addRoadView(); void alterSiteView(); void developView(BGraph &school); void showAdjlistView(); void showMatrixView(); void DFSView(); void BFSView(); void exit_view(); UserFuc.cpp #include \"stdafx.h\" void findSite(BGraph &school) { ArcNode *E; findSiteView(); string name; Site site; int i,j; cout<<\"景点信息查询,请输入您要查询的景点名\"< site=school.searchByName(name); cout<<\"景点编号:\"< j=E->adjvex; int dis=caculateDistance(school.adjlist[i].vex,school.adjlist[j].vex); —46— 《校园导游咨询*》设计报告 string direct=direction(school.adjlist[j].vex,school.adjlist[i].vex); cout<<\"在\"< } system(\"pause\"); } void guide(BGraph &school) { guideView(); school.findPath(); system(\"pause\"); } void addSite(BGraph &school) { addSiteView(); school.addSite(); cout< cout< string name,temp; alterSiteView(); cout<<\"请输入要修改的景点名称:\"; cin>>name; s=school.searchByName(name); cout<<\"该景点名称为 \"< school.adjlist[s.code].vex.siteName=temp; cout<<\"该景点介绍内容为\"< cin>>temp; school.adjlist[s.code].vex.introduction=temp; cout< void showAdjlist(BGraph &school) { showAdjlistView(); school.pGraph(); system(\"pause\"); } void showMatrix(BGraph &school) { showMatrixView(); school.pMatrix(); system(\"pause\"); } void DFS(BGraph &school) { string name; int visited[20]={0}; DFSView(); cout<<\"请输入遍历起始顶点:\"; cin>>name; cout< void BFS(BGraph &school) { string name; int visited[20]={0}; BFSView(); cout<<\"请输入遍历起始顶点:\"; cin>>name; cout< VertexNode.h —48— 《校园导游咨询*》设计报告 #pragma once #include \"ArcNode.h\" #include \"Site.h\" class VertexNode { public: }; friend class BGraph; Site vex; //顶点内容 ArcNode *firstarc; //边表的头指针 VertexNode(void); ~VertexNode(void); public: VertexNode.cpp #include \"stdafx.h\" #include \"VertexNode.h\" VertexNode::VertexNode(void) { } VertexNode::~VertexNode(void) { } welcomeVision.cpp #include \"stdafx.h\" void Welcome_Vision() {//1 cout<<\" ╔════════════════════════╗\"< 《校园导游咨询*》设计报告 cout<<\" ║ ┃★┃┠S┨┠H┨┠I┨┠E┨┠P┨┃★┃ ║\"< cout<<\" cout<<\" cout<<\" cout<<\" cout<<\" cout<<\" ║ 20121764║\"< 《校园导游咨询*》设计报告 cout<<\" ║╰★╮` 、 正在载入中.. ╰★╮` ║\"< cout<<\" cout<<\" ║ ║\"< 《校园导游咨询*》设计报告 cout<<\" ╠════════════════════════╣\"< ║ ╔ ╗┏┯┓┏┯┓┏┯┓┏┯┓┏┯┓╔ ╗ ║\"< system(\"cls\"); //5 cout<<\" ╔════════════════════════╗\"< ║╰★╮` 、★°☆∴° ★°.°☆°∴°★╰★╮` ║\"< 因篇幅问题不能全部显示,请点此查看更多更全内容