Java 模拟ATM(修正)

  ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0)。 模拟ATM的功能设计,用户插卡后显示选择语言界面,输入密码界面,用户输入正确密码(用户输入错误密码,则提示该卡已被锁定,无法操作),则弹出选择界面:存款、取款、转账汇款、修改密码、查询余额。 选择“取款”,则显示100元、500元、1000元、1500元、2000元、5000元、其他金额、退卡、返回操作供用户选择; 选择“存款”,则提示用户输入存款金额,修改余额; 选择“转账”,则提示用户输入转账行号、转账金额,并提示转账成功。 

  要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。 自定义如下异常类,并在程序中验证: 取款时输入非整数时,抛出 “数字格式异常”,提示信息为“请输入正确的数字”; 如果输入数字非100的整倍数时,抛出“数字录入异常”,提示信息为“录入错误,请输出100的整数倍”; 三次密码输入错误,抛出“锁卡异常”,提示信息自定义。

  1 import java.util.*;
  2 public class ShowATM {
  3     @SuppressWarnings({ "resource", "unused" })
  4     public static void main(String[] args) throws NumberErrorException {
  5         Scanner in=new Scanner(System.in);
  6         PATM atm=new ATM();
  7         NumberErrorException nee=new NumberErrorException("输入非法!");
  8         NotHundredTimesException nhte=new NotHundredTimesException("不是一百的整数倍!");
  9         PasswordErrorException pee=new PasswordErrorException("输入错误的密码超过三次!");
 10         int passwordErrorTimes=0;
 11         int choose=-1,number=0,x=0;
 12         String num="";
 13         String pw="";
 14         next:while(true){
 15             System.out.println("是否进入账户(0否1是):");
 16             int kk=-1;
 17             String c=in.next();
 18             if(whetherNum(c))
 19                 kk=Integer.parseInt(c);
 20             if(kk==0) break;
 21             else if(kk!=1){
 22                 System.out.println("输入错误!");
 23                 continue;
 24             }
 25             System.out.println("输入账户密码:");
 26             pw=in.next();
 27             if(atm.ifPass(pw)){
 28                 while(true){
 29                     showFace();
 30                     String cc=in.next();
 31                     if(whetherNum(cc))
 32                         choose=Integer.parseInt(cc);
 33                     switch(choose){
 34                     case 1:
 35                         System.out.println("输入存款金额:");
 36                         while(true){
 37                             try{
 38                                 num=in.next();
 39                                 if(!whetherNum(num))
 40                                     throw nee;
 41                                 else if((x=Integer.parseInt(num)%100)!=0)
 42                                     throw nhte;
 43                                 else
 44                                     break;
 45                             }
 46                             catch(NumberErrorException e){
 47                                 System.out.println("输入正确的数字!");
 48                             }
 49                             catch(NotHundredTimesException e){
 50                                 System.out.println("录入错误,请输入合法的整数(100的整数倍)!");
 51                             }
 52                         }
 53                         number=Integer.parseInt(num);
 54                         atm.save(number);
 55                         System.out.println("存款成功!");
 56                         System.out.println("当前余额:"+atm.getRest()+"元");
 57                         break;
 58                     case 2:
 59                         System.out.println("请选择:");
 60                         int a[]={100,500,1000,1500,2000,5000};
 61                         for(int i=0;i<a.length;i++)
 62                             System.out.println((i+1)+"."+a[i]+"元");
 63                         System.out.println("7.其他");
 64                         String bb="";
 65                         int ch=-1;
 66                         bb=in.next();
 67                         if(whetherNum(bb)){
 68                             ch=Integer.parseInt(bb);
 69                         }
 70                         if(ch>=1&&ch<=6){
 71                             if(atm.withdraw(a[ch-1]))
 72                                 System.out.println("取款成功!");
 73                             else
 74                                 System.out.println("余额不足!");
 75                         }
 76                         else if(ch==7){
 77                             System.out.println("请输入取款金额:");
 78                             while(true){
 79                                 try{
 80                                     num=in.next();
 81                                     if(!whetherNum(num))
 82                                         throw nee;
 83                                     else if((x=Integer.parseInt(num)%100)!=0)
 84                                         throw nhte;
 85                                     else
 86                                         break;
 87                                 }
 88                                 catch(NumberErrorException e){
 89                                     System.out.println("输入正确的数字!");
 90                                 }
 91                                 catch(NotHundredTimesException e){
 92                                     System.out.println("录入错误,请输入合法的整数(100的整数倍)!");
 93                                 }
 94                             }
 95                             number=Integer.parseInt(num);
 96                             if(atm.withdraw(number))
 97                                 System.out.println("取款成功!");
 98                             else 
 99                                 System.out.println("余额不足!");
100                         }
101                         else 
102                             System.out.println("输入有误!");
103                         System.out.println("当前余额:"+atm.getRest()+"元");
104                         break;
105                     case 3:
106                         System.out.println("账户号:");
107                         String s=in.next();
108                         System.out.println("转账金额:");
109                         while(true){
110                             try{
111                                 num=in.next();
112                                 if(!whetherNum(num))
113                                     throw nee;
114                                 else if((x=Integer.parseInt(num)%100)!=0)
115                                     throw nhte;
116                                 else
117                                     break;
118                             }
119                             catch(NumberErrorException e){
120                                 System.out.println("输入正确的数字!");
121                             }
122                             catch(NotHundredTimesException e){
123                                 System.out.println("录入错误,请输入合法的整数(100的整数倍)!");
124                             }
125                         }
126                         number=Integer.parseInt(num);
127                         if(atm.transfer(s, number))
128                             System.out.println("转账成功!");
129                         else
130                             System.out.println("转账失败!");
131                         System.out.println("当前余额:"+atm.getRest()+"元");
132                         break;
133                     case 4:
134                         System.out.println("输入新的六位数密码:");
135                         String p=in.next();
136                         if(p.length()==6&&whetherNum(p))
137                             atm.setPassword(p);
138                         else{
139                             System.out.println("不是六位或者不是数字!");
140                         }
141                         break;
142                     case 5:
143                         System.out.println("当前余额:"+atm.getRest()+"元");
144                         break;
145                     default:
146                         continue next;
147                     }
148                 }
149             }
150             else{
151                 System.out.println("密码错误!");
152                 try{
153                     passwordErrorTimes++;
154                     if(passwordErrorTimes>3)
155                         throw pee;
156                 }
157                 catch(PasswordErrorException e){
158                     System.out.println(e.getMessage()+"账户暂时冻结!");
159                     return ;
160                 }
161             }
162 
163         }
164     }
165     //显示菜单方法
166     public static void showFace(){
167         System.out.println("********************");
168         System.out.println("    1.存款:");
169         System.out.println("    2.取款:");
170         System.out.println("    3.转账汇款:");
171         System.out.println("    4.修改密码:");
172         System.out.println("    5.查询余额:");
173         System.out.println("    6.退卡:");
174         System.out.println("********************");
175         System.out.println("请选择:");
176     }
177     //判断字符串是否为整数(0-999999)
178     public static boolean whetherNum(String s){
179         boolean flag=true;
180         if(s.length()>=7)
181             return false;
182         char arr[]=s.toCharArray();
183         for(int i=0;i<s.length();i++){    
184             if(arr[i]<'0'||arr[i]>'9')
185                 flag=false;
186         }
187         return flag;
188     }
189 }
190 
191 class PersonalAccount{
192     private String passWord="123456";//密码
193     @SuppressWarnings("unused")
194     private String number;//银行卡号
195     private int money=0;
196     public int getMoney(){return money;}//余额
197     public void setPw(String s){passWord=s;}//设置密码
198     public void addMoney(int x){money+=x;}//加钱
199     public void minusMoney(int x){money-=x;}//减钱
200     public boolean whetherPwTrue(String s){//密码是否正确
201         if(s.equals(passWord))
202             return true;
203         else return false;
204     }
205 }
206 abstract class PATM{
207     public abstract boolean withdraw(int x);//取款
208     public abstract void save(int x);//存款
209     public abstract boolean transfer(String s,int x);//转账
210     public abstract boolean ifPass(String s);//判断输入的密码是否正确
211     public abstract int getRest();//查询余额
212     public abstract void setPassword(String s);//设置密码
213 }
214 class ATM extends PATM{
215     private String numbers[]={"6227000000000000071","6227000000000000072",
216             "6227000000000000073","6227000000000000074"};//数据库中已有的账户卡号
217     private PersonalAccount account=new PersonalAccount();
218     public boolean withdraw(int x) {
219         if(x>account.getMoney())
220             return false;
221         else{
222             account.minusMoney(x);
223             return true;
224         }
225     }
226     public void save(int x) {
227         account.addMoney(x);
228     }
229     public boolean transfer(String s, int x) {
230         //转账
231         //先判断转到账户号是否存在
232         //再判断余额是否足够
233         boolean flag=false;
234         for(int i=0;i<numbers.length;i++)
235             if(s.equals(numbers[i])) flag=true;
236         if(x>account.getMoney()) flag=false;
237         if(x<=account.getMoney()&&flag) account.minusMoney(x);;
238         return flag;
239     }
240     public boolean ifPass(String s) {
241         return account.whetherPwTrue(s);
242     }
243     public int getRest() {
244         return account.getMoney();
245     }
246     public void setPassword(String s) {
247         account.setPw(s);        
248     }
249 }
250 @SuppressWarnings("serial")
251 class NumberErrorException extends Exception{
252     public NumberErrorException(String msg){
253         super(msg);
254     }
255 }
256 @SuppressWarnings("serial")
257 class PasswordErrorException extends Exception{
258     public PasswordErrorException(String msg){
259         super(msg);
260     }
261 }
262 @SuppressWarnings("serial")
263 class NotHundredTimesException extends Exception{
264     public NotHundredTimesException(String msg){
265         super(msg);
266     }
267 }

 

 

 

 

 

posted @ 2016-11-23 16:52  遗风遗风丶  阅读(1193)  评论(0编辑  收藏  举报