zoukankan      html  css  js  c++  java
  • Python程序练习3--模拟购物车

    1.功能简介

    此程序模拟用户登陆商城后购买商品操作。可实现用户登陆、商品购买、历史消费记查询、余额和消费信息更新等功能。首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询。

     

    2.实现方法

    • 架构:

    本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了。主要编写了六个函数: 
    (1)login(name,password) 
    用户登陆函数,实现用户名和密码验证,登陆成功则返回登陆次数。 
    (2)get_balance(name) 
    获取用户余额数据。 
    (3)update_balance(name,balance) 
    更新用户余额数据,当用户按q键退出时数据会更新到文件。 
    (4)inquire_cost_record(name) 
    查询用户历史消费记录。 
    (5)update_cost_record(name,shopping_list) 
    更新用户消费记录,当用户按q键退出时本次消费记录会更新到文件。 
    (6)shopping_chart() 
    主函数,完成人机交互,函数调用,各项功能的有序实现。

    • 主要操作:

    (1)根据提示按数字键选择相应选项进行操作。 
    (2)任意时刻按q键退出退出登陆,退出前会完成用户消费和余额信息更新。

    • 使用文件: 

      (1)userlist.txt 
      存放用户账户信息文件,包括用户名、密码、登陆次数和余额。每次用户登陆成功会更新该用户登陆次数,每次按q键退出时会更新余额信息。 
      (2)***_cost_record.txt 
      存放某用户***消费记录的文件,用户首次购买商品后创建,没有购买过商品的用户不会产生该文件。每次按q键退出时会将最新的消费记录更新到文件。
     

    3.流程图

    4.代码

      1 # Author:Byron Li
      2 #-*-coding:utf-8-*-
      3 
      4 '''----------------------------------------------使用文件说明----------------------------------------------------------
      5 使用文件说明
      6 userlist.txt         存放用户账户信息文件,包括用户名、密码、登陆次数和余额
      7 ***_cost_record.txt  存放某用户***消费记录的文件,用户首次购买商品后创建,没有购买过商品的用户不会产生该文件
      8 ---------------------------------------------------------------------------------------------------------------------'''
      9 import os
     10 import datetime
     11 
     12 def login(name,password):   #用户登陆,用户名和密码验证,登陆成功则返回登陆次数
     13     with open('userlist.txt', 'r+',encoding='UTF-8') as f:
     14         line = f.readline()
     15         while(line):
     16             pos=f.tell()
     17             line=f.readline()
     18             if [name,password] == line.split()[0:2]:
     19                 times=int(line.split()[2])
     20                 line=line.replace(str(times).center(5,' '),str(times+1).center(5,' '))
     21                 f.seek(pos)
     22                 f.write(line)
     23                 return times+1
     24     return None
     25 
     26 def get_balance(name):   #获取用户余额数据
     27     with open('userlist.txt', 'r',encoding='UTF-8') as f:
     28         line = f.readline()
     29         for line in f:
     30             if name == line.split()[0]:
     31                 return line.split()[3]
     32     print("用户%s不存在,无法获取其余额信息!"%name)
     33     return False
     34 
     35 def update_balance(name,balance):    #更新用户余额数据
     36     with open('userlist.txt', 'r+',encoding='UTF-8') as f:
     37         line = f.readline()
     38         while(line):
     39             pos1=f.tell()
     40             line=f.readline()
     41             if name == line.split()[0]:
     42                 pos1=pos1+line.find(line.split()[2].center(5,' '))+5
     43                 pos2=f.tell()
     44                 f.seek(pos1)
     45                 f.write(str(balance).rjust(pos2-pos1-2,' '))
     46                 return True
     47     print("用户%s不存在,无法更新其余额信息!" % name)
     48     return False
     49 
     50 def inquire_cost_record(name):     #查询用户历史消费记录
     51     if os.path.isfile(''.join([name,'_cost_record.txt'])):
     52         with open(''.join([name,'_cost_record.txt']), 'r',encoding='UTF-8') as f:
     53             print("历史消费记录".center(40, '='))
     54             print(f.read())
     55             print("".center(46, '='))
     56             return True
     57     else:
     58         print("您还没有任何历史消费记录!")
     59         return False
     60 
     61 def update_cost_record(name,shopping_list):   #更新用户消费记录
     62     if len(shopping_list)>0:
     63         if not os.path.isfile(''.join([name, '_cost_record.txt'])):     #第一次创建时第一行标上“商品  价格”
     64             with open(''.join([name, '_cost_record.txt']), 'a',encoding='UTF-8') as f:
     65                 f.write("%-5s%+20s
    " % ('商品', '价格'))
     66                 f.write(''.join([datetime.datetime.now().strftime('%c'), ' 消费记录']).center(40,'-'))   #写入消费时间信息方便后续查询
     67                 f.write('
    ')
     68                 for product in shopping_list:
     69                     f.write("%-5s%+20s
    "%(product[0],str(product[1])))
     70         else:
     71             with open(''.join([name, '_cost_record.txt']), 'a',encoding='UTF-8') as f:
     72                 f.write(''.join([datetime.datetime.now().strftime('%c'), ' 消费记录']).center(40, '-'))
     73                 f.write('
    ')
     74                 for product in shopping_list:
     75                     f.write("%-5s%+20s
    "%(product[0],str(product[1])))
     76         return True
     77     else:
     78         print("您本次没有购买商品,不更新消费记录!")
     79         return False
     80 
     81 def shopping_chart():    #主函数,用户交互,函数调用,结果输出
     82     product_list=[
     83         ('Iphone',5000),
     84         ('自行车',600),
     85         ('联想电脑',7800),
     86         ('衬衫',350),
     87         ('洗衣机',1000),
     88         ('矿泉水',3),
     89         ('手表',12000)
     90     ]   #商店商品列表
     91     shopping_list=[]   #用户本次购买商品列表
     92     while(True):
     93         username = input("请输入用户名:")
     94         password = input("请输入密码:")
     95         login_times=login(username,password)   #查询输入用户名和密码是否正确,正确则返回登陆次数
     96         if login_times:
     97             print('欢迎%s第%d次登陆!'.center(50,'*')%(username,login_times))
     98             if login_times==1:
     99                 balance = input("请输入工资:")   #第一次登陆输入账户资金
    100                 while(True):
    101                     if balance.isdigit():
    102                         balance=int(balance)
    103                         break
    104                     else:
    105                         balance = input("输入工资有误,请重新输入:")
    106             else:
    107                 balance=int(get_balance(username))  #非第一次登陆从文件获取账户余额
    108             while(True):
    109                 print("请选择您要查询消费记录还是购买商品:")
    110                 print("[0] 查询消费记录")
    111                 print("[1] 购买商品")
    112                 choice=input(">>>")
    113                 if choice.isdigit():
    114                     if int(choice)==0:                 #查询历史消费记录
    115                         inquire_cost_record(username)
    116                     elif int(choice)==1:               #购买商品
    117                         while (True):
    118                             for index,item in enumerate(product_list):
    119                                 print(index,item)
    120                             choice=input("请输入商品编号购买商品:")
    121                             if choice.isdigit():
    122                                 if int(choice)>=0 and int(choice)<len(product_list):
    123                                     if int(product_list[int(choice)][1])<balance:   #检查余额是否充足,充足则商品购买成功
    124                                         shopping_list.append(product_list[int(choice)])
    125                                         balance = balance - int(product_list[int(choice)][1])
    126                                         print("33[31;1m%s33[0m已加入购物车中,您的当前余额是33[31;1m%s元33[0m" %(product_list[int(choice)][0],balance))
    127                                     else:
    128                                         print("33[41;1m您的余额只剩%s元,无法购买%s!33[0m" %(balance,product_list[int(choice)][0]))
    129                                 else:
    130                                     print("输入编号错误,请重新输入!")
    131                             elif choice=='q':      #退出账号登陆,退出前打印本次购买清单和余额信息,并更新到文件
    132                                 if len(shopping_list)>0:
    133                                     print("本次购买商品清单".center(50,'-'))
    134                                     for product in shopping_list:
    135                                         print("%-5s%+20s"%(product[0],str(product[1])))
    136                                     print("".center(50, '-'))
    137                                     print("您的余额:33[31;1m%s元33[0m"%balance)
    138                                     update_cost_record(username,shopping_list)
    139                                     update_balance(username, balance)
    140                                     print("退出登陆!".center(50, '*'))
    141                                     exit()
    142                                 else:
    143                                     print("您本次没有消费记录,欢迎下次购买!")
    144                                     print("退出登陆!".center(50, '*'))
    145                                     exit()
    146                             else:
    147                                 print("选项输入错误,请重新输入!")
    148                     else:
    149                         print("选项输入错误,请重新输入!")
    150                 elif choice=='q':   #退出账号登陆
    151                     print("退出登陆!".center(50, '*'))
    152                     exit()
    153                 else:
    154                     print("选项输入错误,请重新输入!")
    155             break
    156         else:
    157             print('用户名或密码错误,请重新输入!')
    158 
    159 shopping_chart() #主程序运行
    View Code
  • 相关阅读:
    Linux下查看系统版本号信息的方法(转载)
    tomcat 启动超级慢
    新生代老年代GC组合
    GC 提前晋升
    Mysql 锁技术要点【转载】
    第39天:字符串连接、截取操作
    第38天:运算符、字符串对象常用方法
    第37天:小米手机图片展示
    第36天:倒计时:发动短信验证、跳转页面、关闭广告
    第35天:时钟效果
  • 原文地址:https://www.cnblogs.com/byron-li/p/7502210.html
Copyright © 2011-2022 走看看