目录

一、题目描述

二、分析

三、源码


一、题目描述

定义表示银行卡和ATM(自动柜员机)的类,要求ATM可以实现读卡、存钱、取钱、转账的功能。

二、分析

1、首先根据题目要求,需要创建两个类,Card()和ATM(),

2、Card类中有卡号,有效期、以及卡的类型三个属性,在实例化对象时对其值初始化,还重写了str方法,也就是输出格式化,在遇到print时直接调用,然后输出规定格式的内容

3、ATM类的实例化方法中没有对其赋初值,但是有三个对象属性;

第一个是account:以字典的形式来存储卡号、密码以及余额;用字典的键来存卡号,再将其它的信息用字典存起来做为值,这样进行判断的时候可以通过键来取到卡的其它信息;(用字典存储的好处就是可以通过键来获取值)

第二个是curren_card,即用来存储当前卡是否存在,初始值为Nnoe

第三个是curren_account,在读卡的时候,如果卡号在数据库中(此处的数据库是最开始声明的账户字典)这将其键对应的值赋值给此变量,方便后续对密码以及余额操作;(关键点)

4.ATM中的方法:

①读卡——read_card(self,card)

要传入一个卡的对象,首先是判断插入的卡的卡号(卡类的实例化属性)是否在ATM的数据库中,如果再就将其卡号对应的值用curren_account给存储起来,在通过current_account(字典)取出其中的密码,与用户输入的密码进行比较是否一致,如果一致则读卡成功,可以进行下一步,密码只有三次的输入机会,如果三次错误则提示卡被收回;

 def read_card(self,card):# 插卡# 阅读# 输入密码# 字典的成员运算符 in 验证的就是键if card.card_no in self.accounts:self.current_account = self.accounts[card.card_no]for _ in range(3):password = input('请输入您的密码')if password != self.current_account['password']:print('密码错误')else:self.current_card = cardreturn True   # 是否读卡成功else:print('卡被收回,请致电123-456-789')else:print('无效银行卡请拿走')return False   # 默认读卡失败
写代码的逻辑:在进行if判断的时候,可以先将简单的完善,复杂的先用pass占位符,然后再回过头来去写复杂的,这样写起来会轻松很多。这样不仅能完善逻辑,而且能将复杂的事情简单化。如果先把if写完的话,可能会出现漏掉else的情况,或者else的位置错误等情况。

②展示余额——show_balance(self)

通过第一步的读卡操作将当前卡的其它信息保存到变量current_account中,此时的字典存储的就是卡的密码以及账户余额的信息,此时只要余额存在即就可以输出其余额了

    def show_balance(self):if self.current_account:print(f'账户余额{self.current_account["balance"]}')

③存款——add_money(self,money)

存款和展示余额其实没什么差别,差别只是在于一个是展示,一个是对其进行增加,所以此方法还需要传入一个存钱的值,再者就是判断其账户存不存在了 ,如果存在则将钱加到原有的余额上,不存在则返回False

    def add_money(self,money):if money>=100 and self.current_account:self.current_account['balance']+= moneyprint('存款成功')return Truereturn False

④取款——withdraw(self,money)

取款时要传入一个取款金额的参数,取款方法除了要满足卡号存在的情况外,还要满足账户的余额大于要取款的金额,当满足以上两种情况时,才能取款,取款的操作就是将原有账户的余额减去取出的金额,剩下的就是该账户的余额了

    def withdraw(self,money):if money <= self.current_account['balance'] and self.current_account:self.current_account['balance'] -= moneyprint('取款成功')return Trueelse:print('余额不足,请重新选择取款数目')return False

⑤转账——transfer(self,other_card_no,money)

转账需要传入两个参数,一个是要转账的卡号(此处其实也可以传入一个卡的对象,然后再取出其卡号),还有一个就是要转账的金额;首先进行判断的是要转账的账户是否在数据库中,然后同样的将其卡号对应的其他值存储到一个变量中,再者就是判断转账金额和账户余额的大小情况,如果都满足的情况下,就将要转出的账户的余额减去转账的金额,接收的账户的余额加上转账的金额,此时转账就完成了

    def transfer(self,other_card_no,money):if other_card_no in self.accounts:other_account = self.accounts[other_card_no]if money<=self.current_account['balance']:self.current_account['balance']-=moneyother_account['balance']+=moneyprint('转账成功')return Trueelse:print('无效账户')return False

⑥取卡——move_card(self)

取卡的方法就是将之前存储的卡号对应的信息给删除,然后提醒用户取走卡

  def move_card(self):self.current_card = Noneself.current_account = Noneprint('请取走您的卡')

三、源码

# 银行卡类
# 卡号  有效期   卡的类型
# atm取款机类
# 数据库 读卡  存钱 取钱  转账
# 数据库  卡号  密码  余额  是否被冻结class Card:def __init__(self,card_no,expiry_date,card_type="储蓄卡"):self.card_no = card_noself.expiry_date = expiry_dateself.card_type = card_typedef __repr__(self):return f'卡号:{self.card_no}\n有效期:{self.expiry_date}\n卡片类型:{self.card_type}'class ATM:def __init__(self):self.accounts = {'1122334455667788':{'password':'123456','balance':24000.00},'1122334455667789':{'password':'654321','balance':45000.00},'1122334455667790':{'password':'987654','balance':0.00},}self.current_card = Noneself.current_account = Nonedef read_card(self,card):# 插卡# 阅读# 输入密码# 字典的成员运算符 in 验证的就是键if card.card_no in self.accounts:self.current_account = self.accounts[card.card_no]for _ in range(3):password = input('请输入您的密码')if password != self.current_account['password']:print('密码错误')else:self.current_card = cardreturn True   # 是否读卡成功else:print('卡被收回,请致电123-456-789')else:print('无效银行卡请拿走')return False   # 默认读卡失败def show_balance(self):#展示余额if self.current_account:print(f'账户余额{self.current_account["balance"]}')def add_money(self,money):#存钱if money>=100 and self.current_account:self.current_account['balance']+= moneyprint('存款成功')return Truereturn Falsedef withdraw(self,money):#取钱if money <= self.current_account['balance'] and self.current_account:self.current_account['balance'] -= moneyprint('取款成功')return Trueelse:print('余额不足,请重新选择取款数目')return Falsedef transfer(self,other_card_no,money):#转账if other_card_no in self.accounts:other_account = self.accounts[other_card_no]if money<=self.current_account['balance']:self.current_account['balance']-=moneyother_account['balance']+=moneyprint('转账成功')return Trueelse:print('无效账户')return Falsedef move_card(self):#取卡self.current_card = Noneself.current_account = Noneprint('请取走您的卡')#实例化两张卡的对象
card1 = Card('1122334455667788','2222-10-24')
card2 = Card('1122334455667789','2222-10-24')#实例化ATM对象
a = ATM()#读取卡1的信息
a.read_card(card1)
#展示卡1的账户余额
a.show_balance()
#向卡1存款10000元
a.add_money(10000)
a.show_balance()
#从卡1取款6666元
a.withdraw(6666)
a.show_balance()
#向其它账户转账
a.transfer('1122334455667789',8888)
a.show_balance()

ATM银行系统(对象初级练习)相关推荐

  1. 简易的ATM银行系统(Java)

    哈喽,我又来啦!好久没更新了,最近在复习Java基础,然后做了一个简单的ATM系统,可以实现开户,登录,查询,存款,取款,转账,修改密码,注销等简单的功能. 下面附上代码 首先是一个账户的实体类这里就 ...

  2. 面向对象程序设计之类和对象初级试题

    面向对象程序设计之试题 类和对象 定义一个菜谱类Recipe用来存储某种菜的制作过程等相关信息,其属性包括:菜谱名称.菜系(如:川菜.湘菜等).烹饪时长(分钟).所需的多种食材(字符串数组类型,假设每 ...

  3. java 麻将的发牌与洗牌_JAVA程序设计(11)-----面对对象初级设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样...

    zzzzZZZZ 1.开始还想贴图的 实在太懒了-- 这是一张麻将 package com.lovo; import java.awt.Graphics; import java.awt.Image; ...

  4. atm系统的用例模型_ATM银行系统用例图.doc

    ATM银行系统用例图 UML建模语言7种图(以银行ATM系统为例) 分类: JAVA 2010-04-21 20:40 705人阅读 评论(0) 收藏 举报 1 用例图:?????? 描述了系统提供的 ...

  5. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对"状态模式"并不陌生,因为我们之前使用到了状态模式进行 ...

  6. C#——《C#语言程序设计》实验报告——继承与多态——银行ATM程序

    一.实验目的 掌握C#中各种成员的写法: 掌握C#继承和多态概念: 掌握常用接口的使用方法. 二.实验内容 在银行ATM示例的基础上,利用面向对象的思想及语法,进行改进.要求如下: 1)使用面向对象的 ...

  7. C#——银行ATM程序DEMO

    问题描述 1. 使用面向对象的思想,模拟现实世界中的银行.账号.ATM等对象,其中类中有字段.方法: 2. 在程序中适当的地方,使用属性.索引,注意使用修饰符: 3. 使用继承,继承账号(Accoun ...

  8. ATM机等待时间详细代码和解释

    import random#导入随机模块 class ATM(): #定义ATM类对象 def init(self, maxtime=10): #初始化,定义最大操作时间10分钟 self.t_max ...

  9. C#之银行ATM实例-Part1

    一.题目要求: 在下面银行ATM示例的基础上,利用所学的面向对象的思想及语法,进行改进.要求如下: 1. 使用面向对象的思想,模拟现实世界中的银行.账号.ATM等对象,其中类中有字段.方法: 2. 在 ...

最新文章

  1. Swift iOS : 模糊化
  2. 【哈佛商评】关于数据分析,管理者的四个常规错误
  3. uvalive4744(数论)
  4. Spire.Pdf 的各种操作总结
  5. 巧用 Img / JavaScript 采集页面数据
  6. 宏碁笔记本linux,Acer宏碁(Acer宏碁)Acer 4752G-2332G50Mnkk Linux笔记本电脑整体评测-ZOL中关村在线...
  7. 理解vue中$watch使用
  8. Java程序员必读——领悟Java编程思想
  9. 数据结构和算法——八种常用的排序算法----直接插入排序和希尔排序
  10. 计算机竞赛CCC可以直接学吗,2019 CCC 加拿大计算机竞赛
  11. RHEL7 CentOS7 检查查看精简指令
  12. pcb 受潮_PCB受潮影响性能有什么好的处理方法?
  13. 大内高手 调试手段及原理
  14. 嫁给年薪百万的程序员,结婚 6 年后的我竟然还是处女
  15. 微搭典型应用需求梳理
  16. 修改python终端不能打开方法解决
  17. python实现模拟浏览器操作
  18. mysql (1205, 'Lock wait timeout exceeded; try restarting transaction')
  19. 马化腾说视频号是全公司希望
  20. M5Product: Self-harmonized Contrastive Learning for E-commercial Multi-modal Pretraining 论文解读

热门文章

  1. 我的Win7优化纪实2 ---C盘瘦身扩容
  2. 关于浙江叔侄冤案的一些联想
  3. 表示层,业务逻辑层,持久层,数据库(简记)
  4. 青龙面板--多功能之微博联通羊毛
  5. thinkphp 商品添加款式 、规格、图片上传
  6. IQ百度普通收录推送精灵
  7. ⭐算法入门⭐《堆》中等03 —— LeetCode 373. 查找和最小的K对数字
  8. 在学校计算机协会的宣传标语,FS电脑协会宣传标语
  9. 视频回顾 | Pulsar Summit Asia 2020 · 主题演讲
  10. 尖头皮鞋对健康有害无益