文件处理实战之购物车系统

一、文件处理实战之购物车系统

  1. 用户名和密码存放于文件中,格式为:nick|nick123

  2. 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序

  3. 允许用户根据商品编号购买商品

  4. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒

  5. 可随时退出,退出时,打印已购买商品和余额

import os

product_list = [
    ['Iphone7', 5800],
    ['Coffee', 30],
    ['疙瘩汤', 10],
    ['Python Book', 99],
    ['Bike', 199],
    ['ViVo X9', 2499],
]

shopping_cart = {}
current_userinfo = []

db_file = r'db.txt'

while True:
    print('''
登陆
注册
购物
    ''')

    choice = input('>>: ').strip()

    if choice == '1':
        #1、登陆
        tag = True
        count = 0
        while tag:
            if count == 3:
                print('尝试次数过多,退出。。。')
                break
            uname = input('用户名:').strip()
            pwd = input('密码:').strip()

            with open(db_file, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip('\n')
                    user_info = line.split(',')

                    uname_of_db = user_info[0]
                    pwd_of_db = user_info[1]
                    balance_of_db = int(user_info[2])

                    if uname == uname_of_db and pwd == pwd_of_db:
                        print('登陆成功')

                        # 登陆成功则将用户名和余额添加到列表
                        current_userinfo = [uname_of_db, balance_of_db]
                        print('用户信息为:', current_userinfo)
                        tag = False
                        break
                else:
                    print('用户名或密码错误')
                    count += 1

    elif choice == '2':
        uname = input('请输入用户名:').strip()
        while True:
            pwd1 = input('请输入密码:').strip()
            pwd2 = input('再次确认密码:').strip()
            if pwd2 == pwd1:
                break
            else:
                print('两次输入密码不一致,请重新输入!!!')

        balance = input('请输入充值金额:').strip()

        with open(db_file, 'a', encoding='utf-8') as f:
            f.write('%s,%s,%s\n' % (uname, pwd1, balance))

    elif choice == '3':
        if len(current_userinfo) == 0:
            print('请先登陆...')
        else:
            #登陆成功后,开始购物
            uname_of_db = current_userinfo[0]
            balance_of_db = current_userinfo[1]

            print('尊敬的用户[%s] 您的余额为[%s],祝您购物愉快' % (uname_of_db, balance_of_db))

            tag = True
            while tag:
                for index, product in enumerate(product_list):
                    print(index, product)
                choice = input('输入商品编号购物,输入q退出>>: ').strip()
                if choice.isdigit():
                    choice = int(choice)
                    if choice < 0 or choice >= len(product_list): continue

                    pname = product_list[choice][0]
                    pprice = product_list[choice][1]
                    if balance_of_db > pprice:
                        if pname in shopping_cart:  # 原来已经购买过
                            shopping_cart[pname]['count'] += 1
                        else:
                            shopping_cart[pname] = {
                                'pprice': pprice,
                                'count': 1
                            }

                        balance_of_db -= pprice  # 扣钱
                        current_userinfo[1] = balance_of_db  # 更新用户余额
                        print(
                            "Added product " + pname +
                            " into shopping cart,[42;1myour current balance "
                            + str(balance_of_db))

                    else:
                        print("买不起,穷逼! 产品价格是{price},你还差{lack_price}".format(
                            price=pprice, lack_price=(pprice - balance_of_db)))
                    print(shopping_cart)
                elif choice == 'q':
                    print("""
                    ---------------------------------已购买商品列表---------------------------------
                    id          商品                   数量             单价               总价
                    """)

                    total_cost = 0
                    for i, key in enumerate(shopping_cart):
                        print('%22s%18s%18s%18s%18s' %
                              (i, key, shopping_cart[key]['count'],
                               shopping_cart[key]['pprice'],
                               shopping_cart[key]['pprice'] *
                               shopping_cart[key]['count']))
                        total_cost += shopping_cart[key][
                            'pprice'] * shopping_cart[key]['count']

                    print("""
                    您的总花费为: %s
                    您的余额为: %s
                    ---------------------------------end---------------------------------
                    """ % (total_cost, balance_of_db))

                    while tag:
                        inp = input('确认购买(yes/no?)>>: ').strip()
                        if inp not in ['Y', 'N', 'y', 'n', 'yes', 'no']:
                            continue
                        if inp in ['Y', 'y', 'yes']:
                            # 将余额写入文件

                            src_file = db_file
                            dst_file = r'%s.swap' % db_file
                            with open(src_file,'r',encoding='utf-8') as read_f,\
                                open(dst_file,'w',encoding='utf-8') as write_f:
                                for line in read_f:
                                    if line.startswith(uname_of_db):
                                        l = line.strip('\n').split(',')
                                        l[-1] = str(balance_of_db)
                                        line = ','.join(l) + '\n'

                                    write_f.write(line)
                            os.remove(src_file)
                            os.rename(dst_file, src_file)

                            print('购买成功,请耐心等待发货')

                        shopping_cart = {}
                        current_userinfo = []
                        tag = False

                else:
                    print('输入非法')
    elif choice == 'q':
        break

    else:
        print('非法操作')
登陆
注册
购物
    
>>: 2
请输入用户名:nick
请输入密码:123
再次确认密码:123
请输入充值金额:10000

登陆
注册
购物
    
>>: 1
用户名:nick
密码:123
登陆成功
用户信息为: ['nick', 10000]

登陆
注册
购物
    
>>: 3
尊敬的用户[nick] 您的余额为[10000],祝您购物愉快
0 ['Iphone7', 5800]
1 ['Coffee', 30]
2 ['疙瘩汤', 10]
3 ['Python Book', 99]
4 ['Bike', 199]
5 ['ViVo X9', 2499]
输入商品编号购物,输入q退出>>: 0
Added product Iphone7 into shopping cart,[42;1myour current balance 4200
{'Iphone7': {'pprice': 5800, 'count': 1}}
0 ['Iphone7', 5800]
1 ['Coffee', 30]
2 ['疙瘩汤', 10]
3 ['Python Book', 99]
4 ['Bike', 199]
5 ['ViVo X9', 2499]
输入商品编号购物,输入q退出>>: 1
Added product Coffee into shopping cart,[42;1myour current balance 4170
{'Iphone7': {'pprice': 5800, 'count': 1}, 'Coffee': {'pprice': 30, 'count': 1}}
0 ['Iphone7', 5800]
1 ['Coffee', 30]
2 ['疙瘩汤', 10]
3 ['Python Book', 99]
4 ['Bike', 199]
5 ['ViVo X9', 2499]
输入商品编号购物,输入q退出>>: q

                    ---------------------------------已购买商品列表---------------------------------
                    id          商品                   数量             单价               总价
                    
                     0           Iphone7                 1              5800              5800
                     1            Coffee                 1                30                30

                    您的总花费为: 5830
                    您的余额为: 4170
                    ---------------------------------end---------------------------------
                    
确认购买(yes/no?)>>: yes
购买成功,请耐心等待发货

登陆
注册
购物
    
>>: q

转载于:https://www.cnblogs.com/nickchen121/p/11070005.html

欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值