版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 課程名稱: 高級語言課程設(shè)計(jì) </p><p> 課程代碼: </p><p> 設(shè)計(jì)內(nèi)容: 漢諾塔演示系統(tǒng) </p><p> 二0一二 年 12 月21日</p><
2、;p> 目 錄</p><p> 1.課程設(shè)計(jì)目的3</p><p> 1.1了解漢諾塔的基本原理3</p><p> 2.課程設(shè)計(jì)題目描述和要求3</p><p> 2.1課程設(shè)計(jì)題目3</p><p> 2.2課程設(shè)計(jì)要求3</p><p>
3、3.課程設(shè)計(jì)報(bào)告內(nèi)容4</p><p><b> 3.1程序原理4</b></p><p><b> 3.2程序內(nèi)容5</b></p><p><b> 3.3算法設(shè)計(jì)7</b></p><p><b> 3.4程序調(diào)試7</b><
4、/p><p><b> 4.總結(jié)8</b></p><p><b> 一、課程設(shè)計(jì)目的</b></p><p> 1.1了解漢諾塔基本原理</p><p> 1、通過本實(shí)驗(yàn),掌握復(fù)雜性問題的分析方法,了解漢諾塔游戲的時(shí)間復(fù)雜性和空間復(fù)雜性。</p><p> 2、通過
5、本實(shí)驗(yàn),學(xué)習(xí)和了解mfc環(huán)境的應(yīng)用。</p><p> 3、通過本實(shí)驗(yàn),對遞歸算法及進(jìn)棧出棧操作進(jìn)一步了解和應(yīng)用。</p><p> 4、通過本實(shí)驗(yàn),將課堂學(xué)習(xí)的理論與實(shí)踐結(jié)合在一起。</p><p> 5、學(xué)會(huì)編制結(jié)構(gòu)清晰、風(fēng)格良好、數(shù)據(jù)結(jié)構(gòu)適當(dāng)?shù)模?+語言程序,從而具備解決綜合性實(shí)際問題的能力。</p><p> 2.課程設(shè)計(jì)題目
6、描述和要求</p><p> 2.1 課程設(shè)計(jì)描述</p><p> 1、在mfc界面中插入盤子,確定其初始狀態(tài)以及背景圖片。</p><p> 2、選擇盤子的數(shù)量,以自動(dòng)搬移的方式移動(dòng)。</p><p> 3、自動(dòng)搬移可以通過定時(shí)器的方法,每一次移動(dòng)的時(shí)間間隔可以通過修改程序中的代碼自定。</p><p>
7、 4、定義塔的描述類和碟子的描述類。</p><p> 5、選定盤子數(shù)量點(diǎn)擊開始運(yùn)行,點(diǎn)擊結(jié)束后退出程序。</p><p> 2.2 課程設(shè)計(jì)要求</p><p> 通過對高級程序語言設(shè)計(jì)學(xué)習(xí),以及對mfc的自學(xué)過程,掌握對mfc可視化程序的設(shè)計(jì),熟練運(yùn)用老師所講的高級程序語言設(shè)計(jì)的知識,通過綜合運(yùn)用先修課的知識,培養(yǎng)獨(dú)立分析和解決實(shí)際問題的能力。培養(yǎng)學(xué)生使用
8、高級語言開發(fā)系統(tǒng)的能力,提高學(xué)生分析、設(shè)計(jì)系統(tǒng)的能力。</p><p> 3.課程設(shè)計(jì)報(bào)告內(nèi)容</p><p><b> 3.1程序原理</b></p><p> 當(dāng)在一個(gè)函數(shù)A的定義中出現(xiàn)調(diào)用函數(shù)A的情況時(shí),或在A函數(shù)的定義過程中調(diào)用B函數(shù),而在B函數(shù)的定義過程中又調(diào)用了A函數(shù) ,這種調(diào)用關(guān)系稱為遞歸調(diào)用。在設(shè)計(jì)遞歸程序函數(shù)時(shí),通常是先
9、判斷遞歸結(jié)束條件,再進(jìn)行遞歸調(diào)用。其執(zhí)行過程比較復(fù)雜,都存在連續(xù)遞歸調(diào)用(參數(shù)入棧)和回推過程。在使用遞歸的方法設(shè)計(jì)程序時(shí),在遞歸程序中一定要有遞歸結(jié)束條件;否則,在執(zhí)行程序時(shí),會(huì)產(chǎn)生無窮無盡的遞歸調(diào)用。</p><p><b> 3.2程序內(nèi)容</b></p><p> 算法設(shè)計(jì)思想: </p><p> (1)將塔A上的n-1
10、個(gè)碟子借助塔C先移到塔B上。 </p><p> (2)把塔A上剩下的一個(gè)碟子移到塔C上。 </p><p> (3)將n-1個(gè)碟子從塔B借助于塔A移到塔C上。</p><p><b> 實(shí)驗(yàn)步驟: </b></p><p> 1. 用c++ 或c語言設(shè)計(jì)實(shí)現(xiàn)漢諾塔游戲;</p><p&
11、gt; 2. 讓盤子數(shù)從2 開始到7進(jìn)行實(shí)驗(yàn),記錄程序運(yùn)行時(shí)間和遞歸調(diào)用次數(shù); </p><p> 3. 畫出盤子數(shù)n和運(yùn)行時(shí)間t 、遞歸調(diào)用次數(shù)m的關(guān)系然后對程序進(jìn)行分析</p><p><b> 3.3 算法設(shè)計(jì)</b></p><p> ?。?)移動(dòng)盤子在CMyDlg中建立成員函數(shù):</p><p><
12、b> MoveDisk:</b></p><p> int CMyDlg::MoveDish(int n, int a, int b) {</p><p> if(1 == n){</p><p><b> // 移動(dòng)盤子</b></p><p> int i = 1;</p>
13、<p> for(; i <= number ; i++){</p><p> if(a == dish[number - i]){</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b&g
14、t;</p><p> if(i > number){</p><p><b> return 0;</b></p><p><b> }</b></p><p> dish[number - i] = b;</p><p> return 0; // 完成&
15、lt;/p><p><b> }</b></p><p><b> else{</b></p><p> // 將要進(jìn)行的操作進(jìn)棧</p><p> opt[pn][0] = n-1;</p><p> opt[pn][1] = 3-a-b;</p>&l
16、t;p> opt[pn][2] = b;</p><p><b> pn ++;</b></p><p> opt[pn][0] = 1;</p><p> opt[pn][1] = a;</p><p> opt[pn][2] = b;</p><p><b> pn
17、 ++;</b></p><p> opt[pn][0] = n-1;</p><p> opt[pn][1] = a;</p><p> opt[pn][2] = 3-a-b;</p><p><b> pn ++;</b></p><p><b> return
18、 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> ?。?)建立選擇盤子以及盤子移動(dòng)速度的成員函數(shù):</p><p> OnButton1()</p><p> void CMyDlg::OnBut
19、ton1() {</p><p><b> // 開始演示</b></p><p> if(0 == number){</p><p> MessageBox("請選擇盤子數(shù)!");</p><p><b> return ;</b></p><p&g
20、t;<b> }</b></p><p> SetDishNumber(number); // 數(shù)據(jù)重置</p><p> MoveDish(number, 0, 2);</p><p> SetTimer(1015, 400, NULL); // 開始計(jì)時(shí),每400毫秒一步</p><p><b>
21、 }</b></p><p> ?。?)對盤子進(jìn)行設(shè)置:</p><p> void CMyDlg::OnR3() {</p><p><b> // 設(shè)置三個(gè)盤子</b></p><p> SetDishNumber(3);</p><p><b> }</b
22、></p><p> void CMyDlg::OnR4() {</p><p><b> // 設(shè)置四個(gè)盤子</b></p><p> SetDishNumber(4);</p><p><b> }</b></p><p> void CMyDlg::On
23、R5() {</p><p><b> // 設(shè)置五個(gè)盤子</b></p><p> SetDishNumber(5);</p><p><b> }</b></p><p> void CMyDlg::OnR6() {</p><p><b> // 設(shè)
24、置六個(gè)盤子</b></p><p> SetDishNumber(6);</p><p><b> }</b></p><p> void CMyDlg::OnR7() {</p><p><b> // 設(shè)置七個(gè)盤子</b></p><p> SetD
25、ishNumber(7);</p><p><b> }</b></p><p><b> // 設(shè)置盤子個(gè)數(shù)</b></p><p> void CMyDlg::SetDishNumber(int n){</p><p> KillTimer(1015); // 停止計(jì)時(shí)</p>
26、;<p> pn = 0; // 清空棧</p><p> number = n;</p><p> for(int i = 0; i < n ; i++){</p><p> dish[i] = 0; // 初始化每個(gè)盤子都在第一根柱子上</p><p><b> }</b></p&
27、gt;<p> Invalidate(FALSE);//重繪</p><p><b> }</b></p><p><b> ?。?)顯示背景</b></p><p> void CMyDlg::ShowBg(CDC * dc){</p><p><b> //顯示背
28、景</b></p><p> CDC pdc, ddc;</p><p> pdc.CreateCompatibleDC(dc); // 創(chuàng)建一個(gè)臨時(shí)顯示設(shè)備</p><p> ddc.CreateCompatibleDC(dc); // 創(chuàng)建一個(gè)加載盤子的臨時(shí)顯示設(shè)備</p><p> CBitmap bmp, * ob
29、mp;</p><p> bmp.LoadBitmap(IDB_BG); // 加載背景圖片</p><p> obmp = pdc.SelectObject(&bmp); // 將圖片顯示在設(shè)備pdc上。</p><p><b> //顯示盤子</b></p><p> int n[] = {0, 0,
30、 0}; // 用于存放每個(gè)柱子已顯示多少盤子</p><p> for(int i = 0; i < number ; i++){</p><p> CBitmap dbmp, * odbmp;</p><p> dbmp.LoadBitmap(IDB_B7 - i); // 加載從大到小第i個(gè)盤子圖片</p><p> od
31、bmp = ddc.SelectObject(&dbmp); // 將盤子顯示在設(shè)備ddc上。</p><p> pdc.BitBlt(10 + 150*dish[i], 225 - n[dish[i]]*20, 140, 15, &ddc, 0, 0, SRCCOPY); // 將ddc拷貝到臨時(shí)顯示設(shè)備pdc對應(yīng)位置上</p><p> n[dish[i]] ++;
32、</p><p> ddc.SelectObject(odbmp); // 顯示完畢,還原設(shè)備</p><p><b> }</b></p><p> dc->BitBlt(10, 10, 460, 260, &pdc, 0, 0, SRCCOPY); // 將pdc拷貝到程序顯示設(shè)備dc上</p><p
33、> pdc.SelectObject(obmp); // 顯示完畢,還原設(shè)備</p><p><b> }</b></p><p><b> 4.總結(jié)</b></p><p> 對于這次對漢諾塔程序演示的設(shè)計(jì),因?yàn)槭堑谝淮谓佑|mfc可視化程序設(shè)計(jì),多少有點(diǎn)棘手,在網(wǎng)上找了挺多關(guān)于這方面的演示程序進(jìn)行參考,通過
34、對他們的程序進(jìn)行分析理解,學(xué)習(xí)一些以前自己沒有學(xué)到的知識,最終將其變成自己的東西。</p><p> 在實(shí)際操作過程中出現(xiàn)了不少的錯(cuò)誤,雖然犯了一些錯(cuò)誤但是還會(huì)有意外的收獲感覺也挺有意思。畢竟這些錯(cuò)誤在自己的各種尋找方法,網(wǎng)上查找資料,詢問老師同學(xué)等等,最終將問題解決,先不說結(jié)果怎樣,其中的過程就挺讓人回味的。當(dāng)然,在具體操作中對這學(xué)期所學(xué)的數(shù)據(jù)結(jié)構(gòu)的理論知識得到鞏固對高級程序語言設(shè)計(jì)的mfc可視化程序設(shè)計(jì)也有
35、了進(jìn)一步的認(rèn)識和提高,達(dá)到設(shè)計(jì)的基本目的也發(fā)現(xiàn)自己的不足之處在以后的上機(jī)中應(yīng)更加注意。 通過對漢諾塔算法的分析讓我更清楚的認(rèn)識到了不同的算法對程序性能的影響也讓我明白掌握了算法將會(huì)有助于提高軟件的開發(fā)。</p><p><b> 參考文獻(xiàn):</b></p><p> 1辛長安,王顏國. Visual.C.權(quán)威剖析--MFC的原理、機(jī)制與開發(fā)實(shí)例.北京:清華大學(xué)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 漢諾塔課程設(shè)計(jì)--漢諾塔演示程序設(shè)計(jì)
- 漢諾塔問題課程設(shè)計(jì)
- 漢諾塔演示
- 《新漢諾塔》課程設(shè)計(jì)
- 漢諾塔課程設(shè)計(jì)--基于vc++的漢諾塔游戲設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--漢諾塔游戲
- 漢諾塔java課程設(shè)計(jì)說明書
- mfc課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 漢諾塔程序設(shè)計(jì)
- mfc計(jì)算器課程設(shè)計(jì)報(bào)告
- mfc程序設(shè)計(jì)課程設(shè)計(jì)---考勤系統(tǒng)
- mfc課程設(shè)計(jì)報(bào)告-貪食蛇游戲
- 漢諾塔hanoi問題
- 課程設(shè)計(jì)--mfc家庭理財(cái)管理系統(tǒng)
- mfc課程設(shè)計(jì)報(bào)告—模擬計(jì)算器
- mfc課程設(shè)計(jì)報(bào)告---聊天室程序設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告--hannoi塔
- java課程設(shè)計(jì)報(bào)告--hannoi塔
- 3done實(shí)體設(shè)計(jì)案例漢諾塔
- 圖遍歷的演示課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論