模拟银行自动终端系统
Posted HRZJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟银行自动终端系统相关的知识,希望对你有一定的参考价值。
本系统模拟银行用户使用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("银行自助终端系统\\n**********************"); System.out.println("0------开户\\n1------查询\\n2------存款\\n3------取款\\n4------退出"); System.out.print("**********************\\n请选择您要执行的功能:"); Scanner sc = new Scanner(System.in); while (true) { // 等待选择 int resoult = sc.nextInt(); // 选择判断 if (resoult == 0) { System.out.println("\\n**********************\\n您选择的为开户功能"); 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("\\n**********************\\n您选择的为查询功能"); 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("您要查询的账号信息为:\\n**********************"); 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() + "\\n"); 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("\\n**********************\\n您选择的为存款功能\\n请输入您要存款的卡号:"); 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("您要存款的账号信息为:\\n**********************"); 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() + "\\n"); // 提醒输入存款金额完成存款功能 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("\\n**********************\\n您选择的为取款功能\\n请输入您要取款的银行卡号:"); 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("您要取款的账号信息为:\\n**********************"); 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 //以上是关于模拟银行自动终端系统的主要内容,如果未能解决你的问题,请参考以下文章