moea_joint_essay
104年
[資訊] 資訊管理、程式設計
第 三 題
📖 題組:
如欲以結構化程式設計方式利用堆疊設計一簡易撲克牌遊戲發牌系統,包含洗牌、切牌及發牌,以數字 1~52代表撲克牌 52張牌,堆疊陣列 R[0..51]儲存代表 52張撲克牌之數字,R[51]為底部第 52 張牌,R[0]為頂部第 1 張牌:
如欲以結構化程式設計方式利用堆疊設計一簡易撲克牌遊戲發牌系統,包含洗牌、切牌及發牌,以數字 1~52代表撲克牌 52張牌,堆疊陣列 R[0..51]儲存代表 52張撲克牌之數字,R[51]為底部第 52 張牌,R[0]為頂部第 1 張牌:
📝 此題為申論題,共 4 小題
小題 (三)
開始發牌後,如何判斷已發牌至堆疊陣列 R 之底部,以及如何繼續取出下一張牌至整副牌發完?試以流程圖表示之。(10 分)
思路引導 VIP
接續切牌後的發牌。可以設定兩個階段,或利用模除運算(modulo)來循環陣列索引。如果用簡單的指標方法:設定變數 idx 指向當前要發的牌。初始化 idx = 20,計數器 count = 0。每次發出 R[idx],然後 count++。如果 count == 52,發完結束。找下一張牌時,idx++,如果判斷 idx > 51(到達 R 之底部 R[51] 之後),就將 idx 設為 0,繼續從 R[0] 取出,直到 count 達到 52。
小題 (一)
洗牌部分,先用亂數方式隨機取出上述 52 個數字其中 1 個數字(代表隨機取一張牌)以堆疊方式填入陣列 R 之底部,再繼續取下 1 個數字(下一張牌,須判斷亂數取出之數是否已被取出過,若已取過須重取)以堆疊方式依序填入陣列 R,直至 52 個數字(52 張牌)皆被取出填入陣列 R 為止,試畫出其流程圖。(5 分)
思路引導 VIP
繪製流程圖。初始化陣列 R 或一個輔助的 '已取過' 標記陣列。迴圈從 i=51 遞減到 0 (代表由底部 R[51] 填至頂部 R[0])。每次產生亂數,檢查是否重複,重複則重新產生,不重複則存入 R[i],記錄已產生,迴圈結束則洗牌完成。
小題 (二)
已用隨機方式選擇從陣列 R 第 20 張牌(R[19])切牌,並開始取出發牌,請問取出發牌的順序為何?請以 R 陣列內含引數 R[i]方式表示。(5 分)
思路引導 VIP
切牌是指將牌堆分成兩半並交換順序。原本堆疊頂部是 R[0],切牌點在 R[19](第20張)。從 R[19] 切牌,意味著將 R[0]~R[19] 這 20 張牌移到牌堆底部,而 R[20]~R[51] 這 32 張牌移到牌堆頂部。發牌時由頂部開始發,因此先發原本位於 R[20] 的牌,一路發到 R[51];接著發原本位於 R[0] 的牌,一路發到 R[19]。
小題 (四)
洗牌及切牌均須隨機從 1~52 取出一數字,今有一無參數之亂數函數 rand( )可隨機傳回值 K,其中 0 ≤ K < 1,請問如何利用 rand( )隨機取出 1~52,試寫出其程式表示式。(5 分)
思路引導 VIP
K 的範圍是 [0, 1)。要轉換成 1 到 52 的整數。K * 52 範圍是 [0, 52)。無條件捨去取整數(如 int 強制轉型或 floor 函數)後範圍是整數 0 ~ 51。加 1 後,範圍變成 1 ~ 52。