1. 程式人生 > >python模擬ATM系統

python模擬ATM系統

python模擬atm系統

一、環境及程序功能說明

python 2.7.12模擬與銀行ATM功能,主要功能如下:

1,登錄查詢余額

2,轉賬功能

3,提現功能

4,流水查詢

5,密碼修改

6,還款功能

7,退出(切換賬號)

采用pickle存儲賬號密碼相關信息,以賬號名為日誌文件名存儲該賬號的流水日誌~

為了實現測試,先寫一個提供測試文件的小腳本,代碼如下:

#coding:utf-8
import pickle
import time
import os
IOSTIME = ‘%Y-%m-%d %X‘
Now = time.strftime(IOSTIME,time.localtime())
Counts = {‘9168‘:[‘1234‘,‘0‘,15000,[Now]],‘9198‘:[‘4567‘,‘0‘,10000,[Now]],‘9999‘:[‘6789‘,‘1‘,12000,[Now]]}
bank_count = open("banks_counts.pkl",‘w‘)
pickle.dump(Counts,bank_count)
os.chdir(".")
for log in Counts.keys():
    os.popen("rm -rf %s" %log)

print("測試數據已經生成:\n:%s" %Counts)

二、ATM系統實現

#!/usr/bin/env python
#coding=utf8
import pickle
import sys
import time
import os
IOSTIME = ‘%Y-%m-%d %X‘
Now = time.strftime(IOSTIME,time.localtime())
reload(sys)
sys.setdefaultencoding(‘utf-8‘)

##現在時間
def NOW():
    global Now
    Now = time.strftime(IOSTIME,time.localtime())
    return Now

##讀入數據
with open(‘banks_counts.pkl‘) as bank_infos:
    UserInfos = pickle.load(bank_infos)
    print UserInfos

##完成寫入功能
def Write_DB():
    with open(‘banks_counts.pkl‘,‘w‘) as New_bank_infos:
        pickle.dump(UserInfos,New_bank_infos)

#for userinfo in UserInfos.keys():
#    print UserInfos[userinfo]     

##查詢金額
def LookHow(HM):
    print "現在時間是: %s,銀行余額: %s RMB!" %(NOW(),HM)
#提現功能    
def TakeCrash(HOW,WHO):
    ShouXuFei = HOW * 0.01                    #手續費為1/100
    if (HOW + ShouXuFei) > WHO:
        print "余額不足提取!"
    else:
        WHO = WHO - HOW- ShouXuFei
        print "您要提取的金額為:%s,手續費: %s,余額為:%s RMB!" %(HOW,ShouXuFei,WHO)
        with open(UserCard,‘a+‘) as f:
            f.write("%s:%s提款%s\n" %(NOW(),UserCard,HOW))
    UserInfos[UserCard][2] = WHO

####轉賬功能
def ZhuangZ(From,TO,How):
    print From,TO
    if How > From:
        print "%s 賬號余額不足!" %How
    else:
       From = From - How
       TO = TO + How
       print "轉出金額: %s RMB,余額為: %s RMB" %(How,From)

    UserInfos[UserCard][2] = From
    UserInfos[TO_Card][2] = TO
    with open(UserCard,"a+") as f1:
       f1.write("%s:%s扣款%s,輸出到:%s!\n" %(NOW(),UserCard,How,TO_Card))
    with open(TO_Card,"a+") as f2:
       f2.write("%s:%s收到來自%s的%s款!\n" %(NOW(),TO_Card,UserCard,How))

###還款功能
def AddMoney(HOW,WHO):
    if HOW > 0:
        print("確定還款:%s" %HOW)
        UserInfos[WHO][2] = UserInfos[WHO][2] + HOW
        with open(WHO,"a+") as f:
            f.write("%s:還款%s\n" %(NOW(),HOW))

##流水查詢
def Logs(WHO):
    if os.path.isfile(os.path.join(os.getcwd(),WHO)):
        with open(WHO,‘r‘) as f:
            for line in f.readlines():
    else:
        print("該賬號還沒有產生交易流水!")


##最後一次訪問時間
def LastAccess(WHO):
    UserInfos[WHO][3] = NOW()
#    Write_DB()

##密碼修改
def ChgPwd(WHO,NewPass):
    UserInfos[WHO][0] = NewPass
    print("密碼修改成功!")

Contex = ["查詢余額","轉賬","提現","流水","還款","修改密碼","退出"]

ErrorCount = 0
while ErrorCount < 3 :
    for userinfo in UserInfos.keys():
        UserCard = raw_input("[輸入quit|exit退出系統]請輸入您的銀行卡:").strip()
#        if UserCard == ‘quit‘:sys.exit("您選擇退出!")
        if UserCard == ‘‘:continue
        elif UserCard == ‘quit‘ or UserCard == ‘exit‘:
            sys.exit("您選擇退出!")
        elif UserCard not in UserInfos.keys():
            print("您輸入的銀行卡不存在!")
            continue
#        else:
#           print("您輸入的有誤!")  
        UserPwd = raw_input("[輸入quit|exit退出系統]請輸入您的密碼:").strip()
        if  UserPwd == ‘quit‘ or UserPwd == "exit":
            sys.exit("您選擇退出!")
        try:
            if  UserInfos[UserCard][1] != ‘0‘:
                print "%s 賬號被鎖定!" % UserCard
                ErrorCount +=1
                continue
        except KeyError:
                print "%s 賬號不存在!" %UserCard
                ErrorCount +=1
                continue
        if  len(UserPwd) == 0 or UserPwd !=  UserInfos[UserCard][0]:
            print "密碼錯誤!"
            ErrorCount +=1
            continue
        else:
            print "%s 登錄成功!您最後一次訪問在: %s"  %(UserCard,UserInfos[UserCard][3])
            LastAccess(UserCard)   #登錄成功,寫入訪問時間

            while True:
                print(("請選擇你需要的服務:").center(90,"+"))
                print
                for i in range(len(Contex)):
                    print i,Contex[i].decode("utf-8"),‘\t‘,
                print
                print("+" * 80 + ‘\n‘)
                choice = raw_input("[按6或輸入quit退出系統]請選擇您的業務編號:")
                if len(choice) == 0:continue
                elif choice == ‘quit‘ or int(choice) == 6 :
                   Write_DB()
                   print("您選擇退出系統!")
                   break

                elif int(choice) == 0:
                    LookHow(UserInfos[UserCard][2])
                elif int(choice) == 1:
                    TO_Card = raw_input("請輸入對方銀行卡:").strip()
                    if len(TO_Card) == 0 or TO_Card == UserInfos[UserCard]:
                        print "賬號錯誤!"
                        continue
                    HowZ = raw_input("輸入轉賬金額:").strip()
                    if len(HowZ) == 0:
                        print "轉賬金額不能為0!"
                    try:
                        UserInfos[TO_Card]
                    except KeyError:
                         print "對方賬號: %s 不存在!" % TO_Card
                         continue
                    else:
                         UserInfos[TO_Card][2] = int(UserInfos[TO_Card][2])
                         ZhuangZ(UserInfos[UserCard][2],UserInfos[TO_Card][2],int(HowZ))

                elif int(choice) == 2:
                    HowTake = raw_input("請選擇提取金額:")
                    HowTake = int(HowTake)
                    TakeCrash(HowTake,UserInfos[UserCard][2])
                    Write_DB()
                elif int(choice) == 4:
#                    print UserCard
                    HowAdd = int(raw_input("請輸入您要還款的金額:"))
                    AddMoney(HowAdd,UserCard)
                    Write_DB()
                elif int(choice) == 3:
                    Logs(UserCard)
                elif int(choice) == 5:
                    NewPass = raw_input("請輸入新的密碼:")
                    NewPass2 = raw_input("請再輸入一次新密碼:")
                    if NewPass == NewPass2:
                        ChgPwd(UserCard,NewPass)
                        Write_DB()
                    else:
                        sys.exit("兩次輸入的密碼不一致!退出密碼修改!")

else:
    print("你的賬號已鎖,請到櫃臺解鎖!")
    UserInfos[UserCard][1] = ‘1‘
    UserInfos[UserCard][3] = NOW()
    Write_DB()

三、功能測試如

$python creat_bank.py

技術分享

$ python looks_bank.py

技術分享

技術分享


四、所有文件如下

$ls -alh

技術分享

寫著用來練習,如有錯誤之處歡迎指正,交流!

本文出自 “學無止境,學以致用” 博客,請務必保留此出處http://dyc2005.blog.51cto.com/270872/1944150

python模擬ATM系統