序列化,反序列化,模拟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; import java.util.ArrayList;
import java.util.List; public class Zhujiemian { public void zhujiemian()
{
System.out.println("银行自助终端系统");
System.out.println();
System.out.println("************************");
List<String> li=new ArrayList<>();
li.add("开户");
li.add("查询");
li.add("存款");
li.add("取款");
li.add("退出"); for(int i=0;i<5;i++)
{
System.out.println(i+"------"+li.get(i));
}
System.out.println();
System.out.println("请选择您要执行的功能");
} }
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.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.bank.unionpay.Leixing; //单利模式
public class Bank implements Serializable
{
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();// 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.io.Serializable;
import java.util.Scanner; import com.bank.unionpay.Leixing; //储蓄卡
//只有实现了Serializable和Externalizable接口的类的对象才能被序列化。
public class CxCard implements Serializable {
//属性
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<3;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(cairNumber));
}
break;
}
else
{
System.out.println("请重新输入密码,还剩"+(4-h)+"次");
} }
//System.out.println("密码输入超过三次,自动退出系统");
break;
}
else
{
System.out.println("该卡号不存在,请重新输入要查询的卡号");
} } } } }
package com.bank.test; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
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("*************************"); try
{
ObjectInputStream in1=new ObjectInputStream(new FileInputStream("d:/abc122/abc.obj"));
Map<String, CxCard > account1=(Map<String, CxCard>) in1.readObject();
Bank.getBank().account=account1;
//System.out.println(Bank.getBank().account);
}
catch(Exception e)
{ } for(int i=1;i>0;i++)
{
Zhujiemian zjm=new Zhujiemian();
zjm.zhujiemian(); 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("系统即将退出"); File fi=new File("d:/abc122");
if(!fi.exists())
{
fi.mkdirs();
}
ObjectOutputStream obj=new ObjectOutputStream(new FileOutputStream("d:/abc122/abc.obj"));
obj.writeObject(Bank.getBank().account);
System.out.println("数据保存完成");
obj.close(); break; } }
else
{
System.out.println("该菜单不存在");
} } } }
序列化,反序列化,模拟ATM机的更多相关文章
- 模拟ATM机银行系统
淄博汉企Java基础考核项目 模拟银行自助终端系统 一. 本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 说明: 1. 对于数据输入异常,可使用java异常处 ...
- 连接数据库——模拟ATM机查、存、取、开户功能
1.界面:包含开户.查询.存款.取款.功能 package com.bank.test; /** * * @author Administrator *界面类 */ public class Jiem ...
- 01、模拟ATM机界面程序
一.概述 设计一个简单的模拟自动取款机ATM界面的程序,实现用户登录及取款等功能. 二.需求分析 (1)模拟自动取款机ATM界面,有常用功能. (2)主要功能包括;用户输入密码登录主界面.取款功能.取 ...
- 模拟ATM机将输入的数据插入数据库
ATM抽象类 public abstract class ATM { private double balance; private String idcard; private String pas ...
- C语言模拟ATM机界面
虽然是满屏的printf.printf.printf.printf......尴尬 但是一个小项目做下来还是能学习到很多的,有很多小的问题,不是亲自来敲一遍代码,是不会发现的.他的框架,每一个小函数功 ...
- 语言模拟ATM自动取款机系统
C语言实验报告 题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...
- 简单的小程序实现ATM机操作
简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...
- JAVA - ATM机程序
ATM机程序 UnionPayTest.java package oo.day06.work; public class UnionPayTest { } interface UnionPay{ // ...
- Java 模拟ATM(修正)
ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0). 模拟AT ...
随机推荐
- 在Asp.Net MVC中用Ajax回调后台方法
在Asp.Net MVC中用Ajax回调后台方法基本格式: var operData = ...; //传递的参数(action中定义的) var type = ...; //传递的参数(action ...
- iOS中图片动画的三种模式及基本的代码实现
-(void)play { //第一种图片动画模式 头尾方式 //头尾方式 [UIView beginAnimations:nil context:nil];//动画开始 [UIView setAni ...
- css把超出的部分显示为省略号的方法兼容火狐
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- Confluent Platform 3.0支持使用Kafka Streams实现实时的数据处理(最新版已经是3.1了,支持kafka0.10了)
来自 Confluent 的 Confluent Platform 3.0 消息系统支持使用 Kafka Streams 实现实时的数据处理,这家公司也是在背后支撑 Apache Kafka 消息框架 ...
- 查看mysql的安装信息
查看mysql的安装信息: #ps -ef | grep mysql usr/bin/mysql 是指:mysql的运行路径 var/lib/mysql 是指:mysql数据库文件的存放路径 usr/ ...
- FFmpeg与libx264 x264接口源代码简单分析
源代码位于“libavcodec/libx264.c”中.正是有了这部分代码,使得FFmpeg可以调用libx264编码H.264视频. 从图中可以看出,libx264对应的AVCodec结构体ff ...
- C#插件构架实战 + Visual C#插件构架实战补遗(转)
C#插件构架实战 C# 插件构架实战 Jack H Hansen [ 2004-07-27 ] Keywords C# 插件 反射(System.Reflection) 属性(System.Attri ...
- POJ 3080 后缀数组/KMP
题目链接:http://poj.org/problem?id=3080 题意:给定n个DNA串,求最长公共子串.如果最长公共子串的长度小于3时输出no significant commonalitie ...
- 关于__IPHONE_OS_VERSION_MAX_ALLOWED和__IPHONE_OS_VERSION_MIN_ALLOWED的用法
简单来说, 这些编译期常量, 对运行时的环境判断完全无效, 它告诉编译器用哪一段代码来进行编译, 那那段代码里, 你仍然可以写运行到目标机器里会崩溃的代码, 从stackoverflow里拷两段示例代 ...
- iOS 关于iOS开发中的delegate
有A.B两个对象,A要完成某件事,想让B帮它做. 这时候,A中就要实例化一个B的对象b,A还要在头文件中声明协议,然后在B中实现协议中对应的方法. 这时候再把A的delegate设置为b,在需要的地方 ...