ATM管理系统
博客班级 | 软件工程 |
---|---|
作业要求 | 作业要求 |
作业目标 | 编写一个ATM管理系统 |
学号 | 3180701217 |
一.题目要求
编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
允许网上查询参考,但请注意不要直接抄袭,可以理解看懂别人的代码,再自己编写
二.代码提交
(1)源代码
用户类来记录用户的姓名、身份证号、电话号码、银行卡
class User:
def __init__(self, name, idcard, phonenum, card):
self.name = name
self.idcard = idcard
self.phonenum = phonenum
self.card = card
卡类是用来记录银行卡的卡号、密码、存储的金额、是否被冻结的状态
class Card:
def __init__(self, cardnum, password, money, islock=False):
self.cardnum = cardnum
self.password = password
self.money = money
self.islock = islock
定义一个ATM类
我们几乎所有的事情要在ATM类中完成,登陆、开户、查询、取款等等,这些都要在ATM中完成,所以编写ATM类这是非常重要也是最难写的。不过也不要着急,我们一步一步来完善ATM的功能。
导入用户模块,还有随机数模块,我们要用它来生成用户的银行卡号。
import random
import time
然后把类的大致框架写出来,定义一个用来存储所有信息的字典。
class ATM:
userDict = dict()
islogin = None
ATM系统欢迎界面
@staticmethod
def welcome():
print('''
**********************
* *
* welcome to bank *
* *
**********************
''')
@staticmethod
def select():
print('''
**********************
* 1.登陆 2.开户 *
* 3.查询 4.取款 *
* 5.存款 6.转账 *
* 7.改密 8.锁卡 *
* 9.解锁 0.退出 *
**********************
''')
num = input("请选择服务项目:")
return num
定义函数来获取银行卡的卡号,银行卡的卡号是随机的
@classmethod
def getcardnum(cls):
while True:
cardnum = str()
for x in range(6):
cardnum += str(random.randrange(0, 10))
if cardnum not in cls.userDict:
return cardnum
如果是新用户的话,需要开户
@classmethod
def openuser(cls):
name = input("请输入您的姓名:")
idcard = input("请输入您的身份证号码:")
phonenum = input("请输入您的电话号码:")
psd = input("请设置您的密码:")
psd2 = input("请确认您的密码:")
if psd == psd2:
money = int(input("请输入您的预存金额:"))
if money > 0:
cardnum = cls.getcardnum()
card = Card(cardnum, psd, money)
user = User(name, idcard, phonenum, card)
cls.userDict[cardnum] = user
print("开卡成功!您的卡号为%s,请牢记..." % cardnum)
else:
print("预存金额非法,开卡失败!")
else:
print("两次输入密码不一致,开卡失败!")
登录函数,这里要注意在开始输入卡号之后,要先判断此卡号是否已经被冻结。如果已经冻结,则无法登录。登录成功,在这里就要把我们定义的islogin赋值为True,因为查询、取款、存款、转账、改密操作我们要先判断是否已经登录。
@classmethod
def login(cls):
cardnum = input("请输入你的卡号:")
user = cls.userDict.get(cardnum)
if user:
if user.card.islock:
print("您的卡片已经被锁!")
return
else:
a = 0
while a < 3:
psd = input("请输入您的密码:")
if psd == user.card.password:
print("登陆成功!")
cls.islogin = cardnum
break
else:
print("密码错误,登陆失败!")
a += 1
if a == 3:
user.card.islock = True
print("您的卡片已经被冻结!")
else:
print("卡号不存在")
查询
@classmethod
def search(cls):
if cls.islogin:
print("您当前的余额为%d元" % cls.userDict.get(cls.islogin).card.money)
else:
print("请登录后查询!")
取款
@classmethod
def withdrawals(cls):
if cls.islogin:
print("您当前的余额为%d元" % cls.userDict.get(cls.islogin).card.money)
rmoney = int(input("输入您想提取的金额:"))
if rmoney <= cls.userDict.get(cls.islogin).card.money:
cls.userDict.get(cls.islogin).card.money -= rmoney
print("取款中,请稍后...")
time.sleep(1)
print("成功提取%d元!" % rmoney)
print("您当前的余额为%d元!" % cls.userDict.get(cls.islogin).card.money)
return
else:
print("您的余额不足%d元,请重新输入!" % rmoney)
else:
print("请登录后取款!")
存款
@classmethod
def deposit(cls):
if cls.islogin:
addmoney = int(input("请您放入钞票:"))
cls.userDict.get(cls.islogin).card.money += addmoney
print("存款中,请稍后...")
print("您本次存入的金额为:%d元" % addmoney)
print("您的余额为%d元" % cls.userDict.get(cls.islogin).card.money)
else:
print("请登录后存款!")
更改密码
@classmethod
def changepassword(cls):
if cls.islogin:
newpsd1 = input("请输入您的新密码:")
newpsd2 = input("请再次输入您的新密码:")
if newpsd1 == newpsd2:
cls.userDict.get(cls.islogin).card.password = newpsd2
print("更改密码成功!")
else:
print("两次输入密码不一致,更改密码失败!")
else:
print("您还未登录,请登陆后更改密码!")
冻结银行卡
@classmethod
def lock(cls):
if cls.islogin:
cls.userDict.get(cls.islogin).card.islock = True
print("您的卡片已经成功冻结!")
cls.islogin = None
else:
print("您还未登录,请登陆后进行操作!")
解冻银行卡
@classmethod
def unlock(cls):
cardnum = input("请输入你的卡号:")
user = cls.userDict.get(cardnum)
if user:
psd = input("请输入您的密码:")
if psd == user.card.password:
user.card.islock = False
print("卡片解锁成功!")
cls.islogin = cardnum
else:
print("密码错误,登陆失败!")
else:
print("卡号不存在")
转账
@classmethod
def transfer(cls):
if cls.islogin:
receive = input("请输入接受账号:")
a = cls.userDict.get(receive)
if a:
tmoney = int(input("请输入您转账的金额:"))
if tmoney <= cls.userDict.get(cls.islogin).card.money:
cls.userDict.get(cls.islogin).card.money -= tmoney
cls.userDict.get(receive).card.money += tmoney
print("成功转账%d元到%s" % (tmoney, receive))
else:
print("您的余额不足%d元!" % tmoney)
else:
print("账号不存在!")
else:
print("您还未登陆,请登录后进行操作!")
调用ATM类就可以完成所有操作。
import time
import json
def user2dict(user):
"""序列化"""
return {'name': user.name,
'idcard': user.idcard,
'phonenum': user.phonenum,
'card': {'cardnum': user.card.cardnum,
'password': user.card.password,
'money': user.card.money,
'islock': user.card.islock}}
def dict2user(d):
"""反序列化"""
return User(d['name'],
d['idcard'],
d['phonenum'],
Card(d['card']['cardnum'],
d['card']['password'],
d['card']['money'],
d['card']['islock']))
def main():
ATM.welcome()
# noinspection PyBroadException
try:
# with open('use.txt', 'rb') as f:
# ATM.userDict = pickle.load(f)
with open('use.txt', 'r', encoding='utf-8') as f:
for line in f.readlines():
userdict = json.loads(line)
user = dict2user(userdict)
ATM.userDict[user.card.cardnum] = user
except BaseException:
pass
while True:
time.sleep(0.2)
num = ATM.select()
if num == '1':
print("登陆!")
ATM.login()
elif num == '2':
print("开户!")
ATM.openuser()
elif num == '3':
print("查询!")
ATM.search()
elif num == '4':
print("取款!")
ATM.withdrawals()
elif num == '5':
print("存款!")
ATM.deposit()
elif num == '6':
print("转账!")
ATM.transfer()
elif num == '7':
print("更改密码!")
ATM.changepassword()
elif num == '8':
print("冻结卡片!")
ATM.lock()
elif num == '9':
print("解冻卡片")
ATM.unlock()
elif num == '0':
print("已退出!")
print("请及时取走您的卡片!")
with open('use.txt', 'w', encoding='utf-8') as f2:
for user in ATM.userDict.values():
userstr = json.dumps(user, default=user2dict)
f2.write(userstr+'\n')
break
else:
print("选择有误,请重新输入!")
if __name__ == '__main__':
main()
(2)程序主要运行界面
三.个人小结
psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 340 | 550 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 70 |
Development | 开发 | 20 | 40 |
Analysis | 需求分析(包括学习新技术) | 30 | 25 |
Design Spec | 生成设计文档 | 10 | 20 |
Design Review | 设计复审 | 10 | 15 |
Coding Standard | 代码规范 | 10 | 10 |
Design | 具体设计 | 30 | 60 |
Coding | 具体编码 | 60 | 180 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 40 | 45 |
Reporting | 报告 | 10 | 20 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 20 | 15 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 20 |