免費開始練習
moea_joint_essay 104年 [資訊] 資訊管理、程式設計

第 四 題

📖 題組:
如欲以結構化程式設計方式利用堆疊設計一簡易撲克牌遊戲發牌系統,包含洗牌、切牌及發牌,以數字 1~52代表撲克牌 52張牌,堆疊陣列 R[0..51]儲存代表 52張撲克牌之數字,R[51]為底部第 52 張牌,R[0]為頂部第 1 張牌:
📝 此題為申論題,共 4 小題

小題 (四)

洗牌及切牌均須隨機從 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。

🤖
AI 詳解
AI 專屬家教

要將範圍 0 ≤ K < 1 的亂數轉換為 1~52 的整數,可將 K 乘以 52,無條件捨去小數點取整數後,再加 1。 程式表示式(以常見語言語法或虛擬碼表示): Result = INT( rand() * 52 ) + 1

小題 (一)

洗牌部分,先用亂數方式隨機取出上述 52 個數字其中 1 個數字(代表隨機取一張牌)以堆疊方式填入陣列 R 之底部,再繼續取下 1 個數字(下一張牌,須判斷亂數取出之數是否已被取出過,若已取過須重取)以堆疊方式依序填入陣列 R,直至 52 個數字(52 張牌)皆被取出填入陣列 R 為止,試畫出其流程圖。(5 分)

思路引導 VIP

繪製流程圖。初始化陣列 R 或一個輔助的 '已取過' 標記陣列。迴圈從 i=51 遞減到 0 (代表由底部 R[51] 填至頂部 R[0])。每次產生亂數,檢查是否重複,重複則重新產生,不重複則存入 R[i],記錄已產生,迴圈結束則洗牌完成。

🤖
AI 詳解
AI 專屬家教

流程圖說明如下(文字描述):

  1. 開始 (Start)
  2. 初始化變數:設定 i = 51(指向堆疊底部 R[51]),準備一個布林陣列 Used[1..52] 初始值為 False(用來記錄數字是否被取出過)。

小題 (二)

已用隨機方式選擇從陣列 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]。

🤖
AI 詳解
AI 專屬家教

切牌動作是將牌堆分為兩部分並對調位置。原本由頂部向底部的順序為 R[0], R[1], ..., R[51]。 從第 20 張牌(R[19])切牌,表示將 R[0] 到 R[19] 這 20 張牌(原本的上半部)移至最底部;而將 R[20] 到 R[51] 這 32 張牌(原本的下半部)移至最頂部。 因為堆疊發牌是從頂部開始取出,所以發牌的順序為:

小題 (三)

開始發牌後,如何判斷已發牌至堆疊陣列 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。

🤖
AI 詳解
AI 專屬家教

為實現循環發牌,可使用一個索引變數與一個計數器,流程圖文字說明如下:

  1. 開始 (Start)
  2. 初始化:設定目前索引 idx = 20(切牌後的第一張牌),設定發牌計數器 count = 0

🏷️ 相關主題

物件導向程式設計與系統分析核心概念
查看更多「[資訊] 資訊管理、程式設計」的主題分類考古題