1. 程式人生 > >Python練習【5】【自動售貨系統】

Python練習【5】【自動售貨系統】

不足 ESS exceptio dsw default 限制 int coin 提示信息

題目:

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片


代碼:

# 商品屬性
prize_default = [2, 3, 4, 5, 8, 6]
goods_info = {‘A‘ + str(i+1): dict(prize=prize_default[i], quantity=0) for i in range(6)}

# 存錢盒信息
money_default = [1, 2, 5, 10]
moneybox_info = {money_default[i]: 0 for i in range(4)}

money_balance = 0# 投入累計
cmd_list = [‘r‘, ‘p‘, ‘b‘, ‘c‘, ‘q‘]# 命令類型
cmd_in_all=[]# 命令倉
refund_coin=[]# 退幣倉

# 命令拆分並執行
def cmd_exec():
    cmd_in = input()
    if (cmd_in[0] not in cmd_list) or not cmd_in.endswith(‘;‘): # 輸入命令不合法提示並返回
        print(‘invalid cmd‘)
        return
    cmd_in_all = cmd_in.rstrip(‘;‘).split(‘;‘)# 多個命令分割
    for i in cmd_in_all: # 多個命令依次執行
        cmd_choice(i)
    cmd_in_all=[] # 清空命令倉

# 輸入命令並判斷
def cmd_choice(cmd_in):
    if cmd_in[0] not in cmd_list: # 命令不合法提示並返回
        print(‘invalid cmd‘)
        return
    else: # 命令合法執行相應命令
        cmd_def[cmd_list.index(cmd_in[0])](cmd_in.lstrip(cmd_in[0] + ‘ ‘))

# 信息初始化r
def info_init(input_info):
    init_info = input_info.split(‘ ‘) # 從空格處斷開分出兩個字符串
    # 限制輸入數據的範圍
    for i in init_info:  # 遍歷兩個字符串
        for j in i.split(‘-‘): # 從字符串中提出數字信息
            if int(j) > 10: # 如果單個賦值超過10,輸出提示信息
                print(‘out of range , Initialization failed‘)
                return
    for i,v in zip(goods_info,init_info[0].split(‘-‘)): # 存入商品數量
        goods_info[i][‘quantity‘] = int(v)
    for i,v in zip(money_default,init_info[1].split(‘-‘)): # 存入錢幣數量
        moneybox_info[i] = int(v)
    print(‘S001:Initialization is successful‘) # 初始化成功信息

# 投幣p
def put_in_money(money):
    global money_balance
    money = int(money) # 將字符串轉成數值
    if money not in money_default: # 投入不是10,5,2,1的硬幣報錯並返回
        print(‘E002:Denomination error‘)
        return
    if money != 1 and money != 2: # 1,2硬幣不適用下面規則
        if money > moneybox_info[2] * 2 + moneybox_info[1] * 1: # 投入硬幣大於盒內2,1硬幣的總數時報錯並返回
            print(‘E003:Change is not enough,pay fail‘)
            return
    if money_balance > 10: # 余額大於10時報錯並返回
        print(‘E004:Pay the balance is beyond the scope biggest‘)
        return
    for i in goods_info: # 遍歷貨物數量
        if goods_info[i][‘quantity‘] != 0: # 有貨跳出循環
            break
    else: # 沒貨報錯並返回
        print(‘E005:All the goods sold out‘)
        return
    money_balance += money # 成功投幣計入余額
    moneybox_info[money] += 1 # 投入幣放入存錢盒
    print(‘S002:Pay success,balance=‘+str(money_balance)) # 成功提示

# 購買商品b
def buy(goods):
    global money_balance
    if goods not in goods_info: # 商品不存在提示並返回
        print(‘E0:Goods does not exist‘)
        return
    if goods_info[goods][‘quantity‘]==0: # 商品數量為0提示並返回
        print(‘E007:The goods sold out‘)
        return
    if money_balance<goods_info[goods][‘prize‘]: # 余額不足提示並返回
        print(‘E008:Lack of balance‘)
        return
    money_balance-=goods_info[goods][‘prize‘] # 成功余額減少
    goods_info[goods][‘quantity‘]-=1 # 成功數量減一
    print(‘S003:Buy success,balance=‘+str(money_balance)) # 購買成功提示

# 退幣c
def refund(*arg):
    global money_balance
    global refund_coin
    if money_balance==0: # 余額為0時提示並返回
        print(‘E009:Works failure‘)
        return
    else:
        for i in money_default[::-1]: # 余額不為0時,從高到低遍歷存錢盒裏的硬幣
            while moneybox_info[i]!=0 and money_balance>= i: # 當余額大於該面值硬幣且該硬幣數大於0時
                refund_coin.append(i) # 將要退回的硬幣存入列表
                money_balance-=i # 余額減去對應值
                moneybox_info[i]-=1 # 存錢盒內該類硬幣數量減去1
        else:
            coin_back=[refund_coin.count(i) for i in money_default]
            # 統計應退各類硬幣數
            print(coin_back)
            for i in range(4): # 打印退幣信息
                print(money_default[i],‘yuan coin number=‘+str(coin_back[i]))
            refund_coin=[] # 情況退幣倉

# 查詢庫存及存錢盒信息q
def inquire(cmd):
    if cmd==‘0‘: # 查詢商品信息
        for i in sorted(goods_info.items(),key=lambda a:a[1][‘quantity‘],reverse=True):
            print(i[0],i[1][‘prize‘],i[1][‘quantity‘])
    if cmd==‘1‘: # 查詢存錢盒信息
        for i in money_default:  # 打印退幣信息
            print(str(i), ‘yuan coin number=‘ + str(moneybox_info[i]))

# 命令對應函數列表
cmd_def = [info_init, put_in_money, buy, refund, inquire]
while True:
    try:
        cmd_exec()
    except Exception as error:
        print(‘system exception‘)

測試結果:

初始化:

技術分享圖片

投幣:

技術分享圖片

購買:

技術分享圖片

退幣:

技術分享圖片

查詢:

技術分享圖片
技術分享圖片

多命令:

技術分享圖片

Python練習【5】【自動售貨系統】