作业需求:
- 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
- 在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
- 用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
- 允许查询之前的消费记录
购物车用户信息:
{‘test1‘: {‘123‘: ‘19969.0‘}, ‘cx‘: {‘123‘: ‘725.0‘}, ‘lou‘: {‘123‘: ‘200.0‘}, ‘even‘: {‘qw‘: ‘1560‘}, ‘cv1‘: {‘1‘: 100.5}, ‘name‘: {‘password‘: ‘20000.0‘}, ‘test‘: {‘guaishou‘: ‘10169.0‘}, ‘test2‘: {‘123‘: ‘293338.0‘}}
以字典形式存储用户名,密码,余额
历史购物信息:
{‘test1‘: [[‘Coffee‘, 31]], ‘cx‘: [[‘iphone‘, 5800], [‘apple‘, 5], [‘apple‘, 5], [‘book‘, 75]], ‘lou‘: [[‘bike‘, 800]], ‘name‘: [[‘iphone‘, 5800], [‘bike‘, 800]], ‘test‘: [[‘Bike‘, 800], [‘Coffee‘, 31], [‘Coffee‘, 31], [‘Mac Pro‘, 9800], [‘Coffee‘, 31]], ‘test2‘: [[‘Bike‘, 800], [‘Coffee‘, 31], [‘Iphone‘, 5800], [‘Coffee‘, 31]]}
以字典形式,对应用户名和历史购物记录
流程图:
代码:
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Lou set = False # 设置set 当输入为q就可以退出 file = open(‘shopping_cart_userinfo.txt‘,‘r+‘,encoding=‘utf-8‘) # 读取购物车用户信息文件 f = str(file.read()) # 将文件内容转化成字符串 for line in f: # 逐行读取 file_str = str(f) data= eval(file_str) # 将字符串转换为字典data name = input("请输入姓名:") # 提示输入用户名 password = input("请输入密码:") # 提示输入密码 while True: if name in data: # 用户名在字典data if password in data[name]: # 密码如果能对应用户名,就欢迎登录 salay = float(data[name][password]) print(‘‘‘\033[32;1m欢迎登录,当前余额为%s\033[0m‘‘‘%salay) break else: # 否则密码输入错误,提示重新输入 password = input("密码输入错误,请重新输入:") continue else: # 否则判断为首次登录,将用户名,密码,工资存到用户信息文件中 salay_str = input("欢迎首次登录,请输入你的工资:") # 输入工资数 salay = float(salay_str) # 将输入的字符串转换为数字 data[name]={password:salay} # 将密码-工资对对应到用户名 file.seek(0) # 文件的读取移到开头 file.write(str(data)) # 写入新的字典信息 file.tell() # 返回当前位置 break list = [ # 购物清单 [‘Iphone‘,5800], [‘Mac Pro‘,9800], [‘Bike‘,800], [‘Watch‘,10600], [‘Coffee‘,31], [‘Alex Python‘,120] ] file_list_r = open(‘shopping_cart_purchase_history.txt‘,‘r+‘,encoding=‘utf-8‘) # 读取历史购买记录文件 f_list_r = str(file_list_r.read()) for line in f_list_r: # 逐行读取 file_str_h = str(f_list_r) shoppinglist_dict = eval(file_str_h) # 将历史记录信息转换为字典 if name not in shoppinglist_dict: # 如果首次登录,会没有历史记录 shoppinglist_dict[name] = [] # 首次登录历史记录留空 shoppinglist = shoppinglist_dict[name] # 不是首次登录,将之前历史记录赋值到变量 shoppinglist_now = [] # 本次购物记录留空 choose = input("\n是否需要查询历史购物记录(y/n):") # 询问是否需要查询历史记录 if choose == ‘y‘: # 选y,输出历史购物记录 print("\n\n-----------历史购物记录------------") print(shoppinglist) print("--------------结束---------------\n\n") while not set: # 购物车开始 print(‘-----------商品清单------------‘) # 输出商品清单 for index,item in enumerate(list,1): print(index,item) print("-------------结束--------------") number = input("请输入想购买的商品编号:") # 输入商品编号 if number == "q": # 当输入为q,退出,打印本次购物清单 set = True data[name][password] = str(salay) # 将字符串的工资给到对应用户名下的密码-工资对中 file.seek(0) file.write(str(data)) # 将用户信息写入购物车用户信息存档中 file.tell() print("------------购物清单------------") # 打印购物清单,提示余额 print(shoppinglist_now) print("您的余额为:",salay) print("-------------结束--------------") shoppinglist.extend(shoppinglist_now) # 将本次购物记录追加到购物记录列表中 shoppinglist_dict[name] = shoppinglist # 购物列表与用户名做对应 file_list_r.seek(0) file_list_r.write(str(shoppinglist_dict)) # 写入字符串的购物历史记录 file_list_r.tell() elif number.isdigit() == False: # 校验输入是否为整数 print("\033[31;1m输入不是编号内容,请重新输入\033[0m") elif int(number)>int(len(list)) or int(number)<= 0: # 如果输入值不在清单中,提示报错 print("\033[31;1m您所购买的商品不在清单中\033[0m") else: number_buy = int(number)-1 if list[number_buy][1]<(salay): # 如果余额够,提示成功购买,显示余额 salay = salay - int(list[number_buy][1]) msg = ‘‘‘ \033[32;1m您已将%s加入购物车中 余额为%d\033[0m ‘‘‘ % (list[number_buy][0],salay) print(msg) shoppinglist_now.append(list[number_buy]) # 本次购物信息加到本次购买记录中 else: print("\033[31;1m您已没有余额可以购买\033[0m") # 否则提示余额不足 file.close() file_list_r.close()