版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、程序設(shè)計藝術(shù)與方法實驗一 STL 的熟悉與使用1 實驗?zāi)康?(1) 掌握 C+中 STL 的容器類的使用。 (2) 掌握C+中 STL 的算法類的使用。2 試驗設(shè)備 硬件環(huán)境:PC 計算機 軟件環(huán)境: 操作系統(tǒng):Windows 2000 / Windows XP / Linux 語言環(huán)境:Dev cpp / gnu c+ 3 試驗內(nèi)容 (1) 練習(xí) vector 和 list 的使用。 定義一個空的 vector,元素類型為 int,生成 10 個隨機數(shù)插入到 vector 中,用迭代 器遍歷 vector 并輸出其中的元素值。在 vector 頭部插入一個隨機數(shù),用迭代器遍歷 vector
2、并輸出其中的元素值。用泛型算法 find 查找某個隨機數(shù),如果找到便輸出,否則將此數(shù) 插入 vector 尾部。用泛型算法 sort 將 vector 排序,用迭代器遍歷 vector 并輸出其中的元 素值。刪除 vector 尾部的元素,用迭代器遍歷 vector 并輸出其中的元素值。將 vector 清 空。 定義一個 list,并重復(fù)上述實驗,并注意觀察結(jié)果。 (2) 練習(xí)泛型算法的使用。 - 149 定義一個 vector,元素類型為 int,插入 10 個隨機數(shù),使用 sort 按升序排序,輸出 每個元素的值,再按降敘排序,輸出每個元素的值。練習(xí)用 find 查找元素。用 min 和
3、 max 找出容器中的小元素個大元素,并輸出。源代碼:#include #include #include#include #include using namespace std;vector myV;bool sortup(int v1,int v2)return v1v2; int main(int argc, char *argv) srand(time(NULL); for (int i=0;i10;i+) myV.push_back(rand(); sort(myV.begin(),myV.end(),sortup); vector:iterator it1; for (it1=m
4、yV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutendl; int min=myV0; for (it1=myV.begin()+1;it1!=myV.end();it1+) if(*it1)min)min=(*it1); cout最小元素為 minmax)max=(*it1); cout最大元素為 maxendl; coutendl; int value=rand(); it1=find(myV.begin(),myV.end(),value); if(*it1)=value) cout找到了這個隨機數(shù)endl ; else co
5、ut沒有找到這個隨機數(shù)endl; myV.insert(myV.end(),value); cout插入尾部的隨機數(shù)為valueendl; for (it1=myV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutnendl; int t=rand(); myV.insert(myV.begin(),t); cout插入頭部的隨機數(shù)為 tendl; for (it1=myV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutendl; myV.pop_back (); for (it1
6、=myV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutendl; myV.clear(); if(myV.empty() cout Its empty! endl; system(PAUSE); return 0;運行截圖:2 練習(xí)泛型算法的使用:源代碼:#include#include/#incluedusing namespace std;typedef list lin;int value=1,2,3,4,5; void print(lin &l)int i;lin:iterator lit; for(lit=l.begin()
7、;lit!=l.end();lit+)cout(*lit) ; coutv2; int main()lin lin2; lin2.push_front(3); lin2.push_front(4); lin2.insert(lin2.begin(),value,value+5);coutlin2內(nèi)的元素為:;print(lin2);lin2.sort();cout排序后的lin2: ;print(lin2);lin2.push_front(10); cout在list頭部插入10之后的結(jié)果:; print(lin2);lin2.remove(6);cout刪除一個數(shù)后的lin1:; print
8、(lin2); system(PAUSE); return 0;運行截圖:實驗二 搜索算法的實現(xiàn)1. 實驗?zāi)康?(1) 掌握寬度優(yōu)先搜索算法。 (2) 掌握深度優(yōu)先搜索算法。 2. 試驗設(shè)備 硬件環(huán)境:PC 計算機 軟件環(huán)境: 操作系統(tǒng):Windows 2000 / Windows XP / Linux 語言環(huán)境:Dev cpp / gnu c+ 3. 試驗內(nèi)容 (1) 將書上的走迷宮代碼上機運行并檢驗結(jié)果,并注意體會搜索的思想。 (2) 八皇后問題:在一個國際象棋棋盤上放八個皇后,使得任何兩個皇后之間不相互攻擊,求出所有的布棋方法。上機運行并檢驗結(jié)果。 思考:將此題推廣到 N 皇后的情況,檢
9、驗在 N 比較大的情況下,比方說 N=16 的時 候,你的程序能否快速的求出結(jié)果,如果不能,思考有什么方法能夠優(yōu)化算法。 (3) 騎士游歷問題: 在國際棋盤上使一個騎士遍歷所有的格子一遍且僅一遍,對于任意給定的頂點, 輸出一條符合上述要求的路徑。 (4) 倒水問題:給定 2 個沒有刻度容器,對于任意給定的容積,求出如何只用兩個瓶裝出 L 升 的水,如果可以,輸出步驟,如果不可以,請輸出 No Solution。(2)八皇后問題源代碼:#include using namespace std;#include int sum = 0;int upperlimit = 1;void compare
10、(int row,int ld,int rd)if(row!=upperlimit)int pos=upperlimit&(row|ld|rd); while(pos!=0)int p=pos&-pos;pos-=p;compare(row+p,(ld+p)1);elsesum+;int main()int n;coutn;upperlimit = (upperlimitn)-1;compare(0,0,0);cout問題的解如下:sumendl;return 0;運行截圖:(4)倒水問題源代碼:4.倒水問題:#includestdio.hint main() int ca,cb,cc,x,y
11、; while(scanf(%d%d%d,&ca,&cb,&cc)!=EOF) if(cb=cc) printf(fill Bn); else if(ca=cc) printf(fill An); printf(pour A Bn); else x=y=0; if(caca-x) /如果b中的水大于a中的剩余容積,就把a灌滿/ y-=ca-x; x=ca; printf(pour B An); else /如果b中的水小于a中的剩余容積,那么把b中的水全加入a/ x+=y; y=0; printf(pour B An); if(y=cc) /如果b中的水已經(jīng)和cc相等,那就結(jié)束/ break;
12、 if(ca=x) /如果a中的水滿了,就把a倒空/ x=0; printf(empty An); else while(1) if(x=0) x=ca; printf(fill An); if(xcb-y) /如果a中的水大于b中的剩余容積,就把b灌滿/ x-=cb-y; y=cb; printf(pour A Bn); else /如果a中的水小于b中的剩余容積,那么把a中的水全加入b/ y+=x; x=0; printf(pour A Bn); if(y=cc) /如果b中的水已經(jīng)和cc相等,那就結(jié)束/ break; if(y=cb) /如果b中的水滿了,就把b倒空/ y=0; prin
13、tf(empty Bn); printf(successn); return 0;運行截圖:實驗三 計算幾何算法的實現(xiàn)1. 實驗?zāi)康?(1) 理解線段的性質(zhì)、叉積和有向面積。 (2) 掌握尋找凸包的算法。 (3) 綜合運用計算幾何和搜索中的知識求解有關(guān)問題。 2. 試驗設(shè)備 硬件環(huán)境:PC 計算機 軟件環(huán)操作系統(tǒng):Windows 2000 / Windows XP / Linux 語言環(huán)境:Dev cpp / gnu c+ 3. 試驗內(nèi)容 (1) 將講義第三章第三節(jié)中的凸包代碼上機運行并檢驗結(jié)果。 (2) 完成講義第三章的課后習(xí)題,上機運行并檢驗結(jié)果。 (3) 思考: 判線段相交時,如果有個線
14、段的端點在另一條線段上,注意可能與另一條線段上的 端點重合,思考這樣的情況怎么辦。 (4) 房間短路問題: 給頂一個內(nèi)含阻礙墻的房間,求解出一條從起點到終點的短路徑。房間的邊界 固定在 x=0,x=10,y=0 和 y=10。起點和重點固定在(0,5)和(10,5)。房間里還有 0 到 18 個 墻,每個墻有兩個門。輸入給定的墻的個數(shù),每個墻的 x 位置和兩個門的 y 坐標(biāo)區(qū)間, 輸出最短路的長度。(4)房間短路問題源代碼: #include #include #include #include using namespace std; typedef pair POINT;/線段 doubl
15、e direction(POINT p,POINT p1,POINT p2) POINT v1,v2; v1.first=p2.first-p1.first; v1.second=p2.second-p1.first; v2.first=p1.first-p.first; v2.second=p1.second-p.second; return v1.first*v2.second-v1.second*v2.second; bool on_segment(POINT p,POINT p1,POINT p2) double min_x=p1.firstp2.first?p1.first:p2.f
16、irst; double min_y=p1.secondp2.second?p1.second:p2.second; if(p.first=min_x&p.first= min_y&p.second=max_y) return true; else return false; POINT startPoint; bool sortByPolorAngle(const POINT &p1,const POINT &p2) double d=direction(startPoint,p1,p2); if(d0)return false; if(d=0&on_segment(startPoint,p
17、1,p2)return true; if(d=0&on_segment(p2,startPoint,p1)return true; return false; void find_convex_hull(vector&point) POINT p0=point0; int k=0; for(int i=0;ipoint.size();i+) if(pointi.secondp0.second| pointi.second=p0.second&pointi.firstp0.first) p0=pointi; k=i; point.erase(point.begin()+k); point.ins
18、ert(point.begin(),p0); vectorconvex_hull; do convex_hull.push_back(point0); startPoint=point0; point.erase(point.begin(); sort(point.begin(),point.end(),sortByPolorAngle); if(point0=convex_hull0)break; point.push_back(convex_hullconvex_hull.size()-1); while(1); for(int j=0;jconvex_hull.size();j+) co
19、utconvex_hullj.first convex_hullj.secondendl; int main() vector pv; double x,y; int i; cout請輸入10個點:endl; for(i=1;i=10;i+) coutNo.ixy;pv.push_back(make_pair(x,y); coutendl; find_convex_hull(pv); system(Pause); return 0; 運行截圖:實驗四 動態(tài)規(guī)劃算法的實現(xiàn)1. 實驗?zāi)康?(1) 理解動態(tài)規(guī)劃的基本思想、動態(tài)規(guī)劃算法的基本步驟。 (2) 掌握動態(tài)規(guī)劃算法實際步驟。 2. 試驗設(shè)備
20、硬件環(huán)境:PC 計算機 軟件環(huán)境: 操作系統(tǒng):Windows 2000 / Windows XP / Linux 語言環(huán)境:Dev cpp / gnu c+ 3. 試驗內(nèi)容 (1) 求兩個字符串的最長公共子序列。 X 的一個子序列是相應(yīng)于 X 下標(biāo)序列1, 2, , m的一個子序列,求解兩個序列的所有 子序列中長度大的,例如輸入:pear, peach 輸出:pea。 (2) 給定兩個字符串 a 和 b,現(xiàn)將串 a 通過變換變?yōu)榇?b,可用的操作為,刪除串 a 中的一 個字符;在串 a 的某個位置插入一個元素;將串 a 中的某個字母換為另一個字母。對于 任意的串 a 和串 b,輸出少多少次能夠
21、將串變?yōu)榇?b。 思考:輸出變換的步驟。 (3) 輸入一個矩陣,計算所有的子矩陣中和的大值。 例如,輸入 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 輸出為:15 思考:當(dāng)矩陣很大時,比如 100*100 的矩陣,你的程序還能夠很快的得出結(jié)果嗎,如果 不能,請思考如何用動態(tài)規(guī)劃的思想解決(1) 求兩個字符串的最長公共子序列源代碼:#include#include#define N 100using namespace std;/str1存儲字符串x,str2存儲字符串ychar str1N,str2N;/lcs存儲最長公共子序列char lcsN;/cij存儲str11.i與str21.j的最長公共子序列的長度int cNN;/flagij=0為str1i=str2j/f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 婚慶行業(yè)前臺工作總結(jié)
- 定制家具設(shè)計師工作要點
- 《美麗的海洋世界》課件
- 購物服務(wù)員工作總結(jié)
- 前臺文員情緒智力提升方案計劃
- 《苗木霜害怎么預(yù)防》課件
- 2024年廣東省汕尾市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2021年甘肅省嘉峪關(guān)市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2023年四川省雅安市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2021年云南省楚雄自治州公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 培智三年級上冊生活語文期末測試卷(A)
- GB/T 13296-2023鍋爐、熱交換器用不銹鋼無縫鋼管
- JCT2381-2016 修補砂漿標(biāo)準(zhǔn)
- 新加坡學(xué)習(xí)匯報
- 人工智能與機器學(xué)習(xí)基礎(chǔ)課程
- 辦公大樓物業(yè)服務(wù)投標(biāo)方案(完整技術(shù)標(biāo))
- 高速公路隧道工程施工方案
- 中國營養(yǎng)科學(xué)全書
- 針灸推拿試題(附參考答案)
- 《機械制圖》說課課件-畫組合體視圖的方法和步驟
- 2023-2024學(xué)年成都市錦江區(qū)四年級數(shù)學(xué)第一學(xué)期期末統(tǒng)考模擬試題含答案
評論
0/150
提交評論