python模拟ATM系统

一、环境及程序功能说明

      python 2.7.12模拟与银行ATM功能,主要功能如下:

       1,登录查询余额

       2,转账功能

       3,提现功能

       4,流水查询

       5,密码修改

       6,还款功能

       7,退出(切换账号)

       采用pickle存储账号密码相关信息,以账号名为日志文件名存储该账号的流水日志~

为了实现测试,先写一个提供测试文件的小脚本,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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系统实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#!/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  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

wKioL1laFaPzSIytAAIE4DjPGt4003.png

$ python looks_bank.py

wKiom1laFIbAn_ebAAvuN1jbwTI233.png-wh_50

wKioL1laFIzwlAeGAArIeqxBeek607.png-wh_50


四、所有文件如下

$ls -alh

wKiom1laEsOCXzWYAAG2lkVgBwY725.png

写着用来练习,如有错误之处欢迎指正,交流!










本文转自 dyc2005 51CTO博客,原文链接:http://blog.51cto.com/dyc2005/1944150,如需转载请自行联系原作者
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值