zoukankan      html  css  js  c++  java
  • 小程序3:ATM小程序

    ATM实现流程

    1.欢迎界面和菜单

    显示部分的代码代码放到view.py中

    import time
    
    class View():
        def login():
            """
            管理员登录
            :return: 
            """
            while True:
                username = input("请输入管理员用户名:")
                password = input("请输入管理员密码:")
                if username == 'admin' and password == '123':
                    View.welcome_view()
                    time.sleep(1)
                    View.operate_view()
                    return True
                else:
                    print("管理员用户或密码错误,请重新输入")
    
        def welcome_view():
            """
            欢迎界面
            :return: 
            """
            print("**************************************")
            print("*                                    *")
            print("*                                    *")
            print("*     Welcome to Kengdie's Bank      *")
            print("*                                    *")
            print("*                                    *")
            print("**************************************")
    
        def operate_view():
            """
            菜单
            :return: 
            """
            print("**************************************")
            print("*       开户(1)         查询(2)       *")
            print("*       存钱(3)         取钱(4)       *")
            print("*       转账(5)         改密(6)       *")
            print("*       锁卡(7)         解卡(8)       *")
            print("*       补卡(9)         退出(0)       *")
            print("**************************************")

    实现效果如下图所示

    2.创建Card类和Person类

    Card类存储了一个卡的基本信息,Card类相关参数如下所示:

    class Card:
        def __init__(self,cardid,password,money):
            self.cardid = cardid # 卡号
            self.password = password # 卡号对应的密码
            self.money = money # 卡内余额
            self.islock = False # 卡的状态,False代表卡未被冻结

    Person类存储了一个用户的基本信息,Person类相关参数如下所示:

    class Person():
        def __init__(self,name,userid,phone,card):
            self.name = name # 用户姓名
            self.userid = userid # 身份证号
            self.phone = phone # 手机号
            self.card = card # 用户卡对象

    3.通过pickle获取user.txt和userid.txt中的数据

     def __init__(self):
            """
            初始化方法,用来加载txt中文件数据
            """
            self.get_user_dict()
            self.get_userid_dict()
    
        def get_user_dict(self):
            """
            加载user.txt中的数据
            :return:
            """
            if os.path.exists("user.txt"):
                with open("user.txt", mode='rb') as fp:
                    self.user_dict = pickle.load(fp)
            else:
                self.user_dict = {}
    
        def get_userid_dict(self):
            """
            加载userid.txt中的数据
            :return:
            """
            if os.path.exists("userid.txt"):
                with open("userid.txt", mode='rb') as fp:
                    self.userid_dict = pickle.load(fp)
            else:
                self.userid_dict = {}

    4.当我们选择为0,要实现保存操作

        def save(self):
            """
            存储两个字典
            :return:
            """
            with open("user.txt", mode='wb') as fp:
                pickle.dump(self.user_dict,fp) # 退出时,将字典写回文件中
            with open("userid.txt", mode='wb') as fp:
                pickle.dump(self.userid_dict,fp)

    5.选择为1:开户(注册)功能

        def register(self):
            """
            开户(注册)
            :return:
            """
            name = self.check_name()
            userid = self.check_userid()
            phone = self.check_phone()
            password = self.get_pwd("请输入您的密码","请确认您的密码")
            cardid = self.get_cardid()
            money = 10
            card = Card(cardid,password,money)
            person = Person(name,userid,phone,card)
    
            self.user_dict[cardid] = person
            self.userid_dict[userid] = cardid
    
            print("恭喜{}开卡成功,卡号{},卡上余额{}元".format(name,cardid,money))

    1.关于输入的合法性:在注册时,我们需要输入名字、身份证号、手机号等众多信息,而这些输入内容都需要进行正则匹配后才可以通过的

    下面的函数是专门用来判断用户输入的内容是否合法:

      def check_name(self):
            """
            检查名字是否合法
            :return:
            """
            while True:
                name = input("请输入您的名字:")
                if name == "" or " "in name:
                    print("名字不符合规范")
                else:
                    return name
    
    
        def check_userid(self):
            """
            检查身份证号码是否规范
            :return:
            """
            while True:
                userid = input("请输入您的身份证号:")
                value = re.search("^d{6}([1-9]d{3})([0][1-9]|[1][0-2])([0][1-9]|[12][0-9]|[3][01])d{3}[Xd]$", userid)
                if value != None:
                    return userid
                else:
                    print("身份证号码不符合规范")
    
        def check_phone(self):
            """
            检查手机号是否规范
            :return:
            """
            while True:
                phone = input("请输入您的手机号:")
                value = re.findall("^[1][3-9]d{9}$",phone)
                if value != []:
                    return value
                else:
                    print("手机号不符合规范")
    
        def check_pwd(self,check_pwd):
            """
            检测密码是否规范
            :param check_pwd:
            :return:
            """
            value = re.findall("^w{6}$",check_pwd)
            if value != []:
                return value[0]
            else:
                print("密码不符合规范")

    2.关于获取卡号:当用户正确的填写信息后,我们需要赋予用户一个卡号,所以我们需要一个生成卡号的函数:

        def get_cardid(self):
            """
            获取随机卡号
            :return:
            """
            while True:
                cardid = str(random.randrange(100000,1000000))
                if cardid not in self.user_dict:
                    return cardid

    3.关于user.txt和userid.txt中数据的存储形式:当我们注册成功时,我们应该存储一些用户信息放到字典中

    下面规定了数据的存储形式:

    user.txt : {卡号1:用户对象1,卡号2:用户对象2,卡号3:用户对象3}

    userid.txt : {身份证号1:卡号1,身份证号2:卡号2,身份证号3:卡号3}

    4.实现效果如下图所示:

    选择为2:查询用户卡余额

        def query(self):
            """
            查询用户卡内余额
            :return:
            """
            card = self.get_card_info()
            if not card:
                print("抱歉,这张卡不存在")
            else:
                if card.islock:
                    print("您的账户已经被冻结")
                else:
                    if self.pwd_validation(card):
                        print("您的卡内余额为{}元".format(card.money))

    1.输入卡号获取卡号所对应的用户对象:无论是现在的查询操作,还是后面的其他操作,我们会经常需要根据当前卡号获取当前卡号所对应的卡号对象

    所以我们需要定义一个get_card_info方法,目的是根据输入的用户卡号获取卡号对象,方便后面的操作

        def get_card_info(self):
            """
            获取卡号
            :return:
            """
            cardid = input("请输入您的卡号:")
            if cardid not in self.user_dict:
                return False
            else:
                user = self.user_dict[cardid]
                return user.card

    2.关于逻辑:如下图所示

    3.关于输入密码正确与否,以及输错次数的限定,我们需要单独定义一个函数

        def pwd_validation(self,card):
            """
            密码验证
            :param card:
            :return:
            """
            times = 1
            while times < 4:
                password = input("请输入您的密码:")
                if password == card.password:
                    return True
                else:
                    print("密码输入错误,您还有{}次机会".format(3-times))
                    # print(card.password)
                    if times == 3:
                        card.islock = True
                        print("由于您多次输入密码错误,您的账户已经被冻结~")
                times += 1

    4.实现效果如下图所示

    3.选择为3:存钱

        def save_money(self):
            """
            存钱
            :return:
            """
            card = self.get_card_info()
            if not card:
                print("抱歉,这张卡不存在")
            else:
                user = self.user_dict[card.cardid] # 给卡号获取用户对象
                print("您这张卡的用户名为{}".format(user.name)) # 根据用户对象取用户名
                key_sure = input("确认存钱请按1 ,按其他键返回上一层:") # 确认按钮
                if key_sure == "1":
                    str_money = input("请输入您的存款金额:")
                    if str_money.isdecimal() and str_money != "0": # 输入金额必须是纯数字且不可以存0元
                        money = int(str_money)
                        card.money += money # 存的钱+卡内的钱=现在卡里有多少钱
                        print("您已经成功存入{}元".format(money))
                    else:
                        print("输入存款金额非法")

    1.需要注意的是:可以根据user_dict中的键:card.cardid获取到值:user(用户对象)-->用来显示用户名

    2.实现效果如下图所示

    4:选择为4:取钱

       def get_money(self):
            """
            取钱
            :return:
            """
            card = self.get_card_info()
            if not card:
                print("抱歉,这张卡不存在")
            else:
                if card.islock:
                    print("您的账户已经被冻结")
                else:
                    if self.pwd_validation(card):
                        while True:
                            money = input("请输入您的取款金额:")
                            if money.isdecimal() and money != "0":
                                money = int(money)
                                if money <= card.money:# 只有输入的取款金额小于卡内的余额,才可以取款
                                    card.money -= money
                                    print("您已经成功取款{}元,还剩{}元".format(money,card.money))
                                    break
                                else: # 如果输入的取款金额大于卡内的余额,提示余额不足
                                    print("银行卡内余额不足,请重新输入")
                            else:
                                print("输入金额非法")

    1.需要注意的是:只有取款金额小于卡内的余额,才可以成功取款

    2.关于逻辑:如下图所示

    3.实现效果如下图所示

  • 相关阅读:
    Android第四次作业
    Android第三次作业
    android 第一次作业
    团队作业-项目答辩
    团队作业2
    软工作业--团队作业2
    软件工程—团队作业1
    软件工程第一次作业
    Android第四次作业
    Android 第三次作业
  • 原文地址:https://www.cnblogs.com/libolun/p/13493140.html
Copyright © 2011-2022 走看看