Java 中 ATM 系统开发

ATM 系统开发

一、 系统准备

1、 简介

内容分析:

  • 每个用户的账户信息都是一个对象,需要提供账户类
  • 需要准备一个容器,用于存储系统全部账户对象信息
  • 首页只需要包含;登录和注册两个功能

实现步骤:

  • 定义账户类,用于后期创建账户对象封装用户的账户信息
  • 账户类中的信息至少需要包含(卡号、姓名、密码、余额、取现额度)
  • 需要准备一个集合,用于存储系统用户的账户对象
  • 需要展示欢迎页面,包括两个功能:开户功能和登录功能

2、 定义账户类

package ATM;

public class Account {
    // 成员变量私有化
    private String m_Id;  // 卡号
    private String m_Name;  // 姓名
    private String m_Pwd;  // 密码
    private double m_Money;  // 账户余额
    private double m_GetMoney;  // 每次取现额度

    public String getM_Id() {
        return m_Id;
    }

    public void setM_Id(String m_Id) {
        this.m_Id = m_Id;
    }

    public String getM_Name() {
        return m_Name;
    }

    public void setM_Name(String m_Name) {
        this.m_Name = m_Name;
    }

    public String getM_Pwd() {
        return m_Pwd;
    }

    public void setM_Pwd(String m_Pwd) {
        this.m_Pwd = m_Pwd;
    }

    public double getM_Money() {
        return m_Money;
    }

    public void setM_Money(double m_Money) {
        this.m_Money = m_Money;
    }

    public double getM_GetMoney() {
        return m_GetMoney;
    }

    public void setM_GetMoney(double m_GetMoney) {
        this.m_GetMoney = m_GetMoney;
    }
}

3、 欢迎页面

package ATM;

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

public class ATMSystem {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 1、 定义账户类

        // 2、 定义集合容器
        ArrayList<Account> accounts = new ArrayList<>();

        // 3、 展示系统的首页
        show(sc);
    }
    private static void show(Scanner sc) {
        OUT:
        while (true) {
            System.out.println("0、 退出系统");
            System.out.println("1、 账户登录");
            System.out.println("2、 账户开户");
            System.out.println("请选择要进行的操作:");
            int command = sc.nextInt();
            switch (command) {
                case 0:
                    // 退出
                    break OUT;
                case 1:
                    // 用户登录
                    loginAccount(accounts, sc);
                    break;
                case 2:
                    // 账户开户
                    createAccount(sc, accounts);
                    break;
                default:
                    System.out.println("请按照要求输入哦!!!");
            }
        }
    }
}

二、 开户功能

1、 简介

分析:

  • 开户功能其实就是往系统的集合容器中存入一个新账户对象的信息

实现步骤:

  • 开户应该定义一个方法,并传入账户集合
  • 创建一个 Acount 账户类的对象用于封装账户信息(姓名、密码、卡号)
  • 键盘录入姓名、密码、确认密码
  • 生成账户卡号,卡号必须由系统自动生成8位数字
  • 把账户对象存入到集合中去

2、 代码实现

private static void createAccount(Scanner sc, ArrayList<Account> accounts) {
    // 开户
    System.out.println("================开户系统=====================");
    // 创建一个对象,用于封装账户信息
    Account at = new Account();
    // 录入信息,把账户信息添加到集合中去
    System.out.println("请输入用户名:");
    String name = sc.next();
    at.setM_Name(name);
    String pwd = null;
    while (true) {
        System.out.println("请输入密码:");
        pwd = sc.next();
        System.out.println("请再次输入密码:");
        String pwd_s = sc.next();
        if (pwd.equals(pwd_s)) {
            System.out.println("密码认证通过");
            break;  // 密码录入成功
        } else {
            System.out.println("两次密码不一样,请重新输入!");
        }
    }
    at.setM_Pwd(pwd);
    at.setM_GetMoney(10000.0);  // 限额默认为 1w
    String id = getRandomOnlyId(accounts);
    at.setM_Id(id);  // 创建卡号
    at.setM_Money(0.0);  // 余额为0
    accounts.add(at);
    System.out.printf("恭喜您,创建成功,卡号为%s!!\n", id);
}

private static String getRandomOnlyId(ArrayList<Account> accounts) {
    // 得到卡号
    Random r = new Random();
    while (true) {
        String id = "";
        for (int i = 0; i < 8; i++) {
            id += r.nextInt(10);
        }
        Account acc = getAccountById(id, accounts);
        if (acc == null) {  // 不重复
            return id;
        }
    }
}

private static Account getAccountById(String id, ArrayList<Account> accounts) {
    // 判断 id 是否重复
    for (int i = 0; i < accounts.size(); i++) {
        Account acc = accounts.get(i);
        if (id.equals(acc.getM_Id())) {
            return acc;
        }
    }
    return null;
}

三、 登录功能

1、 简介

2、 代码实现

private static void loginAccount(ArrayList<Account> accounts, Scanner sc) {
    System.out.println("================登录系统=====================");
    if (accounts.size() == 0) {
        System.out.println("请先注册账户!");
        return;
    }
    int j = 0;
    while (j < 6) {
        System.out.println("请输入卡号:");
        String id = sc.next();
        System.out.println("请输入密码:");
        String pwd = sc.next();
        for (int i = 0; i < accounts.size(); i++) {
        	if (accounts.get(i).getM_Id().equals(id) && accounts.get(i).getM_Pwd().equals(pwd)) {
                System.out.println("登录成功");
                show2(accounts, sc, accounts.get(i));
                return;
            }
        }
        System.out.println("账号或密码错误,请重新输入!!!");
        j++;
    }
    System.out.println("6次机会已过,请与管理员联系!!");
}

四、 登录成功

1、 界面

功能分析:

  • 用户登录成功后,需要进入用户操作页
  • 查询就是直接展示当前登录成功的账户对象的信息
  • 退出账户是需要回到首页

代码实现:

private static void show2(ArrayList<Account> accounts, Scanner sc, Account acc) {
    while (true) {
        System.out.println("================操作页面=====================");
        System.out.println("0、 退出");
        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("请输入要进行的操作:");
        int choice = sc.nextInt();
        switch (choice) {
            case 0:
                // 退出
                return;
            case 1:
                // 查询
                searchAccount(acc);
                break;
            case 2:
                // 存款
                saveMoney(acc, sc);
                break;
            case 3:
                // 取款
                getMoney(acc, sc);
                break;
            case 4:
                // 转账
                moveMoney(accounts, sc, acc);
                break;
            case 5:
                // 修改密码
                changePwd(accounts, acc, sc);
                break;
            case 6:
                // 注销账户
                delAccount(accounts, acc);
                return;
            default:
                System.out.println("请按照要求输入哦!!!");
        }
    }
}

2、 查询功能

private static void searchAccount(Account acc) {
    System.out.println("================信息如下=====================");
    System.out.println("用户名:" + acc.getM_Name());
    System.out.println("卡号:" + acc.getM_Id());
    System.out.println("本日剩余额度:" + acc.getM_GetMoney());
    System.out.println("余额:" + acc.getM_Money());
    System.out.println("输出完成!!!");
}

3、 注销账户

private static void delAccount(ArrayList<Account> accounts, Account acc) {
    accounts.remove(acc);
    System.out.println("注销成功");
}

4、 存款功能

功能分析:

  • 存款就是拿到当前账户对象
  • 然后让用户输入存款的金额
  • 调用账户对象的赋值方法,将账户余额修改成存钱后的余额

代码实现:

private static void saveMoney(Account acc, Scanner sc) {
    System.out.println("请输入要存入的金额:");
    double money = sc.nextDouble();
    acc.setM_Money(acc.getM_Money() + money);  // 余额加存入的钱
    System.out.println("存款成功,余额为:" + acc.getM_Money());
}

5、 取款功能

功能分析:

  • 取款就是拿到当前对象
  • 然后让用户输入取款金额,同时判断是否小于余额,,大于100
  • 调用账户对象的赋值方法,将账户余额修改为取钱后的余额,同时修改限额

代码实现:

private static void getMoney(Account acc, Scanner sc) {
    if (acc.getM_Money() < 100) {
        // 判断余额是否大于100元
        System.out.println("余额小于100");
        return;
    }
    System.out.println("请输入要取款的金额:");
    double money = sc.nextDouble();
    if (money > acc.getM_Money()) {
        // 如果取款金额大于余额
        System.out.println("余额不足!!!");
        return;
    } else if (money > acc.getM_GetMoney()) {
        // 如果取款金额大于限额
        System.out.println("抱歉,取款金额大于限额!");
        return;
    }
    // 更新余额
    acc.setM_Money(acc.getM_Money() - money);
    acc.setM_GetMoney(acc.getM_GetMoney() - money);
    System.out.println("取款成功!");
    searchAccount(acc);
}

6、 转账功能

功能分析:

  • 转账功能需要判断系统中是否有2个账户对象,及以上
  • 同时还要判断自己账户是否有钱
  • 接下来需要输入对方卡号,判断对方账户是否存在
  • 对方账户存在还需要认证对方户主的形式
  • 满足要求则可以把自己账户对象的金额修改到对方账户对象中去

代码实现:

private static void moveMoney(ArrayList<Account> accounts, Scanner sc, Account acc) {
    if (accounts.size() == 1) {
        System.out.println("一个账户不能转账");
        return;
    }
    System.out.println("请输入要转账的卡号:");
    String id = sc.next();
    Account acc_c = getAccountById(id, accounts);
    if (acc_c == null) {
        System.out.println("该用户不存在,转账失败!");
        return;
    }
    System.out.println("请输入转账金额:");
    double money = sc.nextDouble();
    if (money > acc.getM_Money()) {
        System.out.println("余额不足!");
        return;
    } else if (money > acc.getM_GetMoney()) {
        System.out.println("限额不足!");
        return;
    }
    System.out.println("请输入对方账户用户名:");  // 用户名认证
    String name = sc.next();
    if (!name.equals(acc_c.getM_Name())) {
        return;
    }
    // 更新金额
    acc_c.setM_Money(acc_c.getM_Money() + money);
    acc.setM_Money(acc.getM_Money() - money);
    acc.setM_GetMoney(acc.getM_GetMoney() - money);  // 更新额度
    System.out.println("转账完成!");
    searchAccount(acc);
}

7、 密码修改

功能分析:

  • 输入一次旧密码,输入两次新密码
  • 重新登陆

代码实现:

private static void changePwd(ArrayList<Account> accounts, Account acc, Scanner sc) {
    System.out.println("请输入旧密码:");
    String pwd_o = sc.next();
    if (!pwd_o.equals(acc.getM_Pwd())) {
        System.out.println("密码输入错误!");
        return;
    }
    String pwd_n = null;
    while (true) {
        System.out.println("请输入新密码:");
        pwd_n = sc.next();
        if (pwd_n.equals(pwd_o)) {
            System.out.println("修改密码要和原密码不一样!");
            continue;
        }
        System.out.println("请再输入一次新密码:");
        String pwd_ne = sc.next();
        if (!pwd_n.equals(pwd_ne)) {
            System.out.println("两次密码输入不相同,请重新输入!");
            continue;
        }
        break;
    }
    acc.setM_Pwd(pwd_n);
    System.out.println("修改成功,请重新登陆");
    show(sc, accounts);
}

五、 总代码

1、 主运行文件

package ATM;

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

public class ATMSystem {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 1、 定义账户类
        // 2、 定义集合容器
        ArrayList<Account> accounts = new ArrayList<>();
        // 3、 展示系统的首页
        show(sc, accounts);
    }

    private static void show(Scanner sc, ArrayList<Account> accounts) {
        OUT:
        while (true) {
            System.out.println("================ATM系统=====================");
            System.out.println("0、 退出系统");
            System.out.println("1、 账户登录");
            System.out.println("2、 账户开户");
            System.out.println("请选择要进行的操作:");
            int command = sc.nextInt();
            switch (command) {
                case 0:
                    // 退出
                    break OUT;
                case 1:
                    // 用户登录
                    loginAccount(accounts, sc);
                    break;
                case 2:
                    // 账户开户
                    createAccount(sc, accounts);
                    break;
                default:
                    System.out.println("请按照要求输入哦!!!");
            }
        }
    }

    private static void loginAccount(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("================登录系统=====================");
        if (accounts.size() == 0) {
            System.out.println("请先注册账户!");
            return;
        }
        int j = 0;
        while (j < 6) {
            System.out.println("请输入卡号:");
            String id = sc.next();
            System.out.println("请输入密码:");
            String pwd = sc.next();
            for (int i = 0; i < accounts.size(); i++) {
                if (accounts.get(i).getM_Id().equals(id) && accounts.get(i).getM_Pwd().equals(pwd)) {
                    System.out.println("登录成功");
                    show2(accounts, sc, accounts.get(i));
                    return;
                }
            }
            System.out.println("账号或密码错误,请重新输入!!!");
            j++;
        }
        System.out.println("6次机会已过,请与管理员联系!!");
    }

    private static void show2(ArrayList<Account> accounts, Scanner sc, Account acc) {
        while (true) {
            System.out.println("================操作页面=====================");
            System.out.println("0、 退出");
            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("请输入要进行的操作:");
            int choice = sc.nextInt();
            switch (choice) {
                case 0:
                    // 退出
                    return;
                case 1:
                    // 查询
                    searchAccount(acc);
                    break;
                case 2:
                    // 存款
                    saveMoney(acc, sc);
                    break;
                case 3:
                    // 取款
                    getMoney(acc, sc);
                    break;
                case 4:
                    // 转账
                    moveMoney(accounts, sc, acc);
                    break;
                case 5:
                    // 修改密码
                    changePwd(accounts, acc, sc);
                    break;
                case 6:
                    // 注销账户
                    delAccount(accounts, acc);
                    return;
                default:
                    System.out.println("请按照要求输入哦!!!");
            }
        }
    }

    private static void delAccount(ArrayList<Account> accounts, Account acc) {
        accounts.remove(acc);
        System.out.println("注销成功");
    }

    private static void changePwd(ArrayList<Account> accounts, Account acc, Scanner sc) {
        System.out.println("请输入旧密码:");
        String pwd_o = sc.next();
        if (!pwd_o.equals(acc.getM_Pwd())) {
            System.out.println("密码输入错误!");
            return;
        }
        String pwd_n = null;
        while (true) {
            System.out.println("请输入新密码:");
            pwd_n = sc.next();
            if (pwd_n.equals(pwd_o)) {
                System.out.println("修改密码要和原密码不一样!");
                continue;
            }
            System.out.println("请再输入一次新密码:");
            String pwd_ne = sc.next();
            if (!pwd_n.equals(pwd_ne)) {
                System.out.println("两次密码输入不相同,请重新输入!");
                continue;
            }
            break;
        }
        acc.setM_Pwd(pwd_n);
        System.out.println("修改成功,请重新登陆");
        show(sc, accounts);
    }

    private static void moveMoney(ArrayList<Account> accounts, Scanner sc, Account acc) {
        if (accounts.size() == 1) {
            System.out.println("一个账户不能转账");
            return;
        }
        System.out.println("请输入要转账的卡号:");
        String id = sc.next();
        Account acc_c = getAccountById(id, accounts);
        if (acc_c == null) {
            System.out.println("该用户不存在,转账失败!");
            return;
        }
        System.out.println("请输入转账金额:");
        double money = sc.nextDouble();
        if (money > acc.getM_Money()) {
            System.out.println("余额不足!");
            return;
        } else if (money > acc.getM_GetMoney()) {
            System.out.println("限额不足!");
            return;
        }
        System.out.println("请输入对方账户用户名:");  // 用户名认证
        String name = sc.next();
        if (!name.equals(acc_c.getM_Name())) {
            return;
        }
        // 更新金额
        acc_c.setM_Money(acc_c.getM_Money() + money);
        acc.setM_Money(acc.getM_Money() - money);
        acc.setM_GetMoney(acc.getM_GetMoney() - money);  // 更新额度
        System.out.println("转账完成!");
        searchAccount(acc);
    }

    private static void getMoney(Account acc, Scanner sc) {
        if (acc.getM_Money() < 100) {
            // 判断余额是否大于100元
            System.out.println("余额小于100");
            return;
        }
        System.out.println("请输入要取款的金额:");
        double money = sc.nextDouble();
        if (money > acc.getM_Money()) {
            // 如果取款金额大于余额
            System.out.println("余额不足!!!");
            return;
        } else if (money > acc.getM_GetMoney()) {
            // 如果取款金额大于限额
            System.out.println("抱歉,取款金额大于限额!");
            return;
        }
        // 更新余额
        acc.setM_Money(acc.getM_Money() - money);
        acc.setM_GetMoney(acc.getM_GetMoney() - money);
        System.out.println("取款成功!");
        searchAccount(acc);
    }

    private static void saveMoney(Account acc, Scanner sc) {
        System.out.println("请输入要存入的金额:");
        double money = sc.nextDouble();
        acc.setM_Money(acc.getM_Money() + money);  // 余额加存入的钱
        System.out.println("存款成功,余额为:" + acc.getM_Money());
    }

    private static void searchAccount(Account acc) {
        System.out.println("================信息如下=====================");
        System.out.println("用户名:" + acc.getM_Name());
        System.out.println("卡号:" + acc.getM_Id());
        System.out.println("本日剩余额度:" + acc.getM_GetMoney());
        System.out.println("余额:" + acc.getM_Money());
        System.out.println("输出完成!!!");
    }

    private static void createAccount(Scanner sc, ArrayList<Account> accounts) {
        // 开户
        System.out.println("================开户系统=====================");
        // 创建一个对象,用于封装账户信息
        Account at = new Account();
        // 录入信息,把账户信息添加到集合中去
        System.out.println("请输入用户名:");
        String name = sc.next();
        at.setM_Name(name);
        String pwd = null;
        while (true) {
            System.out.println("请输入密码:");
            pwd = sc.next();
            System.out.println("请再次输入密码:");
            String pwd_s = sc.next();
            if (pwd.equals(pwd_s)) {
                System.out.println("密码认证通过");
                break;  // 密码录入成功
            } else {
                System.out.println("两次密码不一样,请重新输入!");
            }
        }
        at.setM_Pwd(pwd);
        at.setM_GetMoney(10000.0);  // 限额默认为 1w
        String id = getRandomOnlyId(accounts);
        at.setM_Id(id);  // 创建卡号
        at.setM_Money(0.0);  // 余额为0
        accounts.add(at);
        System.out.printf("恭喜您,创建成功,卡号为:\n%s\n", id);
    }

    private static String getRandomOnlyId(ArrayList<Account> accounts) {
        // 得到卡号
        Random r = new Random();
        while (true) {
            String id = "";
            for (int i = 0; i < 8; i++) {
                id += r.nextInt(10);
            }
            Account acc = getAccountById(id, accounts);
            if (acc == null) {  // 不重复
                return id;
            }
        }
    }

    private static Account getAccountById(String id, ArrayList<Account> accounts) {
        // 判断 id 是否重复
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if (id.equals(acc.getM_Id())) {
                return acc;
            }
        }
        return null;
    }
}

2、 账户类文件

package ATM;

public class Account {
    // 成员变量私有化
    private String m_Id;  // 卡号
    private String m_Name;  // 姓名
    private String m_Pwd;  // 密码
    private double m_Money;  // 账户余额
    private double m_GetMoney;  // 每次取现额度

    public String getM_Id() {
        return m_Id;
    }

    public void setM_Id(String m_Id) {
        this.m_Id = m_Id;
    }

    public String getM_Name() {
        return m_Name;
    }

    public void setM_Name(String m_Name) {
        this.m_Name = m_Name;
    }

    public String getM_Pwd() {
        return m_Pwd;
    }

    public void setM_Pwd(String m_Pwd) {
        this.m_Pwd = m_Pwd;
    }

    public double getM_Money() {
        return m_Money;
    }

    public void setM_Money(double m_Money) {
        this.m_Money = m_Money;
    }

    public double getM_GetMoney() {
        return m_GetMoney;
    }

    public void setM_GetMoney(double m_GetMoney) {
        this.m_GetMoney = m_GetMoney;
    }
}

整个项目在:【 https://download.csdn.net/download/qq_62789540/85045248 】免费哦!!

posted @ 2022-03-27 20:45  Kenny_LZK  阅读(97)  评论(0编辑  收藏  举报