python 周末大作业之2

要求:
# 1. 用户先给自己的账户充钱:比如先充3000元。
# 2. 页面显示 序号 + 名称 + 价格 , 如:
# # [===========有如下商品供您选择:===========]
# # 序号 名称 价格
# # 1 电脑 1999
# # 2 鼠标 10
# # 3 游艇 20
# # 4 美女 998
# # n或N 购物车结算
# q或Q 退出程序(如不结算购物车可直接退出)]
# [==========================================]
# 购物车结算
# 3. 用户输入选择的商品序号,然后打印商品名称及商品价格,并将此商品,添加到购物车,用户还可继续添加商品。
# 4. 如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 5. (1)用户输入n为购物车结算,依次显示用户购物车里面的商品,数量及单价
# (2)若充值的钱数不足则让用户删除某商品,直至可以购买,若充值的钱数充足,则可以直接购买退出
# (3)退出程序之后,依次显示用户购买的商品,数量,单价,以及此次共消费多少钱,账户余额多少
# 6. 用户输入Q或者q 直接退出程序。

可以分模块就行写,

# 商品列表

goods_list = [
    {"name": "电脑", 'price': 1999},
    {"name": "鼠标", 'price': 10},
    {"name": "游艇", 'price': 20},
    {"name": "美女", 'price': 998},
    {"name": "油精", 'price': 30},
]

# 初始金额

money = 0

# 购物车(你要求的购物车,大致呈现是什么样子的)

car = {}
'''
car = {
    1: {"name": "电脑", 'price': 1999},
    2: {"name": "鼠标", 'price': 10},
    3: {"name": "游艇", 'price': 20},
    4: {"name": "美女", 'price': 998},
    5: {"name": "油精", 'price': 30},
}
'''

# 充值

def chongzhi():
    global money
    while 1:
        money1 = input('请输入您要充值的金额:').strip()
        if money1.isdigit():
            money1 = int(money1)
            money += money1
            print('充值成功,本次充值金额为%s元,总金额%d元' % (money1, money))
            break
        else:
            print('充值失败,请输入数字')

# 展示商品

def show_goods():
    print('序号  名称  价格')
    for index, dic in enumerate(goods_list, start=1):
        print(index, dic['name'].rjust(6), str(dic['price']).rjust(5))

#添加到购物车

def shopping(sn):
    # 这条已存在购物车里面
    if sn in car:
        car[sn]['amount'] += 1
    # 不存在则创建一条数据
    else:
        car[sn] = {
            'name': goods_list[sn - 1]['name'],
            'price': goods_list[sn - 1]['price'],
            'amount': 1
        }
    print('添加购物车成功')
    print('序号  名称  单价  数量  总价')
    print(sn, car[sn]['name'].rjust(6), str(car[sn]['price']).rjust(5), str(car[sn]['amount']).rjust(4),
          str(car[sn]['price'] * car[sn]['amount']).rjust(6))

#展示购物车

def show_car():
    total = 0
    print('[===================购物车明细如下===================]')
    print('序号  名称  单价  数量  总价')
    for k, dic in car.items():
        print(k, dic['name'].rjust(6), str(dic['price']).rjust(5), str(dic['amount']).rjust(4),
              str(dic['price'] * dic['amount']).rjust(6))
        total += dic['price'] * dic['amount']
    return total

# 展示购买的商品

def show_shopping():
    print('[===================您购买的商品明细如下===================]')
    print('序号  名称  单价  数量  总价')
    for k, dic in car.items():
        print(k, dic['name'].rjust(6), str(dic['price']).rjust(5), str(dic['amount']).rjust(4),
              str(dic['price'] * dic['amount']).rjust(6))
    print('购物成功!')

# 退出

def quit():
    global flag
    print('[===================欢迎下次光临===================]')
    flag = False

# 删除商品

def del_goods(sn):
    if sn.isdigit():
        sn = int(sn)
        if 0 < sn <= len(goods_list):
            car[sn]['amount'] -= 1
            if car[sn]['amount'] == 0:
                car.pop(sn)
        else:
            error2()
    else:
        error1()

# 结算

def jiesuan():
    global flag
    while 1:
        total = show_car()
        print(' 您的当前金额为%d元, 您购物车的商品总价格为%d元' % (money, total))

        # 钱够,可以买单
        if money - total >= 0:
            res = input('确认购买请按y,按q结束程序,按任意键继续购物').strip()
            if res.upper() == 'Y':
                print('购买成功, 您剩余%d元' % (money - total))
                show_shopping()
                quit()
                break
            elif res.upper() == 'Q':
                quit()
                flag = False
                break
            else:
                break
        # 钱不够,删除掉一些商品
        else:
            res = input('您的余额不够, 请删除一些商品d或者充值c')
            if res.upper() == 'D':
                sn = input('请输入您要删除的商品序号: ').strip()
                # 删除商品
                del_goods(sn)
            elif res.upper() == 'C':
                chongzhi()

# 一些报错函数

def error1():
    print('您输入的选项不存在')


def error2():
    print('您输入的选项超出范围')

# 程序入口

if __name__ == '__main__':
    print('[===================欢迎光临**购物中心===================]')
    # 1. 充值
    chongzhi()
    # 2. 展示商品
    show_goods()
    # 3. 开始购物
    flag = True
    while flag:
        sn = input('请输入您要购买的商品序号:(按n结算,按q退出)').strip()
        if sn.isdigit():
            sn = int(sn)
            if 0 < sn <= len(goods_list):
                # 购物
                shopping(sn)
            else:
                error2()
        elif sn.upper() == 'Q':
            quit()
        elif sn.upper() == 'N':
            jiesuan()
        else:
            error1()

 小结:

1.全局变量flag在while flag 中的使用,按照之前的写法我会把while True:写成这样子之后,假如遇到循环体中

(1)若不能满足某种条件需要退出循环,就没有办法做到,写个变量的话,就很好控制循环的出入,flag = 0,退出。

如:

flag = 1

while flag:

    if(i<5):

        flag=0

当执行完条件if之后,就会跳出循环。

(2)第二种情况

flag = 1

while flag:

    for i ilistvar:

  pass

  flag = 0 

  break

如果遇到执行循环之后想跳出大循环的这种情况,需要在内部循环中先使用break,跳出当前玄幻,再次循环的时候flag=0,就会立马退出。

2.程序中的全局变量money,flag 全局变量若要在函数里面就行修改的时候必须使用关键字,global。

3,.判断字符串中是否是纯数字字符串函数isdigit(),还有在字符串前面添加空白间隔字符,rjust().

4.

        if sn.isdigit():
            sn = int(sn)
            if 0 < sn <= len(goods_list):
                # 购物
                shopping(sn)
            else:
                error2()
        elif sn.upper() == 'Q':
            quit()
        elif sn.upper() == 'N':
            jiesuan()
        else:
            error1()
思路很重要,一定要清楚。多成判断,处理每一层。
5.enumerate(可迭代数据,起始值) 返回的是一个个元祖索引和值的小元祖。
for k,v enumerate(XX):
  print(k,v)
6.程序先考虑大体思路,然后可以从怎么去使用入手写程序。
7.本题程序,购物车的构造,以及商品列表的构造都是需要注意的。

猜你喜欢

转载自www.cnblogs.com/longerandergou/p/10927660.html