版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課課 程程 設(shè)設(shè) 計(jì)計(jì) 報(bào)報(bào) 告告 課程設(shè)計(jì)名稱:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 課程設(shè)計(jì)題目:撲克牌的排序撲克牌的排序 目目 錄錄 1 課程設(shè)計(jì)介紹課程設(shè)計(jì)介紹.1 1.1 課程設(shè)計(jì)內(nèi)容.1 1.2 課程設(shè)計(jì)要求.1 2 課程設(shè)計(jì)原理課程設(shè)計(jì)原理.2 2.1 課設(shè)題目粗略分析.2 2.2 原理圖介紹.2 2.2.1 功能模塊圖.2 2.2.2 流程圖分析.3 3 數(shù)據(jù)結(jié)構(gòu)分析數(shù)據(jù)結(jié)構(gòu)分析.6 3.1 存儲(chǔ)結(jié)構(gòu).6 3.2 算法描述.6 4 調(diào)試與分析調(diào)試與分析.12 4.1 調(diào)試過(guò)程.12 4.2 程序執(zhí)行過(guò)程.12 參考文獻(xiàn)參考文獻(xiàn).15 附附 錄(關(guān)鍵部分程序清單)錄(關(guān)鍵部分程序清單
2、).16 1 課程設(shè)計(jì)介紹課程設(shè)計(jì)介紹 1.1 課程設(shè)計(jì)內(nèi)容課程設(shè)計(jì)內(nèi)容 編寫(xiě)算法能夠用基數(shù)排序算法對(duì)撲克牌進(jìn)行排序。應(yīng)能夠選擇按花色優(yōu) 先或按面值優(yōu)先,初始撲克牌牌序要求能自動(dòng)生成(隨機(jī)生成) 。 1.2 課程設(shè)計(jì)要求課程設(shè)計(jì)要求 1花色的符號(hào)可自定,輸出要求給出初始牌序和結(jié)果牌序。 2參考相應(yīng)資料,獨(dú)立完成課程設(shè)計(jì)任務(wù)。 3交規(guī)范課程設(shè)計(jì)報(bào)告和軟件代碼。 2 課程設(shè)計(jì)原理課程設(shè)計(jì)原理 2.1 課設(shè)題目粗略分析課設(shè)題目粗略分析 根據(jù)課設(shè)題目要求,擬將整體程序分為三大模塊。此三個(gè)模塊相互獨(dú)立, 沒(méi)有嵌套調(diào)用的情況,以下是三個(gè)模塊的大體分析: 1建立一個(gè)結(jié)構(gòu)體數(shù)組存放整副撲克。 2根據(jù)要求的撲克
3、數(shù)及生成的隨機(jī)數(shù)建立一個(gè)結(jié)構(gòu)體數(shù)組存放需要排序 的撲克。 3用基數(shù)排序的方法對(duì)隨機(jī)生成的撲克進(jìn)行相應(yīng)要求的排序 2.2 原理圖介紹原理圖介紹 2.2.1 功能模塊圖功能模塊圖 隨機(jī)生成需排序的撲克 對(duì)撲克按花色優(yōu)先排序 并輸出 對(duì)撲克按面值優(yōu)先排序并 輸出 圖 2. 1 功能模塊圖 初始化生成整副撲克 2.2.2 流程圖分析流程圖分析 1隨機(jī)生成需排序的撲克函數(shù)流程圖,如圖 2.2 所示: y y 圖 2.2 生成隨機(jī)撲克的流程圖 開(kāi)始 i+ i=1 i=t n=rand() ri.huase=pokern.huase ri.num=pokern.num ri.order=pokern.ord
4、er ri.key0=pokern.huase ri.key1=pokern.order k=(n+2)%13 k=0,1,11,12 2111111 以%c 輸出 value 以%d 輸 出 value n 結(jié)束 ri.huase=pokern.huase ri.num=pokern.num ri.order=pokern.order ri.key0=pokern.huase ri.key1=pokern.order k=(n+2)%13 利用一個(gè) for 循環(huán)及隨機(jī)函數(shù) rand(),利用每次循環(huán)生成的隨機(jī)數(shù)對(duì)應(yīng)的 數(shù)值 num 建立初始的無(wú)序撲克,同時(shí)將 huase、value 分別賦給
5、關(guān)鍵字 key0、 key1以對(duì)其進(jìn)行排序 2. 對(duì)撲克進(jìn)行花色優(yōu)先排序的函數(shù)流程圖,如圖 2.3 所示: y 圖 2.3 對(duì)撲克進(jìn)行花色優(yōu)先排序的流程圖 開(kāi)始 i=0 in-1 ri.next=i+1 i+ rn.next=0 i=0 i=1 調(diào)用 distribute()、 collect() 函數(shù) i+ i!=0 輸出人 ri.huase ri.value 結(jié)束 i=r0.next i y y n y n 對(duì)長(zhǎng)為 n 的數(shù)組 r,利用 next 域建立為靜態(tài)鏈表,進(jìn)行關(guān)鍵字先 key1 (面值)后 key0(花色)的基數(shù)排序,排序后的數(shù)組按關(guān)鍵字 key0(花色) 優(yōu)先的順序存放,利用靜
6、態(tài)鏈表依次將其輸出。 3. 對(duì)撲克進(jìn)行面值優(yōu)先排序的函數(shù)流程圖如圖 2.4 所示: y 圖 2.4 對(duì)撲克進(jìn)行面值優(yōu)先排序的流程圖 開(kāi)始 i=0 i=0 調(diào)用 distribute()、 collect() 函數(shù) i- i!=0 輸出人 ri.huase ri.value 結(jié)束 i=r0.next i y y n y n 對(duì)長(zhǎng)為 n 的數(shù)組 r,利用 next 域建成靜態(tài)鏈表,進(jìn)行關(guān)鍵字先 key0 (花色)后 key1(面值)的基數(shù)排序,排序后的數(shù)組按關(guān)鍵字 key1(面值) 優(yōu)先的順序存放,利用靜態(tài)鏈表依次將其輸出。 3 數(shù)據(jù)結(jié)構(gòu)分析數(shù)據(jù)結(jié)構(gòu)分析 3.1 存儲(chǔ)結(jié)構(gòu)存儲(chǔ)結(jié)構(gòu) typedef
7、struct int value ; / 撲克面值 char huase; / 撲克花色 int num; / 控制面值輸出形式 int order; / 在同一花色撲克的位置 int key2; / 排序用的關(guān)鍵字 int next; / 下一個(gè)撲克的位置 apoker; / 定義一個(gè)結(jié)構(gòu)體表示一張撲克 apoker poker52; / 定義一個(gè)大小為 52 的結(jié)構(gòu)體數(shù),組存放整副撲克 apoker unsortpokermax ; / 定義一個(gè)足夠大的結(jié)構(gòu)體數(shù)組,存放需排序的撲 克 typedef int tempradix; / 大小為關(guān)鍵字的基數(shù)的整形數(shù)組,用于基數(shù)排 序的分配、收集
8、 3.2 算法描述算法描述 1初始化建立撲克的算法描述說(shuō)明如下: 結(jié)構(gòu)體名定義為 apoker,poker52,unsortpokermax是 apoker 類(lèi)型,對(duì) 其賦上每個(gè)結(jié)點(diǎn)的名字,每個(gè)名字對(duì)應(yīng)自己的一個(gè) num,以控制面值的輸出 形式,value 對(duì)應(yīng)撲克的面值,huase 對(duì)應(yīng)撲克的花色。 for(i=0;i52;i+)/*建立整副撲克*/ j=i/13;/*將撲克分為四種花色*/ k=(i+2)%13; /*控制面值的輸出形式*/ m=i%13;/*同一花色中所處的位置*/ pokeri.order=m; if(j=0) pokeri.huase=3;/*花色賦值*/ else
9、if(j=1) pokeri.huase=4; else if(j=2) pokeri.huase=5; else pokeri.huase=6; if(k=0) pokeri.value=75;/*面值賦值*/ else if(k=1) pokeri.value=65; else if(k=11) pokeri.value=74; else if(k=12) pokeri.value=81; else pokeri.value=k; pokeri.num=i; 2隨機(jī)生成初始撲克的算法描述如下: 利用一個(gè) for 循環(huán)及隨機(jī)函數(shù) rand(),利用每次循環(huán)生成的隨機(jī)數(shù)對(duì)應(yīng)的 數(shù)值 num 建
10、立初始的無(wú)序撲克,同時(shí)將 huase、value 分別賦給關(guān)鍵字 key0、 key1以對(duì)其進(jìn)行排序。根據(jù) num 控制撲克 value 的輸出格式。 for(i=1;i=t;i+)/*生成 t 張撲克*/ n=rand()%51; /*隨機(jī)生成 52 以內(nèi)的數(shù)*/ unsortpokeri.huase=pokern.huase;/*結(jié)構(gòu)體賦值*/ unsortpokeri.value=pokern.value; unsortpokeri.num=pokern.num; unsortpokeri.order=pokern.order; unsortpokeri.key0=unsortpoker
11、i.huase; /*關(guān)鍵字賦值*/ unsortpokeri.key1=unsortpokeri.order; k=(n+2)%13; /*用 num 控制 value 輸出形式*/ if(k=0|k=1|k=11|k=12) printf (%c%c ,pokern.huase,pokern.value); else printf (%c%d ,pokern.huase,pokern.value); 3按第 i 個(gè)關(guān)鍵字對(duì)記錄分配算法如下: 按第 i 位關(guān)鍵字 keyi建立 radix 個(gè)隊(duì)列,同一隊(duì)列中的 keyi相同。 headi和 taili分別指向各隊(duì)列中第一個(gè)和最后一個(gè)記錄。he
12、adj=0 表示相應(yīng) 隊(duì)列為空隊(duì)列。 void distribute(apoker r,int i,temp head,temp tail) int j,p; for(j=0;jradix;j+) headj=0;tailj=0; /*將個(gè)隊(duì)列初始化為空隊(duì)列*/ p=r0.next; /*p 指向鏈表中的第一個(gè)記錄*/ while(p!=0) j=rp.keyi;/*用記錄中第 i 位關(guān)鍵字求相應(yīng)隊(duì)列號(hào)*/ if(headj=0) headj=p;/*將 p 所指向的結(jié)點(diǎn)加入第 i 個(gè)結(jié)點(diǎn)中*/ else rtailj.next=p; tailj=p; p=rp.next; 4將分配后記錄收集
13、、連接算法如下: 從 0 到 radix-1 依次掃描各隊(duì)列,將所有非空隊(duì)列首尾相接,重新鏈接成 一個(gè)鏈表。 void collect(apoker r,temp head,temp tail) int j; int t; j=0; while(headj=0)/*找第一個(gè)非空隊(duì)列*/ j+; r0.next=headj; t=tailj; while(jradix-1)/*尋找并串接所有非空隊(duì)列*/ j+; while(jradix-1) if(headj!=0)/*鏈接非空隊(duì)列*/ rt.next=headj; t=tailj; rt.next=0;/*t 指向最后一個(gè)非空隊(duì)列中的最后一個(gè)
14、結(jié)點(diǎn)*/ 5按面值優(yōu)先對(duì)撲克排序接算法如下: 對(duì)長(zhǎng)為 len 的數(shù)組 r 進(jìn)行關(guān)鍵字先 key0(花色)后 key1(面值)的基數(shù)排序, 排序后的數(shù)組按關(guān)鍵字 key1(面值)優(yōu)先的順序存放,利用 num 控制輸出格 式將其輸出。 void valuepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=n-1;i+) ri.next=i+1;/*構(gòu)造靜態(tài)鏈表*/ rn.next=0; for(i=0;i=1;i+)/*從最低位關(guān)鍵字開(kāi)始,進(jìn)行分配收集*/ distribute(r,i,head
15、,tail); collect(r,head,tail); printf(按面值優(yōu)先排序后的撲克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; /*用 num 控制 value 輸出形式*/ if(k=0|k=1|k=11|k=12) printf (%c%c ,ri.huase,ri.value); else printf (%c%d ,ri.huase,ri.value); 6按花色優(yōu)先對(duì)撲克排序算法如下: 對(duì)長(zhǎng)為 len 的數(shù)組 r 進(jìn)行關(guān)鍵字先 key1(面值)后 key0(花色)的基數(shù)排序, 排序后的數(shù)組按關(guān)鍵字 key0(花色
16、)優(yōu)先的順序存放,利用 num 控制輸出格 式將其輸出。 void huasepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=0;i-) /*從最低位關(guān)鍵字開(kāi)始,進(jìn)行分配收集*/ distribute(r,i,head,tail); collect(r,head,tail); printf(按花色排序后的撲克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; /*用 num 控制 value 輸出形式*/ if(k=0|k=1|k=11|
17、k=12) printf (%c%c ,ri.huase,ri.value); else printf (%c%d ,ri.huase,ri.value); 4 調(diào)試與分析調(diào)試與分析 4.1 調(diào)試過(guò)程調(diào)試過(guò)程 在調(diào)試過(guò)程中,使用函數(shù) rand()時(shí),出現(xiàn)rand : undeclared identifier,意識(shí)到 是由于沒(méi)有添加#includes這個(gè)頭文件造成的,修改后就可以運(yùn)行了;還 有一個(gè)出現(xiàn)的問(wèn)題是,在一個(gè) for 循環(huán)中將 i 錯(cuò)寫(xiě)為 j,導(dǎo)致程序無(wú)法正常運(yùn)行, 通過(guò)單步跟蹤,找出問(wèn)題。在字符 ch 的輸入時(shí)少寫(xiě)了取地址符,使程序無(wú)法運(yùn) 行,加上后程序運(yùn)行正常。 4.2 程序執(zhí)行過(guò)
18、程程序執(zhí)行過(guò)程 首先要輸入需生成的撲克數(shù),如圖 4.1 所示: 圖 4.1 進(jìn)入系統(tǒng)的界面 生成需要張數(shù)的撲克如圖 4.2 所示: 圖 4.2 隨機(jī)生成的撲克 選擇按花色優(yōu)先排序后的撲克,如圖 4.3 所示: 圖 4.3 按花色優(yōu)先排序后的撲克 選擇按面值優(yōu)先排序后的撲克,如圖 4.4 所示: 圖 4.4 按面值優(yōu)先排序后的撲克 直到輸入操作選 c 退出系統(tǒng),算法結(jié)束。如圖 4.5 所示: 圖 4.5 退出系統(tǒng)后的界面 參考文獻(xiàn)參考文獻(xiàn) 1 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)m.北京:清華大學(xué)出版社,2007. 2 張長(zhǎng)海,陳娟.c 程序設(shè)計(jì)m.北京:高等教育出版社,2004. 3 譚浩強(qiáng).c 程序設(shè)計(jì)
19、m.北京:清華大學(xué)出版社,2005. 4 蘇士華,黃學(xué)俊.數(shù)據(jù)結(jié)構(gòu) 解析.習(xí)題.課程設(shè)計(jì)m.合肥:中國(guó)科學(xué)技術(shù)大學(xué) 出版社,2009. 5 張瑞軍.數(shù)據(jù)結(jié)構(gòu)m. 北京:清華大學(xué)出版社,2009. 6 劉懷亮. 數(shù)據(jù)結(jié)構(gòu) 習(xí)題解析與實(shí)驗(yàn)指導(dǎo)m. 北京:冶金出版社,2009. 附附 錄(關(guān)鍵部分程序清單)錄(關(guān)鍵部分程序清單) 程序代碼程序代碼 #include #include #include #define radix 13 typedef struct int value ; char huase; int num; int order; int key2; int next; apoke
20、r; apoker poker52; typedef int tempradix; apoker *createpoker(apoker unsortpoker,int t) int i,j,k,m; int n ; for(i=0;i52;i+) j=i/13;k=(i+2)%13; m=i%13; pokeri.order=m; if(j=0) pokeri.huase=3; else if(j=1) pokeri.huase=4; else if(j=2) pokeri.huase=5; else pokeri.huase=6; if(k=0) pokeri.value=75; else
21、 if(k=1) pokeri.value=65; else if(k=11) pokeri.value=74; else if(k=12) pokeri.value=81; else pokeri.value=k; pokeri.num=i; printf(隨機(jī)生成的撲克:n); for(i=1;i=t;i+) n=rand()%51; unsortpokeri.huase=pokern.huase; unsortpokeri.value=pokern.value; unsortpokeri.num=pokern.num; unsortpokeri.order=pokern.order; u
22、nsortpokeri.key0=unsortpokeri.huase; unsortpokeri.key1=unsortpokeri.order; k=(n+2)%13; if(k=0|k=1|k=11|k=12) printf (%c%c ,pokern.huase,pokern.value); else printf (%c%d ,pokern.huase,pokern.value); return unsortpoker; void distribute(apoker r,int i,temp head,temp tail) int j,p; for(j=0;jradix;j+) he
23、adj=0;tailj=0; p=r0.next; while(p!=0) j=rp.keyi; if(headj=0) headj=p; else rtailj.next=p; tailj=p; p=rp.next; void collect(apoker r,temp head,temp tail) int j; int t; j=0; while(headj=0) j+; r0.next=headj; t=tailj; while(jradix-1) j+; while(jradix-1) if(headj!=0) rt.next=headj; t=tailj; rt.next=0; v
24、oid valuepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=n-1;i+) ri.next=i+1; rn.next=0; for(i=0;i=1;i+) distribute(r,i,head,tail); collect(r,head,tail); printf(面值優(yōu)先排序排序后的撲克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; if(k=0|k=1|k=11|k=12) printf (%c%c ,ri.huase,r
25、i.value); else printf (%c%d ,ri.huase,ri.value); void huasepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=0;i-) distribute(r,i,head,tail); collect(r,head,tail); printf(花色優(yōu)先排序后的撲克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; if(k=0|k=1|k=11|k=12) printf (%c%c ,ri.huase,ri.value); else printf (%c%d ,ri.huase,ri.value); void main() int i,n; char ch; apoke
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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è)施維護(hù)合同三篇
- 網(wǎng)絡(luò)營(yíng)銷(xiāo)勞動(dòng)合同三篇
- 高速公路貨物運(yùn)輸合同三篇
- 汽車(chē)行業(yè)發(fā)展咨詢觀察
- 營(yíng)銷(xiāo)行業(yè)安全管理工作總結(jié)
- 2001年河南高考化學(xué)真題及答案(圖片版)
- DB32∕T 3512-2019 公路協(xié)同巡查管理系統(tǒng)建設(shè)技術(shù)規(guī)范
- 2024年美術(shù)教案范例
- 農(nóng)田水利工程招標(biāo)合同(2篇)
- 【部編版九下歷史】知識(shí)清單
- 高考真題 選擇性必修3《邏輯與思維》-2024年高考政治一輪復(fù)習(xí)選擇題+主觀題(新教材新高考)(解析版)
- 監(jiān)察法學(xué)智慧樹(shù)知到期末考試答案2024年
- 糖尿病酮癥酸中毒PPT小講課
- 百香果的栽培條件
- 2024版國(guó)開(kāi)電大法學(xué)本科《商法》歷年期末考試總題庫(kù)
- 湖北省荊州市荊州八縣市區(qū)2023-2024學(xué)年高一上學(xué)期1月期末聯(lián)考物理試題(原卷版)
- 小程序商場(chǎng)方案
- 班組年終總結(jié)
- 廣西桂林市2023-2024學(xué)年高二上學(xué)期期末考試物理試卷
- 內(nèi)蒙古赤峰市2023-2024學(xué)年高一上學(xué)期期末考試物理試題【含答案解析】
- nfc果汁加工工藝
評(píng)論
0/150
提交評(píng)論