import os
class Account:
def __init__(self, username, password, money=0):
self.username = username
self.password = password
self.money = money class ATM:
def __init__(self):
self.acc = None # 账户信息. 当登陆成功之后。 self。acc = 当前登陆的账户 def regist(self):
print("欢迎来到注册环节")
username = input("请输入你要注册用户名:")
password = input("请输入你要注册密码:") f = open("atm.txt", mode="r", encoding="utf-8")
for line in f:
if line.strip().split("$$")[0] == username: # 用户名重复了
print("对不起, 用户名重复了")
return acc = Account(username, password)
# 把账户信息写入到文件中
f = open("atm.txt", mode="a", encoding="utf-8")
f.write(acc.username+"$$" + acc.password+"$$"+str(acc.money)+"\n")
f.flush()
f.close()
print("注册成功!!!!") def login(self):
print("欢迎进入登陆环节!!")
username = input("请输入你要注册用户名:")
password = input("请输入你要注册密码:")
f = open("atm.txt", mode="r", encoding="utf-8")
for line in f:
if line.strip().split("$$")[0] == username and line.strip().split("$$")[1] == password: # 用户名重复了
print("登陆成功")
# 把登陆成功的账户放在atm中
self.acc = Account(line.strip().split("$$")[0], line.strip().split("$$")[1], int(line.strip().split("$$")[2]))
break
else:
print('登陆失败!!!!') def write_to_file(self):
# 把当前账户里的信息写入到atm.txt
with open("atm.txt", mode="r", encoding="utf-8") as f1, \
open("atm.txt_副本", mode="w", encoding="utf-8") as f2:
for line in f1:
# 找到当前登陆的账户
if line.strip().split("$$")[0] == self.acc.username:
line = self.acc.username + "$$" + self.acc.password + "$$" + str(self.acc.money) + "\n"
f2.write(line)
os.remove("atm.txt")
os.rename("atm.txt_副本", "atm.txt") def cun(self):
if self.acc ==None:
print("还没有登陆呢, 请登陆")
return
print("进入存钱环节")
money = int(input("请输入你要存的钱数:"))
self.acc.money += money # 存钱了
self.write_to_file()
print("存钱成功") def qu(self):
if self.acc ==None:
print("还没有登陆呢, 请登陆")
return
print("进入取钱环节")
money = int(input("请输入你要取的钱数:"))
if self.acc.money < money:
print("余额不足")
return
self.acc.money -= money
self.write_to_file()
print("取钱成功.") def huikuan(self):
if self.acc ==None:
print("还没有登陆呢, 请登陆")
return
print("进入汇款环节!")
target = input("请告诉我对方账号:")
if target == self.acc.username :
print("自己不能汇款给自己")
return f = open("atm.txt", mode="r", encoding="utf-8")
for line in f:
if line.strip().split("$$")[0] == target: # 找到了我要汇款的账号
break
else:
print("对不起。 账号不存在")
return
f.close()
# 汇款
money = int(input("请输入你要汇款的钱数:"))
if self.acc.money < money:
print("余额不足")
return
else: # 钱够。 账户也对
# 先给对方账号加钱
with open("atm.txt", mode="r", encoding="utf-8") as f1, \
open("atm.txt_副本", mode="w", encoding="utf-8") as f2:
for line in f1:
if line.strip().split("$$")[0] == target: # 找到了我要汇款的账号
line = line.strip().split("$$")[0] + "$$" + line.strip().split("$$")[1] + "$$" + str(int(line.strip().split("$$")[2]) + money) + "\n"
f2.write(line)
os.remove("atm.txt")
os.rename("atm.txt_副本", "atm.txt")
# 自己账号减钱
self.acc.money -= money
self.write_to_file()
print("汇款成功!") def chaxun(self):
if self.acc ==None:
print("还没有登陆呢, 请登陆")
return
print("您的余额是:%s" % self.acc.money) def run(self):
menu = ("注册", "登陆", "存钱", "取钱", "汇款", "查询余额", "退出")
while 1:
for i, m in enumerate(menu, 1):
print(i, m)
m = input("请输入你要执行的菜单:")
if m == "":
self.regist()
elif m == '':
self.login()
elif m == '':
self.cun()
elif m == '':
self.qu()
elif m == "":
self.huikuan()
elif m == "":
self.chaxun()
elif m == "":
self.acc = None#永不停机的ATM ATM().run() # 程序的入口

面向对象之-------------------永不停机的ATM的更多相关文章

  1. 【Akka】Actor模型探索

    Akka是什么 Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的.通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台.在容错性方面我们採取了" ...

  2. Akka初步介绍

    Akka可能很多人都没有用过,也不知道是什么,但如果说起Scala或Spark就有很多人都听说过或使用过 ,这里简单说下三者的关系Akka是使用Scala开发的,Spark中使用了Akka作为其消息的 ...

  3. 百行go代码构建p2p聊天室

    百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3 ...

  4. web3js learning

    使用console.log(web3.version.api);来查看了web3的版本是0.20.1, 参考文档在:https://github.com/ethereum/wiki/wiki/Java ...

  5. 超计算(Hyper computation)模型

    超计算(Hyper computation)模型 作者:Xyan Xcllet链接:https://www.zhihu.com/question/21579465/answer/106995708来源 ...

  6. Druid学习之路 (一)Druid初识

    作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9588079.html 转载请注明出处 最近在学习和使用Druid.觉得一些章节有必要按照自己的理解翻译 ...

  7. 以太坊系列之十八: 百行go代码构建p2p聊天室

    百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3 ...

  8. SEER见证人操作指南

    SEER的见证人设计 共识方式 在区块生产者的产生方式上,SEER采取了PoS的共识方式,用户通过智能合约抵押自己持有的SEER竞选主力见证人(区块生产者). 对于SEER区块链来说,制约区块链TPS ...

  9. windows开机自启动的django服务

    做了一个django项目,想部署在win10的笔记本电脑上,可以开机后台自动启动.找了很多的方法.最后成功了. 参考了这个博主的内容. https://blog.csdn.net/qq_3595961 ...

随机推荐

  1. Winform状态栏控件中Label靠右显示的方法

    设计器:   代码: 在Form_Load事件中添加 : statusStripMain.LayoutStyle= ToolStripLayoutStyle.HorizontalStackWithOv ...

  2. lucene、solr中的日期衰减方法-------function query --尚未测试在solr4.8

    经常有一种情景是这样的:我们索引了N年的文章,而查询时候无论直接用相关度.或者用时间排序,都是比较鲁莽的:我们想要一种既要相关度比较高,又要时间上比较新的文章. 这时候的解决办法就是,自定义日期衰减的 ...

  3. apache重写规则详解

    RewriteEngine on 为重写引擎开关,如果设为off,则任何重写规则定义将不被应用,该开关的另一好处就是如果为了临时拿掉重写规则,则改为off再重启动Apache即可,不必将下面一条条的重 ...

  4. Tensorflow梯度下降应用

    import tensorflow as tfimport numpy as np #使用numpy生成随机点x_data = np.random.rand(100)y_data = x_data*0 ...

  5. GCD 学习(四) dispatch_group

    如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,可以把该操作放到最后一个任务执行完成后继续,但是在并行队列中怎么做呢.这就有dispatch_group 成组操作 ...

  6. WOJ 41 约数统计

    只会写60分算法QuQ 考虑到一个数$x$大于$\sqrt{x}$的质因数最多只有一个,我们可以筛出小于$\sqrt{r}$范围内的所有质因数然后直接用这些取分解质因数. 最后扫一遍发现还没有分解完的 ...

  7. 导出Excel解决方案之一NOPI

    一.概要 导出Excel这个功能相信很多人都做过,但是实现这个功能解决方案有好几种,今天我未大家介绍一种比较新的,其实也不新了- -!它叫NPOI,可以完美操作EXCEl的导入和导出操作,让我们一起看 ...

  8. 《Effective Java》第5章 泛型

    第23条:请不要在新代码中使用原生态类型 声明中具有一个或者多个类型参数( type parameter)的类或者接口,就是泛型(generic)类或者接口. 每种泛型定义一组参数化的类型(param ...

  9. 日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)

    一.自定义了一个ArrayList的模拟集合(源码+详细说明) 前段时间分析了下ArrayList集合的源码,总觉得如果不自己定义一个的话,好像缺了点什么,所以有了如下的代码. 代码可以说是逐行注释了 ...

  10. [学习笔记]Vfork深入理解

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> ...