版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)論文</p><p> 題目: 迷宮 </p><p> 學(xué)院: 信息工程學(xué)院 </p><p> 專業(yè): 信息管理與信息系統(tǒng) </p><p>
2、 班級(jí): 信息管理與信息系統(tǒng)本(1)班 </p><p> 姓名: ******* </p><p> 學(xué)號(hào): </p><p> 指導(dǎo)教師: &
3、lt;/p><p> 設(shè)計(jì)時(shí)間: </p><p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p><b> 一、設(shè)計(jì)任務(wù)</b></p><p> 隨機(jī)生成一個(gè)迷宮圖,從迷宮中找尋出路,將迷宮的左上角作入口,右下角</
4、p><p> 作出口,尋找從入口點(diǎn)到出口點(diǎn)的一條通路,并將通路信息顯示出來。 </p><p><b> 設(shè)計(jì)要求</b></p><p><b> 基本要求:</b></p><p> 對(duì)系統(tǒng)進(jìn)行功能模塊分析、控制模塊分析;</p><p> 系統(tǒng)設(shè)計(jì)要完成題目所要求
5、的功能;</p><p> 編程簡(jiǎn)練、可用,盡可能的使系統(tǒng)的功能更加完善和全面;</p><p> 說明書、流程圖清晰、美觀。</p><p><b> 創(chuàng)新要求</b></p><p> 在基本要求達(dá)到后,可進(jìn)行創(chuàng)新設(shè)計(jì),如改善算法性能、友好的人機(jī)界面。</p><p><b>
6、; 設(shè)計(jì)期限</b></p><p> 設(shè)計(jì)進(jìn)度及完成情況表</p><p><b> 前言</b></p><p> 隨著科技的日益發(fā)展,在當(dāng)今知識(shí)爆炸的年代,計(jì)算機(jī)毫無(wú)疑問成為了人們?nèi)粘I钪胁豢苫蛉钡墓ぞ?,而在?jì)算機(jī)及其應(yīng)用的各個(gè)領(lǐng)域中,都會(huì)用到各種各樣的數(shù)據(jù)結(jié)構(gòu),學(xué)會(huì)分析研究計(jì)算機(jī)加工對(duì)象的特征,選擇合適的數(shù)據(jù)結(jié)構(gòu)和
7、存儲(chǔ)表示,以及編制相應(yīng)的實(shí)現(xiàn)算法,是學(xué)習(xí)計(jì)算機(jī)不可或缺的知識(shí)技能。</p><p> 數(shù)據(jù)結(jié)構(gòu)可以說是編程的靈魂,它不是一門語(yǔ)言所以沒有關(guān)鍵字。它只是給程序開發(fā)人員一個(gè)開發(fā)思路而已,講的主要是已經(jīng)成熟的編程思想和算法,而且?guī)缀踹m用于所有開發(fā)語(yǔ)言。就好像學(xué)習(xí)英語(yǔ)一樣,學(xué)習(xí)編程語(yǔ)言讓你會(huì)說英語(yǔ),記住很多英語(yǔ)單詞,熟悉英語(yǔ)的很多語(yǔ)法。而學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)能讓你你出很漂亮的英語(yǔ)文章。</p><p>
8、 當(dāng)然,在數(shù)據(jù)結(jié)構(gòu)中迷宮是一個(gè)非常經(jīng)典的問題,許多做課程設(shè)計(jì)的學(xué)生都可能選擇迷宮這一課題。解決迷宮有很多種方法,在我的設(shè)計(jì)中我采用的是遞歸法,本方法在數(shù)據(jù)結(jié)構(gòu)中運(yùn)用的還是比較多的,當(dāng)然還有回溯法運(yùn)用的也比較普遍。至于其他的方法一般就不常見了,因?yàn)樵趯W(xué)生熟悉和能夠運(yùn)用的方法中,這兩種方法是運(yùn)用廣泛的,在許多高校,老師提倡的和教導(dǎo)的最基本的也是這兩種方法。迷宮在數(shù)據(jù)結(jié)構(gòu)中是比較簡(jiǎn)單的,容易讓學(xué)生入門和對(duì)計(jì)算機(jī)產(chǎn)生興趣,更容易讓學(xué)生樹立起信
9、心。數(shù)據(jù)結(jié)構(gòu)是一種工具,在日常生活中運(yùn)用的比較多,學(xué)好數(shù)據(jù)結(jié)構(gòu)可以提高以后再計(jì)算機(jī)方面編程的能力和實(shí)踐能力。</p><p> 本論文包括五個(gè)章節(jié),包括需求分析、總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼與調(diào)試、總結(jié)。</p><p> 在整個(gè)課程設(shè)計(jì)的實(shí)踐中,我們小組成員團(tuán)結(jié)協(xié)作,共同交流,一起努力解決遇到的問題,學(xué)習(xí)到編寫和調(diào)試代碼要細(xì)心、耐心,才能最終完成整個(gè)課程設(shè)計(jì)。同時(shí),在實(shí)踐中,得到了老師許
10、多寶貴意見,其他同學(xué)也提出了許多有益的建議,謹(jǐn)此一并致以誠(chéng)摯的謝意。</p><p> 由于個(gè)人水平有限,論文中有些許不當(dāng)之處,望老師批評(píng)指正。</p><p><b> 目錄</b></p><p> 第1章 需求分析‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥4</p><p> 1.1性能需求與功能
11、需求‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥4</p><p> 1.2課題設(shè)計(jì)的目的與意義‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥4</p><p> 第2章 總體設(shè)計(jì)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥6</p><p> 2.1課題設(shè)計(jì)的總體思路‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥6</p><p> 2.2整個(gè)程序的流程
12、圖‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥7</p><p> 2.3 課題設(shè)計(jì)界面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥8</p><p> 第3章 詳細(xì)設(shè)計(jì)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥9</p><p> 3.1 main()主函數(shù)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥9</p><p> 3.2
13、Init ()初始化函數(shù) ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥9</p><p> 3.3 MapRand( )迷宮生成函數(shù) ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥9</p><p> 3.4 PrMap( )迷宮顯示函數(shù) ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥9</p><p> 3.5 FindWay( )系統(tǒng)自動(dòng)探索‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
14、10</p><p> 3.6 PeopleFind( )人工探索‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥10</p><p> 3.7 Result( )結(jié)果處理函數(shù)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥11</p><p> 3.8 Close()圖形關(guān)閉函數(shù)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥11</p><p> 第4章 編碼與調(diào)
15、試‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥12</p><p> 第5章 總結(jié)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥20</p><p> 附錄‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥21</p><p><b> 參考文獻(xiàn)</b></p><p><b>
16、第1章 需求分析</b></p><p> 1.1性能需求與功能需求</p><p> 性能需求:隨著社會(huì)經(jīng)濟(jì)和人們物質(zhì)生活的不斷提高,人們對(duì)精神生活的需求也越來越高,在現(xiàn)今社會(huì)里,人們對(duì)諸如智商、情商等的重視無(wú)疑反映了對(duì)精神生活的態(tài)度。當(dāng)然具體到我們每個(gè)人來說,想必大多數(shù)人小時(shí)候都玩過魔方、迷宮吧。作為這種智力游戲,人們是百玩不厭的。正是鑒于這種需求,本設(shè)計(jì)運(yùn)用計(jì)算機(jī)語(yǔ)言
17、及其算法,將人的意志賦予機(jī)器實(shí)現(xiàn),使人們不必在陷于枯燥的重復(fù)勞動(dòng),從而將更多的精力投入到未知領(lǐng)域的探索上。</p><p> 功能需求:本設(shè)計(jì)的關(guān)鍵在于將人的思想自動(dòng)化,有所編軟件的自動(dòng)的搜索可行路徑。因此,軟件必須擁有自動(dòng)搜索并記錄可行路徑的功能,除此之外,軟件還應(yīng)設(shè)置人機(jī)交互接口,以便能夠人為地建立迷宮圖;當(dāng)然對(duì)于迷宮問題還有很多需要考慮的地方,比如由用戶自己探索可行路徑,但由于本設(shè)計(jì)側(cè)重于迷宮的求解算法設(shè)
18、計(jì),并非以游戲的形式為初衷,一定有不全之處,望讀者見諒。</p><p> 1.2課題設(shè)計(jì)的目的與意義</p><p> 一般認(rèn)為,一個(gè)數(shù)據(jù)結(jié)構(gòu)是由數(shù)據(jù)元素依據(jù)某種邏輯聯(lián)系組織起來的。對(duì)數(shù)據(jù)元素間邏輯關(guān)系的描述稱為數(shù)據(jù)的邏輯結(jié)構(gòu);數(shù)據(jù)必須在計(jì)算機(jī)內(nèi)存儲(chǔ),數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)形式,是其在計(jì)算機(jī)內(nèi)的表示;此外討論一個(gè)數(shù)據(jù)結(jié)構(gòu)必須同時(shí)討論在該類數(shù)據(jù)上執(zhí)行的運(yùn)算才有意義。 </
19、p><p> 在許多類型的程序的設(shè)計(jì)中,數(shù)據(jù)結(jié)構(gòu)的選擇是一個(gè)基本的設(shè)計(jì)考慮因素。許多大型系統(tǒng)的構(gòu)造經(jīng)驗(yàn)表明,系統(tǒng)實(shí)現(xiàn)的困難程度和系統(tǒng)構(gòu)造的質(zhì)量都嚴(yán)重的依賴于是否選擇了最優(yōu)的數(shù)據(jù)結(jié)構(gòu)。許多時(shí)候,確定了數(shù)據(jù)結(jié)構(gòu)后,算法就容易得到了。有些</p><p> 時(shí)候事情也會(huì)反過來,我們根據(jù)特定算法來選擇數(shù)據(jù)結(jié)構(gòu)與之適應(yīng)。不論哪種情況,選擇合適的數(shù)據(jù)結(jié)構(gòu)都是非常重要的。而進(jìn)行課程設(shè)計(jì)實(shí)踐操作能夠使我們
20、更好地鞏固課本知識(shí),對(duì)課本知識(shí)有更深一步的了解,了解迷宮求解相關(guān)方面的知識(shí),能小組合作完成較為簡(jiǎn)單的程序的設(shè)計(jì)并獨(dú)立完成課程設(shè)計(jì)的論文,通過課程設(shè)計(jì),達(dá)到增強(qiáng)鞏固數(shù)據(jù)結(jié)構(gòu)知識(shí)的目的,使知識(shí)更加全面化,系統(tǒng)化。</p><p> 選擇了數(shù)據(jù)結(jié)構(gòu),算法也隨之確定,是數(shù)據(jù)而不是算法是系統(tǒng)構(gòu)造的關(guān)鍵因素。這種看法導(dǎo)致了許多種軟件設(shè)計(jì)方法和程序設(shè)計(jì)語(yǔ)言的出現(xiàn),面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言就是其中之一。</p>&
21、lt;p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)課程的一個(gè)重要的環(huán)節(jié),能鞏固和加深課堂教學(xué)中所學(xué)習(xí)到的內(nèi)容,提高學(xué)生學(xué)習(xí)的實(shí)踐和實(shí)際工作能力,為以后的學(xué)習(xí)奠定好的基礎(chǔ)和學(xué)習(xí)態(tài)度及方法。通過課程設(shè)計(jì),使學(xué)生加強(qiáng)團(tuán)隊(duì)合作的意識(shí),并且能夠綜合運(yùn)用課本知識(shí)來解決實(shí)際問題,加強(qiáng)分析問題、解決問題和動(dòng)手的能力。</p><p><b> 第2章 總體設(shè)計(jì)</b></p><p&g
22、t; 2.1課題設(shè)計(jì)的總體思路</p><p> 程序的設(shè)計(jì),首先要考慮迷宮的表示,這是一個(gè)二維關(guān)系圖,典型的存儲(chǔ)方式是選擇二維數(shù)組,數(shù)據(jù)元素的值只有兩種狀態(tài),所以取值為0或1,其中0表示通路,1表示墻壁即此路不通,這里將二維數(shù)組取名為map,將最外面一圈設(shè)為墻壁,作為一個(gè)封閉圖形,只留下入口點(diǎn)和出口點(diǎn)為通路。</p><p> 圖形的顯示就可以根據(jù)數(shù)組元素的值來確定,如果是人工探索
23、,則根據(jù)按鍵來確定探索物的位置坐標(biāo),利用循環(huán)語(yǔ)句即可實(shí)現(xiàn);如果是人工探索,則根據(jù)按鍵來確定探索物的位置坐標(biāo),利用循環(huán)語(yǔ)句即可實(shí)現(xiàn);如果是系統(tǒng)自動(dòng)檢索,并在8個(gè)方向檢索,則問題相對(duì)復(fù)雜,采用遞歸的方法實(shí)現(xiàn)。 </p><p> ?。?) 迷宮—作為線性結(jié)構(gòu)的典型應(yīng)用,大多數(shù)是用遞歸方法實(shí)現(xiàn),用0代表通路,1代表此路不通。本程序采用了一個(gè)美觀逼真的迷宮圖,而且是隨機(jī)生成的,迷宮的大小為N*N,N預(yù)定義為常數(shù),修
24、改N的數(shù)值,可以改變迷宮的大小(只要不超過屏幕顯示范圍),用白色表示可走的路,藍(lán)色表示此路不可以通過,并畫出整個(gè)程序的流程圖,讓整個(gè)程序的設(shè)計(jì)思路一目了然。</p><p> ?。?) 若設(shè)定的迷宮存在通路,如果采用的是系統(tǒng)自動(dòng)探索的運(yùn)行方式,則會(huì)顯示出所走過的路徑;如果采用的是人工探索方式,沒有記錄所走過的路徑,只顯示找的通路信息;</p><p> (5) 程序執(zhí)行的命令
25、為:生成迷宮、求解迷宮、輸出迷宮的解。</p><p> 2.2整個(gè)程序的流程圖</p><p> 圖2-1 整個(gè)程序的流程圖</p><p> 2.3 課題設(shè)計(jì)界面</p><p> 圖2-2 人工探索通路圖</p><p> 系統(tǒng)運(yùn)行首先出現(xiàn)提示字符串“please select hand(1)else
26、 auto”,詢問是選擇人工</p><p> 探索還是系統(tǒng)自動(dòng)探索,當(dāng)用戶出現(xiàn)字符1按回車鍵后出現(xiàn)一個(gè)迷宮圖,紅色矩形塊(表示探索物)出現(xiàn)在左上角,這是可以按代表8個(gè)方向的字符選擇通路,遇到墻壁不能通行,按回車鍵結(jié)束探索,如果這是探索物移動(dòng)到右下角出口,則顯示找到通路信息,否則顯示沒有找到通路信息,在提示信息后,如果輸入的字符不是1 ,則系統(tǒng)自動(dòng)查找通路,如果沒有找到通路,則顯示沒有找到通路信息,如果找到通路
27、,則用紅色標(biāo)記走過的路徑</p><p><b> 第3章 詳細(xì)設(shè)計(jì)</b></p><p> 3.1 main()主函數(shù)</p><p> 首先,確定是進(jìn)行人工探索還是系統(tǒng)自動(dòng)探索,通過輸入字符來選定,選定之后調(diào)用圖形初始化函數(shù),緊接著調(diào)用迷宮生成函數(shù)及迷宮顯示函數(shù),然后根據(jù)輸入的字符調(diào)用人工探索函數(shù)或自動(dòng)探索函數(shù)。探索完畢進(jìn)行處理,
28、最后關(guān)閉圖形系統(tǒng),程序結(jié)束。</p><p> if(ch=='1')</p><p> PeopleFind(map);//人工搜索</p><p><b> else</b></p><p> FindWay(map,1,1);//系統(tǒng)自動(dòng)從下標(biāo)1,1的地方開始搜索</p>&l
29、t;p> Init()初始化函數(shù)</p><p> 由于迷宮圖是在圖形方式顯示的,所以要進(jìn)行圖形初始化工作。</p><p> MapRand()迷宮生成函數(shù)</p><p> 用數(shù)組map表示一個(gè)迷宮,要隨機(jī)生成迷宮,數(shù)組元素的值利用隨機(jī)函數(shù)生成0或1的數(shù)。將最外面一圈設(shè)為墻壁即不可通過,作為一個(gè)封閉圖形,只留下入口點(diǎn)和出口點(diǎn)為通路。</p&g
30、t;<p> for(i=0;i<N;i++)</p><p><b> {</b></p><p> for(j=0;j<N;j++)</p><p><b> {</b></p><p> if(i==0||i==N-1||j==0||j==N-1)//最外面
31、一圈為墻壁</p><p> map[1][j]=1;</p><p><b> else</b></p><p> if(i==1&&j==1||i==N-2||&&j==N-2)//出發(fā)點(diǎn)與終點(diǎn)表示為可走的</p><p> map[i][j]=0;</p>&l
32、t;p><b> else</b></p><p> map[i][j]=random(2);//其他的隨機(jī)生成0或1</p><p><b> }</b></p><p><b> }</b></p><p> PrMap()迷宮顯示函數(shù)</p>
33、<p> 根據(jù)數(shù)組map的值輸出迷宮圖,利用函數(shù)setfillstyle()設(shè)置圖形實(shí)體填充樣式,bar()函數(shù)輸出矩形塊,每個(gè)塊的大小為12*12單位,塊與塊間距為3,如果數(shù)組元素值為0,則填充為白色,值為1顯示填充為藍(lán)色,一個(gè)數(shù)組元素對(duì)應(yīng)一個(gè)矩形塊。數(shù)組元素的下標(biāo)為矩形塊的中心坐標(biāo),利用兩重循環(huán)語(yǔ)句可以完成迷宮圖的顯示。</p><p> FindWay()系統(tǒng)自動(dòng)探索</p>
34、<p> 從下標(biāo)(1,1)開始探索,依次按照右下、下、右、上、右上、左下、、左、左上的順序前進(jìn),若該方向上的值為0,則前進(jìn)一步,然后作相應(yīng)的標(biāo)記,表示該探索物在某一方向探索過,而在另一個(gè)方向上探索,若8個(gè)方向均已探索過,則不能再前進(jìn),需要沿著原來的路徑回溯一步,然后重復(fù)上述過程直到出口。</p><p> 判斷8個(gè)方向的順序前三個(gè)是判斷右下、下、右、這樣的話可以以最短的路徑找到迷宮出口。</p
35、><p> 因?yàn)橐厮荩詫?shí)現(xiàn)的方法可以有兩種;一種是非遞歸型方法,設(shè)置一個(gè)堆棧,記錄所有走過的路徑,前進(jìn)時(shí)入棧,回溯時(shí)可以出棧;另一種是遞歸方法,不必設(shè)堆棧,但遞歸的方法其實(shí)就是棧的應(yīng)用,只不過棧由系統(tǒng)安排,對(duì)用戶是不可見的。本程序采用了后者實(shí)現(xiàn)。</p><p> 在遞歸過程中凡是已經(jīng)走過的路,做標(biāo)記為1,防止來回徘徊而最終無(wú)法找到出口。由于走過的路數(shù)組元素要改變?yōu)?,為了8個(gè)方向的
36、遞歸和回溯,所以做了一個(gè)函數(shù)WayCopy()把舊迷宮數(shù)組拷貝到新迷宮數(shù)組。同時(shí)設(shè)計(jì)一個(gè)全局變量yes,如果到了出口,yes賦值為1 ,探索結(jié)束。為了顯示所走過的路徑,把具體的路線保存在二維數(shù)組way中。Way[n][0]代表所走路徑的行下標(biāo),way[n][1]代表所走路徑的列下標(biāo),其中的n代表走的步數(shù),根據(jù)way數(shù)組將走過的路徑用紅色顯示。</p><p> PeopleFind()人工探索</p>
37、;<p> 首先輸出迷宮圖以及人工控制操作圖示。紅色探索物出現(xiàn)在左上角,采用人工控制8個(gè)方向的移動(dòng),由于8個(gè)方向,用光標(biāo)鍵只能控制4個(gè)方向,為了統(tǒng)一,采用了臨近的8個(gè)字符q、w、e、a、d、z、x、c代表8個(gè)方向,按了字符后,對(duì)應(yīng)方向不是墻壁,可以將紅色探索無(wú)移動(dòng)到相應(yīng)位置,按回車鍵表示人工操作,如果此時(shí)map數(shù)組元素的坐標(biāo)是目標(biāo)出口,則yes賦值為1,表示探索成功,否則賦值為0。</p><p>
38、; 由于探索物在不停地移動(dòng),要在新位置顯示,并將走過的路恢復(fù)為白色通路,可以調(diào)用函數(shù)DrawPeople(&x,&y,n)完成,參數(shù)x和y代表所走過的行坐標(biāo)和列坐標(biāo),n代表所選的方向,根據(jù)n的值將x和y進(jìn)行相應(yīng)的變化。</p><p> void PeopleFind(int (*map)[N])</p><p><b> {</b></p
39、><p><b> int x,y;</b></p><p> char c=0;//接收按鍵的變量</p><p> x=y=1;//人工查找的初始位置</p><p> setcolor(11);//設(shè)置當(dāng)前畫線顏色</p><p> line(500,200,550,200);//從當(dāng)
40、前點(diǎn)開始用增量(x,y)畫一直線(int x1,int y1,int x2,int y2)</p><p> outtextxy(570,197,"d");//繪制并填充一個(gè)扇形(int x,int y,char far*textstring)</p><p> Result()結(jié)果處理函數(shù)</p><p> 因?yàn)椴捎昧藘煞N探索方式,但最終
41、結(jié)果是找到和沒找到兩種情況,所以在程序中設(shè)計(jì)了全局變量yes,根據(jù)yes的值進(jìn)行處理,如果yes為0調(diào)用函數(shù)NotFind(),顯示沒找到通路信息,否則調(diào)用函數(shù)Find()。如果是系統(tǒng)自動(dòng)探索,F(xiàn)ind()會(huì)顯示出所走過的路徑,如果是人工探索,沒有記錄所走過的路徑,只顯示找到通路信息。</p><p> if(yes)//如果找到</p><p><b> Find();&l
42、t;/b></p><p> else//沒找到路</p><p> NotFind();</p><p> Close()圖形關(guān)閉函數(shù)</p><p> 調(diào)用函數(shù)closegraph()關(guān)閉圖形函數(shù)系統(tǒng),程序結(jié)束。</p><p><b> 第4章 編碼與調(diào)試</b></p
43、><p> #include<graphics.h>//圖形函數(shù)</p><p> #include<stdlib.h>//其它函數(shù)</p><p> #include<stdio.h>//此行為文件包含,告訴系統(tǒng)必須包含文件stdio.h,此文件為輸入和輸出提供支持。</p><p> #includ
44、e<conio.h>//字符屏幕操作函數(shù)</p><p> #include<dos.h>//接口函數(shù)</p><p> #define N 20 //迷宮的大小可以改變</p><p> int oldmap[N][N];//遞歸用的數(shù)組,用全局變量節(jié)約時(shí)間</p><p> int yes=0;//yes是
45、判斷是否找到路的標(biāo)志,1找到,0沒找到</p><p> int way[100][2],wayn=0;//way數(shù)組是顯示路線用的,wayn是統(tǒng)計(jì)走了幾個(gè)格子</p><p> void Init(void);//圖形初始化</p><p> void Close(void);//圖形關(guān)閉</p><p> void DrawPeo
46、ple(int *x,int *y,int n);//畫人工探索物圖</p><p> void PeopleFind(int (*x)[N]);//人工探索</p><p> void WayCopy(int (*x)[N],int(*y)[N]);//為了8個(gè)方向的遞歸,把舊迷宮圖拷貝給新數(shù)組</p><p> int FindWay(int (*x)[
47、N],int i,int j);//自動(dòng)搜索函數(shù)</p><p> void MapRand(int (*x)[N]);//隨機(jī)生成迷宮函數(shù)</p><p> void PrMap(int (*x)[N]);//輸出迷宮圖函數(shù)</p><p> void Result(void);//輸出結(jié)果處理</p><p> void Find
48、(void);//成功處理</p><p> void NotFind(void);//失敗處理</p><p><b> //主函數(shù)</b></p><p> void main(void)</p><p><b> {</b></p><p> int map[
49、N][N];//迷宮數(shù)組</p><p><b> char ch;</b></p><p> clrscr();//清除正文模式窗口</p><p> printf("\n please select hand(1) else auto\n");//選擇搜索方式</p><p> scanf
50、("%c",&ch);</p><p> Init();//圖形初始化</p><p> MapRand(map);//生成迷宮</p><p> PrMap(map);//顯示迷宮圖</p><p> if(ch=='1')</p><p> PeopleFind
51、(map);//人工搜索</p><p><b> else</b></p><p> FindWay(map,1,1);//系統(tǒng)自動(dòng)從下標(biāo)1,1的地方開始搜索</p><p> Result();//輸出結(jié)果</p><p><b> Close();</b></p><
52、;p><b> }</b></p><p><b> //圖形初始化</b></p><p> void Init(void)</p><p><b> {</b></p><p> int gd=DETECT,gm;</p><p>
53、 initgraph(&gd,&gm,"c:\\tc");</p><p><b> }</b></p><p><b> //畫人工控制圖</b></p><p> void DrawPeople(int *x,int *y,int n)</p><p>
54、<b> {</b></p><p> //如果將以下兩句注釋掉,則顯示人工走過的路徑</p><p> setfillstyle(SOLID_FILL,WHITE);//設(shè)置白色實(shí)體填充樣式(int patttern,int color)</p><p> bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)
55、*15+6,50+(*x)*15+6);//畫一個(gè)二維條形圖(int left,int top,int rigth,int bottom)</p><p><b> //恢復(fù)原通路</b></p><p> switch(n)//判斷x和y的變化,8個(gè)方向的變化</p><p><b> {</b></p>
56、;<p> case 1:(*x)--;break;//上</p><p> case 2:(*x)--;(*y)++;break;//右上</p><p> case 3:(*y)++;break;//右</p><p> case 4:(*x)++;(*y)++;break;//右下</p><p> case 5
57、:(*x)++;break;//下</p><p> case 6:(*x)++;(*y)--;break;//左下</p><p> case 7:(*y)--;break;//左</p><p> case 8:(*x)--;(*y)--;break;//左上</p><p><b> }</b></p
58、><p> setfillstyle(SOLID_FILE,RED);//新位置顯示探索物</p><p> bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);</p><p><b> }</b></p><p><b> //人工手動(dòng)查
59、找</b></p><p> void PeopleFind(int (*map)[N])</p><p><b> {</b></p><p><b> int x,y;</b></p><p> char c=0;//接收按鍵的變量</p><p>
60、 x=y=1;//人工查找的初始位置</p><p> setcolor(11);//設(shè)置當(dāng)前畫線顏色</p><p> line(500,200,550,200);//從當(dāng)前點(diǎn)開始用增量(x,y)畫一直線(int x1,int y1,int x2,int y2)</p><p> outtextxy(570,197,"d");//繪制并填
61、充一個(gè)扇形(int x,int y,char far*textstring)</p><p> line(500,200,450,200);</p><p> outtextxy(430,197,"a");</p><p> line(500,200,500,150);</p><p> outtextxy(497
62、,130,"w");</p><p> line(500,200,500,250);</p><p> outtextxy(497,270,"x");</p><p> line(500,200,450,150);</p><p> outtextxy(445,130,"q"
63、;);</p><p> line(500,200,550,150);</p><p> outtextxy(550,130,"e");</p><p> line(500,200,450,250);</p><p> outtextxy(445,270,"z");</p><
64、;p> line(500,200,550,250);</p><p> outtextxy(550,270,"c")//以上是畫8個(gè)方向的控制介紹</p><p> setcolor(YELLOW);//設(shè)置當(dāng)前畫線顏色(int color)</p><p> outtextxy(420,290,"Press 'E
65、nter' to end");//按回車鍵結(jié)束</p><p> setfillstyle(SOLID_FILL,RED);//設(shè)置填充模式和顏色</p><p> bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);//入口位置顯示</p><p> while(c!=13)//如果按下的不是回車鍵
66、</p><p><b> {</b></p><p> c=getch();//接收字符后開始各個(gè)方向的探索</p><p> if(c=='w'&&map[x-1][y]!=1)</p><p> DrawPeople(&x,&y,1);//上</p>
67、;<p><b> else</b></p><p> if(c=='e'&&map[x-1][y+1]!=1)</p><p> DrawPeople(&x,&y,2);//右上</p><p><b> else</b></p><
68、;p> if(c=='d'&&map[x][y+1]!=1)</p><p> DrawPeople(&x,&y,3);//右</p><p><b> else</b></p><p> if(c=='c'&&map[x+1][y+1]!=1)<
69、;/p><p> DrawPeople(&x,&y,4);//右下</p><p><b> else</b></p><p> if(c=='x'&&map[x+1][y]!=1)</p><p> DrawPeople(&x,&y,5);//下<
70、;/p><p><b> else</b></p><p> if(c=='z'&&map[x+1][y-1]!=1)</p><p> DrawPeople(&x,&y,6);//左下</p><p><b> else</b></p>
71、;<p> if(c=='a'&&map[x][y-1]!=1)</p><p> DrawPeople(&x,&y,7);//左</p><p><b> else</b></p><p> if(c=='q'&&map[x-][y-1]!=
72、1)</p><p> DrawPeople(&x,&y,8);//左上</p><p><b> }</b></p><p> setfillstyle(SOLID_FILL,WHITE);//消去紅色探索物,恢復(fù)原迷宮圖</p><p> bar(100+y*15-6,50+x*15-6,10
73、0+y*15+6,50+x*15+6);</p><p> if(x==N-2&&y==N-2)//人工控制找成功的話</p><p> yes=1;//如果成功標(biāo)志為1</p><p><b> }</b></p><p><b> //拷貝迷宮數(shù)組</b></p&g
74、t;<p> void WayCopy(int(*oldmap)[N],int(*map)[N])</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=0;i<N;i++)</p><p> for(j
75、=0;j<N;j++)</p><p> oldmap([i][j]=map[i][j];</p><p><b> }</b></p><p><b> //遞歸找路</b></p><p> int FindWay(int (*map)[N],int i,int j)</p&
76、gt;<p><b> {</b></p><p> if(i==N-2&&j==N-2)//走到路口</p><p><b> {</b></p><p> yes=1;//標(biāo)志為1,表示成功</p><p><b> return;</b&
77、gt;</p><p><b> }</b></p><p> map[i][j]=1;//走過的地方變?yōu)?</p><p> WayCopy(oldmap,map);//拷貝迷宮圖</p><p> if(oldmap[i+1][j+1]==0&&!yes)//判斷右下方是否可走</p&g
78、t;<p><b> {</b></p><p> FindWay(oldmap,i+1,j+1);</p><p> if(yes)//如果到達(dá)出口了,再把值賦給顯示路線的way數(shù)組,也正是這個(gè)原因,所以具體路線是從最后開始保存</p><p><b> {</b></p><p
79、> way[wayn][0]=i;</p><p> way[wayn++][1]=j</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> Wa
80、yCopy(oldmap,map);</p><p> if(oldmap[i+1][j]==0&&!yes)//判斷下方是否可以走,如果標(biāo)志yes已經(jīng)是1,則不用找下去了</p><p><b> {</b></p><p> FindWay(oldmap,i+1,j);</p><p><
81、b> if(yes)</b></p><p><b> {</b></p><p> way[wayn][0]=i;</p><p> way[wayn++][1]=j;</p><p><b> return;</b></p><p><b
82、> }</b></p><p><b> }</b></p><p> WayCopy(oldmap,map);</p><p> if(oldmap[i][j+1]==0&&!yes)//判斷右方是否可以走</p><p><b> {</b></
83、p><p> FindWay(oldmap,i,j+1);</p><p><b> if(yes)</b></p><p><b> {</b></p><p> way[wayn][0]=i;</p><p> way[wayn++][1]=j;</p>
84、<p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> WayCopy(oldmap,map);</p><p> if(oldmap[i-1][j]==0&&
85、;!yes)//判斷上方是否可以走</p><p><b> {</b></p><p> FindWay(oldmap,i-1,j);</p><p><b> if(yes)</b></p><p><b> {</b></p><p>
86、way[wayn][0]=i;</p><p> way[wayn++][1]=j;</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> WayCopy
87、(oldmap,map);</p><p> if(oldmap[i-1][j+1]==0&&!yes)//判斷右上方是否可以走</p><p><b> {</b></p><p> FindWay(oldmap,i-1,j+1);</p><p><b> if(yes)</b
88、></p><p><b> {</b></p><p> way[wayn][0]=i;</p><p> way[wayn++][1]=j;</p><p><b> return;</b></p><p><b> }</b><
89、;/p><p><b> }</b></p><p> WayCopy(oldmap,map);</p><p> if(oldmap[i+1][j-1]==0&&!yes)//判斷左下方是否可走</p><p><b> {</b></p><p>
90、FindWay(oldmap,i+1,j-1);</p><p><b> if(yes)</b></p><p><b> {</b></p><p> way[wayn][0]=i;</p><p> way[wayn++][1]=j;</p><p><b
91、> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> WayCopy(oldmap,map);</p><p> if(oldmap[i][j-1]==0&&!yes)//判斷左方是否可走
92、</p><p><b> {</b></p><p> FindWay(oldmap,i,j-1);</p><p><b> if(yes)</b></p><p><b> {</b></p><p> way[wayn][0]=i;&l
93、t;/p><p> way[wayn++][1]=j;</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> WayCopy(oldmap,map);<
94、/p><p> if(oldmap[i-1][j-1]==0&&!yes)//判斷左上方是否可走</p><p><b> {</b></p><p> FindWay(oldmap,i-1,j-1);</p><p><b> if(yes)</b></p>&l
95、t;p><b> {</b></p><p> way[wayn][0]=i;</p><p> way[wayn++][1]=j;</p><p><b> return;</b></p><p><b> }</b></p><p>
96、<b> }</b></p><p><b> return;</b></p><p><b> }</b></p><p> //開始的隨機(jī)迷宮圖</p><p> void MapRand(int (*map)[N])</p><p>&l
97、t;b> {</b></p><p><b> int i,j;</b></p><p> cleardevice();//清除圖形屏幕</p><p> randomize();//隨機(jī)數(shù)發(fā)生器</p><p> for(i=0;i<N;i++)</p><p>
98、;<b> {</b></p><p> for(j=0;j<N;j++)</p><p><b> {</b></p><p> if(i==0||i==N-1||j==0||j==N-1)//最外面一圈為墻壁</p><p> map[1][j]=1;</p>&l
99、t;p><b> else</b></p><p> if(i==1&&j==1||i==N-2||&&j==N-2)//出發(fā)點(diǎn)與終點(diǎn)表示為可走的</p><p> map[i][j]=0;</p><p><b> else</b></p><p>
100、 map[i][j]=random(2);//其他的隨機(jī)生成0或1</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //輸出迷宮圖</b></p>
101、;<p> void PrMap(int (*map)[N])</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=0;i<N;i++)</p><p> for(j=0;j<N;j++)<
102、/p><p> if(map[i][j]==0)</p><p><b> {</b></p><p> setfillstyle(SOLID_FILL,WHITE);//白色為可走的路</p><p> bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);</p>
103、;<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> setfillstyle(SOLID_FILL,BLUE);//藍(lán)色為墻壁</p><p> bar(100+j*15-6
104、,50+i*15-6,100+j*15+6,50+i*15+6);</p><p><b> }</b></p><p><b> }</b></p><p><b> //找到通路</b></p><p> void Find(void)</p><
105、;p><b> {</b></p><p><b> int i;</b></p><p> setfillstyle(SOLID_FILL,RED);//紅色輸出走的具體路線</p><p><b> wayn--;</b></p><p> for(i=wa
106、yn;i>=0;i--)</p><p><b> {</b></p><p> bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+way[i][1]*15+6,50+way[i][0]*15+6);</p><p> sleep(1);//控制時(shí)間顯示</p><p>
107、;<b> }</b></p><p> bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6);//在目標(biāo)點(diǎn)標(biāo)紅色</p><p> setcolor(GREEN);</p><p> settextstyle(0,0,2);//設(shè)置字體大小</p>
108、<p> outtextxy(130,400,"Find a way!");</p><p><b> }</b></p><p><b> //沒找到通路</b></p><p> void NotFind(void)</p><p><b> {
109、</b></p><p> setcolor(GREEN);</p><p> settextstyle(0,0,2);//設(shè)置字體大小</p><p> outtextxy(130,400,"Not find a way!"); </p><p><b> }</b></p
110、><p><b> //結(jié)果處理</b></p><p> void Result(void)</p><p><b> {</b></p><p> if(yes)//如果找到</p><p><b> Find();</b></p>
111、<p> else//沒找到路</p><p> NotFind();</p><p><b> getch();</b></p><p><b> }</b></p><p><b> //圖形關(guān)閉</b></p><p>
112、void Close(void)</p><p><b> {</b></p><p> closegraph();</p><p><b> }</b></p><p><b> 第5章 總結(jié)</b></p><p> 通過上機(jī)實(shí)踐學(xué)習(xí),使我
113、對(duì)c語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)有了更近一步的認(rèn)識(shí)和了解,要想學(xué)好計(jì)算機(jī),重在實(shí)踐,要通過不斷的上機(jī)操作才能更好地學(xué)習(xí)它。通過實(shí)踐,發(fā)現(xiàn)自己有很多不足的地方,首先,自己的c語(yǔ)言的功底不行,有很大的提升空間,對(duì)c語(yǔ)言的一些標(biāo)準(zhǔn)庫(kù)函數(shù)不太了解,通過這段時(shí)間的學(xué)習(xí),較之之前,有所提高;再者,自己在指法上還不行,通過學(xué)習(xí)也有所改進(jìn),以后會(huì)繼續(xù)努力。</p><p> 隨著信息量越來越大的現(xiàn)在,如何有效地存儲(chǔ)數(shù)據(jù)也是件很有意義的事情,
114、數(shù)據(jù)結(jié)構(gòu)就能在這方面發(fā)揮很大的作用。通過這次數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)更加增進(jìn)了我和小組之間的感情,增強(qiáng)了團(tuán)隊(duì)合作意識(shí),也讓彼此了解到了在此方面的不足,讓我們?cè)谝院蟮纳顚W(xué)習(xí)中相互督促和交流經(jīng)驗(yàn)。</p><p> 數(shù)據(jù)結(jié)構(gòu)是一門很重要的科學(xué),在很多領(lǐng)域都發(fā)揮著舉足輕重的作用,學(xué)好數(shù)據(jù)結(jié)構(gòu)是身為一名學(xué)習(xí)計(jì)算機(jī)的學(xué)生必須要做的事,在以后的學(xué)習(xí)中我會(huì)更加的關(guān)注和了解其中的精妙。當(dāng)然,數(shù)據(jù)結(jié)構(gòu)是一門很復(fù)雜的學(xué)科,包涵著很多很深
115、層次的東西,不僅僅是數(shù)據(jù)結(jié)構(gòu)的相關(guān)算法,更是一種思想和思維方式,這不是一時(shí)半會(huì)就能學(xué)好的,我們只能通過不斷的實(shí)踐,不斷的探索,不斷地穩(wěn)固所學(xué)的知識(shí)才能有更好的發(fā)展。</p><p><b> 附錄</b></p><p><b> 參考文獻(xiàn)</b></p><p> 【1】唐策善 李龍 黃劉生 《數(shù)據(jù)結(jié)構(gòu)-用C語(yǔ)言描
116、述》 高等教育出版社 1995年4月第1版</p><p> 【2】李明 主編 李剛健 宣善立 副主編 《C語(yǔ)言程序設(shè)計(jì)教程》 上海交通大學(xué)出版社 2008年1月第1版</p><p> 【3】郭翠英 等編著 《C語(yǔ)言程序設(shè)計(jì)案例精編》 中國(guó)水利水電出版社 2004年3月第1版</p><p> 【4】劉瑞新 汪遠(yuǎn)征 《Visul Bas
117、ic程序設(shè)計(jì)教程》 機(jī)械工業(yè)出版社 2002</p><p> 【5】譚浩強(qiáng) 《Visul Basic程序設(shè)計(jì)案例教程》 清華大學(xué)出版社 2008</p><p> 【6】管麗娜 白海波 《實(shí)用Visul Basic 6教程》 清華大學(xué)出版社 2001</p><p> 【7】段興 《Visul Basic數(shù)據(jù)庫(kù)實(shí)用程序設(shè)計(jì)100例》 人民郵電出版
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)僅提供信息存儲(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ù)結(jié)構(gòu)迷宮課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---迷宮
- 迷宮問題——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(迷宮問題)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮求解
- 迷宮游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-走迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)迷宮問題課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)—迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)迷宮問題課程設(shè)計(jì)報(bào)告
- 迷宮求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論