




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)(C++)課程設(shè)計(jì)題目:校園導(dǎo)游咨詢*姓名:學(xué)號(hào):院系:專業(yè)年級(jí):2014年7月8日
目錄一、 設(shè)計(jì)題目 2二、 需求分析 2三、 概要設(shè)計(jì) 6四、 詳細(xì)設(shè)計(jì) 11五、 調(diào)試分析 13六、 測(cè)試結(jié)果 14七、 附錄:程序設(shè)計(jì)源代碼 20設(shè)計(jì)題目校園導(dǎo)游咨詢*需求分析運(yùn)行環(huán)境(軟、硬件環(huán)境)電腦型號(hào) X64兼容臺(tái)式電腦 處理器 英特爾第二代酷睿i5-2310@2.90GHz四核主板 華碩P8H61-MLX(英特爾H61芯片組)內(nèi)存 8GB(威剛DDR31333MHz)主硬盤 西數(shù)WDCWD10EALX-009BA0(1TB/7200轉(zhuǎn)/分)顯卡 ATIRadeonHD6700Series(512MB/ATI)顯示器 SGW5600PL2208HD(21.7英寸)光驅(qū) 華碩DRW-24D1STaDVD刻錄機(jī)聲卡 瑞昱ALC887@英特爾6SeriesChipset高保真音頻網(wǎng)卡 瑞昱RTL8168EPCI-EGigabitEthernetNIC/華碩操作系統(tǒng):Windows7Ultimate(x86)sp1編程環(huán)境:MicrosoftVisualStudio2012輸入的形式和輸入值的范圍內(nèi)容形式范圍景點(diǎn)代號(hào)int自然數(shù)景點(diǎn)名稱string所有字符景點(diǎn)簡(jiǎn)介string所有字符X坐標(biāo)int正整數(shù)Y坐標(biāo)int正整數(shù)輸出的形式描述內(nèi)容形式范圍景點(diǎn)代號(hào)int自然數(shù)景點(diǎn)名稱string所有字符景點(diǎn)簡(jiǎn)介string所有字符X坐標(biāo)int正整數(shù)Y坐標(biāo)int正整數(shù)最短路徑圖像jpg功能描述 以我校南匯校區(qū)部分景點(diǎn)、進(jìn)行抽象化,生成了具有15個(gè)頂點(diǎn)、18條邊的圖,以鄰接表與鄰接矩陣復(fù)合形式儲(chǔ)存在內(nèi)存中,主要有以下功能:查詢景點(diǎn)的信息,包括基本信息和拓展的周圍節(jié)點(diǎn)信息;景點(diǎn)導(dǎo)航,給出起點(diǎn)、終點(diǎn),規(guī)劃出最短路徑和風(fēng)景最佳路徑;修改景點(diǎn),道路信息,包括添加景點(diǎn)、添加道路、修改景點(diǎn)功能;開發(fā)人員工具,包括鄰接表、鄰接矩陣的查看DFS深度優(yōu)先遍歷、BFS廣度優(yōu)先遍歷顯示地圖,打開預(yù)制的地圖文件查看測(cè)試數(shù)據(jù)初始地圖信息:景點(diǎn)編號(hào)景點(diǎn)名稱景點(diǎn)介紹X坐標(biāo)Y坐標(biāo)0北校門學(xué)校的北入口2141北圖書館學(xué)校北側(cè)圖書館12142崇德樓經(jīng)管學(xué)院樓26143奮進(jìn)樓公共機(jī)房12284北運(yùn)動(dòng)場(chǎng)具有足球場(chǎng)、籃球場(chǎng)、健身房等26285行政樓計(jì)算機(jī)學(xué)院樓及其他行政辦公12326教師活動(dòng)中心又稱H樓,具有桌球、乒乓球、會(huì)議室、舞廳等12397雕塑校園雕塑26398南校門學(xué)校南入口2509至誠(chéng)樓辦理學(xué)生事務(wù)處125010大禮堂學(xué)校大型文藝演出、講座場(chǎng)所265011南圖書館學(xué)校南側(cè)的圖書館125212大學(xué)生文化活動(dòng)中心團(tuán)委、學(xué)生會(huì)、社聯(lián)所在處121213風(fēng)帆廣場(chǎng)綠地廣場(chǎng),景色優(yōu)美265814南運(yùn)動(dòng)場(chǎng)具有足球場(chǎng)、籃球場(chǎng)、羽毛球場(chǎng)等1270比例尺:1:9.15(即:坐標(biāo)與實(shí)際地理單位相差)距離鄰接矩陣:0概要設(shè)計(jì)抽象數(shù)據(jù)類型定義描述(對(duì)各類的成員及成員函數(shù)進(jìn)行抽象描述,參見書或ppt及實(shí)驗(yàn))Site類Data: 編號(hào)Code 景點(diǎn)名稱SiteName 景點(diǎn)介紹Introduction 景點(diǎn)X坐標(biāo)景點(diǎn)Y坐標(biāo)Operation: 構(gòu)造函數(shù) 輸入:編號(hào),名稱,介紹,X坐標(biāo),Y坐標(biāo)前置條件:無動(dòng)作:初始化Site類元素輸出:無后置條件:無 SetSite 輸入:編號(hào),名稱,介紹,X坐標(biāo),Y坐標(biāo)前置條件:無動(dòng)作:賦值Site類元素輸出:無后置條件:無ArcNode類Data: 鄰接點(diǎn)下標(biāo)值A(chǔ)djvx指向下一個(gè)邊結(jié)點(diǎn)的指針*nextarc;風(fēng)景等級(jí)sceneLevel;距離distance;Operation: 構(gòu)造函數(shù) 輸入:Adjvx,*nextarc,sceneLevel;前置條件:無動(dòng)作:初始化ArcNode類輸出:無后置條件:無VertexNode類Data: 節(jié)點(diǎn)內(nèi)容vex節(jié)點(diǎn)首指針*firstarcOperation: 無Road類Data: Site型節(jié)點(diǎn)1,節(jié)點(diǎn)2距離Distance風(fēng)景等級(jí)Bool型是否是機(jī)動(dòng)車道carAviliable;Operation: SetRoad 構(gòu)造函數(shù)輸入:節(jié)點(diǎn)1,節(jié)點(diǎn)2,風(fēng)景等級(jí)前置條件:存在Site對(duì)象動(dòng)作:初始化Road類輸出:無后置條件:無BGraph類Data:鄰接表adjlist[]Int距離矩陣Int風(fēng)景值矩陣Operation:構(gòu)造函數(shù)輸入:前置條件:動(dòng)作:輸出:后置條件:無addSite函數(shù)輸入:景點(diǎn)名稱,景點(diǎn)信息,景點(diǎn)X坐標(biāo),景點(diǎn)Y坐標(biāo)前置條件:頂點(diǎn)表已建立動(dòng)作:添加鄰接表頂點(diǎn)、修改鄰接矩陣輸出:無后置條件:無addRoad函數(shù)輸入:景點(diǎn)1名稱,景點(diǎn)2名稱,風(fēng)景等級(jí)前置條件:頂點(diǎn)表已建立動(dòng)作:添加鄰接表的邊表,修改鄰接矩陣輸出:無后置條件:無ShowInfo函數(shù)輸入:無前置條件:函數(shù)已初始化動(dòng)作:輸出當(dāng)前圖信息輸出:頂點(diǎn)數(shù)、邊數(shù)后置條件:無pGraph函數(shù)輸入:無前置條件:函數(shù)已初始化動(dòng)作:輸出鄰接表輸出:鄰接表后置條件:無pMatrix輸入:無前置條件:函數(shù)已初始化動(dòng)作:輸出鄰接矩陣輸出:鄰接矩陣后置條件:無searchByName輸入:景點(diǎn)名稱前置條件:圖已初始化動(dòng)作:搜索符合名稱的節(jié)點(diǎn)輸出:節(jié)點(diǎn)site型后置條件:無DFSTraverse函數(shù)輸入:無前置條件:圖已初始化動(dòng)作:深度優(yōu)先遍歷輸出:遍歷路徑后置條件:無BFSTraverse函數(shù)輸入:無前置條件:圖已初始化動(dòng)作:廣度優(yōu)先遍歷輸出:遍歷路徑后置條件:無FindPath函數(shù)輸入:節(jié)點(diǎn)1,節(jié)點(diǎn)2前置條件:圖已初始化動(dòng)作:計(jì)算最短路徑輸出:路徑經(jīng)過點(diǎn)、路徑產(chǎn)長(zhǎng)度、每一步的方向后置條件:無功能模塊設(shè)計(jì)(如主程序模塊設(shè)計(jì))主程序模塊:連接各種功能子模塊,使用循環(huán)等待用戶操作,完成程序的基本操作實(shí)現(xiàn)功能。菜單顯示模塊:生成每個(gè)菜單的顯示界面,使程序更簡(jiǎn)單清晰用戶操作功能模塊,由主程序直接調(diào)用的函數(shù)模塊,將功能具象化系統(tǒng)工具函數(shù)模塊,提供如判斷字符串是否為純數(shù)字、計(jì)算兩點(diǎn)之間距離等功能,將常用功能獨(dú)立化,方便重復(fù)使用
模塊層次調(diào)用關(guān)系圖開始?xì)g迎畫面構(gòu)造初始數(shù)據(jù)選擇界面結(jié)束結(jié)束畫面4.BFS1.查看鄰接表3.DFS0.返回上級(jí)菜單0.返回上級(jí)菜單3.修改景點(diǎn)信息1.添加景點(diǎn)或道路界面工具0.退出系統(tǒng)景點(diǎn)信息開始?xì)g迎畫面構(gòu)造初始數(shù)據(jù)選擇界面結(jié)束結(jié)束畫面4.BFS1.查看鄰接表3.DFS0.返回上級(jí)菜單0.返回上級(jí)菜單3.修改景點(diǎn)信息1.添加景點(diǎn)或道路界面工具0.退出系統(tǒng)景點(diǎn)信息
詳細(xì)設(shè)計(jì)實(shí)現(xiàn)概要設(shè)計(jì)中定義的所有的類的定義及類中成員函數(shù),并對(duì)主要的模塊寫出偽碼算法。BGraph::構(gòu)造函數(shù)(傳入Sitea[],Roadb[],intn,inte)//傳入頂點(diǎn)類數(shù)組a,邊類數(shù)組b,頂點(diǎn)數(shù)、邊數(shù){ 頂點(diǎn)數(shù)=n; 邊數(shù)=e; A[]賦值給Adjlist[]成員變量vex 插入邊a[i][j] 插入邊a[j][i]//初始化距離矩陣 新建整形二維數(shù)組dis[][],長(zhǎng)度、寬度均為MAXSIZE,全部賦值為UR 循環(huán)次數(shù)為(邊表數(shù)目) { 當(dāng)(下一個(gè)指針存在) { 將E的權(quán)值放入矩陣中制定位置 指針后移 }//初始化風(fēng)景矩陣 新建整形二維數(shù)組scn[][],長(zhǎng)度、寬度均為MAXSIZE,全部賦值為0 循環(huán)次數(shù)為(邊表數(shù)目) { 當(dāng)(下一個(gè)指針存在) { 將E的權(quán)值放入矩陣中制定位置 指針后移 }頂點(diǎn)數(shù)自增}voidBGraph::添加景點(diǎn){ bool旗標(biāo)=false; 整形數(shù)據(jù)下標(biāo)1,下標(biāo)2,風(fēng)景等級(jí) String型數(shù)據(jù)temp 景點(diǎn)型數(shù)據(jù)n 如果頂點(diǎn)數(shù)目到達(dá)最大值 提示用戶 否則 { 輸入需要添加的景點(diǎn)名 調(diào)用通過景點(diǎn)名返回景點(diǎn)型變量函數(shù),賦值給n 輸入景點(diǎn)信息 輸入景點(diǎn)坐標(biāo)修改距離鄰接矩陣、風(fēng)景鄰接矩陣}voidBGraph::添加邊(){ 輸入節(jié)點(diǎn)1,節(jié)點(diǎn)2 查詢節(jié)點(diǎn)1、節(jié)點(diǎn)2的下標(biāo)advx在adjlist[]中節(jié)點(diǎn)1、節(jié)點(diǎn)2互相添加一條到對(duì)方的邊 修改鄰接距離矩陣 修改鄰接風(fēng)景矩陣 邊數(shù)自增}SiteBGraph::通過景點(diǎn)名稱查找景點(diǎn)(stringname){ 聲明int型指針num_s,num_e,num_d 輸入景點(diǎn)名 在adjlist[]中查找是否有景點(diǎn)名為name的景點(diǎn) 若不存在 輸出不存在 否則 返回該adjlist[]的vex}voidBGraph::導(dǎo)航(){ { 用戶輸入導(dǎo)航原則 若導(dǎo)航原則為距離優(yōu)先 t1="最短路程距離"; t2="m"; 將距離鄰接矩陣二維數(shù)組復(fù)制給臨時(shí)變量數(shù)組temp[][] 若導(dǎo)航原則為風(fēng)景優(yōu)先 t1="最優(yōu)風(fēng)景總值"; t2=""; 將風(fēng)景等級(jí)鄰接矩陣二維數(shù)組復(fù)制給臨時(shí)變量數(shù)組temp[][] 輸出"請(qǐng)輸入起點(diǎn)" 輸入給name1; 查詢name1對(duì)應(yīng)下標(biāo)值,賦值給num_s 輸出"請(qǐng)輸入終點(diǎn)" 輸入給name2; 查詢name2對(duì)應(yīng)下標(biāo)值,賦值給num_d 動(dòng)態(tài)生成num_e 聲明一個(gè)長(zhǎng)寬為maxsize的二維數(shù)組D 聲明一個(gè)長(zhǎng)寬為maxsize的二維數(shù)組path循環(huán)賦值{ 將權(quán)值數(shù)組temp[][]賦值給D[][] 將權(quán)值存在的元素在path數(shù)組中對(duì)應(yīng)位置設(shè)置為i 不存在的設(shè)置為-1 若path中存在比當(dāng)前路徑更小的路徑 更新為新的路徑}輸出起點(diǎn) 當(dāng)path中還存在下一個(gè)點(diǎn) { 輸出當(dāng)前指向頂點(diǎn)名稱 計(jì)算當(dāng)前點(diǎn)與前一點(diǎn)的位置關(guān)系,存到t 計(jì)算當(dāng)前點(diǎn)與前一個(gè)點(diǎn)的距離,存到d 輸出"【向"<<t<<"走"<<d*比例尺<<"米】->"; } 不存在了的話 輸出"->結(jié)束" Path指針后移一位}調(diào)試分析(包括調(diào)試過程中遇到的問題及解決的方法、算法的時(shí)間空間復(fù)雜性分析、經(jīng)驗(yàn)體會(huì)。) 在本次設(shè)計(jì)中,對(duì)于求兩點(diǎn)之間的最短路徑方法花費(fèi)了最多時(shí)間,之前對(duì)于迪杰斯特拉算法和弗洛伊德算法的不熟料導(dǎo)致在運(yùn)用上不能非常得心應(yīng)手,產(chǎn)生了諸多問題。 在計(jì)算的時(shí)間、空間復(fù)雜度上,在盡可能減少占用空間和所需時(shí)間上,努力減少了循環(huán)層數(shù),編寫析構(gòu)函數(shù)及時(shí)釋放了空間。 通過本次試驗(yàn),我較好的掌握了C++編寫技術(shù)、數(shù)據(jù)結(jié)構(gòu)中圖的各類應(yīng)用及VS2012界面、操作、調(diào)試技術(shù),為未來的工作學(xué)習(xí)打下了更好的基礎(chǔ)。測(cè)試結(jié)果附錄:程序設(shè)計(jì)源代碼20121764周桐-校園導(dǎo)游咨詢系統(tǒng).cpp//20121764.cpp:定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。//#include"stdafx.h"#include"ArcNode.h"#include"Site.h"#include"BGraph.h"voidmain(){ system("colorF1"); intf=1;//循環(huán)判斷器 stringst; intselect;//選擇器 //**********初始化校園地圖信息************ //初始化景點(diǎn) Sitesite[15]; site[0].setSite(0,"北校門","學(xué)校的北入口",2,14); site[1].setSite(1,"北圖書館","學(xué)校北側(cè)圖書館",12,14); site[2].setSite(2,"崇德樓","經(jīng)管學(xué)院樓",26,14); site[3].setSite(3,"奮進(jìn)樓","公共機(jī)房",12,28); site[4].setSite(4,"北運(yùn)動(dòng)場(chǎng)","具有足球場(chǎng)、籃球場(chǎng)、健身房等",26,28); site[5].setSite(5,"行政樓","計(jì)算機(jī)學(xué)院樓及其他行政辦公",12,32); site[6].setSite(6,"教師活動(dòng)中心","又稱H樓,具有桌球、乒乓球、會(huì)議室、舞廳等",12,39); site[7].setSite(7,"雕塑","校園雕塑",26,39); site[8].setSite(8,"南校門","學(xué)校南入口",2,50); site[9].setSite(9,"至誠(chéng)樓","辦理學(xué)生事務(wù)處",12,50); site[10].setSite(10,"大禮堂","學(xué)校大型文藝演出、講座場(chǎng)所",26,50); site[11].setSite(11,"南圖書館","學(xué)校南側(cè)的圖書館",12,52); site[12].setSite(12,"大學(xué)生文化活動(dòng)中心","團(tuán)委、學(xué)生會(huì)、社聯(lián)所在處",12,58); site[13].setSite(13,"風(fēng)帆廣場(chǎng)","綠地,景色優(yōu)美",26,58); site[14].setSite(14,"南運(yùn)動(dòng)場(chǎng)","具有足球場(chǎng)、籃球場(chǎng)、羽毛球場(chǎng)等",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);//調(diào)用主界面 cin>>st; if(IsDigit(st)) { select=stringToNum<int>(st); switch(select) { case1:findSite(school);break;//進(jìn)入查詢景點(diǎn)信息界面 case2:guide(school);break;//進(jìn)入景點(diǎn)導(dǎo)航界面 case3:alterSiteRoadView(school);break;//進(jìn)入修改景點(diǎn)或道路子菜單 case4:developView(school);break;//進(jìn)入開發(fā)人員工具界面 case5:ShellExecute(NULL,TEXT("open"),TEXT("地圖.jpg"),NULL,NULL,SW_SHOWNORMAL);break;//顯示地圖 case0: system("cls"); cout<<"退出系統(tǒng)后,用戶自定義的景點(diǎn)、道路將被清空,是否確認(rèn)退出?確認(rèn)輸入[1],暫不退出輸入其他內(nèi)容"<<endl; cin>>st; if(st=="1") f=0;break;//判斷器清零,退出系統(tǒng) default:cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<endl;system("pause");break; } } else {cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<endl;Sleep(1000);} } exit_view();}ArcNode.h#pragmaonceclassArcNode{public: intadjvex;//鄰接點(diǎn)下標(biāo)值 ArcNode*nextarc;//指向下一個(gè)邊結(jié)點(diǎn)的指針 intsceneLevel; intdistance;public: ArcNode(void); ArcNode(intadjvex0,intsceneLevel0,intdistance0); ~ArcNode(void);};ArcNode.cpp#include"stdafx.h"#include"ArcNode.h"http://無參構(gòu)造函數(shù)ArcNode::ArcNode(void){ nextarc=NULL;}//帶參構(gòu)造函數(shù),傳入頂點(diǎn)下標(biāo)、景色等級(jí)、距離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);//構(gòu)造函數(shù),初始化一個(gè)有n個(gè)頂點(diǎn)e條邊的圖 voidaddSite(); voidaddRoad(); ~BGraph();//析構(gòu)函數(shù),釋放鄰接表中各邊表結(jié)點(diǎn)的存儲(chǔ)空間 voidpGraph();//輸出鄰接表 voidpMatrix();//輸出鄰接矩陣 voidshowInfo(); SitesearchByName(stringname);//根據(jù)景點(diǎn)名搜索 voidDFSTraverse(intv,intvisited[]);//深度優(yōu)先遍歷 voidBFSTraverse(intv,intvisited[]);//廣度優(yōu)先遍歷 voidfindPath();public: VertexNodeadjlist[MaxSize]; intdis[MaxSize][MaxSize];//距離鄰接矩陣 intscn[MaxSize][MaxSize];//風(fēng)景鄰接矩陣//存放頂點(diǎn)表的數(shù)組 intvertexNum,arcNum;//圖的頂點(diǎn)數(shù)和邊數(shù)};BGraph.cpp#include"stdafx.h"#include"BGraph.h"#include"Site.h"#include<iomanip>//********帶參構(gòu)造函數(shù)**********BGraph::BGraph(Sitea[],Roadb[],intn,inte)//傳入頂點(diǎn)類數(shù)組a,邊類數(shù)組b,頂點(diǎn)數(shù)、邊數(shù){ 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]; } } //******初始化風(fēng)景鄰接矩陣********** 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]; }}//***********添加節(jié)點(diǎn)************voidBGraph::addSite(){ boolflag=false; intadv1=-1,adv2=-1,scLv=0; stringtemp; Siten; if(vertexNum==MaxSize) cout<<"頂點(diǎn)數(shù)已滿!"<<endl; else { do { flag=false; cout<<"請(qǐng)輸入要添加的景點(diǎn)名稱:"; cin>>temp; for(inti=0;i<vertexNum;i++) { if(temp==adjlist[i].vex.siteName) { cout<<"景點(diǎn)名稱已存在!請(qǐng)重新輸入!"<<endl; flag=true; } } } while(flag); n.siteName=temp; n.code=vertexNum+1; cout<<"請(qǐng)輸入景點(diǎn)信息:"; cin>>roduction; flag=true; while(flag) { cout<<"請(qǐng)輸入景點(diǎn)X坐標(biāo):"; cin>>temp; if(!IsDigit(temp)&&stringToNum<int>(temp)<0) cout<<endl<<"坐標(biāo)輸入有誤!請(qǐng)重新輸入"<<endl; else { flag=false; n.px=stringToNum<int>(temp); } } flag=true; while(flag) { cout<<"請(qǐng)輸入景點(diǎn)Y坐標(biāo):"; cin>>temp; if(!IsDigit(temp)&&stringToNum<int>(temp)<0) cout<<endl<<"坐標(biāo)輸入有誤!請(qǐng)重新輸入"<<endl; else { flag=false; n.py=stringToNum<int>(temp); } } vertexNum++; adjlist[vertexNum-1].vex=n; adjlist[vertexNum-1].firstarc=NULL; //修改距離鄰接矩陣、風(fēng)景鄰接矩陣 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<<"請(qǐng)輸入節(jié)點(diǎn)1:"; cin>>n1; a=searchByName(n1); cout<<"請(qǐng)輸入節(jié)點(diǎn)2:"; cin>>n2; b=searchByName(n2); cout<<"風(fēng)景等級(jí)(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++;}//***********鄰接表析構(gòu)函數(shù)*********BGraph::~BGraph(){ for(inti=0;i<vertexNum;i++) { ArcNode*E,*q; E=adjlist[i].firstarc; while(E) {q=E; E=E->nextarc; deleteq; } }}//******鄰接表輸出函數(shù)********voidBGraph::pGraph(){ inti;ArcNode*E; for(i=0;i<vertexNum;i++) {E=adjlist[i].firstarc; cout<<endl<<"景點(diǎn):"<<adjlist[i].vex.siteName<<"==>"; while(E) { cout<<adjlist[E->adjvex].vex.siteName<<",距離:"<<E->distance*R<<"米->景色等級(jí):"<<E->sceneLevel<<"==>"; E=E->nextarc; } cout<<endl; }}//*********顯示當(dāng)前圖的信息************voidBGraph::showInfo(){ cout<<"當(dāng)前共有"<<vertexNum<<"個(gè)景點(diǎn),"<<arcNum<<"條路"<<endl;}//*********根據(jù)景點(diǎn)名搜索景點(diǎn),返回Site型數(shù)據(jù)************SiteBGraph::searchByName(stringname){ while(1) { inti=0; for(i=0;i<vertexNum;i++) { if(name==adjlist[i].vex.siteName) returnadjlist[i].vex; } cout<<"景點(diǎn)名稱輸入有誤!請(qǐng)重新輸入!"<<endl; cin>>name; }}//*********深度優(yōu)先遍歷************voidBGraph::DFSTraverse(intv,intvisited[])//深度優(yōu)先遍歷{ if(v>vertexNum) cout<<"出錯(cuò)"<<endl;//頂點(diǎn)輸入錯(cuò)誤則拋出異常 ArcNode*p; intj; cout<<adjlist[v].vex.siteName<<""; visited[v]=1; p=adjlist[v].firstarc; while(p)//依次搜索頂點(diǎn)v的鄰接點(diǎn)j { j=p->adjvex; if(visited[j]==0) DFSTraverse(j,visited); p=p->nextarc; }}//*********廣度優(yōu)先遍歷************voidBGraph::BFSTraverse(intv,intvisited[]){ if(v>vertexNum){cout<<"出錯(cuò)";exit(0);}//頂點(diǎn)輸入錯(cuò)誤則拋出異常 intfront,rear,j; ArcNode*p;//生成一個(gè)邊表結(jié)點(diǎn)p intQ[MaxSize]; front=rear=-1; //初始化隊(duì)列,假設(shè)隊(duì)列采用順序存儲(chǔ)且不會(huì)發(fā)生溢出 cout<<adjlist[v].vex.siteName<<""; visited[v]=1;Q[++rear]=v;//被訪問頂點(diǎn)入隊(duì) 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; }}//**************導(dǎo)航***********voidBGraph::findPath(){ intnum_s; intnum_e; intnewnum; inttemp[MaxSize][MaxSize]; stringt; stringt1,t2; stringname1,name2; intf=1;//循環(huán)判斷器 stringst; while(f) { cout<<"景點(diǎn)導(dǎo)航,請(qǐng)選擇導(dǎo)航原則,1為距離最短,2為景色最優(yōu)"<<endl; cin>>t; if(!IsDigit(t)) cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<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="最優(yōu)風(fēng)景總值"; t2=""; for(inti=0;i<vertexNum;i++) for(intj=0;j<vertexNum;j++) temp[i][j]=scn[i][j]; f=0; break; default:cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<endl; break; } } } cout<<"請(qǐng)輸入起點(diǎn)"<<endl; cin>>name1; newnum=searchByName(name1).code; num_s=newnum; cout<<"請(qǐng)輸入終點(diǎn)"<<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];//記錄下一個(gè)鄰接點(diǎn) } } } } cout<<t1<<"為:"<<D[num_s][num_e]*R<<t2<<endl; cout<<"行進(jìn)方案為:"; 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<<"->結(jié)束"<<endl; j=i; }}Function.cpp#include"stdafx.h"#include"ArcNode.h"#include"Site.h"#include"BGraph.h"http://計(jì)算兩直連點(diǎn)距離intcaculateDistance(Sitea,Siteb){ if(a.px!=b.px&&a.py!=b.py) returnUR; else return(abs((a.px-b.px)+(a.py-b.py)));}//********判斷字符串是否是純數(shù)字*********boolIsDigit(stringstr){ for(unsignedinti=0;i<str.size();i++) { if((str.at(i)>'9')||(str.at(i)<'0')) { returnfalse; } } returntrue;}//********判斷兩點(diǎn)之間方向關(guān)系**********stringdirection(Sitea,Siteb)//源點(diǎn)a,目的點(diǎn)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<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║主菜單║"<<endl; cout<<"╠════════════════════════╣"<<endl; cout<<"║║"<<endl; cout<<"║⊕1.查詢景點(diǎn)信息║"<<endl; cout<<"║║"<<endl; cout<<"║⊕2.景點(diǎn)導(dǎo)航║"<<endl; cout<<"║║"<<endl; cout<<"║⊕3.修改景點(diǎn)或道路║"<<endl; cout<<"║║"<<endl; cout<<"║⊕4.開發(fā)人員工具║"<<endl; cout<<"║║"<<endl; cout<<"║⊕5.顯示地圖║"<<endl; cout<<"║║"<<endl; cout<<"║⊕0.退出系統(tǒng)║"<<endl; cout<<"║║"<<endl; cout<<"║請(qǐng)輸入所需功能的編號(hào)后按回車║"<<endl; cout<<"║║"<<endl; cout<<"╚════════════════════════╝"<<endl; cout<<"系統(tǒng)狀態(tài):"<<endl; cout<<"當(dāng)前系統(tǒng)中共有"<<school.vertexNum<<"個(gè)景點(diǎn),"<<school.arcNum<<"條路"<<endl;}voidfindSiteView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║查詢景點(diǎn)信息║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidguideView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║景點(diǎn)導(dǎo)航║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidalterSiteRoadView(BGraph&school){ intf=1;//循環(huán)判斷器 stringst; intselect;//選擇器 while(f) { system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║修改景點(diǎn)或道路║"<<endl; cout<<"╠════════════════════════╣"<<endl; cout<<"║║"<<endl; cout<<"║⊕1.添加景點(diǎn)║"<<endl; cout<<"║║"<<endl; cout<<"║⊕2.添加道路║"<<endl; cout<<"║║"<<endl; cout<<"║⊕3.修改景點(diǎn)信息║"<<endl; cout<<"║║"<<endl; cout<<"║⊕0.返回上級(jí)菜單║"<<endl; cout<<"║║"<<endl; cout<<"║請(qǐng)輸入所需功能的編號(hào)后按回車║"<<endl; cout<<"║║"<<endl; cout<<"╚════════════════════════╝"<<endl; cin>>st; if(IsDigit(st)) { select=stringToNum<int>(st); switch(select) { case1:addSite(school);break;//進(jìn)入添加景點(diǎn)界面 case2:addRoad(school);break;//進(jìn)入添加道路界面 case3:alterSite(school);break;//進(jìn)入修改景點(diǎn)信息界面 case0:f=0;break;//返回上級(jí)菜單 default:cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<endl;system("pause");break; } } else {cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<endl;Sleep(1000);} }}//*********************修改景點(diǎn)或道路**********************voidaddSiteView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║添加景點(diǎn)║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidaddRoadView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║添加道路║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidalterSiteView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║修改景點(diǎn)信息║"<<endl; cout<<"╚════════════════════════╝"<<endl;}//*********************修改景點(diǎn)或道路**********************voiddevelopView(BGraph&school){ intf=1;//循環(huán)判斷器 stringst; intselect;//選擇器 while(f) { system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║開發(fā)人員工具║"<<endl; cout<<"╠════════════════════════╣"<<endl; cout<<"║║"<<endl; cout<<"║⊕1.查看鄰接表║"<<endl; cout<<"║║"<<endl; cout<<"║⊕2.查看鄰接矩陣║"<<endl; cout<<"║║"<<endl; cout<<"║⊕3.DFS深度優(yōu)先遍歷║"<<endl; cout<<"║║"<<endl; cout<<"║⊕4.BFS廣度優(yōu)先遍歷║"<<endl; cout<<"║║"<<endl; cout<<"║⊕0.返回上級(jí)菜單║"<<endl; cout<<"║║"<<endl; cout<<"║請(qǐng)輸入所需功能的編號(hào)后按回車║"<<endl; cout<<"║║"<<endl; cout<<"╚════════════════════════╝"<<endl; cin>>st; if(IsDigit(st)) { select=stringToNum<int>(st); switch(select) { case1:showAdjlist(school);break;//進(jìn)入查看鄰接表界面 case2:showMatrix(school);break;//進(jìn)入查看鄰接矩陣界面 case3:DFS(school);break;//進(jìn)入DFS深度優(yōu)先遍歷界面 case4:BFS(school);break;//進(jìn)入BFS廣度優(yōu)先遍歷界面 case0:f=0;break;//返回上級(jí)菜單 default:cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<endl;system("pause");break; } } else {cout<<"您的輸入有誤!請(qǐng)重新輸入!"<<endl;Sleep(1000);} }}//***********************開發(fā)人員工具********************voidshowAdjlistView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║查看鄰接表║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidshowMatrixView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║查看鄰接矩陣║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidDFSView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║DFS深度優(yōu)先遍歷║"<<endl; cout<<"╚════════════════════════╝"<<endl;}voidBFSView(){ system("cls"); cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<endl; cout<<"╠╣"<<endl; cout<<"║BFS廣度優(yōu)先遍歷║"<<endl; cout<<"╚════════════════════════╝"<<endl;}//***********************開發(fā)人員工具********************voidexit_view(){ system("cls"); cout<<endl<<endl<<endl; cout<<"╔════════════════════════╗"<<endl; cout<<"║☆☆上海電力學(xué)院校園導(dǎo)游咨詢系統(tǒng)☆☆║"<<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;//編號(hào) stringsiteName;//景點(diǎn)名稱 stringintroduction;//介紹 intpx,py;//坐標(biāo)public: voidsetSite(intcode0,stringsiteName0,stringintroduction0,intx,inty); Site(void); Site(intcode0,stringsiteName0,stringintroduction0,intx,inty);//代號(hào),景點(diǎn)名稱,介紹,x坐標(biāo),y坐標(biāo) ~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:標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件,//或是經(jīng)常使用但不常更改的//特定于項(xiàng)目的包含文件//#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"http://*********用戶函數(shù)聲明**********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);//功能函數(shù)聲明boolIsDigit(stringstr);intcaculateDistance(Sitea,Siteb);template<classType>TypestringToNum(conststring&str){ istringstreamiss(str); Typenum; iss>>num; returnnum;}stringdirection(Sitea,Siteb);//*********常量聲明**********constdoubleR=9.15;//比例尺constintUR=999;//設(shè)定不可達(dá)數(shù)值//*********界面聲明**********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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 度數(shù)據(jù)中心設(shè)備采購(gòu)合同
- 特色音樂課件模板
- 神經(jīng)內(nèi)科臨床護(hù)理
- 肉類供應(yīng)合同
- 房屋裝修合同范本
- 房屋共有權(quán)合同范本
- 標(biāo)準(zhǔn)租車合同:非營(yíng)業(yè)性使用協(xié)議詳解
- 建筑工程施工安全管理合同
- 生石灰采購(gòu)合同書
- 電子廢棄物回收處理與環(huán)保標(biāo)準(zhǔn)考核試卷
- 安委會(huì)-安委會(huì)工作總結(jié)
- 2024年九年級(jí)中考數(shù)學(xué)專題訓(xùn)練-動(dòng)點(diǎn)最值之胡不歸模型
- 四年級(jí)下冊(cè)數(shù)學(xué)運(yùn)算定律簡(jiǎn)便計(jì)算練習(xí)100題及答案
- 《數(shù)據(jù)中心液冷系統(tǒng)技術(shù)規(guī)程》
- 足浴技師溝通細(xì)節(jié)培訓(xùn)課件
- 工裝裝修策劃方案
- 咖啡師初級(jí)理論知識(shí)復(fù)習(xí)題及答案
- 高血壓科普健康宣教課件
- 服務(wù)器系統(tǒng)故障演練流程
- 2023樓棟燃?xì)庹{(diào)壓箱應(yīng)用技術(shù)規(guī)程
- 政策目標(biāo)確立和方案制定概述
評(píng)論
0/150
提交評(píng)論