版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 數(shù) 據(jù) 結(jié) 構(gòu)</b></p><p> 課 程 設(shè) 計(jì) 說(shuō) 明 書(shū)</p><p><b> 一.設(shè)計(jì)目的:</b></p><p> 《數(shù)據(jù)結(jié)構(gòu)》課程主要介紹最常用的數(shù)據(jù)結(jié)構(gòu),闡明各種數(shù)據(jù)結(jié)構(gòu)內(nèi)在的邏輯關(guān)系,討論其在計(jì)算機(jī)中的存儲(chǔ)表示,以及在其上進(jìn)行各種運(yùn)算時(shí)的實(shí)現(xiàn)算法,并對(duì)算法的效
2、率進(jìn)行簡(jiǎn)單的分析和討論。進(jìn)行數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)要達(dá)到以下目的:</p><p> 1)了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力;</p><p> 2)初步掌握軟件開(kāi)發(fā)過(guò)程的問(wèn)題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能;</p><p> 3)提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問(wèn)題的能力;</p><
3、p> 4)訓(xùn)練用系統(tǒng)的觀點(diǎn)和軟件開(kāi)發(fā)一般規(guī)范進(jìn)行軟件開(kāi)發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。</p><p> 本系統(tǒng)為用戶提供以下功能:</p><p> (一)、查詢了解學(xué)校概況,為導(dǎo)游參觀者提供關(guān)于學(xué)校的相關(guān)信息。</p><p> (二)、查詢校園各個(gè)場(chǎng)所和景點(diǎn)信息;</p><p> (三)、為導(dǎo)游者或外
4、來(lái)人員參觀人員提供校園交通信息,方便用戶走訪學(xué)校。</p><p> 校園導(dǎo)航查詢系統(tǒng)的開(kāi)發(fā)方法總結(jié)如下:</p><p> (1) 調(diào)查,了解學(xué)校各個(gè)場(chǎng)所與 場(chǎng)所或者是各個(gè)景點(diǎn)與景點(diǎn)之間的信息,路徑和距離,從外來(lái)人員或者參觀者和走訪者的角度出發(fā),該如何設(shè)計(jì)才能滿足用戶需求。</p><p> (2) 分析,對(duì)調(diào)查得到的數(shù)據(jù)進(jìn)行分析,根據(jù)其要求實(shí)現(xiàn)的功能分析系
5、統(tǒng)結(jié)構(gòu)和界面將實(shí)現(xiàn)的基本功能。</p><p> (3) 設(shè)計(jì)與開(kāi)發(fā),設(shè)計(jì)系統(tǒng)界面并編輯實(shí)現(xiàn)其各個(gè)功能的代碼。</p><p> (4) 調(diào)試,在設(shè)計(jì)完成后,調(diào)試系統(tǒng)運(yùn)行的狀況,修改完善系統(tǒng),然后進(jìn)行測(cè)試。</p><p><b> 二.涉及內(nèi)容和要求</b></p><p><b> 設(shè)計(jì)內(nèi)容:<
6、;/b></p><p> ?。?)設(shè)計(jì)學(xué)校的平面圖(至少包括10個(gè)以上的場(chǎng)所)。每?jī)蓚€(gè)場(chǎng)所間可以有不同的路,且路長(zhǎng)也可能不同;</p><p> (2)提供起始點(diǎn)與終點(diǎn)能自動(dòng)找出從任意場(chǎng)所到達(dá)另一場(chǎng)所的最佳路徑(最短路徑)。</p><p><b> 設(shè)計(jì)要求:</b></p><p> (1) 符合課題要
7、求,實(shí)現(xiàn)相應(yīng)功能;</p><p> (2) 要求界面友好美觀,操作方便易行;</p><p> (3) 注意程序的實(shí)用性、安全性;</p><p> 三.本設(shè)計(jì)所采用的數(shù)據(jù)結(jié)構(gòu)</p><p> 校園旅游模型是由各個(gè)景點(diǎn)和景點(diǎn)以及場(chǎng)所和場(chǎng)所之間的路徑組成的,所以這完全可以用數(shù)據(jù)結(jié)構(gòu)中的圖來(lái)模擬。用圖的結(jié)點(diǎn)代表景點(diǎn)或場(chǎng)所,用圖的邊代表
8、景點(diǎn)或場(chǎng)所之間的路徑。所以首先應(yīng)創(chuàng)建圖的存儲(chǔ)結(jié)構(gòu)。結(jié)點(diǎn)值代表景點(diǎn)信息,邊的權(quán)值代表景點(diǎn)間的距離。結(jié)點(diǎn)值及邊的權(quán)值采用圖存儲(chǔ)。本系統(tǒng)需要查詢景點(diǎn)信息和求一個(gè)景點(diǎn)到另一個(gè)景點(diǎn)的最短路徑長(zhǎng)度及路線,為方便操作,所以給每個(gè)景點(diǎn)一個(gè)代碼,用結(jié)構(gòu)體類型實(shí)現(xiàn)。計(jì)算路徑長(zhǎng)度,最短路線和最佳路徑時(shí)可用迪杰斯特拉(Dijkastra)算法實(shí)現(xiàn)。最后用switch選擇語(yǔ)句選擇執(zhí)行瀏覽景點(diǎn)信息或查詢最短路徑和距離。</p><p>
9、圖的存儲(chǔ)結(jié)構(gòu)常用的有4種,分別是數(shù)組表示法,鄰接表,十字鏈表,鄰接多重表。在此程序中運(yùn)用的是數(shù)組表示法:</p><p> 網(wǎng)的鄰接矩陣:A[i][j]= wi,j 若<vi,vj>或(vi,vj)∈VR</p><p> ∞ 反之</p><p> #define INFINITY INT_MAX
10、//最大值無(wú)窮大</p><p> #define MAX_VERTEX_NUM 20 //最大頂點(diǎn)個(gè)數(shù)</p><p> typedef enum{DG,DN,AG,AN} GraphKind; //有向圖,有向網(wǎng),無(wú)向圖,無(wú)向網(wǎng)</p><p> typedef struct ArcCell{</p><p>
11、 VRType adj; </p><p> InfoType *info; //該弧相關(guān)信息的指針</p><p> }ArcCell,AdjMatrix[max_vertex_num][max_vertex_num];</p><p> tpyedef struct{</p><p> VertexType vexs[MAX_VE
12、RTEX_NUM]; //頂點(diǎn)向量</p><p> AdjMatrix arcs; //鄰接矩陣</p><p> int vexnum,arcnum; //圖的當(dāng)前頂點(diǎn)數(shù)和弧數(shù)</p><p> GraphKind kind; //圖的種類標(biāo)志</p><p><b> }MGraph;</b></
13、p><p> 創(chuàng)建一個(gè)二維數(shù)組用來(lái)存儲(chǔ)兩個(gè)地點(diǎn)的距離,數(shù)組兩個(gè)下標(biāo)分別代表兩個(gè)地點(diǎn)的位置(起點(diǎn)與終點(diǎn)),若兩個(gè)地點(diǎn)之間沒(méi)有路線可走則用無(wú)窮大表示兩點(diǎn)之間沒(méi)有路,依據(jù)此條件完成初始化平面矩陣。</p><p><b> 例子:</b></p><p> Edge[0][0].value=0 , Edge[0][1].value=
14、25 , Edge[0][2].value=25 ; </p><p> Edge[0][3].value=90, Edge[0][4].value=uplimit, Edge[0][5].value=uplimit ;</p><p> Edge[0][6].value=10 , Edge[0][7].value=uplimit , Ed
15、ge[0][8].value=uplimit;</p><p> Edge[0][9].value=uplimit, Edge[0][10].value=uplimit;</p><p><b> 2.</b></p><p> 迪杰斯特拉(Dijkstra)算法思想:</p><p> 按路徑長(zhǎng)度遞增的
16、次序產(chǎn)生最短路徑.</p><p> 算法的一級(jí)實(shí)現(xiàn):輔助數(shù)組D[0..n-1]</p><p><b> D[i]:</b></p><p> 表示當(dāng)前所找到的從始點(diǎn)v到終點(diǎn)vi的最短路徑的長(zhǎng)度.</p><p> 算法的二級(jí)實(shí)現(xiàn): (用鄰接矩陣arcs來(lái)存儲(chǔ)有向圖)</p><p>
17、 (1) S:表示已找到從v出發(fā)的最短路徑的終點(diǎn)的集合;</p><p> D[i]:表示當(dāng)前所找到的從v到終點(diǎn)vi的最短路徑的長(zhǎng)度.</p><p> S={v}; D[i]=arcs[Locate-vex(G,v)][i] vi∈V</p><p> (2)選擇vj, 使得</p><p> D[j]=min
18、{D[i]| vi∈V-S}</p><p> 令 S=S∪{j}</p><p> (3)修改從v出發(fā)到集合V-S上任頂點(diǎn)Vk可達(dá)的最短路徑長(zhǎng)度.</p><p> if D[j]+arcs[j,k]<D[k]</p><p> D[k]=D[j]+arcs[j][k]</p><p> (4
19、)重復(fù)(2)、(3)共n-1次;</p><p> 即可求得從v到圖上其余各頂點(diǎn)的最短路徑.</p><p> 以下為迪杰斯特拉算法</p><p> void ShortestDist(int s){ </p><p> for ( int i=0;i<11;i++){ //dist和p
20、ath數(shù)組初始化 </p><p> dist[i].value=Edge[s][i].value; //鄰接矩陣第s行元素賦值到dist中 </p><p> S[i].value=0; //已求出最短路徑的頂點(diǎn)集合初始化 </p><p> if(i!=s && dist[i].va
21、lue<uplimit){ </p><p> path[i].value=s; </p><p><b> } </b></p><p> else path[i].value=-1; //路徑存放數(shù)組初始化</p><p><b>
22、 } </b></p><p> S[s].value=1; //頂點(diǎn)s加入頂點(diǎn)集合</p><p> dist[s].value=0; </p>&
23、lt;p> /* 循環(huán)計(jì)算該場(chǎng)所與鄰接場(chǎng)所之間的最短距離 */ </p><p> for (i=0;i<11-1;i++){ //從頂點(diǎn)s確定n-1條路徑 </p><p> float min=uplimit; </p><p> int u=s; </p>&
24、lt;p> for (int j=0;j<11;j++){ //選擇當(dāng)前不在集合S中具有最短路徑的頂點(diǎn)u </p><p> /* 如果有路徑比目前的最小值還小,則替換這個(gè)最小值 */ </p><p> if (!S[j].value && dist[j].value<min){ </p
25、><p><b> u=j; </b></p><p> min=dist[j].value; </p><p><b> }</b></p><p><b> } </b></p><p> S[u].value=1;
26、 //將頂點(diǎn)u加入集合S,表示它已在最短路徑上 </p><p> for (int w=0;w<11;w++){ //修改 </p><p> if (!S[w].value && Edge[u][w].value<uplimit && dis
27、t[u].value+Edge[u][w].value<dist[w].value){ </p><p> dist[w].value=dist[u].value+Edge[u][w].value; </p><p> path[w].value=u; </p><p> 3.用switch語(yǔ)句,分支case語(yǔ)句出現(xiàn)友好界面,提示相關(guān)的輸入信息,
28、為用戶的使用提供方便的輸入信息,例如:</p><p><b> switch(c)</b></p><p><b> {</b></p><p> case 0: printf("女生公寓");break;</p><p> case 1: printf( "
29、圖書(shū)館");break;</p><p> case 2: printf( "體育館");break;</p><p> case 3: printf( "一道門(mén)");break;</p><p> case 4: printf( "一教學(xué)樓");break;</p><
30、p> case 5: printf( "男生公寓");break;</p><p> case 6: printf( "食堂");break;</p><p> case 7: printf( "體育場(chǎng)");break;</p><p> case 8: printf( "五道門(mén)&q
31、uot;);break;</p><p> case 9: printf( "十號(hào)教學(xué)樓");break;</p><p> case 10:printf("實(shí)驗(yàn)樓");break;</p><p> 四、功能模塊詳細(xì)設(shè)計(jì)</p><p> (一)設(shè)計(jì)功能的實(shí)現(xiàn)</p><p
32、> 接下來(lái)根據(jù)以上搭建的程序框架完成各個(gè)模塊的算法</p><p> 首先是抽象數(shù)據(jù)類型的定義:</p><p> 圖的抽象數(shù)據(jù)類型的 定義:</p><p> ADT Mgragh{</p><p> 數(shù)據(jù)對(duì)象V: V是具有相同特征的數(shù)據(jù)元素的 集合,稱為定點(diǎn)集</p><p> 數(shù)據(jù)關(guān)系R
33、={VR}</p><p> VR={ <V,W> | V, W∈V, <V , W>表示從V到W的邊 </p><p><b> }</b></p><p><b> 2、 基本操作:</b></p><p> CreateUDN(&G,V,VR);
34、// 創(chuàng)建圖</p><p> 初始條件:V是圖的頂點(diǎn)集,VR是圖中邊的 集合。</p><p> 操作結(jié)果:按V和VR的定義構(gòu)造圖 G。</p><p> ?。ǘ┲饕惴ㄔO(shè)計(jì)及相關(guān)算法補(bǔ)充</p><p> 先創(chuàng)建圖存儲(chǔ)學(xué)校各個(gè)景點(diǎn)或場(chǎng)所,以圖的頂點(diǎn)表示景點(diǎn)或場(chǎng)所,以邊表示路徑,再利用迪杰斯特拉(DijkStra)算法求出校園各個(gè)地
35、方的最短路徑,然后根據(jù)需要進(jìn)行補(bǔ)充相關(guān)算法。</p><p> void BuildMap() 生成地圖,輸入地圖的基本信息</p><p> void ShortestDist(int s) 找出場(chǎng)所間的最短距離</p><p> void bh() 顯示場(chǎng)所名稱</p><p> void Outpath(int c) 將
36、頂點(diǎn)序列號(hào)轉(zhuǎn)換成場(chǎng)所名稱 </p><p> void getdata(int s,int e) 輸出兩個(gè)場(chǎng)所之間的最短距離,和最短路徑</p><p> void info(int c) c為場(chǎng)所對(duì)應(yīng)的數(shù)字號(hào),輸出場(chǎng)所的具體信息,方便用戶的信息獲取</p><p> void num()用于顯示校園導(dǎo)航系統(tǒng)的界面顯示,輸出
37、10個(gè)地點(diǎn)的名稱</p><p> void main()在主程序中運(yùn)用switch語(yǔ)句分別調(diào)用不同的子函數(shù)完成相應(yīng)的操作</p><p> 程序的具體操作流程:</p><p> 打開(kāi)導(dǎo)航,在屏幕上顯示出學(xué)校各個(gè)景點(diǎn)場(chǎng)所;</p><p> 進(jìn)入主菜單,用switch語(yǔ)句選擇相應(yīng)的數(shù)字,查找學(xué)校簡(jiǎn)介,路線和個(gè)景點(diǎn)與場(chǎng)所之間的距離&
38、lt;/p><p> 進(jìn)入子菜單,選擇相應(yīng)的數(shù)字,查詢了解景點(diǎn)與場(chǎng)所信息及景點(diǎn)與場(chǎng)所的最短距離</p><p><b> 退出導(dǎo)航系統(tǒng)</b></p><p><b> 源程序:</b></p><p> #include <stdio.h></p><p>
39、 #include <iostream.h></p><p> #include <malloc.h></p><p> #include <conio.h></p><p> #include <stdlib.h></p><p> #define Num 11
40、 //最多頂點(diǎn)個(gè)數(shù) </p><p> #define uplimit 100000 //定義一個(gè)無(wú)窮大的值 </p><p> struct intt{</p><p> int value;</p><p><b>
41、};</b></p><p> intt Edge[Num][Num]; //Edge為帶權(quán)鄰接矩陣 </p><p> intt dist[Num]; //dist為最短路程 </p><p>
42、intt path[Num]; //path為最短路徑上該頂點(diǎn)的前一頂點(diǎn)的頂點(diǎn)號(hào) </p><p> intt S[Num]; //S為已求得的在最短路徑上的頂點(diǎn)號(hào) </p><p> intt D[Num];
43、 //D為輸出最短距離時(shí)的輔助數(shù)組</p><p><b> /** </b></p><p> * 生成地圖,輸入地圖的基本信息 </p><p><b> * </b></p><p><b> **/ </b><
44、;/p><p> void BuildMap(){ </p><p> int i,j; </p><p> /* 初始化平面圖矩陣 */ </p><p> for ( i=0;i<11;i++){ </p><p> for ( j=0;j<11;j++
45、){ </p><p> Edge[0][0].value=0 , Edge[0][1].value=25 , Edge[0][2].value=25 ; </p><p> Edge[0][3].value=90, Edge[0][4].value=uplimit, Edge[0][5].value=uplimit ;</p&g
46、t;<p> Edge[0][6].value=10 , Edge[0][7].value=uplimit , Edge[0][8].value=uplimit;</p><p> Edge[0][9].value=uplimit, Edge[0][10].value=uplimit;</p><p> Edge[1][0].value=25 ,
47、 Edge[1][1].value=0 , Edge[1][2].value=10 ; </p><p> Edge[1][3].value=32, Edge[1][4].value=uplimit, Edge[1][5].value=uplimit ;</p><p> Edge[1][6].value=10 , Edge
48、[1][7].value=uplimit , Edge[1][8].value=21;</p><p> Edge[1][9].value=16, Edge[1][10].value=uplimit;</p><p> Edge[2][0].value=25 , Edge[2][1].value=10 , Edge[2][2].value=0
49、 ; </p><p> Edge[2][3].value=uplimit, Edge[2][4].value=uplimit, Edge[2][5].value=uplimit ; </p><p> Edge[2][6].value=uplimit, Edge[2][7].value=uplimit , Edge[2][8].value=uplimit;</
50、p><p> Edge[2][9].value=uplimit, Edge[2][10].value=uplimit;</p><p> Edge[3][0].value=90 , Edge[3][1].value=32 , Edge[3][2].value=uplimit ; </p><p> Edge[3][3].value
51、=0 , Edge[3][4].value=uplimit, Edge[3][5].value=uplimit ; </p><p> Edge[3][6].value=uplimit, Edge[3][7].value=uplimit , Edge[3][8].value=26;</p><p> Edge[3][9].value=uplimit,
52、Edge[3][10].value=uplimit;</p><p> Edge[4][0].value=uplimit, Edge[4][1].value=uplimit , Edge[4][2].value=uplimit ;</p><p> Edge[4][3].value=uplimit, Edge[4][4].value=0, Edge[4][
53、5].value=9 ; </p><p> Edge[4][6].value=uplimit, Edge[4][7].value=uplimit , Edge[4][8].value=uplimit;</p><p> Edge[4][9].value=uplimit, Edge[4][10].value=60;</p><p> Edge[5
54、][0].value=uplimit , Edge[5][1].value=uplimit , Edge[5][2].value=uplimit ;</p><p> Edge[5][3].value=uplimit, Edge[5][4].value=9, Edge[5][5].value=0 ;</p><p> Edge[5][6].value=upl
55、imit , Edge[5][7].value=15 , Edge[5][8].value=50;</p><p> Edge[5][9].value=14, Edge[5][10].value=uplimit;</p><p> Edge[6][0].value=10 , Edge[6][1].value=10 , Edge[
56、6][2].value=uplimit; </p><p> Edge[6][3].value=uplimit, Edge[6][4].value=uplimit, Edge[6][5].value=uplimit ; </p><p> Edge[6][6].value=0 , Edge[6][7].value=35 , Edge[6][8].v
57、alue=uplimit;</p><p> Edge[6][9].value=30, Edge[6][10].value=uplimit;</p><p> Edge[7][0].value=uplimit , Edge[7][1].value=uplimit , Edge[7][2].value=uplimit ; </p><p>
58、 Edge[7][3].value=uplimit, Edge[7][4].value=uplimit, Edge[7][5].value=15 ; </p><p> Edge[7][6].value=35 , Edge[7][7].value=0 , Edge[7][8].value=uplimit;</p><p> Edge[7][9].v
59、alue=13, Edge[7][10].value=uplimit;</p><p> Edge[8][0].value=uplimit , Edge[8][1].value=21 , Edge[8][2].value=uplimit ; </p><p> Edge[8][3].value=26, Edge[8][4].value=u
60、plimit; Edge[8][5].value=50 ;</p><p> Edge[8][6].value=uplimit , Edge[8][7].value=uplimit , Edge[8][8].value=0;</p><p> Edge[8][9].value=22, Edge[8][10].value=10;</p><p
61、> Edge[9][0].value=uplimit , Edge[9][1].value=16 , Edge[9][2].value=uplimit ;</p><p> Edge[9][3].value=uplimit, Edge[9][4].value=uplimit, Edge[9][5].value=14 ; </p><p> Edge[9
62、][6].value=30 , Edge[9][7].value=13 , Edge[9][8].value=22;</p><p> Edge[9][9].value=0, Edge[9][10].value=uplimit;</p><p> Edge[10][0].value=uplimit , Edge[10][1].value=u
63、plimit , Edge[10][2].value=uplimit;</p><p> Edge[10][3].value=uplimit, Edge[10][4].value=60; Edge[10][5].value=uplimit ; </p><p> Edge[10][6].value=uplimit , Edge[10][7].value=uplimit
64、 , Edge[10][8].value=10;</p><p> Edge[10][9].value=uplimit, Edge[10][10].value=0;</p><p><b> } </b></p><p><b> } </b></p><p><b>
65、 } </b></p><p> /* 找出場(chǎng)所間的最短距離--迪杰斯特拉算法 */ </p><p> void ShortestDist(int s){ </p><p> for ( int i=0;i<11;i++){ //dist和path數(shù)組初始化 </p>
66、<p> dist[i].value=Edge[s][i].value; //鄰接矩陣第s行元素賦值到dist中 </p><p> S[i].value=0; //已求出最短路徑的頂點(diǎn)集合初始化 </p><p> if(i!=s && dist[i].value<uplimit){ <
67、;/p><p> path[i].value=s; </p><p><b> } </b></p><p> else path[i].value=-1; //路徑存放數(shù)組初始化</p><p><b> } </b></p&g
68、t;<p> S[s].value=1; //頂點(diǎn)s加入頂點(diǎn)集合</p><p> dist[s].value=0; </p><p> /* 循環(huán)計(jì)算該場(chǎng)所
69、與鄰接場(chǎng)所之間的最短距離 */ </p><p> for (i=0;i<11-1;i++){ //從頂點(diǎn)s確定n-1條路徑 </p><p> float min=uplimit; </p><p> int u=s; </p><p> for (int j=0
70、;j<11;j++){ //選擇當(dāng)前不在集合S中具有最短路徑的頂點(diǎn)u </p><p> /* 如果有路徑比目前的最小值還小,則替換這個(gè)最小值 */ </p><p> if (!S[j].value && dist[j].value<min){ </p><p><b&g
71、t; u=j; </b></p><p> min=dist[j].value; </p><p><b> }</b></p><p><b> } </b></p><p> S[u].value=1;
72、 //將頂點(diǎn)u加入集合S,表示它已在最短路徑上 </p><p><b> } </b></p><p><b> } </b></p><p> void bh() //顯示場(chǎng)所名稱</p><p><b>
73、 {</b></p><p> printf("0.女生公寓 1.圖書(shū)館 2.體育館\n");</p><p> printf("3.五道門(mén) 4.一號(hào)教學(xué)樓 5.男生公寓\n");</p><p> printf("6.食堂
74、 7.體育場(chǎng) 8.一道門(mén)\n");</p><p> printf("9.十號(hào)教學(xué)樓 10.實(shí)驗(yàn)樓\n");</p><p><b> }</b></p><p> /*將頂點(diǎn)序列號(hào)轉(zhuǎn)換成場(chǎng)所名稱*/</p><p&
75、gt; void Outpath(int c) </p><p> { switch(c)</p><p><b> {</b></p><p> case 0: printf("女生公寓");break;</p><p> case 1: printf
76、("圖書(shū)館");break;</p><p> case 2: printf( "體育館");break;</p><p> case 3: printf("五道門(mén)");break;</p><p> case 4: printf("一號(hào)教學(xué)樓");break;</p>
77、<p> case 5: printf( "男生公寓");break;</p><p> case 6: printf("食堂");break;</p><p> case 7: printf("體育場(chǎng)");break;</p><p> case 8: printf("一道
78、門(mén)");break;</p><p> case 9: printf( "十號(hào)教學(xué)樓");break;</p><p> case 10:printf("實(shí)驗(yàn)樓");break;</p><p><b> }</b></p><p><b> }<
79、/b></p><p> /* 輸出兩個(gè)場(chǎng)所之間的最短距離,和最短路徑 */ </p><p> void getdata(int s,int e){ </p><p> D[0].value=e; </p><p> int k; </p><p> for (k=0;D
80、[k].value!=s;k++){ </p><p> D[k+1].value=path[D[k].value].value; </p><p><b> } </b></p><p> if(S[e].value){ </p><p> printf("\n\t場(chǎng)所%d,%d之間的
81、最短距離是:%d",s,e,dist[e].value); </p><p> cout<<"\n\t場(chǎng)所"<<s<<","<<e<<"之間的最短路徑是:"; </p><p> for(; k!=-1;k--){ </p><
82、;p> Outpath(D[k].value);</p><p> if (k!=0){ </p><p> cout<<" --> "; </p><p><b> } </b></p><p><b> } </b></
83、p><p><b> } </b></p><p><b> else </b></p><p> printf("\n\t場(chǎng)所%d到場(chǎng)所%d之間沒(méi)有路徑!",s,e); </p><p><b> } </b></p><
84、;p> void Begin(){ </p><p> int flag=1; </p><p><b> int s,e;</b></p><p> while ( flag ){ </p><p><b> bh();</b></p><p> pr
85、intf("\n\t請(qǐng)輸入起始場(chǎng)所號(hào)與目的場(chǎng)所號(hào):"); </p><p> scanf("%d%d",&s,&e); </p><p> if(s<11 && s>=0 && e<11 && e>=0){ </p><p>
86、; flag=0; </p><p><b> } </b></p><p><b> else </b></p><p> printf("\n場(chǎng)所號(hào)非法,請(qǐng)重新輸入!"); </p><p><b> }</b></p&g
87、t;<p> ShortestDist(s); </p><p> getdata(s,e); </p><p><b> }</b></p><p> /*顯示場(chǎng)所的具體信息*/</p><p> void info(int c) //c為場(chǎng)所對(duì)應(yīng)的數(shù)字號(hào)&
88、lt;/p><p><b> { </b></p><p><b> switch(c)</b></p><p><b> {</b></p><p><b> case 0:</b></p><p> printf(&qu
89、ot;\t 女生公寓,住宿條件較好。");</p><p><b> break;</b></p><p><b> case 1:</b></p><p> printf("\t 圖書(shū)館,內(nèi)部藏有豐富的書(shū)籍,供同學(xué)們學(xué)習(xí)參考,也可以自習(xí)。");</p><p>
90、<b> break;</b></p><p><b> case 2:</b></p><p> printf("\t 體育館,供同學(xué)們進(jìn)行體育活動(dòng)以及上體育課。");</p><p><b> break;</b></p><p><b&g
91、t; case 3:</b></p><p> printf("\t 校門(mén)。");</p><p><b> break;</b></p><p><b> case 4:</b></p><p> printf("\t 一號(hào)教學(xué)樓,供同學(xué)們上課和
92、自習(xí)使用。");</p><p><b> break;</b></p><p><b> case 5:</b></p><p> printf("\t 男生公寓,提供居住。");</p><p><b> break;</b></
93、p><p><b> case 6:</b></p><p> printf("\t 食堂,有兩層樓,是同學(xué)們用餐的地方。");</p><p><b> break;</b></p><p><b> case 7:</b></p>&l
94、t;p> printf("\t 體育場(chǎng),是同學(xué)們開(kāi)運(yùn)動(dòng)會(huì)和進(jìn)行體育賽事的地方。");</p><p><b> break;</b></p><p><b> case 8:</b></p><p> printf("\t 一道門(mén),晚上的時(shí)候這里最熱鬧。");</
95、p><p><b> break;</b></p><p><b> case 9:</b></p><p> printf("\t 十號(hào)教學(xué)樓,這棟樓供學(xué)習(xí)上課使用。");</p><p><b> break;</b></p><
96、p><b> case 10:</b></p><p> printf("\t 實(shí)驗(yàn)樓,是同學(xué)們計(jì)算機(jī)上機(jī),各系做實(shí)驗(yàn)的地方。");</p><p><b> break;</b></p><p><b> default:</b></p><p&
97、gt; printf("\t輸入不合法,請(qǐng)重新輸入!");</p><p><b> break;</b></p><p><b> } </b></p><p><b> }</b></p><p> void num(){</p>
98、<p> printf("****************************************\n");</p><p> printf("***** 校園導(dǎo)航系統(tǒng) *****\n");</p><p> printf("****************************
99、************\n");</p><p> printf(" 0.女生公寓\n");</p><p> printf(" 1.圖書(shū)館\n"); </p><p> printf(" 2.體育館\n");</p><p> pri
100、ntf(" 3.五道門(mén)\n"); </p><p> printf(" 4.一號(hào)教學(xué)樓\n"); </p><p> printf(" 5.男生公寓\n");</p><p> printf(" 6.食堂\n"); </p>
101、<p> printf(" 7.體育場(chǎng)\n"); </p><p> printf(" 8.一道門(mén)\n"); </p><p> printf(" 9.十號(hào)教學(xué)樓\n"); </p><p> pri
102、ntf(" 10.實(shí)驗(yàn)樓\n");</p><p><b> }</b></p><p> void main(){</p><p><b> int c;</b></p><p> char option; </p><p> printf
103、("*****************************************************\n");</p><p> printf("\t\t歡迎光臨中北大學(xué)\n");</p><p> printf("*****************************************************\n&
104、quot;);</p><p> printf("---------------------------\n"); </p><p> printf("1.顯示場(chǎng)所的編號(hào)\n");</p><p> printf("2.查看場(chǎng)所的具體信息\n");</p><p> prin
105、tf("3.找出最短路徑及計(jì)算路徑長(zhǎng)度\n"); </p><p> printf("4.退出\n"); </p><p> printf("---------------------------\n"); </p><p> printf("What do you want t
106、o do?請(qǐng)輸入選擇:\n");</p><p> cin>>option;</p><p> while (option!='0'){</p><p> switch(option)</p><p><b> {</b></p><p> case
107、 '1': </p><p><b> num();</b></p><p> printf("\t\t***************************************\n"); </p><p> printf("
108、;\t\t\t1.顯示場(chǎng)所的編號(hào)\n");</p><p> printf("\t\t\t2.查看場(chǎng)所的具體信息\n");</p><p> printf("\t\t\t3.找出最短路徑及計(jì)算路徑長(zhǎng)度\n"); </p><p> printf("\t\t\t4.退出\n"); &
109、lt;/p><p> printf("\t\t***************************************\n"); </p><p> printf("\tWhat do you want to do ?請(qǐng)輸入選擇:\n");</p><p> cin>>option;</p>
110、<p> system("cls"); //清屏</p><p><b> break;</b></p><p> case '2': //具體信息</p><p> pr
111、intf("\n\t請(qǐng)從0~10中選擇任意字母,查看所對(duì)應(yīng)場(chǎng)所的具體信息:\n");</p><p> printf("\t選擇11則退出\n");</p><p> bh(); //顯示所有場(chǎng)所</p><p><b> cin>>c;</b></p&g
112、t;<p><b> info(c);</b></p><p> if(c==11){</p><p> printf("\t\t***************************************\n"); </p><p> printf("\t\t\t1.顯示場(chǎng)所的編號(hào)\n&q
113、uot;);</p><p> printf("\t\t\t2.查看場(chǎng)所的具體信息\n");</p><p> printf("\t\t\t3.找出最短路徑及計(jì)算路徑長(zhǎng)度\n"); </p><p> printf("\t\t\t4.退出\n"); </p><p>
114、 printf("\t\t***************************************\n"); </p><p> printf("\tWhat do you want to do ?請(qǐng)輸入選擇:\n");</p><p><b> } </b></p><p><b&g
115、t; break;</b></p><p> case '3': //查詢</p><p> BuildMap();</p><p><b> Begin();</b></p><p> print
116、f("\n\t\t***************************************\n"); </p><p> printf("\t\t\t1.顯示場(chǎng)所的編號(hào)\n");</p><p> printf("\t\t\t2.查看場(chǎng)所的具體信息\n");</p><p> printf(&q
117、uot;\t\t\t3.找出最短路徑及計(jì)算路徑長(zhǎng)度\n"); </p><p> printf("\t\t\t4.退出\n"); </p><p> printf("\t\t***************************************\n"); </p><p> printf(&
118、quot;\tWhat do you want to do ?請(qǐng)輸入選擇:\n");</p><p> cin>>option; </p><p> system("cls");</p><p><b> break; </b></p><p> cas
119、e'4': //退出</p><p><b> exit(0);</b></p><p><b> break; </b></p><p><b> } </b>&l
120、t;/p><p><b> }</b></p><p><b> }</b></p><p> 五.課程設(shè)計(jì)心得及存在問(wèn)題</p><p> 通過(guò)本次課程設(shè)計(jì)的制作完成,初步了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,了解了軟件開(kāi)發(fā)的基本過(guò)程,其中包括需求分析,概要設(shè)計(jì),完善分析,程序的大體設(shè)計(jì),根據(jù)需
121、求編寫(xiě)源代碼,代碼編譯測(cè)試,最終完成程序包。在設(shè)計(jì)中通過(guò)查找圖書(shū)資料和網(wǎng)上資源完成求最短路徑的算法(迪杰斯特拉算法),從中對(duì)算法有了更深刻的理解,在程序中還涉及到圖的相關(guān)存儲(chǔ)方法,在此次設(shè)計(jì)中所使用的是鄰接矩陣的方式,完成了對(duì)校園有向圖的構(gòu)建,使用Edge[][].value對(duì)景點(diǎn)距離賦值。在初次運(yùn)行程序的時(shí)候,出現(xiàn)了很多錯(cuò)誤,在修改程序的過(guò)程的中,培養(yǎng)了嚴(yán)謹(jǐn)?shù)脑O(shè)計(jì)態(tài)度和科學(xué)的工作方法和作風(fēng)。本系統(tǒng)在開(kāi)發(fā)中也是嚴(yán)格按照學(xué)校的實(shí)際情況進(jìn)行
122、開(kāi)發(fā)的,在開(kāi)發(fā)中,查閱了很多相關(guān)的算法資料,鞏固了數(shù)據(jù)結(jié)構(gòu)、C語(yǔ)言和C++方面的知識(shí),同時(shí)也學(xué)習(xí)了新的算法知識(shí)。最重要的是在開(kāi)發(fā)過(guò)程中,通過(guò)不斷地學(xué)習(xí),不斷提高自己編程能力和實(shí)際應(yīng)用能力,還有助于改善自己的邏輯思維能力,這對(duì)自己以后對(duì)軟件的開(kāi)發(fā)提供很大的幫助。</p><p> 存在的問(wèn)題:程序中在輸出最短路徑時(shí),只能輸出兩個(gè)景點(diǎn)之間的最短距離值,而不能將實(shí)際的行走路線輸出,這一點(diǎn)沒(méi)有體現(xiàn)出要求中的界面友好與操
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)說(shuō)明書(shū)
- 課程設(shè)計(jì)說(shuō)明書(shū)
- 課程設(shè)計(jì)—校園供需系統(tǒng)分析設(shè)計(jì)說(shuō)明書(shū)
- 前門(mén)課程設(shè)計(jì)說(shuō)明書(shū)
- javaweb課程設(shè)計(jì)說(shuō)明書(shū)
- 后蓋課程設(shè)計(jì)說(shuō)明書(shū)
- 鍋爐課程設(shè)計(jì)說(shuō)明書(shū)
- 空調(diào)課程設(shè)計(jì)說(shuō)明書(shū)
- 蝸輪課程設(shè)計(jì)說(shuō)明書(shū)
- 采礦課程設(shè)計(jì)說(shuō)明書(shū)
- 機(jī)床課程設(shè)計(jì)說(shuō)明書(shū)
- caxa課程設(shè)計(jì)說(shuō)明書(shū)
- 化工課程設(shè)計(jì)說(shuō)明書(shū)
- vb課程設(shè)計(jì)說(shuō)明書(shū)
- 課程設(shè)計(jì)說(shuō)明書(shū).doc
- 課程設(shè)計(jì)說(shuō)明書(shū).doc
- 課程設(shè)計(jì)說(shuō)明書(shū).doc
- 課程設(shè)計(jì)說(shuō)明書(shū).doc
- 課程設(shè)計(jì)說(shuō)明書(shū).doc
- 課程設(shè)計(jì)說(shuō)明書(shū).doc
評(píng)論
0/150
提交評(píng)論