Programming Assignment #4

假設有一部自動販賣機販售下列八種商品選項:

A: 可樂,單價 NTD 30

B: 雪碧,單價 NTD 30

C: 礦泉水,單價 NTD 20

D: 茶堣,單價 NTD 25

E: 科學麵,單價 NTD 10

F: 卡迪那,單價 NTD 20

G: 阿Q泡麵,單價 NTD 50

H: 小熊餅乾,單價 NTD 35

依據下列的規則,寫一個 C 語言程式,模擬此自動販賣機的行為。

  1. 此販賣機有五個動作選項的按鈕:"a" 投幣,"b" 選擇商品,"c" 取消商品,"d" 購買, "e" 取消交易。

  2. 當按下 "a" 投幣鈕後,顧客可投入 1 元、5 元、10 元、或 50 元硬幣。硬幣投入是以輸入 1, 5, 10, 50 的整數方式表示;當輸入 0 時,即表示投幣結束; 若輸入其他數字,則為投幣無效,可繼續投幣。程式須紀錄投入各種硬幣的個數,及投入總金額。

  3. 當按下 "b" 商品選擇鈕後,顧客可按商品項目按鈕以選擇要購買的商品。商品按鈕以輸入英文字 'A', 'B', 'C', 'D', 'E', 'F', 'G', 和 'H' 代表上述的八種商品;當輸入 'Q' 時,表示商品選擇結束;若輸入其他字母,則為商品選擇無效。按下商品選擇鈕後,可連續選擇多項商品。程式須紀錄選擇商品的種類和數量。

  4. 當按下 "c" 商品取消鈕後,顧客可按商品項目按鈕。每按一次商品取消鈕,只能取消一次商品,輸入 'A', 'B', 'C', 'D', 'E', 'F', 'G', 和 'H' 代表取消上述八種商品之一;如果輸入其他字母,表示此次商品取消無效。當取消一個商品時,此商品的選購數量必須大於 0, 程式須將此商品選購數量減 1;如果被取消的商品之選購數量為 0,則此次商品取消無效。

  5. 當按下 "d" 購買鈕時,程式需計算所選購商品的總金額。

    1. 如果投幣總金額大於或等於商品總金額,則輸出所選購的商品及數量,表示販賣機吐出顧客選購的商品,並輸出找零的金額,表示找還零錢;同時結束此次販賣機的交易。找零錢時,程式須輸出找零總額和最佳的硬幣組合。

    2. 如果投幣總金額小於商品總金額,則顯示「金額不足」的訊息,並執行 "a" 投幣鈕的動作。

  6. 當按下 "e" 交易取消鈕後,將顧客所投入的硬幣退回。程式須輸出所投入的硬幣面值和個數,以及投入總金額,表示退款。交易取消後,即結束次販賣機的交易。

  7. 以上每個動作結束後,程式須顯示目前的交易狀態,即顯示投幣總金額,和商品選項、個數、和商品總金額。

程式執行碼,程式執行範例:

>>> 如要繼續購買商品,請輸入 'Y';如要停止購買,請輸入 'N':Y

########################################
  目前交易狀態
    已投入金額: 0
    尚未選擇商品
########################################

        按鈕選擇:
          a: 投入硬幣
          b: 選擇商品
          c: 取消商品
          d: 購買商品
          e: 取消交易

>>> 請選擇按鈕:
a

>>> 請投入 1 元,5 元,10 元或,50 元的硬幣 (投幣完成請輸入 0):
50
$$$$ 投入一個 50 元硬幣

########################################
  目前交易狀態
    已投入金額: 50
    尚未選擇商品
########################################

>>> 請投入 1 元,5 元,10 元或,50 元的硬幣 (投幣完成請輸入 0):
10
$$$$ 投入一個 10 元硬幣

########################################
  目前交易狀態
    已投入金額: 60
    尚未選擇商品
########################################

>>> 請投入 1 元,5 元,10 元或,50 元的硬幣 (投幣完成請輸入 0):
10
$$$$ 投入一個 10 元硬幣

########################################
  目前交易狀態
    已投入金額: 70
    尚未選擇商品
########################################

>>> 請投入 1 元,5 元,10 元或,50 元的硬幣 (投幣完成請輸入 0):
5
$$$$ 投入一個 5 元硬幣

########################################
  目前交易狀態
    已投入金額: 75
    尚未選擇商品
########################################

>>> 請投入 1 元,5 元,10 元或,50 元的硬幣 (投幣完成請輸入 0):
0
$$$$ 投幣結束

########################################
  目前交易狀態
    已投入金額: 75
    尚未選擇商品
########################################

        按鈕選擇:
          a: 投入硬幣
          b: 選擇商品
          c: 取消商品
          d: 購買商品
          e: 取消交易

>>> 請選擇按鈕:
b

########################################
  目前交易狀態
    已投入金額: 75
    尚未選擇商品
########################################

        商品選項:
          A: 可樂 30
          B: 雪碧 30
          C: 礦泉水 20
          D: 茶堣 25
          E: 科學麵 10
          F: 卡迪那 20
          G: 阿Q泡麵 50
          H: 小熊餅乾 35
          Q: 結束商品選擇

>>> 請輸入選擇的商品代號:
C
**** 選擇商品:礦泉水

########################################
  目前交易狀態
    已投入金額: 75
    選擇商品總價: 20
    已選擇商品項目:
      礦泉水 : 1
########################################

        商品選項:
          A: 可樂 30
          B: 雪碧 30
          C: 礦泉水 20
          D: 茶堣 25
          E: 科學麵 10
          F: 卡迪那 20
          G: 阿Q泡麵 50
          H: 小熊餅乾 35
          Q: 結束商品選擇

>>> 請輸入選擇的商品代號:
Q
**** 結束商品選擇

########################################
  目前交易狀態
    已投入金額: 75
    選擇商品總價: 20
    已選擇商品項目:
      礦泉水 : 1
########################################

        按鈕選擇:
          a: 投入硬幣
          b: 選擇商品
          c: 取消商品
          d: 購買商品
          e: 取消交易

>>> 請選擇按鈕:
d

**** 購買商品:
       礦泉水 : 1
**** 退回零錢 55 元:
       50 元硬幣 1 個
       5  元硬幣 1 個

>>> 如要繼續購買商品,請輸入 'Y';如要停止購買,請輸入 'N':
N