要求:
# 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.本题程序,购物车的构造,以及商品列表的构造都是需要注意的。