zoukankan      html  css  js  c++  java
  • 编写简陋的ATM程序

    编写ATM程序

    实现下述功能:

     1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改

     2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱

     3、提现功能:用户输入提现金额,db.txt中该账号钱数减少

     4、查询余额功能:输入账号查询余额

     5、数据来源于文件db.txt(所有的增删改查都在同一文件当中)

     选做中的选做:登录功能

      用户登录成功后,内存中记录下该状态,上述功能以当前登录状态为准,必须先登录才能操作

    代码如下:

    login_name = None  #选做中的选做重点
    
    # 操作系统相关操作功能
    
    def move_fuc():
        import os
        os.remove(r'{}'.format('db.txt'))
        os.rename(r'{}.swap'.format('db.txt'), r'{}'.format('db.txt'))
    
    # 登录功能
    
    def login_func():
        name_user = input('请输入您的账号:').strip()
        name_pwd = input('请输入您的密码:').strip()
        global login_name
        if not login_name:
            with open('db.txt','r',encoding='utf-8') as f:
                for line in f:
                    x, y, *_ = line.strip().split(':')
                    if x == name_user and y == name_pwd:
                        print('登陆成功')
                        login_name = name_user
                        return login_name
                else:
                    print('账号密码错误')
    
        else:
            print('您已经登录了,请勿重复登录')
    
    # 充值功能
    
    def recharge_fuc():
        global login_name
        while True:
            if login_name:
                money = input('输入您想充值的金额:')
                with open(r'db.txt', 'rb') as rf, 
                        open(r'db.txt.swap', 'wb') as wf:
                    while True:
                        user_msg = rf.readline().decode('utf-8')
                        *_, z = user_msg.strip().split(':')
                        if login_name in user_msg:
                            money = int(z) + int(money)
                            data = user_msg.replace('{}'.format(z), '{}'.format(money))
                            wf.write(data.encode('utf-8'))
                        else:
                            wf.write('{}'.format(user_msg).encode('utf-8'))
                        if len(user_msg) == 0:
                            break
                move_fuc()
                print('充值成功,现有金额为{}元'.format(money))
                return '充值成功'
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
                inp_N = input('请输入符号:>>')
                if inp_N == 'P':
                    login_func()
                else:
                    print('退出')
                    break
    
    
    # 转账功能
    
    def take_fuc():
        global login_name
        tag = 0
        while True:
            if login_name:
                name = input('输入您想转账的人:')
                with open(r'db.txt', 'rb') as f, 
                        open(r'db.txt.swap', 'wb') as wf:
                    while True:
                        take_msg = f.readline().decode('utf-8')
                        x, *_= take_msg.strip().split(':')
                        if name == x:
                            tag = 1
                            break
                        elif not len(take_msg):
                            print('本银行没有该账号,玩呢?')
                            return
                    f.seek(0, 0)
                    money = input('输入您想转账的金额:')
                    while tag:
                        take_msg = f.readline().decode('utf-8')
                        *_, z = take_msg.strip().split(':')
                        if name in take_msg:
                            money1 = int(z) + int(money)
                            data = take_msg.replace('{}'.format(z), '{}'.format(money1))
                            wf.write(data.encode('utf-8'))
                        elif login_name in take_msg:
                            if int(z) > int(money):
                                money2 = int(z) - int(money)
                                data = take_msg.replace('{}'.format(z), '{}'.format(money2))
                                wf.write(data.encode('utf-8'))
                                continue
                            else:
                                print('转账现金已经超过余额')
                                return '转账现金已经超过余额'
                        else:
                            wf.write('{}'.format(take_msg).encode('utf-8'))
                        if len(take_msg) == 0:
                            print('转账成功')
                            query_fuc()
                            break
                move_fuc()
                break
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
                inp_N = input('请输入符号:>>')
                if inp_N == 'P':
                    login_func()
                else:
                    print('退出')
                    break
    
    
    # 查询余额功能
    
    def query_fuc():
        global login_name
        while True:
            if login_name:
                with open(r'db.txt','rb') as f:
                    while True:
                        query_msg = f.readline().decode('utf-8')
                        if login_name in query_msg:
                            *_ , z = query_msg.strip().split(':')
                            print('{}的账号余额为{}元'.format(login_name,z))
                            return z
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
                inp_N = input('请输入符号:>>')
                if inp_N == 'P':
                    login_func()
                else:
                    print('退出')
                    break
    
    
    # 提现功能
    
    def cash_func():
        global login_name
        while True:
            if login_name:
                money_cash = input('请输入您的提现金额:>>').strip()
                with open(r'db.txt', 'rb') as f, 
                        open(r'db.txt.swap', 'wb') as wf:
                    while True:
                        cash_msg = f.readline().decode('utf-8')
                        if login_name in cash_msg:
                            *_ , z = cash_msg.strip().split(':')
                            if int(z) > int(money_cash):
                                money1 = int(z) - int(money_cash)
                                data = cash_msg.replace('{}'.format(z), '{}'.format(money1))
                                wf.write(data.encode('utf-8'))
                            else:
                                print('余额不足,提现失败')
                                return '余额不足,提现失败'
                        else:
                            wf.write('{}'.format(cash_msg).encode('utf-8'))
                        if len(cash_msg) == 0:
                            break
                move_fuc()
                print('提现成功')
                query_fuc()
                return '提现成功'
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
            inp_N = input('请输入符号:>>')
            if inp_N == 'P':
                login_func()
            else:
                print('退出')
                break
    
    
    # 主函数体
    
    def main_func():
        contests_atm = {
            '1':login_func,
            '2':recharge_fuc,
            '3':take_fuc,
            '4':cash_func,
            '5':query_fuc,
            '6':'6'
        }
        while True:
            print("""
            ==============ATM====================
                '1':登录
                '2':充值
                '3':转账
                '4':提现
                '5':余额
                '6':退出
            ==============END====================     
            """)
            cmd = input('请输入命令编号>>: ').strip()
            if not cmd.isdigit():
                print('必须输入命令编号的数字,傻叉')
                continue
            if cmd not in contests_atm:
                print('输入的命令不存在')
                continue
            if cmd == '6':
                print('已成功退出!')
                break
            contests_atm[cmd]()
    
    
    main_func()
    

    问题:

    1、while循环的时候解压赋值只能取一个,去两个及以上就会报错,for循环反而没问题,在解压赋值之前就要判断,while循环需要考虑的重中之重

    2、当定义了字典函数以后,value后面不能加(),否则会直接运行,不知道为什么。(已解决,写的时候知识点没有讲,自己摸索的)

    3、反省点,在b模式下进行文件读写操作时,要时刻注意指针的位置!

    更新

     1、注册功能:用户输入账号名、密码、金额,按照固定的格式存入文件db.txt(自己同时把黑名单系统也加入其中,只要三次错误谁都救不了!账户锁死)

     2、登录功能:用户名不存在,要求必须先注册,用户名存在&输错三次锁定,登录成功后记录下登录状态(提示:可以使用全局变量来记录)

    login_name = None  #选做中的选做重点
    
    # 操作系统相关操作功能
    def move_fuc():
        import os
        os.remove(r'{}'.format('db.txt'))
        os.rename(r'{}.swap'.format('db.txt'), r'{}'.format('db.txt'))
    
    
    
    # 注册功能
    def register_func():
        locked = '1'
        name_user = input('请输入您的注册账号:>>').strip()
        name_pwd = input('请输入您的注册密码:>>').strip()
        name_money = input('请输入您的初始金钱:>>').strip()
        with open(r'db.txt', 'rb+') as f:
            while True:
                res = f.readline().decode('utf-8')
                if not len(res):
                    break
                p,x, *_ = res.strip().split(':')
                if x == name_user:
                    print('该账号已被注册,请重新注册')
                    return
    
            f.write('
    {}:{}:{}:{}'.format(locked,name_user, name_pwd, name_money).encode('utf-8'))
            print('注册成功')
    
    def login_fuc():
        global login_name
        if not login_name:
            name_user = input('请输入您的账号:>>').strip()
            i = 0
            tag = 1
            with open(r'db.txt', 'rb') as rf, 
                    open(r'db.txt.swap', 'wb') as wf:
                while tag:
                    log_res = rf.readline().decode('utf-8')
                    if not len(log_res):
                        print('找不到该账号,请注册')
                        return
                    p,x,y,z = log_res.strip().split(':')
                    if x == name_user:
                        tag = 0
                if p == '0':
                    print('账号已被锁定,告辞!')
                    return
                while i <3:
                    name_pwd = input('请输入您的密码')
                    if name_pwd == y:
                        print('成功登陆')
                        login_name = name_user
                        return
                    else:
                        i += 1
                        print('账号密码输入错误')
                else:
                    print('连续输入三次,账号锁定')
                rf.seek(0,0)
                while True:
                    locked_res = rf.readline().decode('utf-8')
                    if len(locked_res) == 0:
                        break
                    a,*_ = locked_res.strip().split(':')
                    if x in locked_res:
                        data = locked_res.replace('{}'.format(a), '0')
                        wf.write(data.encode('utf-8'))
                    else:
                        wf.write('{}'.format(locked_res).encode('utf-8'))
            move_fuc()
        else:print('账号不能重复登录')
    
    # 充值功能
    def recharge_fuc():
        global login_name
        while True:
            if login_name:
                money = input('输入您想充值的金额:')
                with open(r'db.txt', 'rb') as rf, 
                        open(r'db.txt.swap', 'wb') as wf:
                    while True:
                        user_msg = rf.readline().decode('utf-8')
                        *_, z = user_msg.strip().split(':')
                        if login_name in user_msg:
                            money = int(z) + int(money)
                            data = user_msg.replace('{}'.format(z), '{}'.format(money))
                            wf.write(data.encode('utf-8'))
                        else:
                            wf.write('{}'.format(user_msg).encode('utf-8'))
                        if len(user_msg) == 0:
                            break
                move_fuc()
                print('充值成功,现有金额为{}元'.format(money))
                return '充值成功'
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
                inp_N = input('请输入符号:>>')
                if inp_N == 'P':
                    login_func()
                else:
                    print('退出')
                    break
    
    
    # 转账功能
    def take_fuc():
        global login_name
        tag = 0
        while True:
            if login_name:
                name = input('输入您想转账的人:')
                with open(r'db.txt', 'rb') as f, 
                        open(r'db.txt.swap', 'wb') as wf:
                    while True:
                        take_msg = f.readline().decode('utf-8')
                        p,x, *_= take_msg.strip().split(':')
                        if name == x:
                            tag = 1
                            break
                        elif not len(take_msg):
                            print('本银行没有该账号,玩呢?')
                            return
                    f.seek(0, 0)
                    money = input('输入您想转账的金额:')
                    while tag:
                        take_msg = f.readline().decode('utf-8')
                        *_, z = take_msg.strip().split(':')
                        if name in take_msg:
                            money1 = int(z) + int(money)
                            data = take_msg.replace('{}'.format(z), '{}'.format(money1))
                            wf.write(data.encode('utf-8'))
                        elif login_name in take_msg:
                            if int(z) > int(money):
                                money2 = int(z) - int(money)
                                data = take_msg.replace('{}'.format(z), '{}'.format(money2))
                                wf.write(data.encode('utf-8'))
                                continue
                            else:
                                print('转账现金已经超过余额')
                                return '转账现金已经超过余额'
                        else:
                            wf.write('{}'.format(take_msg).encode('utf-8'))
                        if len(take_msg) == 0:
                            print('转账成功')
                            query_fuc()
                            break
                move_fuc()
                break
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
                inp_N = input('请输入符号:>>')
                if inp_N == 'P':
                    login_func()
                else:
                    print('退出')
                    break
    
    
    # 查询余额功能
    def query_fuc():
        global login_name
        while True:
            if login_name:
                with open(r'db.txt','rb') as f:
                    while True:
                        query_msg = f.readline().decode('utf-8')
                        if login_name in query_msg:
                            *_ , z = query_msg.strip().split(':')
                            print('{}的账号余额为{}元'.format(login_name,z))
                            return z
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
                inp_N = input('请输入符号:>>')
                if inp_N == 'P':
                    login_func()
                else:
                    print('退出')
                    break
    
    
    # 提现功能
    def cash_func():
        global login_name
        while True:
            if login_name:
                money_cash = input('请输入您的提现金额:>>').strip()
                with open(r'db.txt', 'rb') as f, 
                        open(r'db.txt.swap', 'wb') as wf:
                    while True:
                        cash_msg = f.readline().decode('utf-8')
                        if login_name in cash_msg:
                            *_ , z = cash_msg.strip().split(':')
                            if int(z) > int(money_cash):
                                money1 = int(z) - int(money_cash)
                                data = cash_msg.replace('{}'.format(z), '{}'.format(money1))
                                wf.write(data.encode('utf-8'))
                            else:
                                print('余额不足,提现失败')
                                return '余额不足,提现失败'
                        else:
                            wf.write('{}'.format(cash_msg).encode('utf-8'))
                        if len(cash_msg) == 0:
                            break
                move_fuc()
                print('提现成功')
                query_fuc()
                return '提现成功'
            else:
                print('还没有登录,请登录后再操作,输入P登录或者输入任意键退出')
            inp_N = input('请输入符号:>>')
            if inp_N == 'P':
                login_func()
            else:
                print('退出')
                break
    
    
    # 主函数体
    def main_func():
        contests_atm = {
            '0':register_func,
            '1':login_fuc,
            '2':recharge_fuc,
            '3':take_fuc,
            '4':cash_func,
            '5':query_fuc,
            '6':'6'
        }
        while True:
            print("""
            ==============ATM====================
                '0':注册
                '1':登录
                '2':充值
                '3':转账
                '4':提现
                '5':余额
                '6':退出
            ==============END====================     
            """)
            cmd = input('请输入命令编号>>: ').strip()
            if not cmd.isdigit():
                print('必须输入命令编号的数字,傻叉')
                continue
            if cmd not in contests_atm:
                print('输入的命令不存在')
                continue
            if cmd == '6':
                print('已成功退出!')
                break
            contests_atm[cmd]()
    
    
    main_func()
    

    内心小总结:

      不管做什么都需要心平气和,不能着急,越着急越想不到,二十分钟做不出来的登录锁定,放松下来一次搞定,心态决定一切!!

  • 相关阅读:
    Java数据结构和算法(三)——冒泡、选择、插入排序算法
    Java数据结构和算法(二)——数组
    Java数据结构和算法(一)——简介
    Linux系列教程(二十四)——Linux的系统管理
    部署python项目到linux服务器
    ImportError:No module named 'PIL'
    Django异常
    linux安装mysqlclient报错
    python升级带来的yum异常:File "/usr/bin/yum", line 30
    python3+django+mysql
  • 原文地址:https://www.cnblogs.com/Lance-WJ/p/12528924.html
Copyright © 2011-2022 走看看