项目实战:ATM转账

ATM

题目描述

在这里插入图片描述

在这里插入图片描述

代码

在这里插入图片描述

ATM

package Test;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @Author: ggdpzhk
 * @CreateTime: 2024-08-07
 */
public class ATM {
    ArrayList<Account> accounts = new ArrayList<>();
    Scanner sc = new Scanner(System.in);
    private Account loginAccount;//记住登录后的账户


    /*欢迎界面*/
    public void start() {

        while (true) {
            System.out.println("==欢迎进入森林银行ATM系统==");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("3.退出ATM");
            System.out.println("请选择您要操作的命令:");

            Scanner scanner = new Scanner(System.in);
            int command = scanner.nextInt();
            switch (command) {
                case 1:
                    login();
                    break;
                case 2:
                    createAccount();
                    break;
                case 3:
                    return;
                default:
                    System.out.println("您输入的命令有误,请检查后再输入~~");
                    break;
            }
        }
    }

    /* 登录*/
    public void login() {
        System.out.println("==系统登陆==");
        if (accounts.isEmpty()) {
            System.out.println("系统当前账户为空,先去开户吧~~~");
            start();
        } else {
            System.out.println("请输入您的卡号:");
            String newCardId = sc.next();

            Account account = getAccountByCardId(newCardId);
            if (account == null) {
                System.out.println("该卡号不存在");
            } else {
                while (true) {
                    System.out.println("请输入账号密码:");
                    String password = sc.next();
                    if (account.getPassword().equals(password)) {
                        loginAccount = account;
                        System.out.println("登陆成功!已经进入" + account.getName() + "的账户,您的卡号是:" + account.getCardId());
                        //展示登录后的界面
                        showUserCommand();
                        return;
                    } else {
                        System.out.println("您输入的密码有误,请检查后再输入");
                    }
                }
            }
        }

    }

    private Account getAccountByCardId(String cardId) {
       /* for(int i = 0; i<accounts.size(); i++){
            Account account = accounts.get(i);
            if(account.getCardId().equals(cardId)){
                return account;
            }
        }*/
        for (Account account : accounts) {
            if (account.getCardId().equals(cardId)) {
                return account;
            }
        }
        return null;
    }

    /*展示登录后的界面*/
    private void showUserCommand() {
        while (true) {
            System.out.println(loginAccount.getName() + "您可以进行以下操作:");
            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("7.注销当前账户");
            System.out.println("请选择您要操作的命令:");


            int command = sc.nextInt();
            switch (command) {
                case 1:
                    showLoginAccount();
                    break;
                case 2:
                    addMoney();
                    break;
                case 3:
                    drawMoney();
                    break;
                case 4:
                    tranceferMoney();
                    break;
                case 5:
                    String oddPassword = loginAccount.getPassword();
                    changePassword();
                    if (loginAccount.getPassword().equals(oddPassword)) {
                        break;
                    }//要是修改了密码,就退出用户,回到欢迎页面重新登录;
                    //要是没修改,就是break
                case 6:
                    //退出页面 指的是要回到欢迎界面,如果你只是单纯的跳转到start(),会出现嵌套问题,所以应该结束对应的方法以返回start()界面。而不能跳转。
                    System.out.println(loginAccount.getName() + "您已退出登录");
                    return;
                case 7:
                    int oddsize = accounts.size();
                    removeAccoumt();
                    if (oddsize > accounts.size()) {
                       return;
                    }
                    break;
                default:
                    System.out.println("您输入的命令不正确,请检查后再输入~~~");
            }
        }
    }

    private void removeAccoumt() {
        System.out.println("您确定要注销账户吗?您的一切信息都将无法找回 y/n");
        switch (sc.next()) {
            case "y":
                if (loginAccount.getMoney() == 0) {
                    accounts.remove(loginAccount);
                    System.out.println("您的账户已注销!");
                } else {
                    System.out.println("您的账户还有余额,请先取出后再注销账户");
                    System.out.println("余额:" + loginAccount.getMoney());
                }
            case "n":
            default:
        }
    }

    private void tranceferMoney() {
        if (accounts.size() == 1) {
            System.out.println("系统中只有一个账户,无法进行转账");
            return;
        }
        if (loginAccount.getMoney() == 0) {
            System.out.println("您的账户中余额为0,无法进行转账");
        }

        while (true) {
            System.out.println("请输入对方卡号:");
            String cardId = sc.next();
            Account account = getAccountByCardId(cardId);//接收账户
            if (account == null) {
                System.out.println("卡号有误,请重新输入:");
            } else {
                String name = "*" + account.getName().substring(1);
                System.out.println("请输入" + name + "的姓氏");
                String perName = sc.next();
                if (account.getName().startsWith(perName)) {
                    System.out.println("请输入转账金额:");
                    double money = sc.nextDouble();
                    if (money <= loginAccount.getMoney() && money <= loginAccount.getLimit()) {
                        loginAccount.setMoney(loginAccount.getMoney() - money);
                        account.setMoney(account.getMoney() + money);
                        System.out.println("转账成功, 您的余额为" + loginAccount.getMoney());
                        break;
                    } else {
                        System.out.println("余额不足或者超过取款限额");
                        System.out.println("您的余额是" + loginAccount.getMoney());
                        System.out.println("取款限额是" + loginAccount.getLimit());
                        return;
                    }
                } else {
                    System.out.println("姓氏有误");
                }
            }
        }
    }


    private void showLoginAccount() {
        System.out.println(loginAccount.toString());
    }

    private void addMoney() {
        System.out.println("==存款==");
        System.out.println("您要存入多少钱:");
        double addmoney = sc.nextDouble();
        loginAccount.setMoney(loginAccount.getMoney() + addmoney);
        System.out.println("存钱成功!您的余额是" + loginAccount.getMoney());
    }

    private void drawMoney() {
        System.out.println("==取款==");
        System.out.println("您要取出多少钱:");
        double drawmoney = sc.nextDouble();

        if (drawmoney <= loginAccount.getMoney() && drawmoney <= loginAccount.getLimit()) {
            loginAccount.setMoney(loginAccount.getMoney() - drawmoney);
            System.out.println("取款成功!!!当前余额:" + loginAccount.getMoney());
        } else {
            System.out.println("余额不足或者超过取款限额");
            System.out.println("您的余额是" + loginAccount.getMoney());
            System.out.println("取款限额是" + loginAccount.getLimit());
        }
    }

    private void changePassword() {
        System.out.println("==修改密码==");
        System.out.println("您确定要修改密码吗?y/n");
        switch (sc.next()) {
            case "y":
                OUT:
                while (true) {
                    System.out.println("请输入旧密码:");
                    String oddPassword = sc.next();
                    if (loginAccount.getPassword().equals(oddPassword)) {
                        while (true) {
                            System.out.println("请输入新密码:");
                            String newPassword = sc.next();
                            if (!loginAccount.getPassword().equals(newPassword)) {
                                System.out.println("再次输入新密码:");
                                if (sc.next().equals(newPassword)) {
                                    loginAccount.setPassword(newPassword);
                                    System.out.println("修改成功!须使用新密码重新登录");
                                    break OUT;
                                } else {
                                    System.out.println("两次输入密码不一致");
                                }
                            } else {
                                System.out.println("新密码不能与旧密码一致!!");
                            }
                        }
                    } else {
                        System.out.println("旧密码有误!!");
                    }
                }
            case "n":
            default:
                break;
        }
    }


    /*开户*/
    private void createAccount() {
        Account account = new Account();
        System.out.println("请输入您的姓名:");
        String name = sc.next();
        account.setName(name);
        System.out.println("请输入您的性别:男/女");

        while (true) {
            String sex = sc.next();
            if (sex.equals("男") || sex.equals("女")) {
                // System.out.println(account.getSex());
                account.setSex(sex);
                break;
            } else {
                System.out.println("您输入的性别格式有误,请重新输入:");
            }
        }

        while (true) {
            String password = null;
            System.out.println("请输入您的密码:");
            password = sc.next();
              /*  if(password == null){
                    System.out.println("密码不能为空");
                }else{
                    break;
                }*/
            System.out.println("再次输入密码:");
            String OKPassword = sc.next();

            if (password.equals(OKPassword)) {
                account.setPassword(password);
                break;
            } else {
                System.out.println("两次密码不一致,请重新设置密码");
            }
        }

        System.out.println("请输入每次提现额度:");
        double limit = sc.nextDouble();
        account.setLimit(limit);
        String cardId = randomCardId();
        account.setCardId(cardId);
        System.out.println("开户成功,您的卡号是:" + account.getCardId());
        accounts.add(account);
        System.out.println("恭喜您" + account.getName() + ",开户成功");
    }


    /* 检测是否与已存在的卡号重复
     */
    private boolean isCardExisting(String cardId) {
        for (int i = 0; i < accounts.size(); i++) {
            if (accounts.get(i).getCardId().equals(cardId)) {
                return true;
            }
        }
        return false;
    }


    /*生成8位数字组成的卡号(且卡号不能重复)
     *生成验证码的思路
     * */
    private String randomCardId() {
        //生成
        String cardId = "";
        String str = "0123456789";
        do {
            for (int i = 0; i < 8; i++) {
                int index = (int) (Math.random() * str.length());
                cardId += str.charAt(index);
            }
            //检测是否与已存在的卡号重复
            if (loginAccount != null && (loginAccount.getCardId().equals(cardId) || isCardExisting(cardId))) {
                continue;
            }
            break;
        } while (true);
        return cardId;
    }
}

Account

package Test;

/**
 * @Author: ggdpzhk
 * @CreateTime: 2024-08-07
 */
public class Account {
    private String cardId;
    private String name;
    private String sex;
    private String password;
    private double money;
    private double limit;//限额

    public Account(String cardId, String name, String sex, String password, double money, double limit) {
        this.cardId = cardId;
        this.name = name;
        this.sex = sex;
        this.password = password;
        this.money = money;
        this.limit = limit;
    }

    public Account() {
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getName() {
        if(sex.equals("男")){
            return name+"先生";
        }else {
            return name+"女士";
        }
        //return name + sex.equals("男") ? "先生" : "女士";
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String 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;
    }

    @Override
    public String toString() {
        return "欢迎"+getName()+
                ",卡号:" + cardId +
                ", 密码:'" + password + '\'' +
                ", 余额:" + money;
    }
}

Test

package Test;

/**
 * @Author: ggdpzhk
 * @CreateTime: 2024-08-07
 */
public class Test {
    public static void main(String[] args) {
        ATM atm = new ATM();
        atm.start();
    }
}

运行结果

在这里插入图片描述

问题

为什么使用String类型接收sc.cextLine()还没有键盘输入直接就结束了

在这里插入图片描述

循环条件

总是会用错循环条件或者分界条件
智能补全一定要看检查,补全挖坑!!!!

print大法

逻辑有问题或者跳转有问题都能用

跳出外层循环 OUT

在这里插入图片描述

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值