java 模拟ATM机操作(初次学习java)

最大程度模拟现实ATM机操作


  1. 存款 100/200/500/1000/2000/5000/10000
  2. 取款 首先验证密码,3次连续失败锁定账户;密码验证成功后无需重复输入密码,可多次取款 100/200/500/1000/2000/5000/10000
  3. 查询余额
  4. 退卡

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;
  }
}

初次学习,有错误,可以改进的地方请指出,多谢!

不知道几年之后再看到当初的代码会有什么样的心情呢。。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值