JAVA基础的ATM机存款项目

定义一些ATM机中会运用到的基本元素

package NEW;

public class Account {
     private String userName;//用户名
     private String passWord;//账户密码
     private String ueserId;//卡号
     private char sex;//用户性别
     private double limit;//限额
     private double money;//余额

    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
    public char getSex() {
        return this.sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getUserName() {
        return userName+(sex == '男' ? "先生" : "女士");
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getUeserId() {
        return ueserId;
    }

    public void setUeserId(String ueserId) {
        this.ueserId = ueserId;
    }


    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}

支撑ATM机实现各种功能的方法

package NEW;

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

public class ATM {
    ArrayList<Account> accounts =  new ArrayList<>();
    Scanner sc = new Scanner(System.in);
    private Account loginac;//记录登录后的用户账户
    public void start() {
        while (true) {
            System.out.println("==========欢迎进入ATM系统==========");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("请选择");
            int command = sc.nextInt();//单值,考虑运用switch循环
            switch (command) {
                case 1:
                    //用户登录
                    login();
                    break;
                case 2:
                    //用户开户
                    createAccount();
                    break;
                default:
                    System.out.println("无该操作");//用while循环去重置该界面
                    break;

            }
        }
    }
    /*账户登录操作*/
    private void login(){
        System.out.println("====系统登录====");
        //判断系统之中是否有对象
        if(accounts.size()==0){
            System.out.println("当前系统中无任何账户,请先注册");
           return;
        }
        //存在对象,开始登录进程
        while(true){
            System.out.println("请输入您的登录卡号");
            String cardId = sc.next();
            Account acc = getAccountByCardId(cardId);
            if(acc==null){
                //该卡号不存在
                System.out.println("您的卡号输入错误,请确认");
            }else{
                while (true) {
                    //卡号存在,让用户输入密码
                    System.out.println("请输入您的账号密码");
                    String password = sc.next();
                    //判断密码是否正确
                    if(acc.getPassWord().equals(password)){
                        loginac = acc;
                        //密码正确,登录成功
                        System.out.println("恭喜您"+acc.getUserName()+"登录成功"+"您的卡号是"+acc.getUeserId());
                        //展示登录后的操作界面
                        showUserCommand();
                        return;
                    }else{
                        System.out.println("您的密码输入错误,请确认");
                    }
                }
            }
        }

    }
    /**展示登录后的操作界面*/
    private void showUserCommand(){
        while (true) {
            System.out.println(loginac.getUserName()+"您可以选择如下功能进行账户处理");
            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.注销当前账户");
            int command = sc.nextInt();
            switch (command) {
                    case 1:
                        //查账户
                        showLoginAccount();
                        break;
                    case 2:
                        //取款
                        drawMoney();
                        break;
                    case 3:
                         //转账
                        tranforMoney();
                        break;
                    case 4:
                        //存款
                        depositMoney();
                        break;
                    case 5:
                        // 密码修改
                        updatePassWord();
                        break;
                    case 6:
                        //退出
                        System.out.println(loginac.getUserName()+"您退出系统成功!");
                        return;
                    case 7:
                         //注销账户
                        if(delectAccount()){
                        //销户成功,返回欢迎界面
                        return;
                        }
                        break;
                    default:
                        System.out.println("您的输入错误,请确认");

            }
        }
    }
    /**更改账户密码*/
    private void updatePassWord() {
        System.out.println("=====密码修改操作=====");
        while (true) {
            //让用户认证当前密码
            System.out.println("请输入当前账号密码");
            String passWord = sc.next();
            if(passWord.equals(loginac.getPassWord())){
                System.out.println("认证通过");
                System.out.println("请您输入新密码");
                String newPassWord = sc.next();
                System.out.println("请您在一次确认您的新密码");
                String confirmPassWord = sc.next();
                if(newPassWord.equals(confirmPassWord)){
                    loginac.setPassWord(newPassWord);
                    System.out.println("密码修改成功");
                    break;
                }else{
                    System.out.println("您的新密码两次输入不一致,修改失败,请确认");
                }
            }else{
                System.out.println("您的密码错误,请确认");
            }
            //询问用户是否继续修改密码
            System.out.println("您是否继续修改密码:Y/N");
            String c =  sc.next();
            if(!"Y".equalsIgnoreCase(c)){
                break;
            }
        }
    }

    /**销户*/
    //销户这个操作执行到最后实际上是返回一个销户成功或失败的结果,所以这个方法的返回值应设置为boolean
    private boolean delectAccount() {
        System.out.println("=====销户操作=====");
        System.out.println("请您确定要进行对这个账户的销户:Y/N");
        String command = sc.next();
        switch (command) {
            case "Y":
                //确认要销户
                //进一步确认该账户中是否有钱,有钱则无法销户
                if(loginac.getMoney()==0){
                    //符合销户标准,进行销户
                    accounts.remove(loginac);
                    System.out.println("您已成功销户");
                    return true;
                }else{
                    System.out.println("您的账户中存在余额,无法销户");
                    return false;
                }
            default:
                System.out.println("您的账户保留");
                return false;
        }

    }

    /**转账*/
    private void tranforMoney() {
        System.out.println("=====转账操作=====");
        //首先要判断转账的两个前提
        //1.系统里是否有两及个以上的账户,起码有两个才能相互转账
        //2.转账出去的那个账户是否有余额
        if(accounts.size()<2){
            System.out.println("当前系统中只有您一个账户,无法转账,请确认");
            return;
        }
        if(loginac.getMoney()==0){
            System.out.println("您的账户中没有余额,请确认");
            return;
        }
        while (true) {
            //正式开始转账
            System.out.println("请您输入对方的卡号:");
            String cardId = sc.next();
            //判断这个卡号是否正确
            Account acc = getAccountByCardId(cardId);
            if(acc==null){
                System.out.println("对方的卡号不存在");
            }else{
                //对方的账户存在,进行姓氏认证
                String name ="*"+acc.getUserName().substring(1);
                //substring是用来将*与用户名的第一个字发生替换的
                System.out.println("请您输入【"+name+"】:");
                String personName =  sc.next();
                //判断该姓氏是否正确
                if(acc.getUserName().startsWith(personName)){
                    while (true) {
                        //认证通过,开始转账
                        System.out.println("请输入您的转账金额:");
                        double money = sc.nextDouble();
                        //判断该金额是否超过了自己的余额,即是否转的起
                        if(loginac.getMoney()>=money){
                            //够的话就开始更新双方的账号余额信息了
                            //自己的
                            loginac.setMoney(acc.getMoney()-money);
                            //对方的
                            acc.setMoney(acc.getMoney()+money);
                            System.out.println("您的余额为:"+acc.getMoney());
                            return;//跳出转账方法
                        }else{
                            System.out.println("您的余额不足,请确认,您最多能转:"+loginac.getMoney());
                    }
                    }
                }else{
                    System.out.println("您的认证错误,请确认");
                }
            }
        }


    }

    private void drawMoney() {
        System.out.println("=====取钱操作=====");
        //判断当前余额是否大于100,小于100则无法取出
        if(loginac.getMoney()<100){
            System.out.println("您的存款金额不足100元,无法取出");
            return;
        }
        //大于100可以取钱,让用户输入取款金额
        while (true) {
            System.out.println("请输入您的取款金额:");
            double money = sc.nextDouble();
            //判断余额是否充足
            if(money<loginac.getMoney()){
                //当前余额充足
                //还要判断是否超过了单次的取款限额,即再嵌套一个if循环
                if(money>loginac.getLimit()){
                    System.out.println("您此次的取款超过了单次的限额,您的限额为:"+loginac.getLimit());
                }else{
                    //若都满足要求,则正式开始取钱,即更新账户内的余额
                    loginac.setMoney(loginac.getMoney()-money);
                    System.out.println("您取款:"+money+"\n"+"取款之后您的余额为"+loginac.getMoney());
                    break;
                }
            }else{
                //余额不足
                System.out.println("您的余额不足,您的余额为:"+loginac.getMoney());
            }
        }

    }

    /**存钱*/
    private void depositMoney() {
        System.out.println("======存钱操作======");
        System.out.println("请输入您的存款金额:");
        double money = sc.nextDouble();
        //之后更新账户的余额
        loginac.setMoney(money+loginac.getMoney());
        System.out.println("恭喜您,您此次存钱:"+money+"您存钱之后的总额为"+loginac.getMoney());
    }

    /**展现账户登录信息*/
    private void showLoginAccount(){
        System.out.println("您的账号信息如下");
        System.out.println("姓名"+loginac.getUserName());
        System.out.println("存款"+loginac.getMoney());
        System.out.println("卡号"+loginac.getUeserId());
        System.out.println("性别"+loginac.getSex());
        System.out.println("单次限额"+loginac.getLimit());
    }


    /**账户开户操作 */
    public void createAccount() {
        System.out.println("=====开户操作=====");
        Account acc = new Account();
        System.out.println("请输入您的姓名");
        String name = sc.next();
        acc.setUserName(name);

        while (true) {
            System.out.println("请输入你的性别");
            char sex = sc.next().charAt(0);//charAT的作用是获取输入的字符串的第一位因为没有提供nextchar方法
            if (sex == '男' || sex == '女') {
                acc.setSex(sex);
                break;
            } else {
                System.out.println("您的操作错误,请重新输入");
            }
        }

        while (true) {
            System.out.println("请输入您的账户密码:");
            String password = sc.next();
            System.out.println("请再次输入密码确认");
            String okpassword = sc.next();
            if (password.equals(okpassword)) {
                acc.setPassWord(okpassword);
                break;
            } else {
                System.out.println("您的两次密码输入不一致,请确认");
            }
        }
        System.out.println("请输入您的限额:");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

        //重难点:为这个账户生成一个卡号,且不能与其他以存在的账户卡号重复
        String newCard = creatCardId();
        acc.setUeserId(newCard);

        accounts.add(acc);
        System.out.println("恭喜您" + acc.getUserName() + "开户成功"+"您的卡号是"+acc.getUeserId());

    }
        /*返回一个8位数的卡号,并且不能与其他账户的卡号重复*/


        //1.首先定义一个String类型的变量去记住8个数字作为一个卡号
        private String creatCardId() {
            while (true) {
                String cardId = "";

                //2.使用循环随机生成8个数字作为新生成的卡号
                Random r = new Random();
                for (int i = 0; i < 8; i++) {
                    int date = r.nextInt(10);//0~9
                    cardId += date;

                }
                //3.对上一步中产生的卡号进行判断,是否与其他账户重复了
                Account acc = getAccountByCardId(cardId);
                if(acc == null){
                    return cardId;
                }
            }

        }
            //根据卡号查询账户对象返回
            private Account getAccountByCardId(String cardId) {
            //遍历全部账户对象的卡号
                for (int i = 0; i <accounts.size(); i++) {
                    Account acc = accounts.get(i);//逐个取出accounts集合里的账户集合,方便后续对比卡号
                 //判断这个账户对象acc中的卡号是否符合不重复的要求
                 if(acc.getUeserId().equals(cardId)){
                     return acc;
                 }
                }
                return null;//查无此号,即这个卡号再已有的账户卡号之中并不重复

            }
}

测试能否正常执行

package NEW;

public class Test {
    public static void main(String[] args) {
        ATM atm = new ATM();
        atm.start();


    }
}
posted @ 2025-10-19 18:05  冰涿  阅读(14)  评论(0)    收藏  举报