JAVASE练手项目-ATM

此项目使用到的技术主要是面向对象和JAVA的常用API和ArrayList实现。可以用来做JAVA的基础练手或者是期末作业。

主要功能是:用户开户,登录,存钱,取钱,转账,注销,修改密码。

注:下面的演示图片都是用户输入成功的,方便笔者展示,大家可以运行笔者的代码,来演示用户输入错误后提示的错误。

 1.先创建一个账户类

这个类主要用于表示银行账户信息。主要是封装了用户的卡号,用户名,性别,密码,余额,额度。

public class Account {
    private String CarId;//卡号
    private String UserName;//用户名
    private char sex;//性别
    private String password;//密码
    private double money;//余额
    private double limit;//额度

    // 获取卡号
    public String getCarId() {
        return CarId;
    }

    // 设置卡号
    public void setCarId(String carId) {
        CarId = carId;
    }

    // 获取用户名
    public String getUserName() {
        return UserName;
    }

    // 设置用户名
    public void setUserName(String userName) {
        UserName = userName;
    }

    // 获取性别
    public char getSex() {
        return sex;
    }

    // 设置性别
    public void setSex(char sex) {
        this.sex = sex;
    }

    // 获取密码
    public String getPassword() {
        return password;
    }

    // 设置密码
    public void setPassword(String password) {
        this.password = password;
    }

    // 获取余额
    public double getMoney() {
        return money;
    }

    // 设置余额
    public void setMoney(double money) {
        this.money = money;
    }

    // 获取额度
    public double getLimit() {
        return limit;
    }

    // 设置额度
    public void setLimit(double limit) {
        this.limit = limit;
    }
}

2.创建ATM的显示页面

用于显示ATM的页面

public void start() {
        // 用户交互循环,提供ATM机功能选择
        while (true) {
            System.out.println("-------欢迎您使用ATM机使用!--------");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("请选择:");
            int commond = scanner.nextInt();
            switch (commond) {
                case 1:
                  // 调用登录方法
	               login();
                    break;
                case 2:
                  // 调用开户方法
                openAccount();
                    break;
                default:
                    System.out.println("输入错误,请重新输入!");
            }
        }
    }

3.用户开户操作

用户开户方法,用来创建新的账户并添加到账户列表中。

这里需要注意的是,用户的账号不是自己输入的,而是由系统自动生成的。

这里有三个方法,一个是开户的主要方法(openAccount),一个是生成一个不重复的卡号(createCardId),一个是根据卡号查询账户对象返回,查询生成的卡号是否存在(getAccountByCarId),注释笔者在代码中做了详细的解释。

 /**
     * 用户开户方法,用来创建新的账户并添加到账户列表中。
     * 这里需要注意的是,用户的账号不是自己输入的,而是由系统自动生成的。
     */
    private void openAccount() {
        //创建一个账户对象,用于封装用户的开户信息
        Account account = new Account();
        //输入用户信息,赋值给账户对象
        System.out.print("请输入您的姓名:");
        account.setUserName(scanner.next());
        // 在循环中提示用户输入性别,并验证输入是否为'男'或'女',将合法的性别设置到account对象中
        while (true) {
            System.out.print("请输入您的性别:");
            char sex = scanner.next().charAt(0);
            if (sex == '男' || sex == '女') {
                account.setSex(sex);
                break;
            } else {
                System.out.println("您输入的性别有误,请重新输入!");
            }
        }
        // 在无限循环中要求用户输入密码,并确认密码,直到两次输入密码一致后才跳出循环
        while (true) {
            System.out.print("请输入您的密码:");
            String password = scanner.next();
            System.out.print("请确认您的密码:");
            String confirmPassword = scanner.next();
            // 如果两次输入的密码不一致,则提示用户重新输入密码
            if (!password.equals(confirmPassword)) {
                System.out.println("两次输入的密码不一致,请重新输入!");
            } else {
                // 如果两次输入的密码一致,则将密码设置到账户中并跳出循环
                account.setPassword(password);
                break;
            }
        }
        /**
         * 以上代码段用于循环提示用户输入取款额度,并验证输入的合法性。
         * 当用户输入的取款额度大于零时,将该值设置到账户对象中;
         * 否则,循环继续,直到用户输入合法的取款额度为止。
         * 其主要功能是确保用户输入的取款额度合法,并将合法的额度设置到账户对象中
         */
        while (true) {
            //设置用户的取款额度
            System.out.print("请输入取款额度:");
            double limitMoney = scanner.nextDouble();
            if (limitMoney > 0) {
                account.setLimit(limitMoney);
                break;
            } else {
                System.out.println("取款额度不能为负数,请重新输入!");
            }
        }
        //生成用户的账号,并设置到账户对象中
        /**
         * 卡号必须是八位,且不能和其他人的卡号相同
         */
        String newCarID = createCardId();
        account.setCarId(newCarID);
        //并设置到账户对象中
        accounts.add(account);
        System.out.println("恭喜您:" + account.getUserName() + "开户成功" + ",您的卡号是:" + newCarID);
    }


    //生成一个不重复的卡号
    private String createCardId() {
        while (true) {
            String carId = "";
            for (int i = 0; i < 8; i++) {
                int num = (int) (Math.random() * 10);
                carId += num;
            }
            //判断卡号是否重复
            Account accountByCarId = getAccountByCarId(carId);
            if (accountByCarId == null) {
                return carId;
            }
        }
    }

    //根据卡号查询账户对象返回,查询生成的卡号是否存在
    private Account getAccountByCarId(String carId) {
        //遍历循环账户列表,查找卡号是否存在
        for (int i = 0; i < accounts.size(); i++) {
            //每遍历一个账户,就用一个Account对象来封装,然后判断卡号是否相同
            Account acc = accounts.get(i);
            if (acc.getCarId().equals(carId)) {
                return acc;
            }
        }
        return null;
    }

 

4.登录功能

登录方法,用来验证用户输入的卡号和密码是否正确

//登录方法,用来验证用户输入的卡号和密码是否正确
    private void login() {
        System.out.println("=========ATM系统登录===============");
        if (accounts.size() == 0) {
            System.out.println("当前没有用户,请先开户!");
            return;
        }

        while (true) {
            System.out.print("请输入您的卡号:");
            String carId = scanner.next();
            //判断这个卡号是否存在
            Account accountByCarId = getAccountByCarId(carId);
            if (accountByCarId == null) {
                System.out.println("卡号不存在,请重新输入!");
            } else {
                while (true) {
                    //如果卡号存在,则提示用户输入密码
                    System.out.print("请输入您的密码:");
                    String password = scanner.next();
                    if (accountByCarId.getPassword().equals(password)) {
                        //如果密码正确,则提示用户登录成功,并进入用户界面
                        System.out.println("恭喜您," + accountByCarId.getUserName() + "登录成功!" + "您的卡号是:" + accountByCarId.getCarId());
                    } else {
                        System.out.println("密码错误,请重新输入!");
                    }
                }
            }
        }

5.创建用户操作的页面

 //设计登录后的界面
    private void showUserCommand() {
        while (true) {
            System.out.println("==================请选择如下功能进行对账户的处理================");
            System.out.println("1.查询账户");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.转账");
            System.out.println("5.修改密码");
            System.out.println("6.退出");
            System.out.println("6.注销当前账户");
            int command = scanner.nextInt();
            System.out.print("请选择:");
            switch (command) {
                case 1:
                    //查询账户
                    showAccountInfo();
                    break;
                case 2:
                    //存款
                    deposit();
                    break;
                case 3:
                    //取款
                    withdraw();
                    break;
                case 4:
                    //转账
                    transfer();
                    break;
                case 5:
                    //修改密码
                    modifyPassword();
                    break;
                case 6:
                    //退出
                    System.out.println("退出登录成功!");
                    loginAccount = null;
                    return;
                case 7:
                    //注销当前账户
                    break;
                default:
                    System.out.println("输入错误,请重新输入!");
            }
        }
    }

6.用户存钱操作

  //进行存钱操作
    private void deposit() {
        System.out.println("============存钱操作============");
        System.out.print("请你输入存款金额:");
        double money = scanner.nextDouble();
        if (money > 0) {
            //这里特别要注意,不要直接把money加到loginAccount的money上,而是应该加上原来的钱
            loginAccount.setMoney(loginAccount.getMoney() + money);
            System.out.println("存款成功!");
        } else {
            System.out.println("存款金额不能为负数,请重新输入!");
        }
    }

7.取钱操作

如果用户的前不足100元,则不能取款。

 //取钱操作
    private void withdraw() {
        System.out.println("==============现在进行的是取钱操作=========");
        //只能取100元
        if (loginAccount.getMoney() < 100) {
            System.out.println("对不起,您的余额不足一百元,不能进行取款操作!");
            return;
        }
        //用户输入取款金额
        while (true) {
            System.out.print("请输入取款金额:");
            double money = scanner.nextDouble();
            if (money <= loginAccount.getMoney()) {
                if (money <= loginAccount.getLimit()) {
                    //这里特别要注意,不要直接把money减到loginAccount的money上,而是应该减去原来的钱
                    loginAccount.setMoney(loginAccount.getMoney() - money);
                    System.out.println("取款成功!您取款了" + money + "元,余额为" + loginAccount.getMoney() + "元!");
                    break;
                } else {
                    System.out.println("您的取款额度已超出限制,请重新输入!");
                }

            } else {
                System.out.println("取款金额有误,余额不足或超出取款限额,您的余额是" + loginAccount.getMoney() + "请重新输入!");
            }
        }
    }

8.转账操作

转账:
     * 要判断系统中是否存在其他用户,然后判断自己的账户是否有钱,然后提示用户输入对方的卡号,
     * 然后输入对方的姓氏进行验证,然后输入转账金额,
     * 然后判断金额是否超过余额,然后减去原来的钱,然后加上新的钱,然后提示转账成功。
     * 这里需要注意的是,转账时,需要判断对方账户的姓氏是否正确,如果正确,才可以进行转账操作。

 /**
     * 转账:
     * 要判断系统中是否存在其他用户,然后判断自己的账户是否有钱,然后提示用户输入对方的卡号,
     * 然后输入对方的姓氏进行验证,然后输入转账金额,
     * 然后判断金额是否超过余额,然后减去原来的钱,然后加上新的钱,然后提示转账成功。
     * 这里需要注意的是,转账时,需要判断对方账户的姓氏是否正确,如果正确,才可以进行转账操作。
     */
    private void transfer() {
        System.out.println("==========用户转账============");
        //判断系统中是否存在其他用户
        if (accounts.size() < 2) {
            System.out.println("当前系统中只有一个用户,不能进行转账操作!");
            return;
        }
        //判断自己的账户是否有钱
        if (loginAccount.getMoney() == 0) {
            System.out.println("对不起,您的账户余额不足,不能进行转账");
            return;
        }
        while (true) {
            //开始转账
            System.out.print("请您输入对方的账号:");
            String CarId = scanner.next();
            //判断这个卡号是否正确
            Account accountByCarId = getAccountByCarId(CarId);


            if (accountByCarId == null) {
                System.out.println("对方账号不存在,请重新输入!");
                return;
            } else {
                //判断这个卡号是否是自己
                if (accountByCarId.getCarId().equals(loginAccount.getCarId())) {
                    System.out.println("不能给自己转账!");
                    break;
                }
                //代表不是自己的账户,是对方的账户,开始进行转账操作
                //接下来,我们需要认证对方账户的姓式。
                String userName = "*" + accountByCarId.getUserName().substring(1);
                System.out.println("请输入【" + userName + "】的姓氏进行验证:");
                String verifyName = scanner.next();
                //判断这个姓氏是否正确
                if (accountByCarId.getUserName().startsWith(verifyName)) {
                    //如果姓氏正确,则开始进行转账操作
                    System.out.print("请输入转账金额:");
                    double money = scanner.nextDouble();
                    //判断这个金额是否超过自己的余额
                    while (true) {
                        if (money > loginAccount.getMoney()) {
                            System.out.println("您的余额不足,请重新输入!最多可以转账" + loginAccount.getMoney() + "元");
                            break;
                        } else {
                            //如果金额没有超过余额,则开始进行转账
                            //这里特别要注意,不要直接把money加到loginAccount的money上,而是应该减去原来的钱
                            //这里更新自己的账户余额
                            //首先把money减到自己的账户上
                            loginAccount.setMoney(loginAccount.getMoney() - money);
                            //然后把money加到对方账户的money上
                            accountByCarId.setMoney(accountByCarId.getMoney() + money);
                            System.out.println("转账成功!您转账了" + money + "元,您的账户余额为" + loginAccount.getMoney() + "元!");
                            return;
                        }
                    }
                } else {
                    System.out.println("对不起,您输入的姓氏有误,请重新输入!");
                }
            }
        }
    }

 9.注销账户

        销户方法,用来删除当前登录的账户
     * 想要询问用户是否要删除当前账户,如果用户输入'y',则删除当前账户,否则,不删除。
     * 这里需要注意的是,删除账户时,需要判断当前账户是否有余额,如果有余额,则不能删除。
     * 如果没钱就可以删除,如果有余额,则提示用户不能删除。

  /**
     * 销户方法,用来删除当前登录的账户
     * 想要询问用户是否要删除当前账户,如果用户输入'y',则删除当前账户,否则,不删除。
     * 这里需要注意的是,删除账户时,需要判断当前账户是否有余额,如果有余额,则不能删除。
     * 如果没钱就可以删除,如果有余额,则提示用户不能删除。
     */
    private boolean deleteAccount() {
        System.out.println("==========ATM系统注销账户==========");
        //判断用户是否确定注销账户
        System.out.print("是否确定注销账户?(y/n):");
        String confirm = scanner.next();
        if (confirm.equals("y")) {
            //判断当前账户是否有余额
            if (loginAccount.getMoney() > 0) {
                System.out.println("您的账户有余额,不能注销!");
                return false;
            } else {
                //如果没有余额,则删除当前账户
                accounts.remove(loginAccount);
                System.out.println("注销账户成功!");
                return true;
            }
        } else {
            System.out.println("您取消了注销账户!");
            return false;
        }
    }

 10.修改密码

修改密码方法,用来修改当前登录的账户的密码。
     * 需要认证用户的身份,然后提示用户输入新的密码,然后再次确认密码,然后将新的密码设置到账户对象中

  /**
     * 修改密码方法,用来修改当前登录的账户的密码。
     * 需要认证用户的身份,然后提示用户输入新的密码,然后再次确认密码,然后将新的密码设置到账户对象中。
     */
    private void modifyPassword() {
        System.out.println("==========修改密码========");
        //用户认证当前密码
        while (true) {
            System.out.println("您好:" + loginAccount.getUserName() + ",请输入您的密码:");
            String password = scanner.next();
            if (!loginAccount.getPassword().equals(password)) {
                System.out.println("密码错误,请重新输入!");
                return;
            } else {
                while (true) {
                    //如果密码正确,则提示用户输入新的密码
                    System.out.println("请输入新的密码:");
                    String newPassword = scanner.next();
                    System.out.println("请确认新的密码:");
                    String confirmPassword = scanner.next();
                    //如果两次输入的密码不一致,则提示用户重新输入密码
                    if (!newPassword.equals(confirmPassword)) {
                        System.out.println("两次输入的密码不一致,请重新输入!");
                    } else {
                        //如果两次输入的密码一致,则将密码设置到账户中并提示修改成功
                        loginAccount.setPassword(newPassword);
                        System.out.println("密码修改成功~~~~~~~~");
                        return;
                    }
                }
            }
        }
    }

11.显示用户的信息

这个功能相对简单。

   //展示当前登录的账户信息
    private void showAccountInfo() {
        System.out.println("卡号:" + loginAccount.getCarId());
        System.out.println("户主:" + loginAccount.getUserName());
        System.out.println("性别:" + loginAccount.getSex());
        System.out.println("余额:" + loginAccount.getMoney());
        System.out.println("取款限额:" + loginAccount.getLimit());
    }

12.结束语

亲爱的读者们,

        感谢你们如星光般璀璨,陪我走过这一段充满思考与探索的旅程。每一篇博客的字里行间,都蕴藏着你们无声的陪伴和默默的支持,它们是我继续前行的动力,也是我不断追求卓越的光芒。

        在此,我向你们表达最真挚的感谢。是你们的关注、鼓励和建议,让我的博客之旅更加丰富多彩。愿我们的友谊如同这博客中的文字,永远流淌着温暖与真诚,长存于彼此的心间。

        同时,我也深知自己的能力和知识有限。因此,如果你们在阅读或浏览代码的过程中发现了任何错误或不足之处,我恳请你们能在评论区留下宝贵的意见。你们的每一个建议,我都会珍视如宝,并在第一时间进行修正和完善。

        再次感谢你们的陪伴与支持,愿我们的博客之旅能够继续携手前行,共同分享更多的知识与美好。

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

与风过山岗

您的鼓励是我莫大的荣幸

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

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

打赏作者

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

抵扣说明:

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

余额充值