综合练习(模拟银行ATM)理解对集合、循环、判断、方法的使用

ATM系统

ATM系统准备分析

①每个用户的信息都是一个对象,需要提供一个账户类
②需要准备一个容器,用与存储系统全部账户对象信息
③首页需要包括:登录和注册两个功能

ATM功能

①登录
②注册
③取款
④存款
⑤转账
⑥修改密码
⑦查看信息

实现步骤

1、首页设计

①定义一个账户类,用于后期创建账户对象封装用户的账户信息
②账户类中信息至少包括(卡号、姓名、密码、余额、取款限额)
③需要准备一个集合用于存储系统用户的账户对象
④需要展示两个功能:注册功能和登录功能

1.1、账户类实现

定义账户类:
在这里插入图片描述
首页功能实现:

ArrayList<Account> Account = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("==============ATM系统=================");
            System.out.println("1.账户登录:");
            System.out.println("2.账户注册:");
            System.out.println("请输入你的操作:");
            int command = scanner.nextInt();
                switch (command){
                    case 1:
                        login(Account,scanner);
                        break;
                    case 2:
                        register(Account,scanner);
                        break;
                    default:
                        System.out.println("输入有误请重新输入。。。");}
            }

首页结果

2.注册功能

注册功能定义一个方法并且传入一个集合

2.1注册功能分析

①定义一个注册功能的方法,并且传入账户集合

 private static void register(ArrayList<Account> account, Scanner scanner) {
    }

②创建一个账户对象用于封装账户信息
③键盘录入用户的信息,以及密码设置(保证两次输入的密码一致)
④为用户随机生成一个卡号(保证卡号唯一)
⑤把对象添加到集合中

2.2注册功能实现

注册功能:

System.out.println("===================系统注册操作========================");
        //创建一个账户对象,用于存储哟用户信息
        Account acc = new Account();
        System.out.println("请输入你的用户名:");
        String userName = scanner.next();
        acc.setUserName(userName);

        //输入密码,使用while循环(确定两次输入的密码都是正确的如果不是继续输入)

        while (true) {
            System.out.println("请输入你的密码:");
            String oldPass = scanner.next();
            System.out.println("请再次输入你的密码:");
            String newPass = scanner.next();
            if (oldPass.equals(newPass)) {
                //密码认证通过,可以创建账户
                acc.setPassWord(newPass);
                break;
            } else {
                System.out.println("对不起两次输入的密码不一致,请重新输入:");
            }
        }

        //录入单日限额
            System.out.println("请输入你的账户限额:");
            double quotaMoney = scanner.nextDouble();
            acc.setQuotaMoney(quotaMoney);

            //获取随机生成的卡号
            String randomCarID = getRandomCarID(account);
            acc.setCardId(randomCarID);
            //将新创建的账户添加到集合中
            account.add(acc);
            System.out.println("恭喜您," + userName + "先生/女生,您开户成功,您的卡号是:" + randomCarID+ ",请您妥善保管卡号" );

随机生成唯一的卡号:

 public static String getRandomCarID(ArrayList<Account> account) {
        Random random = new Random();
        while (true) {
            String carId = "";
            //随机生成8位卡号
            for (int i = 0; i < 8; i++) {
                carId += random.nextInt(10);
            }
            //判断该卡号是否与其他卡号重复
            Account accountByCardId = getAccountByCardId(account, carId);
            if (accountByCardId == null) {
                return carId;
            }
        }
    }

判断用户唯一:

private static Account getAccountByCardId(ArrayList<Account> accounts, String carId) {
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if (acc.getCardId().equals(carId)){
                return acc;
            }
        }
        return null; //查无账户
    }

结果:
在这里插入图片描述

3、登录功能

定义一个登录功能并且传入一个账户集合

private static void login(ArrayList<Account> 
    }
3.1登录功能分析

①用户输入卡号,根据卡号取账户集合里面查找账户对象
②如果没有查询到账户对象,说明卡号不存在,继续提示输入卡号
③查找到卡号,提示用户输入账户密码
④使用输入的卡号和账户对象里面的密码进行比对,比对成功(登录成功),比对不成功(提示继续输入密码)

3.2登录功能实现

登录功能:

        System.out.println("===================用户登录操作========================");
        if (account.size() == 0){
            System.out.println("对不起,当前系统中,无任何账户,请先开户,再来登录~~");
            return;
        }
        while (true){
            System.out.println("请输入你的卡号:");
            String carId = scanner.next();
            //判断该卡号是否存在集合,(根据卡号去搜索账户)
            Account accountByCardId = getAccountByCardId(account, carId);
            if (accountByCardId != null){
                //卡号存在进行密码判断
                while (true){
                    System.out.println("请输入你的密码");
                    String passWord = scanner.next();
                    if (accountByCardId.getPassWord().equals(passWord)){
                        System.out.println("恭喜您," + accountByCardId.getUserName() +"先生/女生进入系统,您的卡号是:" + accountByCardId.getCardId());
                        //进入操作页面
                        showUserCommand(scanner,accountByCardId,account);
                        return;
                    }else {
                        System.out.println("你输入的密码有误请重新输入:");
                    }
                }
            }else {
                System.out.println("你输入的卡号不存在,请重新输入");
            }
        }

结果:
登录操作

4、操作页面

定义一个操作页面的方法,并且传入一个账户集合和一个账户对象

 private static void showUserCommand(Scanner scanner, Account accountByCardId, ArrayList<Account> account) {
 }
4.1操作页面功能分析

①用户登录成功后,直接进入操作页面输入相对应的操作进入相对应的功能

4.2操作页面实现

操作页面:

        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("7.注销账户:");
            System.out.println("请选择:");
            int commad = scanner.nextInt();
            switch (commad){
                case 1:
                    showAccount(accountByCardId);
                    //查询账户
                    break;
                case 2:
                    //存款
                    depositMoney(accountByCardId,scanner);
                    break;
                case 3:
                    //取款
                    drawMoney(accountByCardId,scanner);
                    break;
                case 4:
                    transferMoney(accountByCardId,scanner,account);
                    break;
                case 5:
                    //修改密码
                    updatePassWord(accountByCardId,scanner);
                    return;
                case 6:
                    System.out.println("退出成功,欢迎下次光临");
                    return;
                case 7:
                   if ( deleteAccount(scanner,account,accountByCardId)){
                       //销户成功
                       return;
                   }else {
                       //未进行销户
                    System.out.println("欢迎继续使用");

                       break;
                   }

                default:
                    System.out.println("输入有误请重新输入~~~~~");
            }
        }

结果:
操作页面

5、查询用户信息

定义一个查看方法,并且传入账户对象

private static void showAccount(Account accountByCardId) {
}
5.1查询功能分析

拿到账户对象直接对用户信息进行输出即可

System.out.println("===================当前账户信息如下========================");
        System.out.println("卡号:"+accountByCardId.getCardId());
        System.out.println("户主:"+accountByCardId.getUserName());
        System.out.println("余额"+accountByCardId.getMoney());
        System.out.println("限额"+accountByCardId.getQuotaMoney());

结果:
在这里插入图片描述

6.存款功能

定义一个存款方法,并且传入一个账户对象

private static void depositMoney(Account accountByCardId, Scanner scanner) {
}
6.1存款功能分析

①存款首先需要拿到当前的账户对象
②用户输入存款金额
③修改用户余额
④展示用户信息,确认是否以及存储成功

6.2存款功能实现

存款操作:

System.out.println("===================用户存钱操作========================");
        System.out.println("请输入你要存储的金额");
        double money = scanner.nextDouble();

        //更新余额
        accountByCardId.setMoney(accountByCardId.getMoney()+money);
        System.out.println("存款成功");
        //查看信息
        showAccount(accountByCardId);

结果:
用户存款结果

7、取款

定义一个存款方法,并且传入一个账户对象

private static void drawMoney(Account accountByCardId, Scanner scanner) {
}
7.1取款功能分析

①判断用户的余额是否还有钱
②有钱则拿到该账户对象
③用户输入取款金额,并且判断取款金额是否大于余额
④判断用户取款金额是否超过每日限额
⑤将用户的金额进行修改然后展示

7.2取款功能实现

取款功能:

System.out.println("===================用户取钱操作========================");
        //判断取款金额是否大于限额
        while (true){
            System.out.println("请输入你要取款的金额");
            double money = scanner.nextDouble();
            if (money > accountByCardId.getQuotaMoney()){
                System.out.println("取款金额超过每日限额~~~");
            }else if (money > accountByCardId.getMoney()){
                System.out.println("账户里面没有这么多存款请确认后在操作~~");
                return;
            }else {
                //取钱操作
                System.out.println("恭喜您,取钱" + money +"元,成功!");
                //更新账户
                accountByCardId.setMoney(accountByCardId.getMoney()-money);
                //显示账户信息
                showAccount(accountByCardId);
                return;
            }
        }

结果:
取款操作

8、转账操作

定义一个存款方法,并且传入账户对象和集合

private static void transferMoney(Account accountByCardId, Scanner scanner, ArrayList<Account> account) {
}
8.1转账功能分析

①转账功能需要两个以上的账户对象
②判断自己的账户里面是否有钱
③输入对方的卡号,看是否存在
④判断对方的姓氏
⑤当卡号,姓氏都验证成功后可以开始进行转账

8.2转账功能实现
System.out.println("===================用户转账操作========================");
        //判断集合里面是否存在2个以上的账户
        if (account.size()<2){
            System.out.println("当前系统中,不足2个账户,不能进行转账,请去开户吧~~");
            return;
        }
        //判断用户的余额是否>0
        if (accountByCardId.getMoney()<=0){
            System.out.println("余额为0元,请先进行存款后在进行转账操作");
            return;
        }

        //开始转账
        while (true){
            System.out.println("请输入对方的卡号:");
            String carId = scanner.next();
            //判断卡号是否是自己的
            if (carId.equals(accountByCardId.getCardId())){
                System.out.println("对不起,您不可以给自己进行转账~~");
                continue;
            }

            //查询卡号用户及判断该卡号是否存在
            Account accountByCardId1 = getAccountByCardId(account, carId);
            if (accountByCardId1 == null){
                System.out.println("该用户不存在,请确认卡号");
            }else {
                //用户存在 判断姓氏
                String userName = accountByCardId1.getUserName(); //获取用户的姓氏 张三丰
                //加密用户的姓氏
                String tip = userName.replace(userName.substring(0,1),"*");
                System.out.println("请您输入["+ tip +"]的姓氏"); //*三丰
                String preName = scanner.next();

                if (userName.startsWith(preName)){
                    //认证通过
                    while (true){
                        System.out.println("请输入你要转账的金额:");
                        double money = scanner.nextDouble();
                        //判断用户余额是否够
                        if (money>accountByCardId.getMoney()){
                            System.out.println("对不起,您余额不足,您最多可以转账:" + accountByCardId.getMoney());
                        }else {
                            //余额足够 开始转账
                            accountByCardId1.setMoney(accountByCardId1.getMoney()+money); // 被转账用户
                            accountByCardId.setMoney(accountByCardId.getMoney()-money); //转账用户
                            System.out.println();
                            //转账后信息显示
                            showAccount(accountByCardId);
                            return;
                        }
                    }
                }
            }
        }

结果:
在这里插入图片描述

9、密码修改

密码修改就是将当前对象的密码属性使用set方法进行更新,定义一个密码修改的方法,并且传入账户对象。

private static void updatePassWord(Account accountByCardId, Scanner scanner) {
}
9.1密码修改分析

①修改密码就是将用户的密码属性进行更新
②判断用户输入的两次密码是否一致,一致将密码进行修改,返回登录页面

9.2密码修改功能实现

密码修改:

System.out.println("===================用户密码修改========================");
        while (true){
            System.out.println("请输入当前密码:");
            String oldPass = scanner.next();
            //判断输入的密码是否正确
            if (accountByCardId.getPassWord().equals(oldPass)){
                //密码正确可以修改
                while (true){
                    System.out.println("请输入你的新密码:");
                    String newPass = scanner.next();
                    System.out.println("请再次输入你的新密码:");
                    String newPassW = scanner.next();
                    if (newPass.equals(newPassW)){
                        accountByCardId.setPassWord(newPassW);
                        System.out.println("密码修改成功。");
                        return;
                    }else if (newPassW.equals(oldPass)){
                        System.out.println("新密码和老密码重复请重新输入");
                    }else {
                        System.out.println("您输入的2次密码不一致~~");

                    }
                }
            }else {
                System.out.println("你输入的密码错误");
            }
        }

结果:
密码修改

10、注销账户

直接将对象删除并且返回首页

10.1注销功能分析

进行销户操作需要先进行对用户余额的判断如果里面还有余额就不能注销。

10.2注销功能实现

注销:

System.out.println("===================用户销户========================");
        System.out.println("您真的要销户?y/n:");
        String del = scanner.next();
        switch (del){
            case "y":
                //注销用户
                //判断用户账户是否还有钱
                if (accountByCardId.getMoney() > 0){
                    System.out.println("你的账户里面还有钱,请先进行取款或转账后在销户。");
                }else {
                    account.remove(accountByCardId);
                    System.out.println("您的账户销户完成~~");
                    return true;

                }
                break;
            default:
                System.out.println("当前账户继续保留~");
        }
        return false;
总结

模拟银行ATM机功能,主要是对Java基础中的集合,判断以及循环等综合的运用,熟悉使用程序来完成自己的想法获得一定的编程经验,提高自己解决问题的能力,让基础知识形成体系结构,为后续Java高级技术的学习做有力的支撑。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值