Python 大作业1:商城购物车

# 1,完成一个商城购物车的程序。
# 商品信息在文件存储的,存储形式:
# name price
# 电脑 1999
# 鼠标 10
# 游艇 20
# 美女 998
# .......
#
# 要求:
# 1,用户先给自己的账户充钱:比如先充3000元。
# 2,读取商品信息文件将文件中的数据转化成下面的格式:
# goods = [{"name": "电脑", "price": 1999},
# {"name": "鼠标", "price": 10},
# {"name": "游艇", "price": 20},
# {"name": "美女", "price": 998},
# ...... ]
#
# 3,页面显示 序号 + 商品名称 + 商品价格,如:
# 1 电脑 1999
# 2 鼠标 10
# …
# n 购物车结算
# q或者Q退出程序。
#
# 4,用户输入选择的商品序号,然后打印商品名称及商品价格,并将此商品,添加到购物车,用户还可继续添加商品。
# 5,如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 6,用户输入n为购物车结算,依次显示用户购物车里面的商品,数量及单价,若充值的钱数不足,则让用户删除某商品,直至可以购买,若充值的钱数充足,则可以直接购买。
# 7,用户输入Q或者q退出程序。
# 8,退出程序之后,依次显示用户购买的商品,数量,单价,以及此次共消费多少钱,账户余额多少,并将购买信息写入文件。
#
# 完成1-3要求为C。
# 完成1-4要求为 C+。
# 完成1-6要求为B。
# 完成全部要求并且没有BUG为A 或者A +。





# 创建一个存储全部商品的字典,利用global 关键字将goods设为全局变量
def get_merchandises():
    global goods
    goods = []
    with open(r'merchandise_info', encoding='utf-8', mode='r') as file_handler:
            for line in file_handler:
                info = {}
                temp_list = line.split(' ')
                info.setdefault('name', temp_list[0].strip())
                info.setdefault('price', temp_list[1].strip())
                goods.append(info)
    return
# 显示所有商品的信息及提示信息
def display_merchandises():
    for i in range(len(goods)):
        print(str(i + 1) + ' ' + goods[i]['name'] + ' ' + goods[i]['price'])
    print('n 购物车结算')
    print('q或者Q退出程序')
# 删除购物车商品,传入参数为商品号,返回布尔值代表是否删除成功
def cancel(index):
    if index <= len(goods):
        print(str(index) + ' ' + goods[index - 1]['name'] + ' ' + goods[index - 1]['price'])
        print('----------------------------------------')
        account['shopping_car'].remove(index)
    else:
        return False
    return True
# 将商品添加到购物车,传入参数为商品号,返回布尔值代表是否添加成功
def select(index):
    if index <= len(goods):
        print(str(index) + ' ' + goods[index - 1]['name'] + ' ' + goods[index - 1]['price'])
        print('----------------------------------------')
        account['shopping_car'].append(index)
    else:
        return False
    return True
# 结账,结账是否成功会以布尔形式返回
def settle():
    total_money = 0
    for i in range(0, len(goods)):
        quantity = account['shopping_car'].count(i+1)
        total_money += quantity * int(goods[i]['price'])
        if quantity:
            print(str(i + 1) + ' ' + goods[i]['name'] + ' ' + goods[i]['price'] + f'*{quantity}')
    print('----------------------------------------')
    if total_money > account['balance']:
        return False
    account['balance'] -= total_money
    return True
# 打印清单,无返回值
def summary():
    total_money = 0
    with open(r'history', encoding='utf-8', mode='a') as file_handler:
        file_handler.write('\n')
        for i in range(0, len(goods)):
            quantity = account['shopping_car'].count(i+1)
            total_money += quantity * int(goods[i]['price'])
            if quantity:
                file_handler.write(str(i + 1) + ' ' + goods[i]['name'] + ' ' + goods[i]['price'] + f'*{quantity}' + '\n')
                # print(str(i + 1) + ' ' + goods[i]['name'] + ' ' + goods[i]['price'] + f'*{quantity}')
        file_handler.write(str(total_money) + ' ' + str(account['balance']))
        print(str(total_money) + ' ' + str(account['balance']))
        print('----------------------------------------')

# 主程序
get_merchandises()  # 获得goods字典
deposit(int(input('how much do u wanna deposit?\n')))  # 向账户存钱
display_merchandises()  # 显示商品界面
while 1:
    inp = input()  # 输入商品号或操作
    if inp.isdecimal() and int(inp) <= len(goods):  # 如果是数字且属于商品号,将该商品加入购物车
        select(int(inp))
    elif inp.upper() == 'Q':  # 退出程序
        break
    elif inp == 'n':  # 结账
        while 1:
            re = settle()  # 根据结账函数返回结果判断是否结账成功
            if re:
                summary()  # 成功打印清单,推出while循环
                break
            else:  # 未成功,需要拿出部分商品
                while 1:
                    index = input('which one u want cancel?')
                    print('----------------------------------------')
                    if cancel(int(index)):  # 如果取消商品合法,推出内部循环,重新判断是否结账成功
                        break
        break
    else:  # 输出字符不合法
        print('Illegal input')
        display_merchandises()  # 重新显示初始界面
        print('----------------------------------------')
posted @ 2020-07-11 21:41  Raigor  阅读(574)  评论(0编辑  收藏  举报