技术标签: python
目录上面
先需要分析,有那些类,类有什么属性
人
类名:Person
属性:姓名,身份证号,电话号,卡
行为:
卡
类名:Card
属性:卡号,密码,余额
行为:
提款机
类名:ATM
属性:用户字典
行为:开户,查询,取款,存款,转账,改密码,锁定,解锁,补卡,销户
管理员
类名:Admin
属性:
行为:管理员界面,显示界面(功能界面),管理员验证
管理员界面和显示界面是一进去程序就能看见的
所以分2个函数,管理员界面一个,显示界面一个(即功能界面)。
import time
class Admin(object):
admin = '1'
passwd = '1'
# 管理员界面
def AdminView(self):
print("**********************************************")
print("* *")
print("* *")
print("* 欢迎登录联盟银行 *")
print("* *")
print("* *")
print("**********************************************")
# 功能界面
def FunctionView(self):
print("**********************************************")
print("* 开户(1) 查询(2) *")
print("* 取款(3) 存款(4) *")
print("* 转账(5) 改密码(6) *")
print("* 锁定(7) 解锁(8) *")
print("* 补卡(9) 销户(10) *")
print("* 退出(0) *")
print("**********************************************")
# 管理员验证
def Check(self):
inputAdmin = input("请输入管理员账户: ")
if self.admin != inputAdmin:
print("账号输入错误!")
return -1
inputPasswd = input("请输入管理员密码: ")
if self.passwd != inputPasswd:
print("密码输入错误!")
return -1
# 能执行到这里说明账号密码输入正确
print("操作成功,请稍后...")
# time.sleep(2)
return 0
管理员界面
功能界面
在ATM类中,我把每个用户的所有数据存入字典当中,比如开户行为,目标就是向用户字典中添加一对键值对(卡号-用户)。
当然,除了我所要求的ATM机的功能行为外,还需要额外创建两个方法随机生成卡号和验证密码,因为这两个方法经常被使用,为了提高程序的复用性,我将这两个方法单独写了出来
import random
from Card import Card
from Person import Person
class ATM(object):
def __init__(self, allusers):
# 存储所有用户的信息,用字典
self.allUsers = allusers
# 创建用户
def CreatUser(self):
# 目标:向用户字典中添加一对键值对(卡号-用户)
name = input("请输入您的姓名:")
idCard = input("请输入您的身份证号:")
phone = input("请输入您的电话号码:")
preMoney = int(input("请输入您的预存款金额:"))
if preMoney < 0:
print("预存款输入有误,开户失败......")
return -1
# 设置密码
onePasswd = input("请输入密码:")
# 验证密码
if not self.checkPasswd(onePasswd):
print("密码输入有误,开户失败......")
return -1
# 信息收集完成
# 生成卡号
cardId = self.creatCardId()
card = Card(cardId, onePasswd, preMoney)
user = Person(name, idCard, phone, card)
# user存到字典
self.allUsers[cardId] = user
print("开户成功,请牢记卡号(%s)......" % cardId)
# 查询余额
def searchUserInfo(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
# 查询成功,输出结果
print("账户:%s 余额:%d" % (user.card.cardid, int(user.card.cardmoney)))
# 取款
def getMoney(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
getmoney = int(input("请输入您取款金额:"))
nowmoney = int(user.card.cardmoney)
if getmoney > nowmoney:
print("余额不足,取款失败......")
return -1
nowmoney -= getmoney
user.card.cardmoney = nowmoney
print("取款成功,您目前余额为:%d" % user.card.cardmoney)
# 存款
def saveMoney(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
savemoney = int(input("请输入您存款金额:"))
nowmoney = int(user.card.cardmoney)
nowmoney += savemoney
user.card.cardmoney = nowmoney
print("取款成功,您目前余额为:%d" % user.card.cardmoney)
# 转账
def transferMoney(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
# 查询成功,输出结果
print("账户:%s 余额:%d" % (user.card.cardid, int(user.card.cardmoney)))
tocardid = input("请输入您希望转账的账户:")
# 验证是否存在该卡号
usertoid = self.allUsers.get(tocardid)
if not usertoid:
print("该卡号不存在,查询失败......")
return -1
tomoney = int(input("请输入您希望转账的金额:"))
nowmoney = int(user.card.cardmoney)
tonowmoney = int(usertoid.card.cardmoney)
if tomoney > nowmoney:
print("余额不足,转账失败......")
return -1
nowmoney -= tomoney
tonowmoney += tomoney
user.card.cardmoney = nowmoney
usertoid.card.cardmoney = tonowmoney
print("转账成功,您目前余额为:%d" % user.card.cardmoney)
# 改密码
def changePasswd(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 判断是否锁定
if user.card.cardlock == True:
print("该卡已经被锁定,请解锁后再使用其他操作......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,该卡已经被锁定......")
user.card.cardlock = True
return -1
newpasswd = input("请输入新密码:")
newpasswd2 = input("请确认新密码:")
if newpasswd != newpasswd2:
print("两次密码输入不一致,密码修改失败")
return -1
user.card.cardpasswd = newpasswd
print("密码修改成功......")
# 锁定
def lockUser(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
if user.card.cardlock:
print("该卡已经被锁定,请结束后再使用其他功能")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误......")
return -1
# 锁定
user.card.cardlock = True
print("锁定成功......")
# 解锁
def unlockUser(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,解锁失败......")
return -1
if not user.card.cardlock:
print("该卡没有锁定,无需解锁......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,解锁失败......")
return -1
temid = input("请输入您的身份证号:")
if temid != user.idCard:
print("身份证号输入错误,解锁失败......")
return -1
# 解锁
user.card.cardlock = False
print("解锁成功......")
# 补卡
def newCard(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误......")
return -1
# 重新生成卡号
newcard = self.creatCardId()
user.card.cardid = newcard
print("补卡办理成功,这是您的新卡号:%s" % user.card.cardid)
# 销户
def killUser(self):
cardnum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardnum)
if not user:
print("该卡号不存在,查询失败......")
return -1
# 验证密码
if not self.checkPasswd(user.card.cardpasswd):
print("密码错误,销户失败......")
return -1
self.allUsers.pop(cardnum)
print("该账户已经被销户......")
# 验证密码,循环三次没有正确就输出错误
def checkPasswd(self, realPasswd):
for i in range(3):
temPasswd = input("请确认密码:")
if temPasswd == realPasswd:
return True
return False
# 随机生成卡号
def creatCardId(self):
# 验证密码是否重复
while True:
str = ""
for i in range(6):
ch = chr(random.randrange(ord('0'), ord('9') + 1))
str += ch
# 判断是否重复
if not self.allUsers.get(str):
return str
人的行为可以使用在ATM行为来代替,所以这个class定义了4个属性
class Person(object):
def __init__(self,name,idCard,phone,card):
self.name = name #用户名字
self.idCard = idCard #用户身份证
self.phone = phone #用户电话
self.card = card #用户的信用卡
银行卡这个类只有三个属性卡号,密码,余额。但是在ATM机的行为中,需要对信用卡进行锁定,所以需要多添加一个锁定属性来判断信用卡是否被锁定。
class Card(object):
def __init__(self,cardid,cardpasswd,cardmoney):
self.cardid = cardid #信用卡号
self.cardpasswd = cardpasswd #信用卡密码
self.cardmoney = cardmoney #卡内余额
self.cardlock = False #是否被锁定
在main方法中,因为ATM系统功能界面所示,将进行功能选择
新建立一个银行自动提款机python
import time
from Admin import Admin
import pickle
from ATM import ATM
import os
def main():
# 界面对象
admin = Admin()
# 管理员开机
admin.AdminView()
if admin.Check():
return -1
#存储信息的文件是否存在
if os.path.exists("userinfo.txt"):
filepath = "userinfo.txt"
else:
open("userinfo.txt", "wb")
filepath = "userinfo.txt"
# 提款机对象
#如果存储信息的文件非空
if os.path.getsize(filepath):
f = open(filepath, "rb")
# print(f)
allusers = pickle.load(f)
else:
# print("*****")
allusers = {
}
print((allusers))
atm = ATM(allusers)
while True:
admin.FunctionView()
# 等待用户操作
option = input("请输入您的操作:")
if option == '1':
# 开户
atm.CreatUser()
elif option == '2':
# 查询
atm.searchUserInfo()
elif option == '3':
# 取款
atm.getMoney()
elif option == '4':
# 存款
atm.saveMoney()
elif option == '5':
# 转账
atm.transferMoney()
elif option == '6':
# 改密码
atm.changePasswd()
elif option == '7':
# 锁定
atm.lockUser()
elif option == '8':
# 解锁
atm.unlockUser()
elif option == '9':
# 补卡
atm.newCard()
elif option == '10':
# 销户
atm.killUser()
elif option == '0':
# 退出
if not admin.Check():
# 将当前系统中的用户信息保存到文件中
f = open(filepath, "wb")
pickle.dump(atm.allUsers, f)
f.close()
return -1
time.sleep(2)
if __name__ == "__main__":
main()
文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大
文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码
文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版
文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗
文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程
文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0
文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader
文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型
文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写
文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录
文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点
文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文