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
posted @ 2020-11-18 01:04  SHIWUYU  阅读(121)  评论(0编辑  收藏  举报