模拟银行自助终端系统

Posted 特立独行的猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟银行自助终端系统相关的知识,希望对你有一定的参考价值。

一. 项目功能要求: 

项目开始运行显示主菜单为:  

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

此时,用户可以通过键盘输入选择自己要实现的功能,如果输入不是0,1,2,3,4,则系统提示: 

你选择的菜单不存在!

请重新选择: 

要求用户重新输入数据进行菜单选择!  

 

当用户输入0时,则进入开户功能:系统提示: 

**************************** 

你选择的为开户功能 

请输入你的姓名: 

此时用户需要输入姓名,输入完毕后系统提示:

请输入你的身份证号: 

此时用户需要输入18位身份证号,输入完毕如果验证未通过要求继续输入,直到验证通过后系统提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入,验证通过后系统提示:

开户成功,谢谢使用! 

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

 

当用户输入1时,则进入查询功能:系统提示: 

**************************** 

你选择的为查询功能 

请输入你要查询的卡号: 

此时用户需要输入查询的卡号,系统对卡号进行检测,如果卡号不存在,则提示: 你输入的卡号不存在,请重新输入: 

请输入你要查询的卡号:

要求重新输入卡号,当用户输入正确卡号后,则提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入(最多3次),验证通过后系统将显示当前用户账号信息并进入主菜单:

你查询的账号信息为: 

****************************** 

姓名  身份证号    卡号   金额 

张三丰 420106198410112062 111111   12800.0  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

 

当用户输入2时,则进入存款功能:系统提示: 

**************************** 

你选择的为存款功能 

请输入你要存款的卡号: 

此时用户需要输入存款的卡号,系统对卡号进行检测,如果卡号不存在,则提示: 

你输入的卡号不存在,请重新输入: 

请输入你要存款的卡号: 

要求重新输入卡号,当用户输入正确卡号后,则提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入(最多3次),验证通过后系统将显示当前用户账号信息并进入主菜单: 

你要存款的账号信息为: 

****************************** 

姓名  身份证号     卡号  金额 

张三丰 420106198410112062 111111  12800.0 

请输入你要存入的金额: 

此时要求用户输入存款金额,系统对金额进行判断,如果输入的数据小于等于0,则提示: 

你输入的数据无效,系统将自动退出!谢谢使用  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

如果用户输入数据合法,系统提示存款成功,并回到主菜单: 

存款成功,谢谢使用!  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款 

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

数据将存入用户账号,如果用户再次进行数据查询,则能看到已经改变后的账户金额。 (说明:本系统使用文件进行数据存储,因此如果用户重新启动程序,数据将从文件中读取重新初始化到内存!此功能选做,可参考对象的序列化和反序列化或JSON) 

 

当用户输入3时,则进入取款功能:系统提示: 

**************************** 

你选择的为取款功能 请输入你要取款的卡号: 

此时用户需要输入取款的卡号,系统对卡号进行检测,如果卡号不存在,则提示: 

你输入的卡号不存在,请重新输入: 

请输入你要取款的卡号: 

要求重新输入卡号,当用户输入正确卡号后,则提示:

请输入你的密码: 

此时用户需要输入6位纯数字密码,输入完毕如果验证未通过要求继续输入(最多3次),验证通过后系统将显示当前用户账号信息并进入主菜单: 

你要取款的账号信息为: 

****************************** 

姓名  身份证号     卡号  金额 

张三丰 420106198410112062 111111  12800.0 

请输入你要取款的金额: 

此时要求用户输入取款金额,系统对金额进行判断,如果输入的数据小于0或大于账号总金额,则提示: 

你输入的数据无效,系统将自动退出!谢谢使用  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

如果用户输入数据合法,系统提示取款成功,并回到主菜单: 

取款成功,谢谢使用!  

 

银行自助终端系统 

****************************  

0.------开户

1.------查询  

2.------存款  

3.------取款  

4.------退出 

**************************** 

请选择你要执行的功能: 

数据将从用户账号扣出,如果用户再次进行数据查询,则能看到已经改变后的账户金额。

 

当用户输入4时,系统将退出。

 

二.设计要求

(一)包一:com.bank.unionpay 表示银联,在该包下添加:

  1. 表示银行卡的接口,包含查询余额,存款,取款等抽象方法。
  2. 表示ATM机的抽象类,使用银行卡类型的对象作为参数,实现查询余额,存款,取款等实例方法,添加开户为抽象方法。
  3. 表示四大银行的枚举类型:包含ABC,ICBC,CCB,BOC;分别代表农行,工行,建行,中行。

(二)包二:com.bank.abc 表示农行,在该包下添加:

  1. 以单例模式定义银行类,包含属性:银行类型(枚举类型,常量=ABC),银行名称(String),银行卡列表(集合)等。
  2. 定义银行卡的实现类-储蓄卡,包含属性:银行类型(枚举类型=ABC),姓名,身份证号,卡号,密码,余额;实现查询余额,存款,取款等方法。
  3. 定义ATM机的子类,包含属性:银行类型(枚举类型,常量=ABC),实现开户方法,其中:只能开办储蓄卡,卡号为6位随机数字,自动产生。新开户的银行卡添加到银行的银行卡列表中。
  4. 定义储蓄卡的子类-信用卡,增加属性:透支额度,重写取款方法,控制最大取款金额不能大于余额+透支额度的和。

(三)包三:com.bank.test 表示测试,在该包下添加带main方法的测试类,实现项目要求的模拟ATM机的功能。

程序代码:包一com.bank.unionpay

 1 package com.bank.unionpay;
 2 /**
 3  * 
 4  * @author Administrator
 5  *银联接口
 6  */
 7 public interface Yinlian {
 8     void Chaxun(Yinlian yinl);             //查询余额
 9     void Cunkuan(Yinlian yinl);           //存款
10     void Qukuan(Yinlian yinl);            //取款
11 }
 1 package com.bank.unionpay;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * 
 7  * @author Administrator
 8  *ATM机抽象类
 9  */
10 public abstract class ATM {
11     private int yue;                  //变量余额
12     public abstract void Kaihu();     //抽象方法——开户
13     public int getYue() {             //get余额方法
14         return yue;
15     }
16     public void setYue(int yue) {     //set余额方法
17         this.yue = yue;
18     }
19     public void Chaxun(Yinlian yinl) {              //查询余额
20         System.out.println("您的账户余额为:"+yue);
21     }
22     public void Cunkuan(Yinlian yinl) {             //存款
23         while(true){
24             System.out.println("请输入存款金额:");
25             Scanner sc=new Scanner(System.in);
26             int jine=sc.nextInt();                      //输入存款金额
27             if(jine<0){
28                 System.out.println("输入有误!");       //负数提示
29                 continue;
30             }else{
31                 yue+=jine;                              //重新计算余额
32                 break;
33             }
34         }
35     }
36     public void Qukuan(Yinlian yinl) {                  //取款
37         while(true){
38             System.out.println("请输入取款金额:");
39             Scanner sc=new Scanner(System.in);
40             int jine=sc.nextInt();                      //输入取款金额
41             if(jine<=yue){
42                 yue-=jine;                              //重新计算余额
43                 break;
44             }else if(jine>yue){
45                 System.out.println("余额不足,无法取款!");      //余额不足提示
46                 continue;
47             }else{
48                 System.out.println("输入有误!");               //负数提示
49                 continue;
50             }
51         }        
52     }
53 }
package com.bank.unionpay;
/**
 * 
 * @author Administrator
 *四大银行——枚举
 */
public enum Bank {
    ABC("农行"),ICBC("工行"),CCB("建行"),BOC("中行");     //枚举类型    枚举列表
    private final String name;             //常量银行名
    public String getName(){               //getter方法返回银行名
        return this.name;
    }
    private Bank(String name){             //私有构造方法
        this.name=name;
    }
}

包二com.bank.abc

 1 package com.bank.abc;
 2 import java.util.ArrayList;
 3 import java.util.HashMap;
 4 import java.util.List;
 5 import java.util.Map;
 6 
 7 import com.bank.unionpay.Bank;
 8 /**
 9  * 
10  * @author Administrator
11  *银行类——单例模式
12  */
13 public class Bankclass {
14     private Bankclass(){                 //禁止外部访问构造方法
15         
16     }
17     private static Bankclass bank=new Bankclass();      //内部产生唯一实例
18     public static Bankclass getBankclass()              //开放一个方法给调用者返回这个实例
19     {    
20         return bank;
21     }
22     private final Bank ABC=Bank.ABC;                    //银行类型(枚举类型=ABC)
23     private String bankname;                                //银行名称
24     public List<Long> card=new ArrayList();                //银行卡列表——集合
25     public Map<Long,Bankchuxu> Account=new HashMap<>();       //账号储蓄卡集合
26 }
package com.bank.abc;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import java.util.Scanner;

import com.bank.unionpay.ATM;
import com.bank.unionpay.Bank;
/**
 * 
 * @author Administrator
 *ATM机的子类
 */

public class ATMzi extends ATM{
    private final Bank ABC=Bank.ABC;                    //银行类型(枚举类型=ABC)                       
    @Override
    public void Kaihu() {                               //开户功能
        Bankchuxu bk=new Bankchuxu(); 
        System.out.println("请输入您的姓名:");
        while(true){                                    //输入姓名
            try{                                        //异常处理
                Scanner sc=new Scanner(System.in);
                bk.setName(sc.nextLine());
                break;
            }catch(Exception e){
                System.out.println("输入有误!");
                System.out.println("请重新输入:");
                continue;
            }
        }
        while(true){                                         //输入身份证号
            try{
                System.out.println("请输入您的身份证号:");
                Scanner sc=new Scanner(System.in);
                String a=sc.nextLine();
                String regex="\\\\d{15}|\\\\d{17}[\\\\dxX]";                  //正则表达式控制身份证号
                if(a.matches(regex)){
                    bk.setIDcard(a);
                    break;
                }else{
                    System.out.println("身份证号格式输入有误!");
                    continue;
                }
            }catch(Exception e){
                System.out.println("输入有误!");
                System.out.println("请重新输入:");
                continue;
            }
        }
        while(true){                                    //输入密码
            try{
                System.out.println("请输入6位纯数字密码:");
                Scanner sc=new Scanner(System.in);
                String a=sc.nextLine();
                String regex="\\\\d{6}";                        //正则表达式控制密码
                if(a.matches(regex)){
                    bk.setPassword(a);
                    break;
                }
                else{
                    System.out.println("输入密码格式有误!");
                    continue;
                }
            }catch(Exception e){
                System.out.println("输入有误!");
                System.out.println("请重新输入:");
                continue;
            }
        }
        
        while(true){    
            Random a=new Random();
            Long c=a.nextLong();                //生成储蓄卡号
            String regex="\\\\d{19}";
            if(c>0&&c.toString().matches(regex)){
                bk.setCard(c);           //将生成的储蓄卡号赋给储蓄卡卡号属性
                Bankclass.getBankclass().card.add(bk.getCard());          //将生成的储蓄卡号存到银行的银行卡列表中
                Bankclass.getBankclass().Account.put(bk.getCard(), bk);   //卡号+储蓄卡对象
                System.out.println("您的账号为:"+bk.getCard());
                break;
                }else{
                    continue;
                }
        }
        try {
            FileOutputStream out =new FileOutputStream("d:/账号.txt",true);   //打印卡号到文本中
            StringBuilder shuju=new StringBuilder();
            shuju.append(bk.toString()+"\\r\\n");
            byte[] by=shuju.toString().getBytes();
            out.write(by);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1 package com.bank.abc;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.FileOutputStream;
  5 import java.io.FileReader;
  6 import java.util.Scanner;
  7 
  8 import com.bank.test.Jiemian;
  9 import com.bank.unionpay.Bank;
 10 import com.bank.unionpay.Yinlian;
 11 
 12 /**
 13  * 
 14  * @author Administrator
 15  *储蓄卡类
 16  */
 17 public class Bankchuxu implements Yinlian{
 18     protected final Bank ABC=Bank.ABC;                    //银行类型(枚举类型=ABC)
 19     private String name;                                //姓名
 20     private String IDcard;                                //身份证号
 21     protected long card;                                //银行卡号
 22     private String password;                               //密码
 23     protected int yue;                              //余额
 24     //储蓄卡号get、set方法
 25     public long getCard() { 
 26         return card;
 27     }
 28     public void setCard(long card) {
 29         this.card = card;
 30     }
 31     //姓名get、set方法
 32     public String getName() {
 33         return name;
 34     }
 35     public void setName(String name) {
 36         this.name = name;
 37     }
 38     //身份证号get、set方法
 39     public String getIDcard() {
 40         return IDcard;
 41     }
 42     public void setIDcard(String iDcard) {
 43         IDcard = iDcard;
 44     }
 45     //密码get、set方法
 46     public String getPassword() {
 47         return password;
 48     }
 49     public void setPassword(String password) {
 50         this.password = password;
 51     }
 52     //余额get、set方法
 53     public int getYue() {
 54         return yue;
 55     }
 56     public void setYue(int yue) {
 57         this.yue = yue;
 58     }
 59 
 60     @Override
 61     public void Chaxun(Yinlian yinl) {              //查询功能
 62         try {            
 63             FileReader fr = new FileReader("d:/账号.txt");          //读取文件中的账号
 64             BufferedReader br=new BufferedReader(fr);
 65             String str=null;
 66             while((str=br.readLine())!= null){
 67                 Bankchuxu bk=new Bankchuxu();
 68                 String[] newstr=str.split(" ");                    //字符串分割放到字符串数组中
 69                 for(int i=0;i<newstr.length;i++){                  //遍历数组将信息传给对象
 70                     if(i==0)bk.setName(newstr[0]);
 71                     if(i==1)bk.setIDcard(newstr[1]);
 72                     if(i==2)bk.setCard(Long.parseLong(newstr[2]));
 73                     if(i==3)bk.setPassword(newstr[3]);
 74                     if(i==4)bk.setYue(Integer.parseInt(newstr[4]));
 75                 }
 76                 Bankclass.getBankclass().Account.put(bk.getCard(), bk);   //将卡号+储蓄卡对象放到集合中
 77             }
 78         } catch (Exception e1) {
 79             // TODO 自动生成的 catch 块
 80             e1.printStackTrace();
 81         }
 82         System.out.println("请输入您要查的账号:");                  //输入账号
 83         while(true){
 84             try{
 85                 Scanner sc=new Scanner(System.in);
 86                 long a=sc.nextLong();
 87                 for(Long temp:Bankclass.getBankclass().Account.keySet()){
 88                     if(a==temp){
 89                         card=a;                //取卡号
 90                     }
 91                 }
 92                 if(a==card){          //验证卡号
 93                     System.out.println("请输入您的密码:");            //输入密码
 94                     int i=0;
 95                     while(true){
 96                         Scanner s=new Scanner(System.in);
 97                         String pw=s.nextLine();
 98                         if(pw.equals(Bankclass.getBankclass().Account.get(a).getPassword())){                           //验证密码
 99                             System.out.println("你查询的账号信息为:");
100                             System.out.println("******************************");
101                             System.out.println("姓名     身份证号                                     卡号                                       金额");
102                             System.out.println(Bankclass.getBankclass().Account.get(a).out());
103                             break;
104                         }else{
105                             i++;
106                             if(i==3){                                               //控制输入次数最多3次
107                                 System.out.println("密码输错超过3次,无法继续输入!");
108                                 break;
109                             }else{
110                                 System.out.println("密码输入错误!请重新输入:");
111                                 continue;
112                             }
113                         }
114                     }
115                     break;
116                 }else{
117                     System.out.println("您输入的卡号不存在,请重新输入:");
118                     continue;
119                 }
120             }catch(Exception e){
121                 System.out.println("您输入的账号格式有误!");
122                 System.out.println("请重新输入:");
123                 continue;
124             }
125         }
126     }
127 
128     @Override
129     public void Cunkuan(Yinlian yinl) {             //存款
130         try {
131             FileReader fr = new FileReader("d:/账号.txt");
132             BufferedReader br=new BufferedReader(fr);
133             String str=null;
134             以上是关于模拟银行自助终端系统的主要内容,如果未能解决你的问题,请参考以下文章

模拟银行自助终端系统

(转载)模拟银行自助终端系统

模拟银行自动终端系统

模拟ATM机银行系统

ATM

ARM在自助终端设备的应用