淺析JVM的垃圾回收器
阿新 • • 發佈:2020-11-17
部落格班級 | 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 |