

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計 報 告</p><p> 課程設計名稱:數(shù)據(jù)結(jié)構(gòu)課程設計</p><p> 課程設計題目:撲克牌的排序</p><p><b> 目 錄</b></p><p> 1 課程設計介紹1</p><p> 1.1 課程設計內(nèi)容1</p&
2、gt;<p> 1.2 課程設計要求1</p><p> 2 課程設計原理2</p><p> 2.1 課設題目粗略分析2</p><p> 2.2 原理圖介紹2</p><p> 2.2.1 功能模塊圖2</p><p> 2.2.2 流程圖分析3</p><
3、;p> 3 數(shù)據(jù)結(jié)構(gòu)分析6</p><p> 3.1 存儲結(jié)構(gòu)6</p><p> 3.2 算法描述6</p><p> 4 調(diào)試與分析12</p><p> 4.1 調(diào)試過程12</p><p> 4.2 程序執(zhí)行過程12</p><p><b>
4、 參考文獻15</b></p><p> 附 錄(關鍵部分程序清單)16</p><p><b> 1 課程設計介紹</b></p><p> 1.1 課程設計內(nèi)容</p><p> 編寫算法能夠用基數(shù)排序算法對撲克牌進行排序。應能夠選擇按花色優(yōu)先或按面值優(yōu)先,初始撲克牌牌序要求能自動生成(
5、隨機生成)。 </p><p> 1.2 課程設計要求</p><p> 1.花色的符號可自定,輸出要求給出初始牌序和結(jié)果牌序。 </p><p> 2.參考相應資料,獨立完成課程設計任務。</p><p> 3.交規(guī)范課程設計報告和軟件代碼。</p><p><b> 2 課程設計原理&l
6、t;/b></p><p> 2.1 課設題目粗略分析</p><p> 根據(jù)課設題目要求,擬將整體程序分為三大模塊。此三個模塊相互獨立,沒有嵌套調(diào)用的情況,以下是三個模塊的大體分析:</p><p> 1.建立一個結(jié)構(gòu)體數(shù)組存放整副撲克。</p><p> 2.根據(jù)要求的撲克數(shù)及生成的隨機數(shù)建立一個結(jié)構(gòu)體數(shù)組存放需要排序的撲克
7、。</p><p> 3.用基數(shù)排序的方法對隨機生成的撲克進行相應要求的排序 </p><p><b> 2.2 原理圖介紹</b></p><p> 2.2.1 功能模塊圖</p><p> 圖2. 1 功能模塊圖 </p><p> 2.2.2 流程圖分析</p>
8、<p> 1.隨機生成需排序的撲克函數(shù)流程圖,如圖2.2所示:</p><p><b> Y</b></p><p><b> Y</b></p><p> 圖2.2生成隨機撲克的流程圖</p><p> 利用一個for循環(huán)及隨機函數(shù)rand(),利用每次循環(huán)生成的隨機數(shù)對應的數(shù)
9、值num建立初始的無序撲克,同時將huase、value分別賦給關鍵字key[0]、key[1]以對其進行排序</p><p> 2. 對撲克進行花色優(yōu)先排序的函數(shù)流程圖,如圖2.3所示:</p><p><b> Y</b></p><p> 圖2.3對撲克進行花色優(yōu)先排序的流程圖</p><p> 對長為n的
10、數(shù)組R,利用next域建立為靜態(tài)鏈表,進行關鍵字先key[1](面值)后key[0](花色)的基數(shù)排序,排序后的數(shù)組按關鍵字key[0](花色)優(yōu)先的順序存放,利用靜態(tài)鏈表依次將其輸出。</p><p> 3. 對撲克進行面值優(yōu)先排序的函數(shù)流程圖如圖2.4所示:</p><p><b> Y</b></p><p> 圖2.4對撲克進行面
11、值優(yōu)先排序的流程圖</p><p> 對長為n的數(shù)組R,利用next域建成靜態(tài)鏈表,進行關鍵字先key[0](花色)后key[1](面值)的基數(shù)排序,排序后的數(shù)組按關鍵字key[1](面值)優(yōu)先的順序存放,利用靜態(tài)鏈表依次將其輸出。</p><p><b> 3 數(shù)據(jù)結(jié)構(gòu)分析</b></p><p><b> 3.1 存儲結(jié)構(gòu)
12、</b></p><p> typedef struct </p><p> {int value ; // 撲克面值</p><p> char huase; // 撲克花色</p><p> int num; // 控制面值輸出形式</p><p> int orde
13、r; // 在同一花色撲克的位置</p><p> int key[2]; // 排序用的關鍵字</p><p> int next; // 下一個撲克的位置</p><p> }apoker; // 定義一個結(jié)構(gòu)體表示一張撲克</p><p> apoker poker[52]; // 定義一個大小為52的結(jié)構(gòu)
14、體數(shù),組存放整副撲克</p><p> apoker unsortpoker[max] ; // 定義一個足夠大的結(jié)構(gòu)體數(shù)組,存放需排序的撲克</p><p> typedef int temp[radix]; // 大小為關鍵字的基數(shù)的整形數(shù)組,用于基數(shù)排序的分配、收集</p><p><b> 3.2 算法描述</b><
15、;/p><p> 1.初始化建立撲克的算法描述說明如下:</p><p> 結(jié)構(gòu)體名定義為apoker,poker[52],unsortpoker[max]是apoker類型,對其賦上每個結(jié)點的名字,每個名字對應自己的一個num,以控制面值的輸出形式,value對應撲克的面值,huase對應撲克的花色。</p><p> for(i=0;i<52;i++)/
16、*建立整副撲克*/</p><p> { j=i/13;/*將撲克分為四種花色*/</p><p> k=(i+2)%13; /*控制面值的輸出形式*/</p><p> m=i%13;/*同一花色中所處的位置*/</p><p> poker[i].order=m;</p><p> if(j==0
17、) poker[i].huase=3;/*花色賦值*/</p><p> else if(j==1) poker[i].huase=4;</p><p> else if(j==2) poker[i].huase=5;</p><p> else poker[i].huase=6;</p><p> if(k==0) poker[i]
18、.value=75;/*面值賦值*/</p><p> else if(k==1) poker[i].value=65;</p><p> else if(k==11) poker[i].value=74;</p><p> else if(k==12) poker[i].value=81;</p><p> else poker
19、[i].value=k;</p><p> poker[i].num=i;</p><p><b> }</b></p><p> 2.隨機生成初始撲克的算法描述如下:</p><p> 利用一個for循環(huán)及隨機函數(shù)rand(),利用每次循環(huán)生成的隨機數(shù)對應的數(shù)值num建立初始的無序撲克,同時將huase、val
20、ue分別賦給關鍵字key[0]、key[1]以對其進行排序。根據(jù)num控制撲克value的輸出格式。</p><p> for(i=1;i<=t;i++)/*生成t張撲克*/</p><p><b> { </b></p><p> n=rand()%51; /*隨機生成52以內(nèi)的數(shù)*/</p><p>
21、 unsortpoker[i].huase=poker[n].huase;/*結(jié)構(gòu)體賦值*/</p><p> unsortpoker[i].value=poker[n].value;</p><p> unsortpoker[i].num=poker[n].num;</p><p> unsortpoker[i].order=poker[n].order;&
22、lt;/p><p> unsortpoker[i].key[0]=unsortpoker[i].huase; /*關鍵字賦值*/</p><p> unsortpoker[i].key[1]=unsortpoker[i].order;</p><p> k=(n+2)%13; /*用num控制value輸出形式*/</p><p>
23、; if(k==0||k==1||k==11||k==12) </p><p> printf ("%c%c ",poker[n].huase,poker[n].value);</p><p> else printf ("%c%d ",poker[n].huase,poker[n].value);</p><p>
24、;<b> }</b></p><p> 3.按第i個關鍵字對記錄分配算法如下:</p><p> 按第i位關鍵字key[i]建立radix個隊列,同一隊列中的key[i]相同。head[i]和tail[i]分別指向各隊列中第一個和最后一個記錄。head[j]=0表示相應隊列為空隊列。 </p><p> void distribut
25、e(apoker r[],int i,temp head,temp tail)</p><p> { int j,p;</p><p> for(j=0;j<radix;j++)</p><p> {head[j]=0;tail[j]=0;} /*將個隊列初始化為空隊列*/</p><p> p=r[0].next;
26、/*p指向鏈表中的第一個記錄*/</p><p> while(p!=0)</p><p><b> {</b></p><p> j=r[p].key[i];/*用記錄中第i位關鍵字求相應隊列號*/</p><p> if(head[j]==0)</p><p> head[j]=p;
27、/*將p所指向的結(jié)點加入第i個結(jié)點中*/</p><p> else r[tail[j]].next=p;</p><p> tail[j]=p;</p><p> p=r[p].next;</p><p><b> }</b></p><p><b> }</b>
28、;</p><p> 4.將分配后記錄收集、連接算法如下:</p><p> 從0到radix-1依次掃描各隊列,將所有非空隊列首尾相接,重新鏈接成一個鏈表。</p><p> void collect(apoker r[],temp head,temp tail)</p><p><b> {</b><
29、;/p><p><b> int j;</b></p><p><b> int t;</b></p><p><b> j=0;</b></p><p> while(head[j]==0)/*找第一個非空隊列*/</p><p><b>
30、; j++;</b></p><p> r[0].next=head[j];</p><p> t=tail[j];</p><p> while(j<radix-1)/*尋找并串接所有非空隊列*/</p><p><b> {</b></p><p><b>
31、; j++;</b></p><p> while((j<radix-1)&&(head[j]==0))/*找下一個非空隊列*/</p><p><b> j++;</b></p><p> if(head[j]!=0)/*鏈接非空隊列*/</p><p><b>
32、{</b></p><p> r[t].next=head[j];</p><p> t=tail[j];</p><p><b> }</b></p><p><b> }</b></p><p> r[t].next=0;/*t指向最后一個非空隊列中
33、的最后一個結(jié)點*/</p><p><b> }</b></p><p> 5.按面值優(yōu)先對撲克排序接算法如下:</p><p> 對長為len的數(shù)組R進行關鍵字先key[0](花色)后key[1](面值)的基數(shù)排序,排序后的數(shù)組按關鍵字key[1](面值)優(yōu)先的順序存放,利用num控制輸出格式將其輸出。</p><p
34、> void valuepresort(apoker r[],int len)</p><p><b> {</b></p><p> int i,n,k;</p><p><b> n=len;</b></p><p> temp head,tail;</p>
35、<p><b> n=len;</b></p><p> for(i=0;i<=n-1;i++)</p><p> r[i].next=i+1;/*構(gòu)造靜態(tài)鏈表*/</p><p> r[n].next=0;</p><p> for(i=0;i<=1;i++)/*從最低位關鍵字開始,進行
36、分配收集*/</p><p><b> {</b></p><p> distribute(r,i,head,tail);</p><p> collect(r,head,tail);</p><p><b> }</b></p><p> printf("
37、;按面值優(yōu)先排序后的撲克:\n");</p><p> for(i=r[0].next;i!=0;i=r[i].next)</p><p> { k=(r[i].num+2)%13; /*用num控制value輸出形式*/</p><p> if(k==0||k==1||k==11||k==12) </p><p> p
38、rintf ("%c%c ",r[i].huase,r[i].value);</p><p> else printf ("%c%d ",r[i].huase,r[i].value);</p><p><b> }</b></p><p><b> }</b></p
39、><p> 6.按花色優(yōu)先對撲克排序算法如下:</p><p> 對長為len的數(shù)組R進行關鍵字先key[1](面值)后key[0](花色)的基數(shù)排序,排序后的數(shù)組按關鍵字key[0](花色)優(yōu)先的順序存放,利用num控制輸出格式將其輸出。</p><p> void huasepresort(apoker r[],int len)</p><
40、;p><b> {</b></p><p> int i,n,k;</p><p><b> n=len;</b></p><p> temp head,tail;</p><p><b> n=len;</b></p><p>
41、for(i=0;i<=n-1;i++)</p><p> r[i].next=i+1; /*構(gòu)造靜態(tài)鏈表*/</p><p> r[n].next=0;</p><p> for(i=1;i>=0;i--) /*從最低位關鍵字開始,進行分配收集*/</p><p><b> {</b><
42、;/p><p> distribute(r,i,head,tail);</p><p> collect(r,head,tail);</p><p><b> }</b></p><p> printf("按花色排序后的撲克:\n");</p><p> for(i=r[
43、0].next;i!=0;i=r[i].next)</p><p> { k=(r[i].num+2)%13; /*用num控制value輸出形式*/</p><p> if(k==0||k==1||k==11||k==12) printf ("%c%c ",r[i].huase,r[i].value);</p><p> els
44、e printf ("%c%d ",r[i].huase,r[i].value);</p><p><b> }</b></p><p><b> }</b></p><p><b> 4 調(diào)試與分析</b></p><p><b>
45、 4.1 調(diào)試過程</b></p><p> 在調(diào)試過程中,使用函數(shù)rand()時,出現(xiàn)'rand' : undeclared identifier,意識到是由于沒有添加#includes<time.h>這個頭文件造成的,修改后就可以運行了;還有一個出現(xiàn)的問題是,在一個for循環(huán)中將i錯寫為j,導致程序無法正常運行,通過單步跟蹤,找出問題。在字符ch的輸入時少寫了取地址符
46、,使程序無法運行,加上后程序運行正常。</p><p> 4.2 程序執(zhí)行過程</p><p> 首先要輸入需生成的撲克數(shù),如圖4.1所示:</p><p> 圖4.1 進入系統(tǒng)的界面</p><p> 生成需要張數(shù)的撲克如圖4.2所示:</p><p> 圖4.2 隨機生成的撲克</p>&l
47、t;p> 選擇按花色優(yōu)先排序后的撲克,如圖4.3所示:</p><p> 圖4.3按花色優(yōu)先排序后的撲克</p><p> 選擇按面值優(yōu)先排序后的撲克,如圖4.4所示:</p><p> 圖4.4按面值優(yōu)先排序后的撲克</p><p> 直到輸入操作選C退出系統(tǒng),算法結(jié)束。如圖4.5所示:</p><p&g
48、t; 圖4.5退出系統(tǒng)后的界面</p><p><b> 參考文獻</b></p><p> [1] 嚴蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)[M].北京:清華大學出版社,2007.</p><p> [2] 張長海,陳娟.C程序設計[M].北京:高等教育出版社,2004. </p><p> [3] 譚浩強.C程序設計[M]
49、.北京:清華大學出版社,2005.</p><p> [4] 蘇士華,黃學俊.數(shù)據(jù)結(jié)構(gòu) 解析.習題.課程設計[M].合肥:中國科學技術(shù)大學出版社,2009.</p><p> [5] 張瑞軍.數(shù)據(jù)結(jié)構(gòu)[M]. 北京:清華大學出版社,2009.</p><p> [6] 劉懷亮. 數(shù)據(jù)結(jié)構(gòu) 習題解析與實驗指導[M]. 北京:冶金出版社,2009.</p&g
50、t;<p> 附 錄(關鍵部分程序清單)</p><p><b> 程序代碼</b></p><p> #include <stdio.h></p><p> #include <time.h></p><p> #include <stdlib.h><
51、;/p><p> #define radix 13</p><p> typedef struct </p><p> {int value ;</p><p> char huase;</p><p> int num;</p><p> int order;</
52、p><p> int key[2];</p><p><b> int next;</b></p><p><b> }apoker;</b></p><p> apoker poker[52];</p><p> typedef int temp[radix];
53、</p><p> apoker *createpoker(apoker unsortpoker[],int t)</p><p> { int i,j,k,m;</p><p><b> int n ;</b></p><p> for(i=0;i<52;i++)</p><p&
54、gt; { j=i/13;k=(i+2)%13; m=i%13;</p><p> poker[i].order=m;</p><p> if(j==0) poker[i].huase=3;</p><p> else if(j==1) poker[i].huase=4;</p><p> else if(j==2) poker[i
55、].huase=5;</p><p> else poker[i].huase=6;</p><p> if(k==0) poker[i].value=75;</p><p> else if(k==1) poker[i].value=65;</p><p> else if(k==11) poker[i].value=74;<
56、/p><p> else if(k==12) poker[i].value=81;</p><p> else poker[i].value=k;</p><p> poker[i].num=i;</p><p><b> }</b></p><p> printf("隨機生成
57、的撲克:\n");</p><p> for(i=1;i<=t;i++)</p><p><b> { </b></p><p> n=rand()%51; </p><p> unsortpoker[i].huase=poker[n].huase;</p><p>
58、unsortpoker[i].value=poker[n].value;</p><p> unsortpoker[i].num=poker[n].num;</p><p> unsortpoker[i].order=poker[n].order;</p><p> unsortpoker[i].key[0]=unsortpoker[i].huase;<
59、/p><p> unsortpoker[i].key[1]=unsortpoker[i].order;</p><p> k=(n+2)%13;</p><p> if(k==0||k==1||k==11||k==12) printf ("%c%c ",poker[n].huase,poker[n].value);</p>&l
60、t;p> else printf ("%c%d ",poker[n].huase,poker[n].value);</p><p><b> }</b></p><p> return unsortpoker;</p><p><b> }</b></p><p&g
61、t; void distribute(apoker r[],int i,temp head,temp tail)</p><p> { int j,p;</p><p> for(j=0;j<radix;j++)</p><p> {head[j]=0;tail[j]=0;}</p><p> p=r[0].next
62、;</p><p> while(p!=0)</p><p><b> {</b></p><p> j=r[p].key[i];</p><p> if(head[j]==0)</p><p> head[j]=p;</p><p> else r[tail
63、[j]].next=p;</p><p> tail[j]=p;</p><p> p=r[p].next;</p><p><b> }</b></p><p><b> }</b></p><p> void collect(apoker r[],temp
64、head,temp tail)</p><p><b> {</b></p><p><b> int j;</b></p><p><b> int t;</b></p><p><b> j=0;</b></p><p>
65、; while(head[j]==0)</p><p><b> j++;</b></p><p> r[0].next=head[j];</p><p> t=tail[j];</p><p> while(j<radix-1)</p><p><b> {</
66、b></p><p><b> j++;</b></p><p> while((j<radix-1)&&(head[j]==0))</p><p><b> j++;</b></p><p> if(head[j]!=0)</p><p>
67、;<b> {</b></p><p> r[t].next=head[j];</p><p> t=tail[j];</p><p><b> }</b></p><p><b> }</b></p><p> r[t].next=0;&l
68、t;/p><p><b> }</b></p><p> void valuepresort(apoker r[],int len)</p><p><b> {</b></p><p> int i,n,k;</p><p><b> n=len;<
69、;/b></p><p> temp head,tail;</p><p><b> n=len;</b></p><p> for(i=0;i<=n-1;i++)</p><p> r[i].next=i+1;</p><p> r[n].next=0;</p>
70、;<p> for(i=0;i<=1;i++)</p><p><b> {</b></p><p> distribute(r,i,head,tail);</p><p> collect(r,head,tail);</p><p><b> }</b></p&
71、gt;<p> printf("面值優(yōu)先排序排序后的撲克:\n");</p><p> for(i=r[0].next;i!=0;i=r[i].next)</p><p> { k=(r[i].num+2)%13;</p><p> if(k==0||k==1||k==11||k==12) printf ("%
72、c%c ",r[i].huase,r[i].value);</p><p> else printf ("%c%d ",r[i].huase,r[i].value);</p><p><b> }</b></p><p><b> }</b></p><p>
73、; void huasepresort(apoker r[],int len)</p><p><b> {</b></p><p> int i,n,k;</p><p><b> n=len;</b></p><p> temp head,tail;</p><
74、;p><b> n=len;</b></p><p> for(i=0;i<=n-1;i++)</p><p> r[i].next=i+1;</p><p> r[n].next=0;</p><p> for(i=1;i>=0;i--)</p><p><b&
75、gt; {</b></p><p> distribute(r,i,head,tail);</p><p> collect(r,head,tail);</p><p><b> }</b></p><p> printf("花色優(yōu)先排序后的撲克:\n");</p>
76、<p> for(i=r[0].next;i!=0;i=r[i].next)</p><p> { k=(r[i].num+2)%13;</p><p> if(k==0||k==1||k==11||k==12) printf ("%c%c ",r[i].huase,r[i].value);</p><p> else
77、 printf ("%c%d ",r[i].huase,r[i].value);</p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p> { int i,N;</p><
78、;p><b> char ch;</b></p><p> apoker unsortpoker[100];</p><p> printf("說明:花色順序:%c<%c<%c<%c, 面值順序%d<%d<...<%c<%c<%c<%c",3,4,5,6,2,3,74,81,
79、75,65);</p><p> printf("\n A.花色優(yōu)先排序 B.面值優(yōu)先排序 C.退出系統(tǒng)\n");</p><p> for(i=0;i<100;i++)</p><p> { printf("\n輸入撲克張數(shù): \n");</p><p>
80、; scanf("%d",&N);</p><p> createpoker(unsortpoker,N);</p><p> getchar();</p><p> printf("\n輸入要進行的操作:\n");</p><p> scanf("%c",&
81、;ch);</p><p> if(ch=='A') huasepresort(unsortpoker,N);</p><p> else if(ch=='B') valuepresort(unsortpoker,N);</p><p> else if(ch=='C') break;</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 撲克牌洗牌發(fā)牌過程模擬課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計-拓撲排序
- 數(shù)據(jù)結(jié)構(gòu)課程設計--排序算法
- 數(shù)據(jù)結(jié)構(gòu)課程設計報告--排序
- 數(shù)據(jù)結(jié)構(gòu)課程設計-拓撲排序
- 數(shù)據(jù)結(jié)構(gòu)課程設計---排序綜合
- 撲克牌文化
- 解讀撲克牌
- 數(shù)據(jù)結(jié)構(gòu)課程設計---希爾排序,冒泡排序,快速排序
- 數(shù)據(jù)結(jié)構(gòu)課程設計--冒泡排序法
- 數(shù)據(jù)結(jié)構(gòu)排序綜合課程設計報告
- 數(shù)據(jù)結(jié)構(gòu)排序綜合課程設計報告
- 數(shù)據(jù)結(jié)構(gòu)排序綜合課程設計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設計---排序算法比較
- 撲克牌團隊活動
- 數(shù)據(jù)結(jié)構(gòu)課程設計--排序算法比較
- 數(shù)據(jù)結(jié)構(gòu)課程設計--內(nèi)部排序演示
- 幼兒撲克牌玩法
- 數(shù)據(jù)結(jié)構(gòu)課程設計—綜合排序的設計
- 撲克牌英語大全
評論
0/150
提交評論