Java——ATM程序(完整代码详细解析)

目录

一、需求

二、详细解析

三、完整代码


一、需求

ATM程序(银行取款机器)
1.插卡(输入账户) + 输入密码(只有密码正确,此时才可以进入菜单,否则重新输入密码)
用户输入账号和密码,只有三次输入机会,如果三次都输入失败账户被冻结(输出被冻结)
2.密码正确显示菜单(存款、取款、查询、转账、退出)
 * 在菜单选择:存 输入存多少
 * 在菜单选择: 取 输入取多少(如果输入的数字,大于余额,不能取钱)
 * 在菜单选择:查询
 * 在菜单选择:转账--输入转账的账号以及转账金额(账号错误,不能转账;转账金额大于余额,不能转账)
 * 在菜单选择:切换账号
 * 在菜单选择:修改密码
 * 在菜单选择:退出(结束程序)

二、详细解析

1.登录


        // 对应数组 相同下标位置 为同一用户的数据
        // 提前设置 账户
        String[] userAccount = {"user111", "user123", "user321"};
        // 提前设置 密码
        String[] userPwd = {"111", "123", "321"};
        // 提前设置 余额
        double[] userMoney = {1000, 2000, 3000};


        // 标记变量 标记用户登录状态
        boolean isLogin = false;
        /*记录登录用户 数组下标(下标>=0,取-1,后续只要对下标有了改变,
           其值不为-1的话也说明用户已经登录成功)*/
        int userIndex = -1;
        // 登录
        Scanner input = new Scanner(System.in);

        while (true){
            for (int i = 0; i < 3; i++) {// i表示账号和密码输入的次数 0 1 2
                System.out.println("请输入账户:");
                String account = input.next();
                System.out.println("请输入密码:");
                String password = input.next();
                // 用账号和密码去做比较
                // 遍历 账号数组
                for (int j = 0; j < userAccount.length; j++) {
                // j表示账号数组的下标 和 密码数组的下标
                    // 拿用户输入的账号和密码去和所有存在的账号和密码进行比较
                    // 字符串的比较 使用equals, 字符串1.equals(字符串2)
                    if (account.equals(userAccount[j])
                            && password.equals(userPwd[j])) {
                        userIndex = j;
                        isLogin = true;
                        break;// 结束本层循环
              //continue; // 跳过本次循环 剩余代码 进入下一次循环条件的判断
                    }
                }
                // 想要知道登录成功与否 是不是需要循环结束后才能知道
                //所以我们设置一个标记变量 改变状态
                if (!isLogin) { // 在当前位置等价于 isLogin == false
                    System.out.println("用户或密码有误,请重新输入");
                    // 提示 还剩下几次机会
                    if (i != 2) {// 0 1
                        System.out.println("还有" + (2 - i) + "次输入机会");
                    } else if (i == 2) {
                        System.out.println("3次机会已经用完,卡被冻结");
                        System.out.println("解冻请联系88888888");
                        // 3次机会结束 结束程序
                        System.exit(0);
                    }
                } else {
                    System.out.println("恭喜 登录成功\n欢迎进入江小白银行");
                    break;
                }
            }

2.菜单界面及功能

            // 最好 是在登录成功以后 才会建立死循环
            while (isLogin) {
                // 登录成功 进入菜单
                System.out.println("欢迎进入菜单界面:");
                //存款、取款、查询、转账、退出
                System.out.println("请选择:1-存款 2-取款 3-查询 " +
                        "4-转账 5-切换账号 6-修改密码 7-退出");
                // 声明变量 接收用户 输入的选择
                int choose = input.nextInt();
                // 判断用户输入的值 做出不同的操作 switch-case语句/if语句   --分支语句
                if (choose == 1) {// 存款
                    while (true) {
                        System.out.println("请输入存款金额");
                        double saveMoney = input.nextDouble();
                        
                        if (saveMoney < 0 || saveMoney % 100 != 0) {
                            System.out.println("输入金额有误,请重新输入");
                            continue;
                        }
                        // 把存款金额 加到余额上
                        // userMoney[userIndex] = userMoney[userIndex] +  saveMoney;
                        userMoney[userIndex] += saveMoney;
                        System.out.println("存款成功,当前余额为:"
                                + userMoney[userIndex] + "元");
                        // 操作成功结束 存款循环
                        break;
                    }

                } else if (choose == 2) {// 取款
                    System.out.println("请输入取款金额");
                    double getMoney = input.nextDouble();
       // 如果取款金额大于余额 或者 取款金额输入为负数 或者取款金额不是100的倍数
                    // 重新输入金额在做金额判断

                    if(getMoney < 0 || getMoney > userMoney[userIndex]
                            || getMoney % 100 != 0){
                        System.out.println("金额输入有误,取款失败");
                        // 第一个选择.把取款操作做出循环 在操作中听输入
                        // 第二个选择.输入有误,直接进入菜单 此时我做的选择2
                        continue;
                    }

                    // 代码执行此处 说明金额输入没有问题 可以继续取款操作
                    userMoney[userIndex] -= getMoney;
                    System.out.println("取款成功,当前余额" + userMoney[userIndex] + "元");
                } else if (choose == 3) {// 查询
                    // 获取当前登录用户的余额
                    // 根据登录用户下标获取余额
                    System.out.println("当前余额为:" + userMoney[userIndex] + "元");
                } else if (choose == 4) {// 转账
      // 对方账号(判断账号是存在的) 和 转账金额(合法金额 小于余额、100整数倍、不能为负数)
                    System.out.println("请输入转账账号:");
                    String transAccount = input.next();
                    // 第二种写法 减少嵌套
                    // 保存对方账号的下标
                    int transIndex = -1;
                    // 判断账号是否存在 遍历整个账号数组
                    for(int i = 0;i < userAccount.length;i++){
                        if(userAccount[i].equals(transAccount) &&
                                i != userIndex){
                            transIndex = i;
                            break;
                        }
                    }
                    if(transIndex == -1){// 说明账号不存在
                        System.out.println("对方账号不存在,请重新执行转账操作");
                        continue;
                    }

                    System.out.println("请输入转账金额:");
                    double transMoney = input.nextDouble();
                    if(transMoney < 0 || transMoney % 100 != 0 ||
                            transMoney > userMoney[userIndex]){
                        System.out.println("金额有误,请重新执行转账操作");// 菜单
                        continue;
                    }
                    //  代码能执行到此处,说明账号存在 且 金额无误 可以做转账操作
                    // 转账操作 自己账号扣钱 对方账号加钱
                    userMoney[userIndex] -= transMoney;
                    userMoney[transIndex] += transMoney;
                    System.out.println("转账成功");
                    System.out.println("当前余额为:" + userMoney[userIndex] + "元");

                } else if (choose == 5) {// 切换账号
                    System.out.println("切换账号");
                    break;
                } else if (choose == 6) {// 修改密码
                    // 如果修改ATM密码 会做哪些操作
                    // 改密码 和 转账(数据有误是回到菜单重新开始) 换一种写法
                    // 数据有误 不返回菜单,重新去输入
                    while (true){
                        System.out.println("请输入旧密码");
                        String oldPwd = input.next();
                        // 拿到输入的旧密码和数组中保存的密码 比价
                        if(!oldPwd.equals(userPwd[userIndex])){
              // 输入的旧密码和原本密码不一致
                            System.out.println("旧密码有误,请重新开始修改密码步骤");
                            continue;// 跳过剩余代码,直接再输入旧密码
                        }
                        // 代码能执行到此处,旧密码输入正确
                        System.out.println("请输入新密码");
                        String newPwd = input.next();
                        if(newPwd.equals(oldPwd)){// 新密码和老密码相同
                            System.out.println("新密码不能和旧密码一致," +
                                    "请重新开始修改密码步骤");
                            continue;
                        }
                        // 代码能执行到此处,旧密码输入正确 新密码输入和旧密码不一致
                        System.out.println("请确认新密码");
                        String reNewPwd = input.next();
                        // 新密码 和第二次输入的新密码去做比较
                        if(!newPwd.equals(reNewPwd)){
                            System.out.println("两次输入的新密码不一致," +
                                    "请重新开始修改密码步骤");
                            continue;
                        }
                        // 代码能执行到此处,旧密码输入正确 新密码输入和旧密码不一致
                        // 两次输入的新密码一致 执行最后的改密操作
                        userPwd[userIndex] = newPwd;
                        System.out.println("修改密码成功,请重新登录");
                        // 想要重新登录 需要中断 菜单循环 和 修改密码循环
                        break;
                    }
                    break;
                } else if (choose == 7) {// 退出
                    System.out.println("欢迎下次再来");
                    // 结束程序
                    System.exit(0);
                }

三、完整代码

public class ATM {

    public static void main(String[] args) {
        String[] userAccount = {"user111", "user123", "user321"};
        String[] userPwd = {"111", "123", "321"};
        double[] userMoney = {1000, 2000, 3000};
        
        boolean isLogin = false;
        int userIndex = -1;
        Scanner input = new Scanner(System.in);

        while (true){
            for (int i = 0; i < 3; i++) {
                System.out.println("请输入账户:");
                String account = input.next();
                System.out.println("请输入密码:");
                String password = input.next();
                for (int j = 0; j < userAccount.length; j++) {
                    if (account.equals(userAccount[j])
                            && password.equals(userPwd[j])) {
                        userIndex = j;
                        isLogin = true;
                        break;
                    }
                }
  
                if (!isLogin) {
                    System.out.println("用户或密码有误,请重新输入");
                    if (i != 2) {
                        System.out.println("还有" + (2 - i) + "次输入机会");
                    } else if (i == 2) {
                        System.out.println("3次机会已经用完,卡被冻结");
                        System.out.println("解冻请联系88888888");
                        System.exit(0);
                    }
                } else {
                    System.out.println("恭喜 登录成功\n欢迎进入江小白银行");
                    break;
                }
            }

            
            while (isLogin) {
                System.out.println("欢迎进入菜单界面:");
                System.out.println("请选择:1-存款 2-取款 3-查询 " +
                        "4-转账 5-切换账号 6-修改密码 7-退出");
                int choose = input.nextInt();
                if (choose == 1) {
                    while (true) {
                        System.out.println("请输入存款金额");
                        double saveMoney = input.nextDouble();
                        if (saveMoney < 0 || saveMoney % 100 != 0) {
                            System.out.println("输入金额有误,请重新输入");
                            continue;
                        }
                        userMoney[userIndex] += saveMoney;
                        System.out.println("存款成功,当前余额为:"
                                + userMoney[userIndex] + "元");
                        break;
                    }

                } else if (choose == 2) {
                    System.out.println("请输入取款金额");
                    double getMoney = input.nextDouble();
                    if(getMoney < 0 || getMoney > userMoney[userIndex]
                            || getMoney % 100 != 0){
                        System.out.println("金额输入有误,取款失败");
                        continue;
                    }

    
                    userMoney[userIndex] -= getMoney;
                    System.out.println("取款成功,当前余额" + userMoney[userIndex] + "元");
                } else if (choose == 3) {
                    System.out.println("当前余额为:" + userMoney[userIndex] + "元");
                } else if (choose == 4) {
                    System.out.println("请输入转账账号:");
                    String transAccount = input.next();
                    int transIndex = -1;
                    for(int i = 0;i < userAccount.length;i++){
                        if(userAccount[i].equals(transAccount) &&
                                i != userIndex){
                            transIndex = i;
                            break;
                        }
                    }
                    if(transIndex == -1){
                        System.out.println("对方账号不存在,请重新执行转账操作");
                        continue;
                    }

                    System.out.println("请输入转账金额:");
                    double transMoney = input.nextDouble();
                    if(transMoney < 0 || transMoney % 100 != 0 ||
                            transMoney > userMoney[userIndex]){
                        System.out.println("金额有误,请重新执行转账操作");
                        continue;
                    }
                    userMoney[userIndex] -= transMoney;
                    userMoney[transIndex] += transMoney;
                    System.out.println("转账成功");
                    System.out.println("当前余额为:" + userMoney[userIndex] + "元");

                } else if (choose == 5) {
                    System.out.println("切换账号");
                    break;
                } else if (choose == 6) {
                    while (true){
                        System.out.println("请输入旧密码");
                        String oldPwd = input.next();
                        if(!oldPwd.equals(userPwd[userIndex])){
                            System.out.println("旧密码有误,请重新开始修改密码步骤");
                            continue;
                        }
                
                        System.out.println("请输入新密码");
                        String newPwd = input.next();
                        if(newPwd.equals(oldPwd)){
                            System.out.println("新密码不能和旧密码一致," +
                                    "请重新开始修改密码步骤");
                            continue;
                        }
               
                        System.out.println("请确认新密码");
                        String reNewPwd = input.next();
                        if(!newPwd.equals(reNewPwd)){
                            System.out.println("两次输入的新密码不一致," +
                                    "请重新开始修改密码步骤");
                            continue;
                        }
                        userPwd[userIndex] = newPwd;
                        System.out.println("修改密码成功,请重新登录");
                        break;
                    }
                    break;
                } else if (choose == 7) {
                    System.out.println("欢迎下次再来");
                    System.exit(0);
                }
            }
        }

    }

}

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,Java 事件处理是指通过监听用户的操作事件(如鼠标点击、键盘输入等),并在相应事件发生时执行一定的处理代码来响应用户的操作。下面是一个简单的 ATM 柜员机模拟程序,演示了 Java 事件处理的基本用法: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ATM extends JFrame implements ActionListener { private JLabel label; private JButton button1, button2, button3; public ATM() { super("ATM"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); setLayout(new FlowLayout()); label = new JLabel("请选择操作:"); button1 = new JButton("查询余额"); button2 = new JButton("取款"); button3 = new JButton("存款"); add(label); add(button1); add(button2); add(button3); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() == button1) { label.setText("您的账户余额为1000元。"); } else if (e.getSource() == button2) { label.setText("请输入取款金额:"); } else if (e.getSource() == button3) { label.setText("请输入存款金额:"); } } public static void main(String[] args) { ATM atm = new ATM(); atm.setVisible(true); } } ``` 这个程序实现了一个简单的 ATM 柜员机界面,包含三个按钮:查询余额、取款、存款。当用户点击这些按钮时,程序会在标签中显示相应的信息。在构造函数中,我们设置了窗口的标题、大小和布局,并创建了标签和按钮,添加到窗口中。然后,我们为每个按钮添加了一个事件监听器,使用 this 关键字表示当前对象,即 ATM 类,在 actionPerformed 方法中根据事件源判断用户点击了哪个按钮,并在标签中显示相应的信息。最后在 main 方法中创建了一个 ATM 对象并显示出来。 这个示例程序虽然简单,但演示了 Java 事件处理的基本用法。在实际开发中,我们可以根据具体需求编写更加复杂的事件处理代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BroRiver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值