C++数据结构课程设计-校园导游咨询系统_第1页
C++数据结构课程设计-校园导游咨询系统_第2页
C++数据结构课程设计-校园导游咨询系统_第3页
C++数据结构课程设计-校园导游咨询系统_第4页
C++数据结构课程设计-校园导游咨询系统_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构(C++)课程设计题目:校园导游咨询*姓名:学号:院系:专业年级:2014年7月8日

目录一、 设计题目 2二、 需求分析 2三、 概要设计 6四、 详细设计 11五、 调试分析 13六、 测试结果 14七、 附录:程序设计源代码 20设计题目校园导游咨询*需求分析运行环境(软、硬件环境)电脑型号 X64兼容台式电脑 处理器 英特尔第二代酷睿i5-2310@2.90GHz四核主板 华硕P8H61-MLX(英特尔H61芯片组)内存 8GB(威刚DDR31333MHz)主硬盘 西数WDCWD10EALX-009BA0(1TB/7200转/分)显卡 ATIRadeonHD6700Series(512MB/ATI)显示器 SGW5600PL2208HD(21.7英寸)光驱 华硕DRW-24D1STaDVD刻录机声卡 瑞昱ALC887@英特尔6SeriesChipset高保真音频网卡 瑞昱RTL8168EPCI-EGigabitEthernetNIC/华硕操作系统:Windows7Ultimate(x86)sp1编程环境:MicrosoftVisualStudio2012输入的形式和输入值的范围内容形式范围景点代号int自然数景点名称string所有字符景点简介string所有字符X坐标int正整数Y坐标int正整数输出的形式描述内容形式范围景点代号int自然数景点名称string所有字符景点简介string所有字符X坐标int正整数Y坐标int正整数最短路径图像jpg功能描述 以我校南汇校区部分景点、进行抽象化,生成了具有15个顶点、18条边的图,以邻接表与邻接矩阵复合形式储存在内存中,主要有以下功能:查询景点的信息,包括基本信息和拓展的周围节点信息;景点导航,给出起点、终点,规划出最短路径和风景最佳路径;修改景点,道路信息,包括添加景点、添加道路、修改景点功能;开发人员工具,包括邻接表、邻接矩阵的查看DFS深度优先遍历、BFS广度优先遍历显示地图,打开预制的地图文件查看测试数据初始地图信息:景点编号景点名称景点介绍X坐标Y坐标0北校门学校的北入口2141北图书馆学校北侧图书馆12142崇德楼经管学院楼26143奋进楼公共机房12284北运动场具有足球场、篮球场、健身房等26285行政楼计算机学院楼及其他行政办公12326教师活动中心又称H楼,具有桌球、乒乓球、会议室、舞厅等12397雕塑校园雕塑26398南校门学校南入口2509至诚楼办理学生事务处125010大礼堂学校大型文艺演出、讲座场所265011南图书馆学校南侧的图书馆125212大学生文化活动中心团委、学生会、社联所在处121213风帆广场绿地广场,景色优美265814南运动场具有足球场、篮球场、羽毛球场等1270比例尺:1:9.15(即:坐标与实际地理单位相差)距离邻接矩阵:0概要设计抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或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类输出:无后置条件:无VertexNode类Data: 节点内容vex节点首指针*firstarcOperation: 无Road类Data: Site型节点1,节点2距离Distance风景等级Bool型是否是机动车道carAviliable;Operation: SetRoad 构造函数输入:节点1,节点2,风景等级前置条件:存在Site对象动作:初始化Road类输出:无后置条件:无BGraph类Data:邻接表adjlist[]Int距离矩阵Int风景值矩阵Operation:构造函数输入:前置条件:动作:输出:后置条件:无addSite函数输入:景点名称,景点信息,景点X坐标,景点Y坐标前置条件:顶点表已建立动作:添加邻接表顶点、修改邻接矩阵输出:无后置条件:无addRoad函数输入:景点1名称,景点2名称,风景等级前置条件:顶点表已建立动作:添加邻接表的边表,修改邻接矩阵输出:无后置条件:无ShowInfo函数输入:无前置条件:函数已初始化动作:输出当前图信息输出:顶点数、边数后置条件:无pGraph函数输入:无前置条件:函数已初始化动作:输出邻接表输出:邻接表后置条件:无pMatrix输入:无前置条件:函数已初始化动作:输出邻接矩阵输出:邻接矩阵后置条件:无searchByName输入:景点名称前置条件:图已初始化动作:搜索符合名称的节点输出:节点site型后置条件:无DFSTraverse函数输入:无前置条件:图已初始化动作:深度优先遍历输出:遍历路径后置条件:无BFSTraverse函数输入:无前置条件:图已初始化动作:广度优先遍历输出:遍历路径后置条件:无FindPath函数输入:节点1,节点2前置条件:图已初始化动作:计算最短路径输出:路径经过点、路径产长度、每一步的方向后置条件:无功能模块设计(如主程序模块设计)主程序模块:连接各种功能子模块,使用循环等待用户操作,完成程序的基本操作实现功能。菜单显示模块:生成每个菜单的显示界面,使程序更简单清晰用户操作功能模块,由主程序直接调用的函数模块,将功能具象化系统工具函数模块,提供如判断字符串是否为纯数字、计算两点之间距离等功能,将常用功能独立化,方便重复使用

模块层次调用关系图开始欢迎画面构造初始数据选择界面结束结束画面4.BFS1.查看邻接表3.DFS0.返回上级菜单0.返回上级菜单3.修改景点信息1.添加景点或道路界面工具0.退出系统景点信息开始欢迎画面构造初始数据选择界面结束结束画面4.BFS1.查看邻接表3.DFS0.返回上级菜单0.返回上级菜单3.修改景点信息1.添加景点或道路界面工具0.退出系统景点信息

详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。BGraph::构造函数(传入Sitea[],Roadb[],intn,inte)//传入顶点类数组a,边类数组b,顶点数、边数{ 顶点数=n; 边数=e; A[]赋值给Adjlist[]成员变量vex 插入边a[i][j] 插入边a[j][i]//初始化距离矩阵 新建整形二维数组dis[][],长度、宽度均为MAXSIZE,全部赋值为UR 循环次数为(边表数目) { 当(下一个指针存在) { 将E的权值放入矩阵中制定位置 指针后移 }//初始化风景矩阵 新建整形二维数组scn[][],长度、宽度均为MAXSIZE,全部赋值为0 循环次数为(边表数目) { 当(下一个指针存在) { 将E的权值放入矩阵中制定位置 指针后移 }顶点数自增}voidBGraph::添加景点{ bool旗标=false; 整形数据下标1,下标2,风景等级 String型数据temp 景点型数据n 如果顶点数目到达最大值 提示用户 否则 { 输入需要添加的景点名 调用通过景点名返回景点型变量函数,赋值给n 输入景点信息 输入景点坐标修改距离邻接矩阵、风景邻接矩阵}voidBGraph::添加边(){ 输入节点1,节点2 查询节点1、节点2的下标advx在adjlist[]中节点1、节点2互相添加一条到对方的边 修改邻接距离矩阵 修改邻接风景矩阵 边数自增}SiteBGraph::通过景点名称查找景点(stringname){ 声明int型指针num_s,num_e,num_d 输入景点名 在adjlist[]中查找是否有景点名为name的景点 若不存在 输出不存在 否则 返回该adjlist[]的vex}voidBGraph::导航(){ { 用户输入导航原则 若导航原则为距离优先 t1="最短路程距离"; t2="m"; 将距离邻接矩阵二维数组复制给临时变量数组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 输出"【向"<<t<<"走"<<d*比例尺<<"米】->"; } 不存在了的话 输出"->结束" Path指针后移一位}调试分析(包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。) 在本次设计中,对于求两点之间的最短路径方法花费了最多时间,之前对于迪杰斯特拉算法和弗洛伊德算法的不熟料导致在运用上不能非常得心应手,产生了诸多问题。 在计算的时间、空间复杂度上,在尽可能减少占用空间和所需时间上,努力减少了循环层数,编写析构函数及时释放了空间。 通过本次试验,我较好的掌握了C++编写技术、数据结构中图的各类应用及VS2012界面、操作、调试技术,为未来的工作学习打下了更好的基础。测试结果附录:程序设计源代码20121764周桐-校园导游咨询系统.cpp//20121764.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include"ArcNode.h"#include"Site.h"#include"BGraph.h"voidmain(){ system("colorF1"); intf=1;//循环判断器 stringst; intselect;//选择器 //**********初始化校园地图信息************ //初始化景点 Sitesite[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); //初始化道路 Roadroad[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); 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); BGraphschool(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<int>(st); switch(select) { case1:findSite(school);break;//进入查询景点信息界面 case2:guide(school);break;//进入景点导航界面 case3:alterSiteRoadView(school);break;//进入修改景点或道路子菜单 case4:developView(school);break;//进入开发人员工具界面 case5:ShellExecute(NULL,TEXT("open"),TEXT("地图.jpg"),NULL,NULL,SW_SHOWNORMAL);break;//显示地图 case0: system("cls"); cout<<"退出系统后,用户自定义的景点、道路将被清空,是否确认退出?确认输入[1],暂不退出输入其他内容"<<endl; cin>>st; if(st=="1") f=0;break;//判断器清零,退出系统 default:cout<<"您的输入有误!请重新输入!"<<endl;system("pause");break; } } else {cout<<"您的输入有误!请重新输入!"<<endl;Sleep(1000);} } exit_view();}ArcNode.h#pragmaonceclassArcNode{public: intadjvex;//邻接点下标值 ArcNode*nextarc;//指向下一个边结点的指针 intsceneLevel; intdistance;public: ArcNode(void); ArcNode(intadjvex0,intsceneLevel0,intdistance0); ~ArcNode(void);};ArcNode.cpp#include"stdafx.h"#include"ArcNode.h"//无参构造函数ArcNode::ArcNode(void){ nextarc=NULL;}//带参构造函数,传入顶点下标、景色等级、距离ArcNode::ArcNode(intadjvex0,intsceneLevel0,intdistance0){ adjvex=adjvex0; sceneLevel=sceneLevel0; distance=distance0; nextarc=NULL;}ArcNode::~ArcNode(void){}BGraph.h#pragmaonce#include"stdafx.h"#include"Site.h"#include"VertexNode.h"#include"Road.h"constintMaxSize=20;classBGraph{public: BGraph(Sitea[],Roadb[],intn,inte);//构造函数,初始化一个有n个顶点e条边的图 voidaddSite(); voidaddRoad(); ~BGraph();//析构函数,释放邻接表中各边表结点的存储空间 voidpGraph();//输出邻接表 voidpMatrix();//输出邻接矩阵 voidshowInfo(); SitesearchByName(stringname);//根据景点名搜索 voidDFSTraverse(intv,intvisited[]);//深度优先遍历 voidBFSTraverse(intv,intvisited[]);//广度优先遍历 voidfindPath();public: VertexNodeadjlist[MaxSize]; intdis[MaxSize][MaxSize];//距离邻接矩阵 intscn[MaxSize][MaxSize];//风景邻接矩阵//存放顶点表的数组 intvertexNum,arcNum;//图的顶点数和边数};BGraph.cpp#include"stdafx.h"#include"BGraph.h"#include"Site.h"#include<iomanip>//********带参构造函数**********BGraph::BGraph(Sitea[],Roadb[],intn,inte)//传入顶点类数组a,边类数组b,顶点数、边数{ inti,k; ArcNode*E; intadv1=-1,adv2=-1,scLv=0; stringn1,n2; vertexNum=n; arcNum=e; for(i=0;i<vertexNum;i++) { adjlist[i].vex=a[i]; adjlist[i].firstarc=NULL; } for(k=0;k<arcNum;k++) { //先插入边<i,j> E=newArcNode; 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; //再插入边<j,i> E=newArcNode; 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; //******初始化距离邻接矩阵********** inta[MaxSize][MaxSize]={}; for(inti=0;i<MaxSize;i++) for(intj=0;j<vertexNum;j++) { a[i][j]=UR; if(i==j) a[i][j]=0; } for(inti=0;i<vertexNum;i++) { ArcNode*E; intb; E=adjlist[i].firstarc; while(E) { b=E->adjvex; a[i][b]=E->distance; E=E->nextarc; } } for(inti=0;i<vertexNum;i++) { for(intj=0;j<vertexNum;j++) dis[i][j]=a[i][j]; } } //******初始化风景邻接矩阵********** intsc[MaxSize][MaxSize]={}; for(inti=0;i<MaxSize;i++) for(intj=0;j<vertexNum;j++) { sc[i][j]=UR; if(i==j) sc[i][j]=0; } for(inti=0;i<vertexNum;i++) { ArcNode*E; intb; E=adjlist[i].firstarc; while(E) { b=E->adjvex; sc[i][b]=10-E->sceneLevel; E=E->nextarc; } } for(inti=0;i<vertexNum;i++) { for(intj=0;j<vertexNum;j++) scn[i][j]=sc[i][j]; }}//***********添加节点************voidBGraph::addSite(){ boolflag=false; intadv1=-1,adv2=-1,scLv=0; stringtemp; Siten; if(vertexNum==MaxSize) cout<<"顶点数已满!"<<endl; else { do { flag=false; cout<<"请输入要添加的景点名称:"; cin>>temp; for(inti=0;i<vertexNum;i++) { if(temp==adjlist[i].vex.siteName) { cout<<"景点名称已存在!请重新输入!"<<endl; flag=true; } } } while(flag); n.siteName=temp; n.code=vertexNum+1; cout<<"请输入景点信息:"; cin>>roduction; flag=true; while(flag) { cout<<"请输入景点X坐标:"; cin>>temp; if(!IsDigit(temp)&&stringToNum<int>(temp)<0) cout<<endl<<"坐标输入有误!请重新输入"<<endl; else { flag=false; n.px=stringToNum<int>(temp); } } flag=true; while(flag) { cout<<"请输入景点Y坐标:"; cin>>temp; if(!IsDigit(temp)&&stringToNum<int>(temp)<0) cout<<endl<<"坐标输入有误!请重新输入"<<endl; else { flag=false; n.py=stringToNum<int>(temp); } } vertexNum++; adjlist[vertexNum-1].vex=n; adjlist[vertexNum-1].firstarc=NULL; //修改距离邻接矩阵、风景邻接矩阵 for(inti=0;i<vertexNum;i++) { dis[vertexNum-1][i]=UR; scn[vertexNum-1][i]=0; } for(inti=0;i<vertexNum;i++) { dis[i][vertexNum-1]=UR; scn[i][vertexNum-1]=0; } dis[vertexNum-1][vertexNum-1]=0; }}//**************添加边*********voidBGraph::addRoad(){ intscne; Sitea,b; ArcNode*E; intadv1=-1,adv2=-1,scLv=0; stringn1,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=newArcNode; 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; //再插入边<j,i> E=newArcNode; 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; scn[adv2][adv1]=E->sceneLevel; arcNum++;}//***********邻接表析构函数*********BGraph::~BGraph(){ for(inti=0;i<vertexNum;i++) { ArcNode*E,*q; E=adjlist[i].firstarc; while(E) {q=E; E=E->nextarc; deleteq; } }}//******邻接表输出函数********voidBGraph::pGraph(){ inti;ArcNode*E; for(i=0;i<vertexNum;i++) {E=adjlist[i].firstarc; cout<<endl<<"景点:"<<adjlist[i].vex.siteName<<"==>"; while(E) { cout<<adjlist[E->adjvex].vex.siteName<<",距离:"<<E->distance*R<<"米->景色等级:"<<E->sceneLevel<<"==>"; E=E->nextarc; } cout<<endl; }}//*********显示当前图的信息************voidBGraph::showInfo(){ cout<<"当前共有"<<vertexNum<<"个景点,"<<arcNum<<"条路"<<endl;}//*********根据景点名搜索景点,返回Site型数据************SiteBGraph::searchByName(stringname){ while(1) { inti=0; for(i=0;i<vertexNum;i++) { if(name==adjlist[i].vex.siteName) returnadjlist[i].vex; } cout<<"景点名称输入有误!请重新输入!"<<endl; cin>>name; }}//*********深度优先遍历************voidBGraph::DFSTraverse(intv,intvisited[])//深度优先遍历{ if(v>vertexNum) cout<<"出错"<<endl;//顶点输入错误则抛出异常 ArcNode*p; intj; cout<<adjlist[v].vex.siteName<<""; visited[v]=1; p=adjlist[v].firstarc; while(p)//依次搜索顶点v的邻接点j { j=p->adjvex; if(visited[j]==0) DFSTraverse(j,visited); p=p->nextarc; }}//*********广度优先遍历************voidBGraph::BFSTraverse(intv,intvisited[]){ if(v>vertexNum){cout<<"出错";exit(0);}//顶点输入错误则抛出异常 intfront,rear,j; ArcNode*p;//生成一个边表结点p intQ[MaxSize]; front=rear=-1; //初始化队列,假设队列采用顺序存储且不会发生溢出 cout<<adjlist[v].vex.siteName<<""; visited[v]=1;Q[++rear]=v;//被访问顶点入队 while(front!=rear) { v=Q[++front]; p=adjlist[v].firstarc;//边表中的工作指针p初始化 while(p) { j=p->adjvex; if(visited[j]==0) { cout<<adjlist[j].vex.siteName<<""; visited[j]=1;Q[++rear]=j; }p=p->nextarc;} }}//************输出距离邻接矩阵************voidBGraph::pMatrix(){ for(inti=0;i<vertexNum;i++) { for(intj=0;j<vertexNum;j++) cout<<setw(4)<<dis[i][j]; cout<<endl; }}//**************导航***********voidBGraph::findPath(){ intnum_s; intnum_e; intnewnum; inttemp[MaxSize][MaxSize]; stringt; stringt1,t2; stringname1,name2; intf=1;//循环判断器 stringst; while(f) { cout<<"景点导航,请选择导航原则,1为距离最短,2为景色最优"<<endl; cin>>t; if(!IsDigit(t)) cout<<"您的输入有误!请重新输入!"<<endl; else { switch(stringToNum<int>(t)) { case1: t1="最短路程距离"; t2="m"; for(inti=0;i<vertexNum;i++) for(intj=0;j<vertexNum;j++) temp[i][j]=dis[i][j]; f=0; break; case2: t1="最优风景总值"; t2=""; for(inti=0;i<vertexNum;i++) for(intj=0;j<vertexNum;j++) temp[i][j]=scn[i][j]; f=0; break; default:cout<<"您的输入有误!请重新输入!"<<endl; break; } } } cout<<"请输入起点"<<endl; cin>>name1; newnum=searchByName(name1).code; num_s=newnum; cout<<"请输入终点"<<endl; cin>>name2; newnum=searchByName(name2).code; num_e=newnum; intD[MaxSize][MaxSize]; intpath[MaxSize][MaxSize]; for(inti=0;i<vertexNum;i++) { for(intj=0;j<vertexNum;j++) { D[i][j]=temp[i][j]; if(i!=j&&D[i][j]!=UR) path[i][j]=i; elsepath[i][j]=-1; } } for(intk=0;k<vertexNum;k++) { for(inti=0;i<vertexNum;i++) { for(intj=0;j<vertexNum;j++) { if(D[i][k]+D[k][j]<D[i][j]) { D[i][j]=D[i][k]+D[k][j]; path[i][j]=path[k][j];//记录下一个邻接点 } } } } cout<<t1<<"为:"<<D[num_s][num_e]*R<<t2<<endl; cout<<"行进方案为:"; for(inti=num_s,j=num_s;i>=0;) { cout<<adjlist[i].vex.siteName; i=path[num_e][i]; if(i!=-1) { Sites1=adjlist[i].vex,s2=adjlist[j].vex; intd=caculateDistance(s1,s2); stringt=direction(s1,s2); cout<<"【向"<<t<<"走"<<d*R<<"米】->"; } else cout<<"->结束"<<endl; j=i; }}Function.cpp#include"stdafx.h"#include"ArcNode.h"#include"Site.h"#include"BGraph.h"//计算两直连点距离intcaculateDistance(Sitea,Siteb){ if(a.px!=b.px&&a.py!=b.py) returnUR; else return(abs((a.px-b.px)+(a.py-b.py)));}//********判断字符串是否是纯数字*********boolIsDigit(stringstr){ for(unsignedinti=0;i<str.size();i++) { if((str.at(i)>'9')||(str.at(i)<'0')) { returnfalse; } } returntrue;}//********判断两点之间方向关系**********stringdirection(Sitea,Siteb)//源点a,目的点b{ stringt="\0"; if((a.py)==(b.py)) { if(a.px>b.px) t="东"; else t="西"; } else { if(a.py>b.py) t="南"; else t="北"; } returnt;}#include"stdafx.h"voidmain_menu(BGraph&school){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║主菜单║"<<endl; cout<<"╠════════════════════════╣"<<endl; cout<<"║║"<<endl; cout<<"║⊕1.查询景点信息║"<<endl; cout<<"║║"<<endl; cout<<"║⊕2.景点导航║"<<endl; cout<<"║║"<<endl; cout<<"║⊕3.修改景点或道路║"<<endl; cout<<"║║"<<endl; cout<<"║⊕4.开发人员工具║"<<endl; cout<<"║║"<<endl; cout<<"║⊕5.显示地图║"<<endl; cout<<"║║"<<endl; cout<<"║⊕0.退出系统║"<<endl; cout<<"║║"<<endl; cout<<"║请输入所需功能的编号后按回车║"<<endl; cout<<"║║"<<endl; cout<<"╚════════════════════════╝"<<endl; cout<<"系统状态:"<<endl; cout<<"当前系统中共有"<<school.vertexNum<<"个景点,"<<school.arcNum<<"条路"<<endl;}voidfindSiteView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║查询景点信息║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidguideView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║景点导航║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidalterSiteRoadView(BGraph&school){ intf=1;//循环判断器 stringst; intselect;//选择器 while(f) { system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║修改景点或道路║"<<endl; cout<<"╠════════════════════════╣"<<endl; cout<<"║║"<<endl; cout<<"║⊕1.添加景点║"<<endl; cout<<"║║"<<endl; cout<<"║⊕2.添加道路║"<<endl; cout<<"║║"<<endl; cout<<"║⊕3.修改景点信息║"<<endl; cout<<"║║"<<endl; cout<<"║⊕0.返回上级菜单║"<<endl; cout<<"║║"<<endl; cout<<"║请输入所需功能的编号后按回车║"<<endl; cout<<"║║"<<endl; cout<<"╚════════════════════════╝"<<endl; cin>>st; if(IsDigit(st)) { select=stringToNum<int>(st); switch(select) { case1:addSite(school);break;//进入添加景点界面 case2:addRoad(school);break;//进入添加道路界面 case3:alterSite(school);break;//进入修改景点信息界面 case0:f=0;break;//返回上级菜单 default:cout<<"您的输入有误!请重新输入!"<<endl;system("pause");break; } } else {cout<<"您的输入有误!请重新输入!"<<endl;Sleep(1000);} }}//*********************修改景点或道路**********************voidaddSiteView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║添加景点║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidaddRoadView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║添加道路║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidalterSiteView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║修改景点信息║"<<endl; cout<<"╚════════════════════════╝"<<endl;}//*********************修改景点或道路**********************voiddevelopView(BGraph&school){ intf=1;//循环判断器 stringst; intselect;//选择器 while(f) { system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║开发人员工具║"<<endl; cout<<"╠════════════════════════╣"<<endl; cout<<"║║"<<endl; cout<<"║⊕1.查看邻接表║"<<endl; cout<<"║║"<<endl; cout<<"║⊕2.查看邻接矩阵║"<<endl; cout<<"║║"<<endl; cout<<"║⊕3.DFS深度优先遍历║"<<endl; cout<<"║║"<<endl; cout<<"║⊕4.BFS广度优先遍历║"<<endl; cout<<"║║"<<endl; cout<<"║⊕0.返回上级菜单║"<<endl; cout<<"║║"<<endl; cout<<"║请输入所需功能的编号后按回车║"<<endl; cout<<"║║"<<endl; cout<<"╚════════════════════════╝"<<endl; cin>>st; if(IsDigit(st)) { select=stringToNum<int>(st); switch(select) { case1:showAdjlist(school);break;//进入查看邻接表界面 case2:showMatrix(school);break;//进入查看邻接矩阵界面 case3:DFS(school);break;//进入DFS深度优先遍历界面 case4:BFS(school);break;//进入BFS广度优先遍历界面 case0:f=0;break;//返回上级菜单 default:cout<<"您的输入有误!请重新输入!"<<endl;system("pause");break; } } else {cout<<"您的输入有误!请重新输入!"<<endl;Sleep(1000);} }}//***********************开发人员工具********************voidshowAdjlistView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║查看邻接表║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidshowMatrixView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║查看邻接矩阵║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidDFSView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║DFS深度优先遍历║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidBFSView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║BFS广度优先遍历║"<<endl; cout<<"╚════════════════════════╝"<<endl;}//***********************开发人员工具********************voidexit_view(){ system("cls"); cout<<endl<<endl<<endl; cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海电力学院校园导游咨询系统☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║谢谢使用!再见!║"<<endl; cout<<"╚════════════════════════╝"<<endl; system("pause");}#pragmaonce#include"Site.h"classRoad{public: Sites1,s2; intdistance; intscnLv; boolcarAvilable; voidsetRoad(Sitets1,Sitets2,inttscnLv); Road(void); ~Road(void);};#include"stdafx.h"#include"Road.h"voidRoad::setRoad(Sitets1,Sitets2,inttscnLv){ s1=ts1; s2=ts2; distance=caculateDistance(s1,s2); scnLv=tscnLv;}Road::Road(void){}Road::~Road(void){}#pragmaonce#include"stdafx.h"#include<string>usingnamespacestd;classSite{public: intcode;//编号 stringsiteName;//景点名称 stringintroduction;//介绍 intpx,py;//坐标public: voidsetSite(intcode0,stringsiteName0,stringintroduction0,intx,inty); Site(void); Site(intcode0,stringsiteName0,stringintroduction0,intx,inty);//代号,景点名称,介绍,x坐标,y坐标 ~Site(void);};#include"stdafx.h"#include"Site.h"Site::Site(void){ code=-1; siteName='\0'; introduction='\0'; px=-1; py=-1;}Site::Site(intcode0,stringsiteName0,stringintroduction0,intx,inty){ code=code0; siteName=siteName0; introduction=introduction0; px=x; py=y;}voidSite::setSite(intcode0,stringsiteName0,stringintroduction0,intx,inty){ code=code0; siteName=siteName0; introduction=introduction0; px=x; py=y;}Site::~Site(void){}//stdafx.h:标准系统包含文件的包含文件,//或是经常使用但不常更改的//特定于项目的包含文件//#pragmaonce#include"targetver.h"#include<iostream>#include<Windows.h>#include<string>#include<math.h>#include<sstream>#include<shellapi.h>#include"Site.h"#include"BGraph.h"//*********用户函数声明**********voidfindSite(BGraph&school);voidguide(BGraph&school);voidaddSite(BGraph&school);voidaddRoad(BGraph&school);voidalterSite(BGraph&school);voidshowAdjlist(BGraph&school);voidshowMatrix(BGraph&school);voidDFS(BGraph&school);voidBFS(BGraph&school);//功能函数声明boolIsDigit(stringstr);intcaculateDistance(Sitea,Siteb);template<classType>TypestringToNum(conststring&str){ istringstreamiss(str); Typenum; iss>>num; returnnum;}stringdirection(Sitea,Siteb);//*********常量声明**********constdoubleR=9.15;//比例尺constintUR=999;//设定不可达数值//*********界面声明**********voidWelcome_Vision();voidmain_menu(BGraph&school);voidfindSiteView();voidguideView();voidalterSiteRoadView(BGraph&school);voidaddSiteView();voidaddRoadView();voidalterSiteView();voiddevelopView(BGraph&school);voidshowAdjlistView();voidshowMatrixView();voidDFSView();voidBFSView();voidexit_view();#include"stdafx.h"voidfindSite(BGraph&school){ ArcNode*E; findSite

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论