模拟ATM机银行系统

时间:2021-10-17 08:01:06

淄博汉企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机银行系统

模拟ATM机银行系统

模拟ATM机银行系统

模拟ATM机银行系统

模拟ATM机银行系统的更多相关文章

  1. 连接数据库——模拟ATM机查、存、取、开户功能

    1.界面:包含开户.查询.存款.取款.功能 package com.bank.test; /** * * @author Administrator *界面类 */ public class Jiem ...

  2. 01、模拟ATM机界面程序

    一.概述 设计一个简单的模拟自动取款机ATM界面的程序,实现用户登录及取款等功能. 二.需求分析 (1)模拟自动取款机ATM界面,有常用功能. (2)主要功能包括;用户输入密码登录主界面.取款功能.取 ...

  3. 序列化,反序列化,模拟ATM机

    package com.bank.unionpay; //银行卡的接口 public interface I_yinhangka { //抽象方法 //public abstract默认修饰抽象的 p ...

  4. 模拟ATM机将输入的数据插入数据库

    ATM抽象类 public abstract class ATM { private double balance; private String idcard; private String pas ...

  5. C语言模拟ATM机界面

    虽然是满屏的printf.printf.printf.printf......尴尬 但是一个小项目做下来还是能学习到很多的,有很多小的问题,不是亲自来敲一遍代码,是不会发现的.他的框架,每一个小函数功 ...

  6. 语言模拟ATM自动取款机系统

    C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...

  7. 简单的小程序实现ATM机操作

    简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...

  8. JAVA - ATM机程序

    ATM机程序 UnionPayTest.java package oo.day06.work; public class UnionPayTest { } interface UnionPay{ // ...

  9. 简易ATM机

    简易ATM机(代码如下): /* * 功能:简易银行系统 */package day8; import java.util.Scanner; /** * * @FengYan Huang Admini ...

随机推荐

  1. iOS手势解锁、指纹解锁--Swift代码

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeeds ...

  2. Java页面中文编码要转换两次encodeURI

    1.js文件中使用encodeURI()方法. login_name = encodeURI(encodeURI(login_name)); 2.action中URLDecoder解码 loginNa ...

  3. Java命令行输入求和的简单学习

    思想:命令行输入的参数,必须先转换为数字才能进行加法计算,这就需要引用java.util.Scanner; 流程框图: 源代码: //实现几个整数相加的程序 //高开拓,2015.9.26 packa ...

  4. &lpar;Struts&rpar;ActionForm类及表单数据验证

    LoginForm代码: /* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */ pac ...

  5. Android手机分辨率基础知识(DPI&comma;DIP计算)二

    dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...

  6. matlab结构体形式保存数据生成&period;mat文件&lt&semi; 转&gt&semi;

    2015年 参加天池大数据竞赛     为了建立模型,打算基于matlab使用Random Forest Algorithm的工具包 该工具包我在此分享给大家,http://yunpan.cn/cVX ...

  7. Android-Java-静态成员变量&amp&semi;成员变量&amp&semi;局部变量&lpar;内存图&amp&semi;回收机制&rpar;

    静态成员变量(回收机制) StaticDemo 和 MyDemo package android.java.oop13; class MyDemo { /** * 定义一个静态变量 */ public ...

  8. 第二次作业 对VC&plus;&plus;6&period;0编译软件的评价

    首先这个软件伴随着我们很长时间了,它是我们一上大学最先接触的,也是应用相当多的一个软件,其实在最初的时候,我对编译软件的理解非常有限,觉得它能实现一个代码的功能十分神奇的一件事情,虽然彼时我们写的代码 ...

  9. Go parameter passing

    package main import ( "fmt" ) func main() { fmt.Println("Hello, playground") var ...

  10. MongoDB(三)-- 执行JS、界面工具

    一.执行Js脚本 1.开启mongod服务 2.连接mongodb客户端,./mongo --host 192.168.80.128 --port 27017 3.创建数据库:use testdb1 ...