版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、南華大學計算機科學與技術學院課 程 設 計 報 告 ( 2007 2008 學年度 第 1學期 )課程名稱數(shù)據(jù)結構c+描述課程設計名稱迷宮問題姓名羅丹學號 20064440109專業(yè)計算機科學與技術班級計算機01班地點8209教師 劉 霞 1.實驗目的及要求1)、設計目標(問題描述)迷宮問題問題描述:迷宮實驗是取自心理學的一個古典實驗。在該實驗中,把一只老鼠從一個無頂大盒子的門放入,在盒中設置了許多墻,對行進方向形成了多處阻擋。盒子僅有一個出口,在出口處放置一塊奶酪,吸引老鼠在迷宮中尋找道路以到達出口。對同一只老鼠重復進行上述實驗,一直到老鼠從入口到出口,而不走錯一步。老鼠經(jīng)多次試驗終于得到它
2、學習走迷宮的路線。2)、功能設計要求編寫一個程序求解迷宮問題。迷宮由m行n列的二維數(shù)組設置,0表示無障礙,1表示有障礙。設入口為(1,1),出口為(m,n),每次只能從一個無障礙單元移到周圍四個方向上任一無障礙單元。編程實現(xiàn)對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。算法輸入:代表迷宮入口的坐標算法輸出:穿過迷宮的結果。算法要點:創(chuàng)建迷宮,試探法查找路徑,輸出解3)、實驗目的 1、加深對棧特性理解,以便在解決實際問題中靈活運用它們 2、加深對棧操作實際算法的理解 3、進一步熟悉掌握鏈表的操作; 4、掌握指針的應用 5、更進一步掌握有關類的操作
3、160; 4)、 需求分析 1、本程序實現(xiàn)迷宮的探索過程. 以用戶和計算機對話的方式,即在計算機終端上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中規(guī)定的運算命令,然后程序就探索路徑并輸出路徑。 2、本演示程序中,輸入形式以“回車符”為結束標志,且允許出現(xiàn)重復字符。 3、利用二維指針實現(xiàn)迷宮位置的存儲,并用棧存貯探索路徑,每個結點含三個整形變量。輸入的形式以回車結束。 4、本程序中,用戶可以讀去文件里的迷宮,也可自己
4、重新輸入迷宮,而且用戶可以輸入任意大小的迷宮,然后程序自動探索路徑,并輸出迷宮的路徑 5)、創(chuàng)新(見源程序附錄)6)、軟件、硬件環(huán)境 軟件環(huán)境:Microsoft Windows Xp Processional2002 ServiceMicrosoft Visual C+6.0 硬件環(huán)境:cpu:AMD Athlon(tm)64x DualProcessor 3800+2.01GHz Main memory:960MB2.實驗步驟a.認真閱讀課本的相關知識章節(jié)。b.認真分析課題的需求分析和功能分析。c.根據(jù)分析的思路寫出偽代碼。d.根據(jù)偽代碼上機編寫程序,進行初步調(diào)試。e.逐步增加完善系統(tǒng)的功
5、能,實現(xiàn)人工智能化。f.記錄上機運行時遇到的錯誤,進行認真分析。g.最后認真撰寫實驗報告,寫出實驗心得總結。3. 實驗內(nèi)容1)、設計概述(a) 開發(fā)平臺:VC6.0(b) 參考書籍: 1.數(shù)據(jù)結構C+描述 熊岳山 陳懷義 編著 國防科技大學出版社 2、數(shù)據(jù)結構與算法黃定 黃煜廉 編著 廣東科技出版社 2000年1月第1版3、數(shù)據(jù)結構輔導與提高徐孝凱 編著 清華大學出版社 2003年12月第1版(c) 開發(fā)周期: 10天(構思3天、雛形3天、修改2天、再修改1天、完善1天)2)、處理流程(a)畫出功能結構圖Main主函數(shù)模塊輸出
6、路徑模塊printpath()獲取迷宮模塊探索路徑模塊Findpath()寫文件Writefile()讀文件Readfile()存儲探索路徑模塊stack類Stack類操作模塊數(shù)據(jù)模塊盤空函數(shù)isempty()清空函數(shù)clear()取棧頂函數(shù)getpop()進棧與出棧函數(shù)push()Pop()構造與析構函數(shù)stack()stack()結點模塊Node*top結點數(shù)據(jù)類型模塊datatype類(b)畫出主要數(shù)據(jù)結構的類圖class 類名DataType /定義描述迷宮中當前位置的類型數(shù)據(jù)成員訪問控制權限 數(shù)據(jù)類型 變量名; public:int x; /x代表當前位置的行坐標 int y; /y
7、代表當前位置的列坐標 int pre; /pre表示移動到下一步的方向 class 類名Move /定義下一個位置的方向數(shù)據(jù)成員訪問控制權限 數(shù)據(jù)類型 變量名; public:int x; int y;class 類名Node /結點數(shù)據(jù)成員訪問控制權限 數(shù)據(jù)類型 變量名; public: DataType data; Node *next;class 類名stack數(shù)據(jù)成員訪問控制權限 數(shù)據(jù)類型 變量名; private: Node *top; /指向第一個結點的棧頂指針成員函數(shù)訪問控制權限 返回值類型 函數(shù)名(參數(shù)列表) public: stack(); /構造函數(shù),置空棧 stack()
8、; /析構函數(shù) void Push(DataType data);/把元素data壓入棧中 DataType Pop(); /使棧頂元素出棧 DataType GetPop(); /取出棧頂元素 void Clear(); /把棧清空 bool IsEmpty(); /判斷棧是否為空,如果為空則返回1,否則返回0(c)主要函數(shù)的程序流程圖開始 1.main函數(shù)流程圖: 顯示系統(tǒng)信息選擇獲取迷宮的方式chCh= bCh=a自行輸入Writefile()Readfile()文件讀取探索迷宮路徑是否存在輸出迷宮路徑是否繼續(xù)游戲退出開始2.探索路徑函數(shù)findpath()Temp1.x=1Temp1.
9、y=1入口進棧p.pushq.push是否非空temp2=q.getpop()P q棧頂是否相等探索上下左右四個方位是否有路徑到達新位置是否到達出口最后一個元素進棧輸出路徑回復以改變的迷宮結束 開始3.自行輸入迷宮函數(shù)writefile()輸入長寬m,n動態(tài)申請空間二位數(shù)組空間i<=m是否保存迷宮J<=ni+ ;j+輸入迷宮輸入保存迷宮的文件名保存迷宮結束(d)寫出數(shù)據(jù)測試表(輸入數(shù)據(jù)/預期結果) 測試一:從文件中讀取迷宮: 0010001000010001010000110000111001000001000010100010100111100111100010111100000
10、00 輸出:探索路徑: (1,1,向下) (2,1,向下)(3,1,向下)(4,1,向下)(5,1,向右)(5,2,向右) (5,3,向下)(6,3,向右)(6,4,向右)(6,5,向上)(5,5,向右)(5,6,向右)(5,7,向下)(6,7,向下)(7,7,向下)(8,7,向下)(9,7,向右)(9,8,向右) (9,9)測試二: 自己輸入迷宮: 001000100 輸出探索路徑: (1,1,向下)(2,1,向右)(2,2,向下)(3,2,向右)(3,3)測試三:自己輸入迷宮: 111111000 輸出探索路徑: Sorry!找不到路徑!4.實驗結果結果為以下三種情形之一:1)編譯不通過:
11、給出編譯錯。Compiling.stack.cppSkipping. (no relevant changes detected)main.cppLinking.stack.obj : error LNK2005: "public: _thiscall stack:stack(void)" (?0stackQAEXZ) already defined in main.objstack.obj : error LNK2005: "public: _thiscall stack:stack(void)" (?1stackQAEXZ) already defi
12、ned in main.objstack.obj : error LNK2005: "public: void _thiscall stack:Push(struct DataType)" (?PushstackQAEXUDataTypeZ) already defined in main.objstack.obj : error LNK2005: "public: struct DataType _thiscall stack:Pop(void)" (?PopstackQAE?AUDataTypeXZ) already defined in main.
13、objstack.obj : error LNK2005: "public: struct DataType _thiscall stack:GetPop(void)" (?GetPopstackQAE?AUDataTypeXZ) already defined in main.objstack.obj : error LNK2005: "public: void _thiscall stack:Clear(void)" (?ClearstackQAEXXZ) already defined in main.objstack.obj : error LN
14、K2005: "public: bool _thiscall stack:IsEmpty(void)" (?IsEmptystackQAE_NXZ) already defined in main.objDebug/迷宮問題.exe : fatal error LNK1169: one or more multiply defined symbols found執(zhí)行 link.exe 時出錯.迷宮問題.exe - 1 error(s), 0 warning(s)改正: 在main。cpp中原來包含的是stack.cpp把它改為包含stack.h即可錯誤二: 用string直
15、接定義字符串str時,說沒有定義str 原因:#include<string>using namespace std ;沒有用標準空間錯誤三: 拼寫錯誤正確結果輸出:接上面:接上面:5. 實驗總結分析1)、時間和空間分析該算法的運行時間和使用系統(tǒng)棧所占有的存儲空間與迷宮的大小成正比,迷宮長為m,寬為n,在最好情況下的時間和空間復雜度均為O(m+n),在最差情況下均為O(m*n),平均情況在它們之間2)、程序的優(yōu)點a. 進入演示程序后即顯示文本方式的用戶界面b. 本程序模塊劃分比較合理,且利用指針存儲迷宮,操作方便。c. 能按照玩游戲人的意愿任意輸入迷宮大小,并且可以保存新輸入的迷宮
16、,方便退出游戲后仍可打開自己定義文件查看迷宮。3)、遇到的問題及如何解決 a.如何知道哪一點被探索過且路徑不通? 答:maze【i】【j】本來時表示通與不通,那么可以當探索該點之后,將其值賦為-1,就可以知道此點已經(jīng)被訪問過 b.如何正確的使用文件讀入迷宮? 答:查看大一學的C+課本,仔細閱讀文件那一章。c.我想讓用戶在每次玩游戲之后都能查看輸入的迷宮,我想的是運行程序時隨意新建文本文檔,開始是直接輸入一個.txt結尾的字符串,但編譯好多錯誤,我猜應該是要調(diào)用相關函數(shù),但具體是那一個不清楚。 答:去圖書館借閱相關資料,要調(diào)用相應的庫函數(shù)。4)、存在的缺陷、改進設想 每當自行輸入迷宮后,生成相應
17、的文件保存,但是我在想:一旦玩游戲的人多了,玩的次數(shù)多了,那么生成的保存迷宮文件就會很多,會給人工智能化系統(tǒng)造成文件冗余。我設想:能不能在一段時間之后系統(tǒng)自動調(diào)用函數(shù)來清除冗余文件。5)、自我評價、經(jīng)驗體會等通過這次課程設計,體會如下:、進一步熟悉掌握了有關棧的基本操作;、對迷宮有了更多的認識3、更進一步掌握有關類的操作4、由于對棧的算法推敲不足,使程序調(diào)試時費時不少總之:我認為這次課程設計做的很好。課程設計的成功使我相信一句話:有付出就會有收獲,要相信自己。6. 附錄(源程序清單,要求含有至少30%的源碼附有注釋)迷宮程序代碼(本程序有個創(chuàng)新點)/* Name: stack.h Author
18、: 羅丹 Description: 用于記錄探索路徑的棧類頭文件 */#include<iostream>#include"fstream"using namespace std;class DataType /定義描述迷宮中當前位置的類型public:int x; /x代表當前位置的行坐標 int y; /y代表當前位置的列坐標 int pre; /pre表示移動到下一步的方向; class Move /定義下一個位置的方向 public:int x; int y;class Node /鏈表結點public: DataType data; Node *nex
19、t;/下面定義棧class stackprivate: Node *top; /指向第一個結點的棧頂指針 public: stack(); /構造函數(shù),置空棧 stack(); /析構函數(shù) void Push(DataType data);/把元素data壓入棧中 DataType Pop(); /使棧頂元素出棧 DataType GetPop(); /取出棧頂元素 void Clear(); /把棧清空 bool IsEmpty(); /判斷棧是否為空,如果為空則返回1,否則返回0;/* Name: stack.cpp Author: 羅丹 Description: 用于記錄探索路徑的棧類實
20、現(xiàn)文件 */#include"stack.h"stack:stack() /構造函數(shù),置空棧top=NULL;stack:stack() /析構函數(shù)void stack:Push(DataType x) /進棧Node *TempNode; TempNode=new Node; TempNode->data=x; TempNode->next=top; top=TempNode;DataType stack:Pop() /棧頂元素出棧 DataType Temp; Node *TempNode=NULL; TempNode=top; top=top->ne
21、xt; Temp=TempNode->data; delete TempNode; return Temp;DataType stack:GetPop() /取出棧頂元素return top->data;void stack:Clear() /把棧清空top=NULL;bool stack:IsEmpty() /判斷棧是否為空,如果為空則返回1,否則返回0if(top=NULL) return true; else return false;/* Name: main.cpp Author: 羅丹 Description: 主函數(shù)文件 */#include"stack.h
22、"#include<iostream>#include<string>#include<fstream>using namespace std ;/* Description: 外部函數(shù)的聲明部分*/bool findpath(int *maze,int m,int n); /尋找迷宮路徑 void PrintPath(stack p); /輸出路徑void Restore(int *maze,int m,int n); /恢復迷宮Move move4=0,1,1,0,0,-1,-1,0; /定義當前位置移動的4個方向(上,右,下,左)int* r
23、eadFile (int &m,int &n);int* write &m,int &n);/* Description: main.cpp*/ void main() cout<<endl;/ cout<<""<<endl; cout<<" 2007-2008年度第一學期數(shù)據(jù)結構課程之課程設計 "<<endl; cout<<endl; cout<<" 迷宮問題 "<<endl; cout<<&q
24、uot; 開發(fā)員 : 羅丹"<<endl; cout<<" 專業(yè)班級: 計算機061班"<<endl; cout<<""<<endl; cout<<" 歡迎進入迷宮游戲 "<<endl; int m=0,n=0; int *maze; char ch; int flag=0,flag1=0; while(flag1=0) while(flag=0)/標志是否重新選擇 cout<<endl; cout<<" 請
25、從以下選項中選擇獲取迷宮的方法!"<<endl; cout<<" <a>從文件中讀取"<<endl; cout<<" <b>直接自行輸入"<<endl; cout<<" 請選擇:" cin>>ch; if(ch='a')maze=read);flag=1; else if(ch='b')maze=write);flag=1; else cout<<" Sorry!您
26、輸入的選擇代碼不在范圍內(nèi)!請從新選擇"<<endl; if(findpath(maze,m,n) cout<<" Congratulations! 迷宮路徑探索成功!"<<endl; /得到路徑 else cout<<" Sorry! 路徑不存在"<<endl; cout<<endl; cout<<" 繼續(xù)玩嗎?(y/n)" char c; cin>>c; if(c=n) flag1=1; else flag=0; cout<
27、;<" 謝謝,您已經(jīng)退出迷宮系統(tǒng) "<<endl; cout<<""<<endl;/* Description: 獲取迷宮函數(shù)*/int* readFile (int &m,int &n) /讀出文件int *maze; int i=0,j=0; cout<<" 您選擇的是直接從文件中讀取迷宮!"<<endl; cout<<endl; cout<<" 文件中的迷宮如下: "<<endl; char
28、ch; /定義一個字符,讀取文件中的內(nèi)容 ifstream open("maze.txt"); /定義一個文件對象,并打開文件"maze.txt" /讀取內(nèi)容記錄行數(shù)和列數(shù) (創(chuàng)新點一:從文件中直接讀取迷宮) while(open.get(ch) /從讀取文件中內(nèi)容(一旦個字符形式) if(ch='0'|ch='1') j+; /是0或1字符寬就加1 if(ch='n') i+; /如果是換行符,就行加1 n=j; /得列數(shù) j=0; open.close(); /讀取文件結束 m=i; maze=new
29、int *m+2; /申請長度等于行數(shù)加2的二維指針(為后面的回復迷宮打下基礎) for(i= 0;i<m+2;i+) /申請空間 mazei=new intn+2; i=j=1; ifstream open1("maze.txt"); /重新讀取文件,以得到內(nèi)容 while(open1.get(ch) if(ch='1'|ch='0') mazeij=ch-'0' /把數(shù)字字符轉化為數(shù)字,并存到指針里 cout<<mazeij<<" " /在屏幕中顯示迷宮 j+; if(ch
30、='n') /遇到換行,指針也相應換行 cout<<endl; i+; j=1; open1.close(); /讀取結束 return maze; int* writeFile (int &m,int &n) /將自定義迷宮寫入文件int a,b; int i,j;int*maze; cout<<" 您選擇的是自行輸入迷宮!"<<endl; cout<<" 請輸入迷宮的長:"cin>>b; /輸入迷宮的長和寬 cout<<" 請輸入迷宮的寬
31、:"cin>>a; cout<<" 請輸入迷宮內(nèi)容(0代表可通,1代表不通):n" m=a; n=b; /m,n分別代表迷宮的行數(shù)和列數(shù) maze=new int *m+2; for(i= 0;i<m+2;i+) mazei=new intn+2; /創(chuàng)新點二::隨意申請空間 for(i=1;i<=m;i+) /輸入迷宮的內(nèi)容,0代表可通,1代表不通 for(j=1;j<=n;j+) cin>>mazeij; cout<<" 是否保存新迷宮?(y/n): " char choos
32、e; cin>>choose; if(choose='Y'|choose='y') char ch; string str; cout<<" 請輸入保存迷宮的文件名(以.txt結束):" cin>>str; ofstream open(str.c_str(); /創(chuàng)新點三:按玩游戲人的意愿創(chuàng)建存儲迷宮的文件,也可不建立。 for(i=1;i<=m;i+) for(j=1;j<=n;j+) ch='0'+mazeij; open<<ch; open<<end
33、l; flush(cout); open.close(); for(i=0;i<m+2;i+) mazei0=mazein+1=1; for(i=0;i<n+2;i+) maze0i=mazem+1i=1; return maze; /* Description: 探索路徑函數(shù)*/bool findpath(int *maze,int m,int n)stack q,p; /創(chuàng)新點四:用棧p、q,分別存探索迷宮的過程和存儲路徑 DataType Temp1,Temp2; int x,y,loop; Temp1.x=1; Temp1.y=1; q.Push(Temp1); /將入口位
34、置入棧 p.Push(Temp1); maze11=-1; /創(chuàng)新點五:標志入口位置已到達過 while(!q.IsEmpty() /棧q非空,則反復探索 Temp2=q.GetPop(); if(!(p.GetPop().x=q.GetPop().x&&p.GetPop().y=q.GetPop().y) p.Push(Temp2); /如果有新位置入棧,則把上一個探索的位置存入棧p for(loop=0;loop<4;loop+) /探索當前位置的4個相鄰位置 x=Temp2.x+moveloop.x; y=Temp2.y+moveloop.y; if(mazexy=
35、0) /判斷新位置是否可達 Temp1.x=x; Temp1.y=y; mazexy=-1; /標志新位置已到達過 q.Push(Temp1); /新位置入棧 if(x=(m)&&(y=(n) /成功到達出口 Temp1.x=m; Temp1.y=n; Temp1.pre=0; p.Push(Temp1); /把最后一個位置入棧 PrintPath(p); Restore(maze,m,n); /恢復路徑(因為迷宮里面的內(nèi)容已被改變 return 1; /表示成功找到路徑 if(p.GetPop().x=q.GetPop().x&&p.GetPop().y=q.GetPop().y)/如果沒有新位置入棧,則返回到上一個位置 p.Pop(); q.Pop(); return 0; /表示查找失敗,即迷宮無路經(jīng)/* Description: 輸出路徑函數(shù)*/void PrintPath(stack p) /輸出路徑cout<<endl; cout<<" 迷宮的路徑為"<&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度電子合同法律效力認定及證據(jù)保全操作規(guī)程3篇
- 二零二五年度汽車銷售與售后服務咨詢合同2篇
- 二零二五年鋼筋制作與安裝勞動合同規(guī)范3篇
- 二零二五版企業(yè)品牌形象策劃執(zhí)行合同3篇
- 二零二五年度工傷事故賠償協(xié)議及后續(xù)心理咨詢服務合同6篇
- 二零二五年度電梯產(chǎn)品研發(fā)與創(chuàng)新基金投資合同3篇
- 二零二五年度蜜蜂養(yǎng)殖環(huán)境監(jiān)測與改善合同2篇
- 小麥種子繁育生產(chǎn)合同(2篇)
- 二零二五年電子商務SET協(xié)議安全技術實施合同3篇
- 二零二五年智能工廠生產(chǎn)過程監(jiān)控合同樣本3篇
- 2024年業(yè)績換取股權的協(xié)議書模板
- 顳下頜關節(jié)疾?。谇活M面外科學課件)
- 工業(yè)自動化設備維護保養(yǎng)指南
- 2024人教新版七年級上冊英語單詞英譯漢默寫表
- 《向心力》參考課件4
- 2024至2030年中國膨潤土行業(yè)投資戰(zhàn)略分析及發(fā)展前景研究報告
- 2024年深圳中考數(shù)學真題及答案
- 土方轉運合同協(xié)議書
- Module 3 Unit 1 Point to the door(教學設計)-2024-2025學年外研版(三起)英語三年級上冊
- 智能交通信號燈安裝合同樣本
- 安全生產(chǎn)法律法規(guī)清單(2024年5月版)
評論
0/150
提交評論