1. 程式人生 > 程式設計 >淺析JVM的垃圾回收器

淺析JVM的垃圾回收器

部落格班級https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
作業要求 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478
作業目標 ATM管理系統
學號 3180701205

一.題目要求

編寫一個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.執行程式碼截圖

(1)使用者資訊檔案

(2)查詢餘額

(3)存款

檔案更改

(4)取款

檔案更改

(5)轉賬

檔案更改


(6)開戶

檔案更改

(7)銷戶

檔案更改

(8)退出

表格

psp2.1任務內容計劃完成需要的時間(min)實際完成需要的時間(min)
Planning 計劃 10 10
Estimate 估計這個任務需要多少時間,並規劃大致工作步驟 125 130
Development 開發 40 60
Analysis 需求分析(包括學習新技術) 15 20
Design Spec 生成設計文件 10 15
Design Review 設計複審 10 15
Coding Standard 程式碼規範 5 10
Design 具體設計 15 20
Coding 具體編碼 30 40
Code Review 程式碼複審 5 10
Test 測試(自我測試,修改程式碼,提交修改) 10 25
Reporting 報告 20 30
Test Report 測試報告 10 15
Size Measurement 計算工作量 5 10
Postmortem & Process Improvement Plan 事後總結,並提出過程改進計劃 10

15