Java学习之路--2022/07/20

模拟ATM系统

项目大致实现功能:
1.系统准备、首页设计
2.用户开户功能
3.用户登录功能
4.用户操作页设计 、查询账号、退出账号功能
5.用户存款功能
6.用户取款功能
7.用户转账功能
8.用户修改密码、注销账号功能

//定义一个账户类
public class Account {
    private String cardId;//卡号
    private String userName;//用户名
    private String passWord;//密码
    private double money;//用户余额
    private double quotaMoney;//存取额度

    public String getCardId() {
        return cardId;
    }

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

    public String getUserName() {
        return userName;
    }

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

    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 getQuotaMoney() {
        return quotaMoney;
    }

    public void setQuotaMoney(double quotaMoney) {
        this.quotaMoney = quotaMoney;
    }
}
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATMSystem {
    public static void main(String[] args) {
        //定义一个集合,存储账户信息
        ArrayList<Account> accounts = new ArrayList<>();
        //展示登录界面
        Scanner sc = new Scanner(System.in);
        while (true) {     //按住CTRL + ALT + T键可快速实现while死循环
            System.out.println("===============ATM系统===============");
            System.out.println("1、账户登录");
            System.out.println("2、账户注册");
            System.out.println("请输入操作指令(1、2):");
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    //实现账户登录
                    login(accounts,sc);
                    break;
                case 2:
                    //实现账户注册,快捷生成方法:alt加回车
                    register(accounts,sc);

                    break;
                default:
                    System.out.println("您所输入的操作码不存在~~");
            }
        }
    }

    /**
     * 定义一个方法来进行登录
     * @param accounts 导入数据集合
     * @param sc 导入扫描器
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        if (accounts.size() == 0) {
            System.out.println("请您先注册账号~~" + "\n");
            return;//卫语言风格,结束方法的执行
        }
        while (true) {
            System.out.println("请您输入您的账号:");
            String carId = sc.next();
            Account acc = getAccountByCarId(carId,accounts);
            if (acc != null) {
                while (true) {
                    System.out.println("请您输入密码:");
                    String passWord = sc.next();
                    if (passWord.equals(acc.getPassWord())) {
                        System.out.println("恭喜您,登陆成功!");
                        //展示登陆后的界面
                        showUserCommand(sc,acc,accounts);
                        return;
                    }else {
                        System.out.println("对不起,您输入的密码有误,请重新输入。");
                        //修改成几次输入错误后会跳出忘记密码
                    }
                }
            }else {
                System.out.println("该账户不存在!");
                //可以提供两个选择,一是继续输入,二是去注册账户
            }
            
        }
    }

    /**
     * 定义方法用来展示登录界面
     * @param sc 扫描器
     * @param acc 用户信息
     */
    private static void showUserCommand(Scanner sc, Account acc,ArrayList<Account> accounts) {
        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("请输入您想进行的操作(1~7):");
            int command = sc.nextInt();
            switch (command) {
                case 1://查询账户
                    showAccount(acc);
                    break;
                case 2://存款
                    depositMoney(sc,acc);
                    break;
                case 3://取款
                    drawMoney(sc,acc);
                    break;
                case 4://转账
                    transferMoney(sc,acc,accounts);
                    break;
                case 5://修改密码
                    updatePassword(sc,acc);
                    break;
                case 6://退出
                    return;
                case 7://注销账户
                    if (deleteAccount(sc,acc,accounts)) {
                        return;
                    }else {
                        break;
                    }
                default:
                    break;
            }
        }
    }

    /**
     * 进行销户操作
     * @param sc 扫描器
     * @param acc 用户
     * @param accounts 用户集
     */
    private static boolean deleteAccount(Scanner sc, Account acc, ArrayList<Account> accounts) {
        System.out.println("===============账户注销操作==============");
        System.out.println("请问您是否需要销户?(Yes/No)");
        String YN = sc.next();
        if (YN.equals("Yes")) {
            //进行销户操作
            if (acc.getMoney() != 0) {
                System.out.println("您的账户还有余额,无法进行销户操作。");
            }else {
                accounts.remove(acc);
                System.out.println("已为您进行销户,欢迎您的下次使用。");
                return true;
            }
        }else {
            System.out.println("好的,将为您保留账户。");
        }
        return false;
    }

    /**
     * 定义方法实现修改密码操作
     * @param sc 扫描器
     * @param acc 用户
     */
    private static void updatePassword(Scanner sc, Account acc) {
        System.out.println("===============修改密码操作==============");
        //输入当前密码,验证是否正确
        while (true) {
            System.out.println("请输入当前密码:");
            String passWord = sc.next();
            if (passWord.equals(acc.getPassWord())) {
                //输入新密码并修改acc
                while (true) {
                    System.out.println("请输入新密码:");
                    String newPassWord1 = sc.next();
                    System.out.println("请确认新密码:");
                    String newPassWord2 = sc.next();
                    if (newPassWord1.equals(newPassWord2)) {
                        acc.setPassWord(newPassWord1);
                        System.out.println("您的密码修改成功!");
                        return;
                    }else {
                        System.out.println("您前后输入的密码不一致!");
                    }
                }
            }else {
                System.out.println("您输入的密码不正确!");
            }
        }
    }

    /**
     * 实现转账操作
     * @param sc 扫描器
     * @param acc 传递用户信息
     * @param accounts 所有用户集合用于比对
     */
    private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) {
        System.out.println("===============转账操作==============");
        //判断集合中是否有超过两个账户
        if (accounts.size() == 1) {
            System.out.println("当前系统中无其它账户存在");
            return;
        }
        //判断自己账户中是否有钱
        if (acc.getMoney() == 0) {
            System.out.println("对不起,您的账户余额为:0");
            return;
        }
        //输入对方账户并确认是否存在,且不能是自己的账号
        while (true) {
            System.out.println("请输入您要进行转账的账号:");
            String cardId = sc.next();
            if (cardId.equals(acc.getCardId())) {
                System.out.println("您输入的是自己的卡号");
                continue;
            }
            Account account = getAccountByCarId(cardId, accounts);
            if (account != null) {
                //输入对方姓氏并确认
                String userName = account.getUserName();
                String tip = "*" + userName.substring(1);
                while (true) {
                    System.out.println("请您输入[" + tip + "先生/女士" + "]的用户名");
                    String reName = sc.next();
                    if (reName.equals(account.getUserName())) {
                        //输入转账金额并判断是否超出存取额度以及余额
                        System.out.println("请您输入转账金额:");
                        double money = sc.nextDouble();
                        if (money > acc.getQuotaMoney()) {
                            System.out.println("已超出存取限度!");
                        }else {
                            if (money > acc.getMoney()) {
                                System.out.println("您的转账金额超出余额!您当前的余额为:" + acc.getMoney());
                            } else {
                                acc.setMoney(acc.getMoney() - money);
                                account.setMoney(account.getMoney() + money);
                                System.out.println("转账成功,您当前的余额更新为:" + acc.getMoney());
                                return;
                            }
                        }
                    }else {
                        System.out.println("您输入的姓氏不正确!");
                    }
                }
            }else {
                System.out.println("您输入的账号不存在!");
            }
        }
    }
    /**
     * 实现取钱操作
     * @param sc 扫描器
     * @param acc 用户
     */
    private static void drawMoney(Scanner sc, Account acc) {
        System.out.println("===============取钱操作==============");
        if (acc.getMoney() < 100) {
            System.out.println("您的余额为:" + acc.getMoney() + ",无法进行取钱,请去人工柜台进行取钱操作");
            return;
        }
        System.out.println("请输入取款金额:");
        double money = sc.nextDouble();
        if (money < 100) {
            System.out.println("金额少于100元,请去人工柜台进行取钱操作");
            return;
        }
        if (money > acc.getQuotaMoney()) {
            System.out.println("您的取钱金额已超出存取限度!");
        }else {
            if (money > acc.getMoney()) {
                System.out.println("您的取钱金额超出余额!您当前的余额为:" + acc.getMoney());
            }else {
                acc.setMoney(acc.getMoney() - money);
                System.out.println("取钱成功,您当前的余额更新为:" + acc.getMoney());
            }
        }
    }

    /**
     * 实现存钱
     * @param sc 扫描器
     * @param acc 用户
     */
    private static void depositMoney(Scanner sc, Account acc) {
        System.out.println("===============存钱操作==============");
        System.out.println("请您输入存款金额:");
        double money = sc.nextDouble();
        if ((money > acc.getQuotaMoney()) || (money < 100)) {
            System.out.println("输入的存款金额无法办理,请去人工柜台进行存款");
        }else {
            acc.setMoney(acc.getMoney() + money);
            System.out.println("您已存款成功!");
            showAccount(acc);
        }
    }

    /**
     * 实现查询账户
     * @param acc 用户信息
     */
    private static void showAccount(Account acc) {
        System.out.println("===============当前用户信息如下===============");
        System.out.println("账号:" + acc.getCardId());
        System.out.println("用户名:" + acc.getUserName());
        System.out.println("余额:" + acc.getMoney());
        System.out.println("存取额度:" + acc.getQuotaMoney());
    }

    /**
     * 定义一个方法来注册账号
     * @param accounts 接收用户账号集合
     * @param sc 接收上面的扫描器
     */
    private static void register(ArrayList<Account> accounts,Scanner sc) {
        System.out.println("===============系统注册账户操作===============");
        //1、定义一个account来封装账户信息
        Account account = new Account();

        //2、录入账户信息
        System.out.println("请您输入用户名:");
        String userName = sc.next();
        account.setUserName(userName);

        while (true) { //按住CTRL + ALT + T键可快速实现while死循环
            System.out.println("请您输入密码:");
            String passWard = sc.next();
            System.out.println("请您确认密码:");
            String okPassWard = sc.next();
            if (passWard.equals(okPassWard)) {
                account.setPassWord(okPassWard);
                break;
            }else {
                System.out.println("您输入的两次密码不一致,请重新输入");
            }
        }

        System.out.println("请您输入您的每日存取额度:");
        double quotaMoney = sc.nextDouble();
        account.setQuotaMoney(quotaMoney);

        //为用户随机生成一个8位数且与其他用户不重复的cardId
        String cardId = getRandomCardId(accounts);
        account.setCardId(cardId);

        //3、将账户信息录入到集合accounts中去
        accounts.add(account);
        System.out.println("恭喜您,尊敬的:" + userName + "先生/女士,您已成功注册账户,您的账号为:" + cardId + ",请您妥善保管。");
    }

    /**
     * 定义一个创建不重复cardId的方法
     * @param accounts 传递账户集合用于比对是否重复
     * @return 返回不重复的id,或者返回null
     */
    private static String getRandomCardId(ArrayList<Account> accounts) {
        Random r = new Random();
        String cardId = "";
        while (true) {
            for (int i = 0; i < 8; i++) {
                cardId += r.nextInt(10);
            }
            //利用方法比对是否存在相同carId
            Account acc = getAccountByCarId(cardId,accounts);
            if (acc == null) {
                return cardId;
            }
        }
    }

    //定义一个方法用来比对carId是否与集合中的元素存在相同
    private static Account getAccountByCarId(String cardId, ArrayList<Account> accounts) {
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if (acc.getCardId().equals(cardId)) {
                return acc;
            }
        }
        return null;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值