zoukankan      html  css  js  c++  java
  • 模拟银行自动终端系统

    本系统模拟银行用户使用ATM机开户、查询、存款、取款功能,要求使用java语言编程实现。

    二. 项目功能要求: 

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

    银行自助终端系统 

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

    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机的功能。

    以下功能选做:

    以单态模式实现工商银行,在测试类中默认添加多张银行卡,在农行的ATM机上实现跨行查询和存取款功能。

    package com.bank.unionpay;
    
    public abstract class Atm {
        
        //成员变量
        private Card card;
        
        //成员方法
        public abstract String kaihu();
    
    }
    
    
    
    
    package com.bank.unionpay;
    
    //定义接口类型的card
    public interface Card {
            
        
        //抽象方法
        void cunkuan(double cun);
        
        void qukuan(double qu);
        
        void chaxunyue();
    
    }
    
    
    
    
    package com.bank.unionpay;
    
    public enum Fourbank {
        
        ABC("中国农业银行"),ICBC("中国工商银行"),CCB("中国建设银行"),COB("中国银行");
        
        private final String name;
        
        
        public String getName() {
            return name;
        }
    
    
         //构造方法不能加修饰符
         Fourbank(String name)
        {
            this.name = name;
        }
    
    
    }
    package com.bank.abc;
    
    import java.util.Random;
    
    import com.bank.unionpay.Atm;
    import com.bank.unionpay.Fourbank;
    
    public class AbcAtm extends Atm {
        
        //定义农行属性的ATM机
        private final static Fourbank bank1 = Fourbank.ABC;
        
        //定义开户方法,随机生成六位数账户
        @Override
        public String kaihu() {
            // 随机生成六位数的账户
            String zh = "";
            Random ran = new Random();
            for (int i = 0; i < 6; i++) {
                zh += ran.nextInt(10);
            }
            return zh;
    
        }
    
    }
    
    
    
    package com.bank.abc;
    //单例模式定义银行类
    import java.util.ArrayList;
    import java.util.List;
    
    import com.bank.unionpay.Fourbank;
    
    public class Bank {
    
        // 定义银行类型以及银行卡的list集合
        private Fourbank type;
    
        private String abcname;
    
        private List<Chuxuka> card;
    
        // 构造方法
        private Bank() {
    
            abcname = "中国农业银行";
            type = Fourbank.ABC;
            card = new ArrayList<>();
            card.add(new Chuxuka("张潇", "370321199411301111", "111111", "666666", 2000));
            card.add(new Xinyongka("张三", "370321199999999999", "222222", "666666", 2000));
    
        }
    
        // 构造唯一的Bank实例
        private static Bank abc = new Bank();
    
        // 构造获取唯一Bank实例的方法
        public static Bank getBack() {
            return abc;
        }
    
        // getter和setter方法
        public Fourbank getType() {
            return type;
        }
    
        public void setType(Fourbank type) {
            this.type = type;
        }
    
        public String getAbcname() {
            return abcname;
        }
    
        public void setAbcname(String abcname) {
            this.abcname = abcname;
        }
    
        public List<Chuxuka> getCard() {
            return card;
        }
    
        public void setCard(List<Chuxuka> card) {
            this.card = card;
        }
    
    }
    
    
    
    package com.bank.abc;
    
    import java.io.Serializable;
    
    import com.bank.unionpay.Card;
    import com.bank.unionpay.Fourbank;
    
    public class Chuxuka implements Card, Serializable {
    
        // 定义储蓄卡类的成员变量
        private Fourbank type1 = Fourbank.ABC;// 定义储蓄卡的类型为农行
        private String name; // 定义持卡者姓名
        private String personid; // 定义持卡者身份证号码
        private String cardid; // 定义储蓄卡卡号
        private String mima; // 定义储蓄卡的密码
        private double yue; // 定义储蓄卡的余额
        private double touzhi = 0; // 定义储蓄卡无法透支(透支额度为0)
    
        // 重写存款和取款的方法
        @Override
        public void cunkuan(double cun) {
            yue += cun;
    
        }
    
        @Override
        public void qukuan(double qu) {
            if (qu <= yue) {
                yue -= qu;
                System.out.println("取款成功,谢谢使用!");
            } else
                System.out.println("您输入的取款金额有误,无法完成本次取款,系统将自动退出,谢谢使用!");
    
        }
    
        // 构造方法
        public Chuxuka(String name, String personid, String cardid, String mima, double yue) {
            super();
            this.name = name;
            this.personid = personid;
            this.cardid = cardid;
            this.mima = mima;
            this.yue = yue;
        }
    
        // 以下是getter和setter方法区
        public double getTouzhi() {
            return touzhi;
        }
    
        public void setTouzhi(double touzhi) {
            this.touzhi = touzhi;
        }
    
        @Override
        public void chaxunyue() {
            System.out.println(yue);
    
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPersonid() {
            return personid;
        }
    
        public void setPersonid(String personid) {
            this.personid = personid;
        }
    
        public String getCardid() {
            return cardid;
        }
    
        public void setCardid(String cardid) {
            this.cardid = cardid;
        }
    
        public String getMima() {
            return mima;
        }
    
        public void setMima(String mima) {
            this.mima = mima;
        }
    
        public double getYue() {
            return yue;
        }
    
        public void setYue(double yue) {
            this.yue = yue;
        }
    
        @Override
        public String toString() {
            return name + "," + personid + "," + cardid + "," + mima + "," + yue;
    
        }
    
    }
    
    
    
    package com.bank.abc;
    
    public class Xinyongka extends Chuxuka {
        
        //定义信用卡继承储蓄卡
    
        //重写成员变量,定义信用卡的透支额度为10000元
        private double touzhi = 10000;
        
        //重写取款方法
        
        public void qukuan(double qu) {
            if(qu<=getYue()+touzhi)
            {
                setYue(getYue() - qu);
                System.out.println("取款成功,谢谢使用!");
            }
            else
                System.out.println("您输入的取款金额有误,无法完成本次取款,系统将自动退出,谢谢使用!");
    
        }
    
        public double getTouzhi() {
            return touzhi;
        }
    
        public void setTouzhi(double touzhi) {
            this.touzhi = touzhi;
        }
        
    
        //构造方法
        public Xinyongka(String name, String personid, String cardid, String mima, double yue) {
            
            super(name,  personid,cardid, mima,  yue);
        }
    
    }
    package com.bank.text;
    /**
     * @author 张伟
     * 2016.10.07
     * 模拟银行自动终端系统
     */
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.List;
    import java.util.Scanner;
    
    import com.bank.abc.AbcAtm;
    import com.bank.abc.Bank;
    import com.bank.abc.Chuxuka;
    
    public class BankText {
    
        public static void main(String[] args) throws Exception {
    
            // 实例化abcATM
            AbcAtm abcatm = new AbcAtm();
    
            // 获取Bank实例并初始化银行卡的LIST集合
            Bank bank = Bank.getBack();
            
            List<Chuxuka> cards = bank.getCard();
            
            //应用对象的序列化获取存储的cards
            try {
                ObjectInputStream in = new ObjectInputStream(new FileInputStream("e:/Bank/bank.obj"));
    
                List<Chuxuka> card = (List<Chuxuka>) in.readObject();
                cards = card;
                in.close();
    
            } catch (Exception e1) {
    
                e1.printStackTrace();
            }
            
            
    
            for (int s = 1; s > 0; s++) {
                
                
                // 菜单提示
    
                System.out.println("银行自助终端系统
    **********************");
                System.out.println("0------开户
    1------查询
    2------存款
    3------取款
    4------退出");
                System.out.print("**********************
    请选择您要执行的功能:");
                Scanner sc = new Scanner(System.in);
    
                while (true) {
                    // 等待选择
                    int resoult = sc.nextInt();
    
                    // 选择判断
    
                    if (resoult == 0) {
                        System.out.println("
    **********************
    您选择的为开户功能");
    
                        System.out.print("请输入您的姓名:");
                        Scanner sc1 = new Scanner(System.in);
    
                        while (true) {
                            // 等待输入
                            String name = sc1.nextLine();
                            // 定义汉字的正则表达式
                            String regex = "[\u4E00-\u9FA5]+";
    
                            // 判断输入的name是否合法
                            if (name.matches(regex) && name.length() >= 2 && name.length() <= 4) {
                                System.out.print("请输入您的身份证号:");
    
                                Scanner sc2 = new Scanner(System.in);
    
                                while (true) {
                                    String shenfenzheng = sc2.nextLine();
    
                                    // 定义身份证的正则表达式
    
                                    String regex1 = "\d{17}[0-9a-zA-Z]";
    
                                    // 判断身份证是否合法
    
                                    if (shenfenzheng.matches(regex1)) {
    
                                        System.out.print("请输入六位数字密码:");
    
                                        Scanner sc3 = new Scanner(System.in);
    
                                        while (true) {
                                            String regex2 = "[0-9]{6}";
                                            String mima = sc3.nextLine();
                                            if (mima.matches(regex2)) {
                                                String sss = abcatm.kaihu();
                                                cards.add(new Chuxuka(name, shenfenzheng, sss, mima, 0));
                                                System.out.println("您的账户为:" + sss);
                                                System.out.println("开户成功,谢谢使用!");
                                                // System.out.println(bank.getCard());
                                                break;
                                            } else {
                                                System.out.print("密码输入不合法,请重新输入:");
                                            }
                                        }
                                        break;
                                    } else {
                                        System.out.print("您输入的身份证号不合法,请重新输入:");
                                    }
    
                                }
    
                                break;
                            } else {
                                System.out.print("您输入的姓名不合法,请重新输入:");
                            }
                        }
    
                        break;
                    }
    
                    else if (resoult == 1) {
                        System.out.println("
    **********************
    您选择的为查询功能");
                        System.out.print("请输入您要查询的卡号:");
                        Scanner sc1 = new Scanner(System.in);
    
                        for (int i = 1; i > 0; i++)// 如果输入的卡号存在,则使i<0,执行完全部操作后退出循环完成当前查询,否则,无限循环,直至卡号输入正确为止
                        {
                            // 等待输入需要查询的卡号
                            String cardID = sc1.nextLine();
                            for (int ii = 0; ii < cards.size(); ii++) {
                                if (cards.get(ii).getCardid().equals(cardID)) {
    
                                    System.out.print("请输入您的密码:");
    
                                    Scanner sc2 = new Scanner(System.in);
    
                                    for (int j = 0; j < 3; j++)// 设置输入密码的最高次数
                                    {
                                        String mima = sc2.nextLine();
    
                                        if (mima.equals(cards.get(ii).getMima())) {
                                            // 密码输入正确后显示所有银行卡信息并终止当前查询
                                            System.out.println("您要查询的账号信息为:
    **********************");
                                            System.out.println("姓名:" + cards.get(ii).getName());
                                            System.out.println("身份证号:" + cards.get(ii).getPersonid());
                                            System.out.println("卡号:" + cards.get(ii).getCardid());
                                            System.out.println("余额:" + cards.get(ii).getYue() + "
    ");
                                            i = -1;
                                            break;
                                        } else {
                                            if (j < 2)
                                                System.out.print("密码输入错误,请重新输入:");
                                            else {
                                                // 密码连续输入错误,终止当前查询
                                                System.out.println("对不起,您已经没有了输入机会");
                                                i = -1;
                                                break;
                                            }
    
                                        }
                                    }
    
                                } else if (ii < cards.size()) {
    
                                }
    
                                else {
                                    System.out.print("您输入的卡号不存在,请重新输入:");
                                }
                            }
                        }
    
                        break;
                    }
    
                    else if (resoult == 2) {
                        System.out.print("
    **********************
    您选择的为存款功能
    请输入您要存款的卡号:");
                        Scanner sc1 = new Scanner(System.in);
    
                        for (int i = 1; i > 0; i++)// 如果输入的卡号存在,则使i<0,执行完全部操作后退出循环完成当前存款,否则,无限循环,直至卡号输入正确为止
                        {
                            // 等待输入需要存款的卡号
                            String cardID = sc1.nextLine();
                            for (int ii = 0; ii < cards.size(); ii++) {
                                if (cards.get(ii).getCardid().equals(cardID)) {
                                    i = -1;
                                    System.out.print("请输入您的密码:");
    
                                    Scanner sc2 = new Scanner(System.in);
    
                                    for (int j = 0; j < 3; j++)// 设置输入密码的最高次数
                                    {
                                        String mima = sc2.nextLine();
    
                                        if (mima.equals(cards.get(ii).getMima())) {
                                            // 密码输入正确后显示银行卡的当前信息
                                            System.out.println("您要存款的账号信息为:
    **********************");
                                            System.out.println("姓名:" + cards.get(ii).getName());
                                            System.out.println("身份证号:" + cards.get(ii).getPersonid());
                                            System.out.println("卡号:" + cards.get(ii).getCardid());
                                            System.out.println("余额:" + cards.get(ii).getYue() + "
    ");
    
                                            // 提醒输入存款金额完成存款功能
                                            System.out.print("请输入您的存款金额:");
                                            Scanner sc3 = new Scanner(System.in);
    
                                            double cun = sc3.nextDouble();
    ii=cards.size()+1;
    if (cun > 0) { cards.get(ii).setYue(cards.get(ii).getYue() + cun); System.out.println("存款成功,谢谢使用!");
    }
    else System.out.println("您输入的金额无效,无法完成本次存款,系统将自动退出,谢谢使用");
    break; } else { if (j < 2) System.out.print("密码输入错误,请重新输入:"); else // 密码连续输入错误,终止当前功能 System.out.println("对不起,您已经没有了输入机会"); } } } else if (ii < cards.size()) { } else { System.out.print("您输入的卡号不存在,请重新输入:"); } } } break; } else if (resoult == 3) { System.out.print(" ********************** 您选择的为取款功能 请输入您要取款的银行卡号:"); Scanner sc1 = new Scanner(System.in); for (int i = 1; i > 0; i++)// 如果输入的卡号存在,则使i<0,执行完全部操作后退出循环完成当前取款,否则,无限循环,直至卡号输入正确为止 { // 等待输入需要取款的卡号 String cardID = sc1.nextLine(); for (int ii = 0; ii < cards.size(); ii++) { if (cards.get(ii).getCardid().equals(cardID)) { i = -1; System.out.print("请输入您的密码:"); Scanner sc2 = new Scanner(System.in); for (int j = 0; j < 3; j++)// 设置输入密码的最高次数 { String mima = sc2.nextLine(); if (mima.equals(cards.get(ii).getMima())) { // 密码输入正确后显示银行卡的当前信息 System.out.println("您要取款的账号信息为: **********************"); System.out.println("姓名:" + cards.get(ii).getName()); System.out.println("身份证号:" + cards.get(ii).getPersonid()); System.out.println("卡号:" + cards.get(ii).getCardid()); System.out.println("余额:" + cards.get(ii).getYue()); System.out.println("透支额度:" + cards.get(ii).getTouzhi()); // 提醒输入取款金额完成取款功能 System.out.print("请输入您的取金额:"); Scanner sc3 = new Scanner(System.in); double qu = sc3.nextDouble(); cards.get(ii).qukuan(qu);
    ii=cards.size()+1;
    break; } else { if (j < 2) System.out.print("密码输入错误,请重新输入:"); else // 密码连续输入错误,终止当前功能 System.out.println("对不起,您已经没有了输入机会"); } } } else if (ii < cards.size()) { } else { System.out.print("您输入的卡号不存在,请重新输入:"); } } } break; } else if (resoult == 4) { System.out.println(" ********************** 感谢您的使用,请取好您的卡片,再见"); s = -1; // 保存所有数据并退出 File file = new File("e:/Bank"); if (!file.exists()) { file.mkdirs(); } try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("e:/Bank/bank.obj")); out.writeObject(cards); out.close(); System.out.println("数据保存完成..."); } catch (Exception e) { e.printStackTrace(); } break; } else System.out.print(" 您选择的菜单不存在,请重新选择:"); } } } }

     

     

  • 相关阅读:
    做事的底线和逻辑
    我在华为的十年----徐家俊
    华为的冬天
    如何当好一个师长--林彪
    Base64 的那些事儿
    流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
    软件目的需求开发与管理
    车载行业认证资质
    tcpdump抓包分析 https://www.01hai.com/note/av263669
    packages.conifg
  • 原文地址:https://www.cnblogs.com/HRZJ/p/5936776.html
Copyright © 2011-2022 走看看