Java仿ATM操作系统

image.png

前言

本文主要介绍使用Java简单实现仿ATM操作系统。
该ATM系统主要包括:登录、开户、查询、存款、取款、转账、修改密码、退出、注销账户功能。
该ATM系统主要使用while循环来实现各项功能的循环操作。
结构组成:账户实体类和主系统操作类。

一、账户实体Account类

该类主要包含账户需要的所有字段和存取款的操作方法。

1. 定义字段

定义字段并实现setter和getter方法。

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;
    }
}

2 重写构造方法

    public Account(String cardId, String userName, String password, double quotaMoney) {
        this.cardId = cardId;
        this.userName = userName;
        this.password = password;
        this.quotaMoney = quotaMoney;
    }

3 存款

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

4 取款

0:取款额大于余额
1:取款成功
2:取款额大于单次取款限额

    public int outMoney(double money) {
        if (money > this.money) {
            return 0;
        } else if (money > this.quotaMoney) {
            return 2;
        } else {
            this.money -= money;
            return 1;
        }
    }

二、主系统操作ATMSystem类

该类包括ATM系统的所有操作功能的实现。主要包括系统主页面和登录之后个人页面。

1 系统主页面

系统主页面主要实现登录和开户的功能。

1.1 启动

本系统使用List集合来存储账户信息。

public class ATMSystem {
    public static void main(String[] args) {
        // 存储账户信息
        List<Account> accounts = new ArrayList<>();
        start(accounts);
    }

    /* 起始主页 */
    public static void start(List<Account> accounts) {
        System.out.println("==========欢迎您进入ATM系统==========");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("1、登录");
            System.out.println("2、开户");
            System.out.println("请您选择操作:");
            int type = scanner.nextInt();
            switch (type) {
                case 1:
                    login(scanner, accounts);
                    break;
                case 2:
                    register(scanner, accounts);
                    break;
                default:
                    System.out.println("您选择的操作有误。");
            }
        }
    }
}

1.2 登录

实现逻辑:
1、判断系统中账户个数。
2、通过输入的卡号查询对应账户进行判断。
3、判断输入的密码。
4、进入个人主页面。

    /* 登录 */
    public static void login(Scanner scanner, List<Account> accounts) {
        System.out.println("==========欢迎您进入到登录操作==========");
        if (accounts.size() == 0) {
            System.out.println("当前系统无任何账户,请先开户再登录!");
            return;
        }
        Account account = null;
        while (true) {
            System.out.println("请您输入卡号:");
            String cardId = scanner.next();
            account = queryAccountByCardId(accounts, cardId);
            if (account == null) {
                System.out.println("您输入的卡号有误!");
            } else {
                break;
            }
        }
        while (true) {
            System.out.println("请您输入密码:");
            String password = scanner.next();
            if (account.getPassword().equals(password)) {
                break;
            } else {
                System.out.println("您输入的密码有误!");
            }
        }
        System.out.println("尊敬的" + account.getUserName() + ",欢迎您进入系统!\n您的卡号是:" + account.getCardId());
        enterSystem(scanner, accounts, account);
    }
    /* 查询账户 */
    public static Account queryAccountByCardId(List<Account> accounts, String cardId) {
        for (int i = 0; i < accounts.size(); i++) {
            Account a = accounts.get(i);
            if (a.getCardId().equals(cardId)) {
                return a;
            }
        }
        return null;
    }

1.3 开户

实现逻辑:
1、输入账户基本信息。
2、生成8位由数字组成的不重复的卡号。
3、存储新账户信息。

    /* 开户 */
    public static void register(Scanner scanner, List<Account> accounts) {
        System.out.println("==========欢迎您进入到开户操作==========");
        System.out.println("请您输入姓名:");
        String name = scanner.next();
        String password;
        while (true) {
            System.out.println("请您输入密码:");
            password = scanner.next();
            System.out.println("请您确认密码:");
            if (scanner.next().equals(password)) {
                break;
            } else {
                System.out.println("您两次输入的密码不一致,请重新设置");
            }
        }
        System.out.println("请您设置单次最大取现金额:");
        double quotaMoney = scanner.nextDouble();
        String cardId = createCardId(accounts);
        Account account = new Account(cardId, name, password, quotaMoney);
        accounts.add(account);
        System.out.println("恭喜您开户成功!您的卡号是:\"" + account.getCardId() + "\",请您妥善保管。");
    }
    /* 生成卡号 */
    public static String createCardId(List<Account> accounts) {
        Random random = new Random();
        while (true) {
            String carId = "";
            for (int i = 0; i < 8; i++) {
                carId += random.nextInt(10);
            }
            Account a = queryAccountByCardId(accounts, carId);
            if (a == null) {
                return carId;
            }
        }
    }

2 个人主页面

登录成功之后进入个人主页面主要实现查询、存款、取款、转账、修改密码、退出、注销账户功能。

    /* 进入个人主页面 */
    public static void enterSystem(Scanner scanner, List<Account> accounts, Account account) {
        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、注销账户");
            int type = scanner.nextInt();
            switch (type) {
                case 1:
                    showAccount(account);
                    break;
                case 2:
                    depositMoney(scanner, accounts, account);
                    break;
                case 3:
                    drawMoney(scanner, accounts, account);
                    break;
                case 4:
                    transferMoney(scanner, accounts, account);
                    break;
                case 5:
                    updatePassword(scanner, accounts, account);
                    return;
                case 6:
                    logout(accounts);
                    return;
                case 7:
                    destroyAccount(accounts, account);
                    return;
                default:
            }
        }
    }

2.1 查询

主要展示当前登录账户信息。

    /* 展示账户信息 */
    public static void showAccount(Account account) {
        System.out.println("==========当前账户信息==========");
        System.out.println("卡号:" + account.getCardId() + "\n" + "户主:" + account.getUserName() + "\n" + "余额:" + account.getMoney() + "\n" + "当次取现额度:" + account.getQuotaMoney());
    }

2.2 存款

实现逻辑:
1、当前账户调用存款方法进行存款。
2、存款完成展示当前账户最新信息。

    /* 存款 */
    public static void inMoney(Scanner scanner, List<Account> accounts, Account account) {
        System.out.println("==========存款操作==========");
        System.out.println("请输入存款金额:");
        double money = scanner.nextDouble();
        account.inMoney(money);
        System.out.println("存款完成!");
        showAccount(account);
    }

2.3 取款

实现逻辑:
1、当前账户调用取款方法进行取款。
2、根据当前账户取款方法返回值给出相应的提示。
3、取款完成展示当前账户最新信息。

    /* 取款 */
    public static void outMoney(Scanner scanner, List<Account> accounts, Account account) {
        System.out.println("==========取款操作==========");
        while (true) {
            System.out.println("请输入取款金额:");
            double money = scanner.nextDouble();
            int status = account.outMoney(money);
            switch (status) {
                case 1:
                    System.out.println("取款完成!");
                    showAccount(account);
                    return;
                case 0:
                    System.out.println("账户余额不足!");
                    break;
                case 2:
                    System.out.println("超出单次取现额度!");
                    break;
                default:
                    System.out.println("系统故障!");
            }
        }
    }

2.4 转账

实现逻辑:
1、判断当前系统中账户个数。
2、判断当前账户余额。
3、判断转账账户是否存在。
4、判断转账账户是否是自己。
5、对接收账户进行信息确认。
6、判断当前账户取款方法返回值。
7、转账成功展示当前账户最新信息。

    /* 转账 */
    public static void transferMoney(Scanner scanner, List<Account> accounts, Account account) {
        System.out.println("==========转账操作==========");
        if (accounts.size() < 2) {
            System.out.println("当前只有一个账号,暂无法转账!");
            enterSystem(scanner, accounts, account);
            return;
        }
        if (account.getMoney() == 0) {
            System.out.println("对不起,您的账户没钱,就别转了~~");
            return;
        }
        while (true) {
            System.out.println("请输入转账账号:");
            Account a = queryAccountByCardId(accounts, scanner.next());
            if (a == null) {
                System.out.println("账号不存在!");
            } else  {
                if (account.getCardId().equals(a.getCardId())) {
                    System.out.println("您不可以给自己转账!");
                    continue;
                }
                System.out.println("请确认【*" + a.getUserName().substring(1) + "】的姓氏:");
                String surname = scanner.next();
                if (surname.equals(a.getUserName().substring(0, 1))) {
                    while (true) {
                        System.out.println("请输入转账金额:");
                        double money = scanner.nextDouble();
                        int status = account.outMoney(money);
                        switch (status) {
                            case 1:
                                a.inMoney(money);
                                System.out.println("转账成功!您为" + a.getUserName() + "转账了:" + money);
                                showAccount(account);
                                return;
                            case 0:
                                System.out.println("账户余额不足!您最多可以转:" + account.getMoney());
                                break;
                            case 2:
                                System.out.println("超出单次取现额度!");
                                break;
                            default:
                                System.out.println("系统故障!");
                        }
                    }
                } else {
                    System.out.println("对不起,您认证的信息错误!");
                }
            }
        }
    }

2.5 修改密码

实现逻辑:
1、旧密码确认。
2、判断两次输入的新密码是否一致。
3、修改当前账户密码。
4、在循环的switch中直接return结束循环返回到系统主页面。

    /* 修改密码 */
    public static void updatePassword(Scanner scanner, List<Account> accounts, Account account) {
        System.out.println("==========修改密码操作==========");
        while (true) {
            System.out.println("请输入密码:");
            String password = scanner.next();
            if (password.equals(account.getPassword())) {
                break;
            } else {
                System.out.println("密码错误!");
            }
        }
        while (true) {
            System.out.println("请输入新密码:");
            String password1 = scanner.next();
            System.out.println("请确认新密码:");
            String password2 = scanner.next();
            if (password1.equals(password2)) {
                System.out.println("密码修改成功!");
                account.setPassword(password1);
                break;
            } else {
                System.out.println("密码不一致!");
            }
        }
    }

2.6 退出

实现逻辑:
1、给出提示之后在循环的switch中直接return结束循环返回到系统主页面。

    /* 退出 */
    public static void logout(List<Account> accounts) {
        System.out.println("欢迎下次光临!");
    }

2.7 注销账户

实现逻辑:
1、将当前账户从账户集合中移除。
2、在循环的switch中直接return结束循环返回到系统主页面。

    /* 注销账户 */
    public static void destroyAccount(List<Account> accounts, Account account) {
        accounts.remove(account);
        System.out.println("您的账户已注销!");
    }

总结

以上就是关于Java仿ATM操作系统实现的全部内容。

如果有什么问题,我们可以一起交流讨论解决。

最后,希望可以帮助到有需要的码友。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容