首页 > 代码库 > 模拟ATM机银行系统

模拟ATM机银行系统

淄博汉企Java基础考核项目

模拟银行自助终端系统

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

说明: 

1. 对于数据输入异常,可使用java异常处理机制进行处理。 

2. 评分将以功能实现与代码规范性相结合的方式进行考核。

3. 如果对项目需求有疑问,可以随时以QQ留言方式联系我进行咨询。

4. 国庆放假期间,每天都有老师在公司值班,10月4日是我在公司值班,10月7日正常上班,欢迎大家到公司来做项目。

二. 项目功能要求: 

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

 

银行自助终端系统 

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

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 interface I_yinhangka {	//抽象方法	//public abstract默认修饰抽象的		public abstract void cxyue();//查询余额		void  cunkuan();//存款		void qukuan();//取款		void accound();//账户		}

  

package com.bank.unionpay;public abstract class Atm implements I_yinhangka{	String leixing;//银行卡类型	String accound;//账户	double qukuan;//取款	double cunkuan;//存款	double cxyue ;//余额	String name;	String sfzheng;//省份证号			public Atm(String name,String sfzheng,String accound, double cxyue ) {		super();		this.accound = accound;		this.cxyue = cxyue;		this.name = name;		this.sfzheng = sfzheng;	}		public Atm() {		super();	}	@Override	public void cxyue()	{		// 查询余额		cxyue-=qukuan;		cxyue+=cunkuan;		System.out.println("您的余额="+cxyue);	}	@Override	public void cunkuan() 	{		// 存款		cxyue+=cunkuan;				System.out.println("存款成功,您的存款金额为"+cunkuan);        System.out.println("本次操作后您的余额为:"+cxyue);	}	@Override	public void qukuan() 	{		// 取款		cxyue-=qukuan;		if(cxyue>=0)		{			System.out.println("取款成功,本次取款金额= "+qukuan);			System.out.println("本次操作后您的余额= "+cxyue);		}		else		{			System.out.println("余额不足,无法取款");					}			}	@Override	public void accound() {		// 账户			}		//声明成员方法	public double qukuan(double qukuan)//取款	{		cxyue-=qukuan;		if(cxyue>=0)		{			System.out.println("取款成功,本次取款金额= "+qukuan);			System.out.println("本次操作后您的余额= "+cxyue);		}		else		{			System.out.println("余额不足,无法取款");					}		return qukuan;			}		public double cunkuan(double cunkuan)//存款	{				cxyue+=cunkuan;				System.out.println("存款成功,您的存款金额为"+cunkuan);        System.out.println("本次操作后您的余额为:"+cxyue);		return cunkuan;	}		public double cxyue(double cxyue)	{		cxyue-=qukuan;		cxyue+=cunkuan;		System.out.println("您的余额="+cxyue);		return cxyue;	}		//添加开户的抽象方法	public abstract void kaihu();}

  

package com.bank.unionpay;//银行枚举类型public enum Leixing {	ABC("农行"),ICBC("工行"),CCB("建行"),BOC("中行");		private   final String leixing;			public String getLeixing() 	{		return this.leixing;	}	//构造方法	private Leixing(String leixing)	{		this.leixing=leixing;	}	}

  

package com.bank.abc;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.bank.unionpay.Leixing;//单利模式public class Bank {	private Bank()//禁止外部访问构造方法	{			}	private static Bank  bank=new Bank();//内部产生唯一实例	public static Bank  getBank()//开放一个方法给调用者返回这个实例	{		return bank;	}	final Leixing lx=Leixing.ABC;//农行类型		private String yhName;//银行名称		public List <String>card=new ArrayList<>();//银行卡列表		public Map<String, CxCard > account=new HashMap<>();//账号储蓄卡集合		}

  

package com.bank.abc;import java.util.Random;import java.util.Scanner;import com.bank.unionpay.Atm;import com.bank.unionpay.Leixing;public class Atm2 extends Atm {	 public CxCard cx=new  CxCard();//调用map储蓄卡的信息的对象		public Atm2(String name, String sfzheng, String accound, double cxyue) {		super(name, sfzheng, accound, cxyue);		// TODO 自动生成的构造函数存根	}	public  Atm2() {		// TODO 自动生成的构造函数存根		super();	}	final Leixing lx = Leixing.ABC;	@Override	public void kaihu()// 实现开户	{		System.out.println("您选择的为开户功能");		Scanner sc0=new Scanner(System.in);		System.out.println("请输入姓名");		cx.name=sc0.nextLine();									for(int i=1;i>0;i++) 		{			System.out.println("请输入身份证号");			cx.sfzheng=sc0.nextLine();								if(cx.sfzheng.length()==18)//判断身份证				{								for(int j=1;j>0;j++)					{												System.out.println("请输入密码");						String mm="\\d{6}";//6位数字正则表达式						cx.password=sc0.nextLine();						if(cx.password.matches(mm))						{												cx.setPassword(cx.password);//密码																						Random  ra=new Random();//随机生成6位卡号							int[] ch=new int[6];							StringBuilder str=new StringBuilder();							String s;							for(int k=0;k<6;k++)							{								ch[k]=ra.nextInt(9);//0-9							}															for(Integer c:ch)							{							str.append(c.toString());//遍历  拼接6位数字							}							s=str.toString();							cx.setCairNumber(s);//写入卡号															Bank.getBank().card.add(cx.getCairNumber());//将生成的储蓄卡号存到银行的银行卡列表中							Bank.getBank().account.put(cx.getCairNumber(), cx); //id+储蓄卡对象							System.out.println("开户成功");							System.out.println("您的账号为: "+cx.getCairNumber());															break;						}													else						{							System.out.println("请输入6位纯数字密码");						}					}										break;				}									else				{					System.out.println("请重新输入身份证号");								}			}					}}

  

package com.bank.abc;import java.util.Scanner;import com.bank.unionpay.Leixing;//储蓄卡public class CxCard {	//属性	final Leixing lx=Leixing.ABC;	String  name;//姓名	String sfzheng;//身份证号	String cairNumber;//卡号	String password;//密码	double cxyue ;//余额		//生成卡号的get   set方法	public String getCairNumber() {		return cairNumber;	}	public void setCairNumber(String cairNumber) {		this.cairNumber = cairNumber;	}		public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public String getSfzheng() {		return sfzheng;	}	public void setSfzheng(String sfzheng) {		this.sfzheng = sfzheng;	}	public String getPassword() {		return password;	}	public void setPassword(String password) {		this.password = password;	}	public double getCxyue() {		return cxyue;	}	public void setCxyue(double cxyue) {		this.cxyue = cxyue;	}	public CxCard(String name, String sfzheng, String cairNumber, String password, double cxyue) {		super();		this.name = name;		this.sfzheng = sfzheng;		this.cairNumber = cairNumber;		this.password = password;		this.cxyue = cxyue;	}		@Override	public String toString() {		return "姓名:" + name + "\n"+" 身份证:" + sfzheng + "\n"+"卡号: " + cairNumber +"\n"+ " 余额:" + cxyue;	}	public CxCard() {		// TODO 自动生成的构造函数存根	}//声明成员方法public void qukuan()//取款{	if(true)	{		System.out.println("您选择的为取款功能");		for(int i=1;i>0;i++)		{			Scanner sc1=new Scanner(System.in);							System.out.println("请输入您要取款的卡号");			 cairNumber=sc1.nextLine();			if(Bank.getBank().account.containsKey(getCairNumber()))//判断卡号是否存在			{				for(int h=0;h<4;h++)				{					h=h+1;												System.out.println("请输入密码");													String passwordshuru=sc1.nextLine();																						if(passwordshuru.equals(Bank.getBank().account.get(cairNumber).getPassword()))//判断密码						{							System.out.println("您要取款的账号信息为:");							System.out.println("****************");															//遍历卡号							for(String k:Bank.getBank().account.keySet())							{								System.out.println("账号: "+k);								//通过k便利values的账户信息								System.out.println(Bank.getBank().account.get(k));							}							System.out.println("请输入您要取款的金额");							Scanner qukuan=new Scanner(System.in);							double qk=qukuan.nextDouble();														if(qk>=0)							{								//通过k获取v里面的余额,减去取款金额生成余额								cxyue=Bank.getBank().account.get(cairNumber).getCxyue() -qk;																	System.out.println(cxyue);																if(cxyue>=0)								{									Bank.getBank().account.get(cairNumber).setCxyue(cxyue);									System.out.println("取款成功,本次取款金额= "+qk);																		System.out.println("本次操作后您的余额= "+Bank.getBank().account.get(cairNumber).getCxyue());								}														}							else							{							System.out.println("余额不足,无法取款");																		}															break;									}						else						{							System.out.println("请重新输入密码,还剩"+(4-h)+"次");						}												}										break;					}						}				}					}		public void cunkuan()//存款{				if(true)	{		System.out.println("您选择的为存款功能");		for(int i=1;i>0;i++)		{			Scanner sc1=new Scanner(System.in);							System.out.println("请输入您要存款的卡号");			 cairNumber=sc1.nextLine();			if(Bank.getBank().account.containsKey(getCairNumber()))//判断卡号是否存在			{				for(int h=0;h<4;h++)				{					h=h+1;												System.out.println("请输入密码");													String passwordshuru=sc1.nextLine();														//判断如果输入的密码和通过k找到v里面存的密码一致,输出信息							if(passwordshuru.equals(Bank.getBank().account.get(cairNumber).getPassword()))//判断密码						{							System.out.println("您要存款的账号信息为:");							System.out.println("****************");															//遍历卡号							for(String k:Bank.getBank().account.keySet())							{								System.out.println("账号: "+k);								System.out.println(Bank.getBank().account.get(k));							}								System.out.println("请输入您要存入的金额");								Scanner cunkuan1=new Scanner(System.in);								double ck=cunkuan1.nextDouble();								if(ck>=0)								{									cxyue+=ck;									System.out.println("存款成功,您的存款金额为"+ck);									//把操作后的余额写进集合									Bank.getBank().account.get(cairNumber).setCxyue(cxyue);								    System.out.println("本次操作后您的余额为:"+Bank.getBank().account.get(cairNumber).getCxyue());																		}								else								{									System.out.println("你输入的数据无效,系统将自动退出!谢谢使用");								}																break;							}						else						{							System.out.println("请重新输入密码,还剩"+(4-h)+"次");						}					}									break;				}			else			{				System.out.println("该卡号不存在,请重新输入要查询的卡号");			}						}			}				}						public void cxyue()//查询{			if(true)	{		System.out.println("您选择的为查询功能");		for(int i=1;i>0;i++)		{			Scanner sc1=new Scanner(System.in);							System.out.println("请输入您要查询的卡号");			cairNumber=sc1.nextLine();			if(Bank.getBank().account.containsKey(getCairNumber()))//判断卡号是否存在			{				for(int h=0;h<4;h++)				{					h=h+1;												System.out.println("请输入密码");													String passwordshuru=sc1.nextLine();													//判断密码								if(passwordshuru.equals(Bank.getBank().account.get(cairNumber).getPassword()))					{						System.out.println("您查询的账号信息为:");						System.out.println("****************");														//遍历卡号						for(String k:Bank.getBank().account.keySet())						{							System.out.println("账号: "+k);							//通过k遍历values的信息							System.out.println(Bank.getBank().account.get(k));						}						break;					}					else					{						System.out.println("请重新输入密码,还剩"+(4-h)+"次");					}											}						//System.out.println("密码输入超过三次,自动退出系统");				break;				}			else			{				System.out.println("该卡号不存在,请重新输入要查询的卡号");			}						}									}			}}

  

package com.bank.test;import java.util.Scanner;import com.bank.abc.Atm2;import com.bank.abc.Bank;import com.bank.abc.CxCard;import com.bank.unionpay.Atm;import com.bank.unionpay.Leixing;import com.bank.unionpay.Zhujiemian;public class A {	public static void main(String[] args) throws Exception	{		// TODO 自动生成的方法存根			Leixing[] l= Leixing.values();				for(Leixing x:l)		{			System.out.println("银行卡类型的枚举="+x);		}				System.out.println("*************************");								for(int i=1;i>0;i++)		{			Zhujiemian zjm=new Zhujiemian();			zjm.zhujiemian();			try			{				Scanner sc=new Scanner(System.in);				int in=sc.nextInt();				if(in==0||in==1||in==2||in==3||in==4)				{							if(in==0)											{//测试开户						Atm2  a2=new Atm2();						a2.kaihu();						continue;					}					//查询					if(in==1)					{						Atm2  a2=new Atm2();						a2.cx.cxyue();						continue;					}							if(in==2)					{						//存款						Atm2  a2=new Atm2();						a2.cx.cunkuan();						continue;					}					if(in==3)					{						//取款						Atm2  a2=new Atm2();						a2.cx.qukuan();						continue;					}					if(in==4)					{						//退出						System.out.println("系统即将推出");						break;					}												}				else				{					System.out.println("该菜单不存在");				}					}			catch(Exception e)			{				System.out.println("输入有误,自动退出系统");			}		}			}				}

  技术分享

技术分享

技术分享

技术分享

 

模拟ATM机银行系统