淄博汉企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机银行系统的更多相关文章

  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. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树 矩阵面积并

    D. Vika and Segments     Vika has an infinite sheet of squared paper. Initially all squares are whit ...

  2. loj 1379(最短路变形)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27087 思路:题目的意思是求S->T的所有路径中花费总和小于 ...

  3. 数字信号处理实验(六)——FIR滤波器的设计

    一.四种线性相位FIR滤波器的振幅响应 1.自编函数 [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) 2.一个demo clea ...

  4. Fragment 操作原理

      fragment 本质 fragment 本质上是 view 的容器和控制器,fragment 是 activity 的碎片. activity 是什么呢?activity 是四大组件之一,因为 ...

  5. 转载 linux内核 asmlinkage宏

    转载http://blog.chinaunix.net/uid-7390305-id-2057287.html 看一下/usr/include/asm/linkage.h里面的定义:#define a ...

  6. c++11 正则表达式基本使用

    c++ 11 正则表达式 常用的方法 regex_match regex_search regex_replace 等. regex_match 要求正则表达式必须与模式串完全匹配,例如: strin ...

  7. 移动端-解决ios连续点击页面上移问题

    引入js即可 //解决ios双击页面上移问题//在项目中测试不紧input/button这些表单控件有这个问题,p,div等也有问题,于是乎就直接在body开刀了(function(){ var ag ...

  8. 使用while代替for循环的几个习题

    1:兔子问题 2:100以内质数的和 3:单位给发了一张150元购物卡,拿着到超市买三类洗化用品.洗发水15元,香皂2元,牙刷5元.求刚好花完150元,有多少种买法,没种买法都是各买几样? 总结:wh ...

  9. python 继承

    继承一个类 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init__(self ...

  10. hdu4968

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4968 说是考dp,但是我没出来dp在哪,可能贪心思想更多一些吧. AC代码: #inclu ...