在Java开发中,do-while循环适合需要先执行一次操作再判断后续是否继续的场景,ATM取款流程的人机交互逻辑正好匹配这个特性,用户进入系统后先展示操作菜单,完成一次操作后可以选择是否继续,直到用户主动选择退出。
ATM取款流程的核心逻辑梳理
完整的ATM取款模拟流程主要包含以下几个核心环节:
- 初始密码验证,连续输错三次则锁定账户
- 展示操作菜单,包含查询余额、取款、退出三个选项
- 根据用户选择执行对应操作,操作完成后再次展示菜单
- 用户选择退出时结束整个流程
其中展示菜单、接收用户选择、执行操作、判断是否需要继续的环节,就非常适合用do-while循环来实现,因为无论用户后续是否继续,第一次菜单展示和操作是必须执行的。
核心代码实现
1. 基础框架与初始变量定义
首先定义账户初始余额、正确密码、是否继续操作的标志位等基础变量:
import java.util.Scanner;
public class ATMSimulator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 初始账户余额
double balance = 5000.00;
// 正确密码
String correctPassword = "123456";
// 密码错误次数
int passwordErrorCount = 0;
// 密码验证通过标志
boolean passwordPass = false;
// 密码验证环节
do {
System.out.println("请输入ATM取款密码:");
String inputPassword = scanner.nextLine();
if (correctPassword.equals(inputPassword)) {
passwordPass = true;
System.out.println("密码验证通过,欢迎使用ATM系统");
break;
} else {
passwordErrorCount++;
System.out.println("密码错误,您还有" + (3 - passwordErrorCount) + "次输入机会");
}
} while (passwordErrorCount < 3);
// 密码验证不通过则直接结束程序
if (!passwordPass) {
System.out.println("密码连续输错三次,账户已锁定,请联系银行处理");
scanner.close();
return;
}
// 操作选择变量,1查询 2取款 3退出
int choice;
// 是否继续操作标志,默认继续
boolean isContinue = true;
}
}
2. do-while实现核心操作循环
密码验证通过后,使用do-while循环实现菜单展示、操作执行、继续判断的完整流程:
// 核心操作循环,使用do-while保证至少执行一次菜单展示
do {
// 展示操作菜单
System.out.println("n====== ATM操作菜单 ======");
System.out.println("1. 查询余额");
System.out.println("2. 取款");
System.out.println("3. 退出系统");
System.out.println("请输入您的操作选择(1-3):");
// 接收用户输入的选择
try {
choice = Integer.parseInt(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.println("输入无效,请输入1-3之间的数字");
continue;
}
// 根据选择执行对应操作
switch (choice) {
case 1:
// 查询余额
System.out.println("当前账户余额为:" + balance + "元");
break;
case 2:
// 取款操作
System.out.println("请输入取款金额(100的倍数,单次最多取5000元):");
try {
double withdrawAmount = Double.parseDouble(scanner.nextLine());
// 校验取款金额合法性
if (withdrawAmount <= 0) {
System.out.println("取款金额必须大于0");
} else if (withdrawAmount % 100 != 0) {
System.out.println("取款金额必须是100的倍数");
} else if (withdrawAmount > 5000) {
System.out.println("单次取款金额不能超过5000元");
} else if (withdrawAmount > balance) {
System.out.println("余额不足,当前余额为:" + balance + "元");
} else {
// 执行取款,更新余额
balance -= withdrawAmount;
System.out.println("取款成功,取出金额:" + withdrawAmount + "元,当前余额:" + balance + "元");
}
} catch (NumberFormatException e) {
System.out.println("输入金额无效,请输入正确的数字");
}
break;
case 3:
// 选择退出,修改继续标志为false
System.out.println("感谢使用ATM系统,再见");
isContinue = false;
break;
default:
System.out.println("输入无效,请输入1-3之间的数字");
}
} while (isContinue);
scanner.close();
}
}
代码逻辑关键点说明
整个实现中do-while循环的作用非常明确:
- 循环条件
isContinue初始为true,所以第一次菜单展示和操作一定会执行 - 当用户选择退出(choice为3)时,将
isContinue设为false,下一次循环条件判断不通过,循环结束 - 如果用户输入无效选项,或者完成查询、取款操作后,
isContinue仍为true,循环会继续执行,再次展示菜单
另外需要注意输入校验的处理,比如密码输入、操作选择、取款金额的格式和合法性校验,避免程序因为用户输入异常数据崩溃。如果需要升级为图形化人机交互界面,只需要把控制台的输入输出替换成Swing或者JavaFX的组件事件处理即可,核心的do-while循环逻辑不需要大改。