最大程度模拟现实ATM机操作
- 存款 100/200/500/1000/2000/5000/10000
- 取款 首先验证密码,3次连续失败锁定账户;密码验证成功后无需重复输入密码,可多次取款 100/200/500/1000/2000/5000/10000
- 查询余额
- 退卡
Test.java
import java.util.*;
public class Test {
public static void main(String[] args) {
System.out.println("\n\n\n//你现在拥有一张储蓄卡:卡号为12345678910,密码为666666,余额为1000.0\n");
Account myCount = new Account("12345678910", 666666, 1000);
System.out.println("-----------欢迎使用工商银行ATM-----------\n");
int input = 0;// 操作读入
do {
System.out.println("-----------------------------------------");
System.out.println(" 1.存款 2.取款 3.查询余额 -1.退卡");
System.out.println("-----------------------------------------");
Scanner scan = new Scanner(System.in);
input = scan.nextInt();
switch (input) {
case 1: // 存款
System.out.println("请输入存款金额: 100/200/500/1000/2000/5000/10000\n");
int dep = scan.nextInt();
myCount.deposit(dep);
break;
case 2: // 取款 需依次进行 密码锁,密码验证
myCount.withdraw();
break;
case 3: // 查询余额
System.out.println("查询中,请稍后...");
System.out.println("当前账号余额为" + myCount.getBalance() + "元\n");
break;
case -1: // 退卡
myCount.setIsPassVerify(false);//关闭 密码锁
System.out.println("\n\n欢迎下次使用。\n\n");
break;
default: // error
System.out.println("操作指令错误");
}
} while (input != -1);
}
}
class Account {
private String accountNumber;
private int password;
private double balance;
private boolean withDrawIsLock;// 取款锁。密码验证错误 3次后置为 true, 此后不可取款。
private boolean isPassVerify; // 密码锁。某次使用ATM进行操作时,密码验证成功后,临时置为true,每次取款无需反复输入密码, 只须检查其值是否为 true;
// 修改密码成功后或退卡时,重置为false, 保护账号安全。
Account(String acc, int pas, double bal) {
accountNumber = acc;
password = pas;
balance = bal;
}
void deposit(int d) {
if (d == 100 || d == 200 || d == 500 || d == 1000 || d == 2000 || d == 5000 || d == 10000) {
this.balance += d;
System.out.println("已存入" + d + "元," + "当前账号余额为" + balance + "元\n");
} else {
System.out.println("\n输入取款金额错误,可选金额限制 100/200/500/1000/2000/5000/10000");
}
}
void withdraw() {
Scanner scan = new Scanner(System.in);
for(int count = 0;count <= 3; ){
int num = passwordVerify(); // pass密码验证 返回标识
if(num == 111){
break;
}
// System.out.println("进行密码验证 返回标识" + num);
if(num == 1 || num == 222 ){
setIsPassVerify(true); // 打开 密码锁,退卡前或修改密码前无需再次验证密码。
double bal = getBalance(); // 获取余额
if(num == 1){
System.out.println("密码正确。当前账号余额为" + bal + "元");
}else if(num == 222){
System.out.println("\n\n无需再次验证密码。当前账号余额为" + bal + "元");
}
System.out.println("\n\n请输入取款金额: 100/200/500/1000/2000/5000/10000\n");
int w = scan.nextInt();
// 检查取款金额是否在可选范围
if (w == 100 || w == 200 || w == 500 || w == 1000 || w == 2000 || w == 5000 || w == 10000) {
// 检查余额是否足够
if (w > bal) {
System.out.println("余额不足! " + "当前账号余额为" + bal + "元");
} else {
balance -= w;
System.out.println("已取出" + w + "元," + "当前账号余额为" + getBalance() + "元\n");
}
} else {
System.out.println("\n输入取款金额错误,可选金额限制 100/200/500/1000/2000/5000/10000");
}
break;
}else{
count ++;
if(count <= 2)
System.out.println("密码错误,剩余" + (3 - count) + "次尝试机会,请重新输入...\n\n\n");
// 验证错误次数 >=3 ,打开取款锁
if(count >= 3)
setWithDrawIsLock();
}
}
}
int passwordVerify() { // 返回 0 : 密码错误
// 返回 1 : 密码正确
// 返回 111 : 取款锁打开, 不可取款
// 返回 222 : 密码锁打开,本次取款无需验证密码
// 检查 取款锁状态
if (withDrawIsLock) {
System.out.println("\n\n\n\n*******************不可取款*******************\n");
System.out.println("连续密码验证错误次数大于等于3,请前往柜台咨询。\n");
System.out.println("*******************不可取款*******************\n\n\n\n");
return 111;
}
// 检查密码锁 , 通过后无需再次验证密码
if (isPassVerify) {
return 222; // 密码验证通过
}
// 验证密码
System.out.println("请输入6位数字密码:");
Scanner scan = new Scanner(System.in);
int inputPassword = scan.nextInt();
if (inputPassword == getPassword()) {
return 1; // 密码验证通过
} else {
return 0; // 密码验证未通过
}
}
// 取款锁
// 验证失败错误次数大于等于3; 打开取款锁,禁止取款。继续取款需前往银行柜台处理
void setWithDrawIsLock() {
withDrawIsLock = true;
}
// 密码锁
// 验证密码通过后,临时置为true,取款无需重复验证密码
// 修改秘密时或退卡时,置为false
void setIsPassVerify(boolean state) {
if(state){
this.isPassVerify = true;
}else{
this.isPassVerify = false;
}
}
// 获取密码
private int getPassword() {
return password;
}
double getBalance() {
return balance;
}
}
初次学习,有错误,可以改进的地方请指出,多谢!
不知道几年之后再看到当初的代码会有什么样的心情呢。。