Java项目:ATM系统

6 篇文章 0 订阅
3 篇文章 0 订阅

这两天晚上都在写这个项目,虽然在写之前已经看了教学视频,但是自己动手写还是会遇到许多问题。

上代码:

首先要定义一个账户类:

package com.zhongying.atm;

public class Account {
    private String userName;//户主姓名//
    private String userID;//身份证号//
    private String sex;//性别//
    private String cardID;//卡号//
    private byte accountLevel;//账户等级(1、2、3级,分别对应5000、10000、50000的限额)//
    private double balance;//余额
    private double quota;//限额//
    private String passWord;//密码

    public String getUserName() {

        return userName;
    }

    public String getPassWord() {
        return passWord;
    }

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

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

    public String getUserID() {
        return userID;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public String getSex() {
        return sex;
    }

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

    public String getCardID() {
        return cardID;
    }

    public void setCardID(String cardID) {
        this.cardID = cardID;
    }

    public byte getAccountLevel() {
        return accountLevel;
    }

    public void setAccountLevel(byte accountLevel) {
        this.accountLevel = accountLevel;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public double getQuota() {
        return quota;
    }

    public void setQuota(double quota) {
        this.quota = quota;
    }
}

然后就是主体部分:

package com.zhongying.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);//创建输入对象,以后要用的话直接传参
        ArrayList<Account> accounts = new ArrayList<>();//创建账户类型的集合
        welcomeInterface(sc, accounts);

    }

    /**
     * 用于登录或注册的一级界面
     *
     * @param sc       输入对象
     * @param accounts 具有装载账户对象的集合
     */
    public static void welcomeInterface(Scanner sc, ArrayList<Account> accounts) {
        while (true) {
            System.out.println("===========中印银行ATM系统==========");
            System.out.println("1、账户登录");
            System.out.println("2、注册账户");
            System.out.println("请输入你要的操作:");
            int select = sc.nextInt();
            switch (select) {
                case 1:
                    login(accounts, sc);//登录界面
                    break;
                case 2:
                    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("===========登录界面===========");
            System.out.println("请输入卡号:");
            Account a = findCard(accounts, sc.next());//这个方法如果找不到相同的号码会返回null
            if (a != null) {
                while (true) {
                    System.out.println("请输入密码:");
                    if (sc.next().equals(a.getPassWord())) {//如果密码相等
                        System.out.println("欢迎你," + a.getUserName() + a.getSex() + ",登录成功!");
                        //要进入二级界面
                        function(accounts, a, sc);
                        break;
                    } else {
                        System.out.println("密码输入错误,请重试~~");
                    }
                }
            } else {
                System.out.println("卡号输入有误,请重新输入~~");
            }
        } else {
            System.out.println("系统中没有账户,创建一个吧~~");
        }
    }

    /**
     * 登录之后的功能界面
     *
     * @param accounts 具有装载账户对象的集合
     * @param a        登录的账户对象
     * @param sc       输入对象
     */
    private static void function(ArrayList<Account> accounts, Account a, Scanner sc) {
        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("8、注销账户");
            System.out.println("请输入你要进行的操作:");
            switch (sc.nextInt()) {
                case 1:
                    printfInformation(a);
                    break;
                case 2:
                    deposit(a, sc);
                    break;
                case 3:
                    withdraw(a, sc);
                    break;
                case 4:
                    transfer(a, accounts, sc);
                    break;
                case 5:
                    change(a, sc);
                    break;
                case 6:
                    upgrade(a);
                    break;
                case 7:
                    System.out.println("退出成功!!");
                    return;
                case 8:
                    if (cancel(a, accounts, sc)) {
                        return;
                    }
                    break;
                default:
                    System.out.println("输入有误,重新输入~~");

            }
        }

    }

    /**
     * 注销功能方法
     *
     * @param a        账户
     * @param accounts 装载这个账户的集合
     * @param sc 输入对象
     * @return
     */
    private static boolean cancel(Account a, ArrayList<Account> accounts, Scanner sc) {
        System.out.println("请确认注销账户吗,一旦注销无法恢复");
        System.out.println("1、确认");
        System.out.println("2、取消");
        if (sc.nextInt() == 1) {
            System.out.println("请补全姓名以确认身份:");
            System.out.println(a.getUserName().replace(a.getUserName().substring(1), "**"));//字符串替换
            if (sc.next().equals(a.getUserName().substring(1))) {//判断替换掉的字符串跟用户输入的是否一样
                accounts.remove(a);
                System.out.println("注销成功!!");
                return true;
            } else {
                System.out.println("验证失败");
                return false;
            }

        } else {
            return false;
        }
    }

    /**
     * 用于升级账户类型的方法
     *
     * @param a 要升级的账户地址
     */
    private static void upgrade(Account a) {
        System.out.println(a.getUserName() + a.getSex() + "您好,感谢您对中印银行的长久的支持");
        System.out.println("目前您的" + "账户类型为" + a.getAccountLevel() + "级客户");
        if (a.getAccountLevel() < 3) {
            System.out.println("已经为您成功升级!");
            a.setAccountLevel((byte) (a.getAccountLevel() + 1));
            setQuota(a);//调用限额改变方法
            System.out.println("目前您的账户等级为" + a.getAccountLevel() + "级" + ",单次限额提升到" + a.getQuota());
        } else {
            System.out.println("您已经是我们最高级的客户了,感谢您对本银行的支持!!");
        }
    }

    /**
     * 修改密码方法
     *
     * @param a  要修改密码的账户地址
     * @param sc 输入对象
     */
    private static void change(Account a, Scanner sc) {
        while (true) {//原密码循环
            System.out.println("请输入原密码:");
            if (sc.next().equals(a.getPassWord())) {//确认身份
                while (true) {//新密码循环
                    System.out.println("请输入新密码:");
                    String newPassWord = sc.next();
                    if (!newPassWord.equals(a.getPassWord())) {//新密码不能和旧密码相同
                        System.out.println("请再次输入以确认:");
                        if (sc.next().equals(newPassWord)) {
                            System.out.println("修改密码成功!!");
                            a.setPassWord(newPassWord);
                            return;
                        } else {
                            System.out.println("两次输入的密码不一致~~");
                        }
                    } else {
                        System.out.println("新密码要与旧密码不一样!!");
                    }
                }

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

    /**
     * 转账方法
     *
     * @param a        想要转账的账户地址
     * @param accounts 所有账户的集合
     * @param sc       输入对象
     */
    private static void transfer(Account a, ArrayList<Account> accounts, Scanner sc) {
        if (accounts.size() >= 2) {//确保系统里有两个或以上的账户才能转账
            while (true) {
                System.out.println("请输入对方的卡号:");
                Account other = findCard(accounts, sc.next());//调用找卡号的方法
                if (other != null) { //如果方法返回的不是null,就代表找到了
                    while (true) {//判断金额是否满足转账条件
                        System.out.println("请选择为" + other.getUserName().replace(other.getUserName().substring(1), "**") + other.getSex() + "转账多少元");
                        double money = sc.nextDouble();
                        if (a.getBalance() >= 100 && money <= a.getBalance()) {
                            System.out.println("请输入密码:");
                            while (true) {//密码循环
                                if (sc.next().equals(a.getPassWord())) {
                                    System.out.println("转账成功!!");
                                    other.setBalance(other.getBalance() + money);
                                    a.setBalance(a.getBalance() - money);//将原账户的钱减去转走到钱
                                    return;
                                } else {
                                    System.out.println("密码错误~请重新输入");
                                }
                            }
                        } else {
                            System.out.println("失败!,您的余额为" + a.getBalance() + ",请重新输入要转账的金额");
                        }
                    }
                } else {
                    System.out.println("卡号输入错误~~请重新输入");
                }
            }
        } else {
            System.out.println("系统内没有其他用户,无法转账");
        }
    }

    /**
     * 用于取钱方法
     *
     * @param a  要取钱的对象地址
     * @param sc 输入对象
     */
    private static void withdraw(Account a, Scanner sc) {
        if (a.getBalance() >= 100) {
            System.out.println("请输入你要取多少钱");
            double money = sc.nextDouble();
            if (money <= a.getBalance()) {
                if (money <= a.getQuota()) {
                    a.setBalance(a.getBalance() - money);
                    System.out.println("已成功取走!!目前还有余额" + a.getBalance());
                } else {
                    System.out.println("失败,当次取钱超过限额~~");
                }
            } else {
                System.out.println("余额不足,请重新选择");
            }

        } else {
            System.out.println("余额不足100,取钱失败!!");
        }

    }

    /**
     * 用于存钱方法
     *
     * @param a  需要取钱的账户地址
     * @param sc 输入对象
     */
    private static void deposit(Account a, Scanner sc) {
        System.out.println("请输入你要存入的钱:");
        a.setBalance(a.getBalance() + sc.nextInt());
        System.out.println("存入成功!!");
        System.out.println("你现在余额为:" + a.getBalance());
    }

    /**
     * 用于注册的界面方法
     *
     * @param accounts 要装载账户类的集合
     * @param sc       输入对象地址
     */
    private static void register(ArrayList<Account> accounts, Scanner sc) {
        while (true) {
            System.out.println("===========注册界面===========");
            System.out.println("请输入身份证号码:");
            String userID = sc.next();
            if (userID.length() == 18) {
                Account a = new Account();
                accounts.add(a);//将账户类添加到集合中去
                a.setUserID(userID);
                setSex(a);//判断性别
                System.out.println("请输入姓名:");
                a.setUserName(sc.next());
                a.setCardID(getCardNumber(accounts));//随机出一个8位数卡号
                System.out.println("您的卡号为:" + a.getCardID());
                while (true) {
                    System.out.println("请为卡号:" + a.getCardID() + "\t设置一个密码:");
                    String passWord = sc.next();
                    System.out.println("请再次确认密码:");
                    if (sc.next().equals(passWord)) {
                        a.setPassWord(passWord);
                        break;
                    } else {
                        System.out.println("两次输入的密码不一致,请重新输入~~");
                    }
                }
                a.setAccountLevel((byte) 1);
                setQuota(a);
                return;

            } else {
                System.out.println("身份证格式有误!!");
            }
        }
    }

    /**
     * 用于生成随机的8位卡号数字
     *
     * @param accounts 装载了账户类型的集合
     * @return 返回生成好的不重复的字符串
     */
    private static String getCardNumber(ArrayList<Account> accounts) {
        while (true) {//不重复才返回
            Random r = new Random();
            String cardNumber = "98";//卡号默认98开头
            for (int i = 0; i < 6; i++) {
                cardNumber += r.nextInt(10);//每一次生成的随机数都加到cardNumber里
            }
            for (int i = 0; i < accounts.size(); i++) {//判断卡号与其他用户的卡号是否相同
                if (cardNumber.equals(accounts.get(i).getCardID())) {

                } else {
                    System.out.println("创建成功");
                    return cardNumber;
                }
            }
        }
    }

    /**
     * 用于将用户的基本形象打印
     *
     * @param a 要打印的对象地址
     */
    private static void printfInformation(Account a) {
        System.out.println("-------------------------------------");
        System.out.println("您的信息如下:");
        System.out.println("姓名:" + a.getUserName());
        System.out.println("卡号:" + a.getCardID());
        System.out.println("卡上余额:" + a.getBalance());
        System.out.println("账户类型" + a.getAccountLevel() + "级客户");
        System.out.println("当次限额:" + a.getQuota());
        System.out.println("-------------------------------------");
    }

    /**
     * 通过身份证第17位来判断是男生还是女生
     *
     * @param a 要判断的账户类地址
     */
    private static void setSex(Account a) {
        if ((a.getUserID().charAt(16) % 2) != 0) {//ascll码中字符1-9中对应的ascll码值的奇偶性相同
            a.setSex("先生");
        } else {
            a.setSex("女士");
        }
    }

    /**
     * 根据账户等级调整限额
     *
     * @param a 要调整的账户类地址
     */
    private static void setQuota(Account a) {
        switch (a.getAccountLevel()) {
            case 1:
                a.setQuota(5000);
                break;
            case 2:
                a.setQuota(10000);
                break;
            case 3:
                a.setQuota(50000);
                break;
        }
    }

    /**
     * 用于将要比较的卡号与集合里的其他对象的卡号进行对比
     *
     * @param accounts 装载了用户信息的集合
     * @param cardId   要比较的卡号
     * @return 找到了返回那个卡号的对象地址,找不到返回null
     */
    private static Account findCard(ArrayList<Account> accounts, String cardId) {
        for (int i = 0; i < accounts.size(); i++) {
            if (cardId.equals(accounts.get(i).getCardID())) {
                return accounts.get(i);
            }
        }
        return null;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值