需要ATM机类,该类完成主菜单的相关操作,在取钱和转账时,需判断余额情况

需要ATM机类,该类完成主菜单的相关操作,在取钱和转账时,需判断余额情况
要求:实现数据持久化存储(方式不限)

根据自身需要看是否要创建BankCard银行卡类,如需创建,可以直接用以下属性:
private String account;  //账号

private String password; //密码

private double balance;  //余额

private String bankName; //银行卡名字

private String name;     //持卡人姓名

三、控制台流程参考

*****************

**欢迎使用ATM**

*****************

请输入卡号:

10086

请输入密码:

10086

***********************************

*******请输入你想要操作类型*******

******1.余额查询  2.取款***********

******3.存款        4.转账***********

******5.打印        6.退卡***********

******7.查询转账信息**************

**********************************

1

当前账户余额为:10000.0

***********************************

*******请输入你想要操作类型*******

******1.余额查询  2.取款***********

******3.存款        4.转账***********

******5.打印        6.退卡***********

******7.查询转账信息**************

**********************************

2

*****请选择你要操作菜单的序号*****

*****1.100                        2.200****

*****3.500                        4.800****

*****5.1000                      6.2000***

*****7.其它                       8.返回****

1

当前余额为9900.0

***********************************

*******请输入你想要操作类型*******

******1.余额查询  2.取款***********

******3.存款        4.转账***********

******5.打印        6.退卡***********

******7.查询转账信息**************

**********************************

3

请输入要存款的金额

2000

你当前的余额为:11900.0

***********************************

*******请输入你想要操作类型*******

******1.余额查询  2.取款***********

******3.存款        4.转账***********

******5.打印        6.退卡***********

******7.查询转账信息**************

**********************************

4

请输入的转账卡号

10010

请输入转账金额

1900

你当前的余额为:10000.0

***********************************

*******请输入你想要操作类型*******

******1.余额查询  2.取款***********

******3.存款        4.转账***********

******5.打印        6.退卡***********

******7.查询转账信息**************

**********************************

7

姓名 卡号 银行名称

张三 10086 工商银行

李四 10010 中国银行

王五 10000 交通银行

-----------------------

张三 10086 工商银行

王五 10000 交通银行

李四 10010 中国银行

-----------------------

王五 10000 交通银行

张三 10086 工商银行

李四 10010 中国银行

***********************************

*******请输入你想要操作类型*******

******1.余额查询  2.取款***********

******3.存款        4.转账***********

******5.打印        6.退卡***********

******7.查询转账信息**************

**********************************

5

文件存放路径:I:\m.txt

***********************************

*******请输入你想要操作类型*******

******1.余额查询  2.取款***********

******3.存款        4.转账***********

******5.打印        6.退卡***********

******7.查询转账信息**************

**********************************

package com.hp.shr;
 
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
 
    public class ATMsystem {
        public static void main(String[] args) {
            // 1.准备容器
            ArrayList<Accounts> accounts = new ArrayList<>();
            showMain(accounts);
        }
 
        public static void showMain(ArrayList<Accounts> accounts) {
            // 2.准备系统首页
            Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("==========阿崽银行为您服务==========");
                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:
                        // 开户
                        newAccount(accounts, sc);
                        break;
 
                    default:
                        System.out.println("输入有误,请重新输入");
                        break;
                }
            }
        }
 
        /**
         * 用户开户功能 开户功能实现:往系统的集合容器中存入一个新的账户对象xx; 1.定义开户方法 2.键盘录入信息
         * 3.生成账户卡号,卡号有系统自动生成9位数字(卡号唯一) 4.创建Account账户类
         *
         * @param accounts,sc
         */
        static String password = "";// 记录用户输入的密码,保证判断密码的循环可以正常使用
 
        public static void newAccount(ArrayList<Accounts> accounts, Scanner sc) {
            System.out.println("==========阿崽银行为您服务==========");
            System.out.println("==========用户开户==========");
 
            // 姓名
            System.out.println("==请输入您的姓名");
            String name = sc.next();
 
            // 密码
            while (true) {
                System.out.println("==请输入您的密码");
                password = sc.next();
                System.out.println("==请再次输入您的密码");
                String okPassword = sc.next();
                // 判断两次密码是否一致
                if (okPassword.equals(password)) {
                    break;
                } else {
                    System.out.println("密码错误,请重新输入");
                }
            }
 
            // 生成卡号(独立),并且卡号不能重复
            // 功能1:随机生成一个卡号 功能2:判断该卡号是否与集合内的卡号重复
            String cardId = createCardId(accounts);
 
            // 每日限额
            System.out.println("==请设置每日取现额度");
            double quoteMoney = sc.nextInt();
 
            double money = 0;
            // 创建一个账户对象封装账户的信息,将得到的信息封装在一个对象里
            // 注意这里要和账户里中的顺序一样且对应,不然存入集合时信息会交叉String userName,String userId,String
            // passWord,double money,double quoteMoney
            Account account = new Account(name, cardId, password, money, quoteMoney);
 
            // 将对象里的内容装入集合
            accounts.add(account);
            System.out.println("==开户成功!您的卡号是:" + cardId);
        }
 
        // 功能1:随机生成一个卡号:使用Random随机一个9位数字符串,且不能重复
        // 该功能返回卡号为字符串类型
        public static String createCardId(ArrayList<Accounts> accounts) {
            while (true) {
                String cardID = "";
                Random r = new Random();
                for (int i = 0; i < 9; i++) {
                    cardID += r.nextInt(10);
                }
                Accounts acc = getCardId(cardID, accounts);// 使用功能二判断,得到的是账户类里面的卡号
                if (acc == null) {
                    return cardID;
                }
            }
        }
 
        // 功能2:判断该卡号是否与集合内的卡号重复,
        // 该功能中 如果卡号重复则报告给功能一继续随机 所以应该返回的是账户类中的卡号
        public static Accounts getCardId(String cardID, ArrayList<Accounts> accounts) {
            for (int i = 0; i < accounts.size(); i++) {
                Accounts acc = accounts.get(i);
                if (acc.getAccount().equals(cardID)) {
                    return acc;
                }
            }
            return null;
        }
 
        /**
         * 用户登录功能实现 1.定义方法 2.让用户输入卡号,根据卡号查询账户对象 3.没有账户,说明卡号不存在,找到账号则继续输入密码
         * 4.密码不正确,继续输入密码。密码正确,登录成功
         *  @param accounts
         * @param sc
         */
        public static void login(ArrayList<Accounts> accounts, Scanner sc) {
 
            while (true) {
                System.out.println("==请输入您的卡号:");
                String cardId = sc.next();
 
                Account acc = getCardId(cardId, accounts);
                if (acc != null) {
                    System.out.println("==请输入密码:");
                    String password = sc.next();
                    // 判断密码是否正确
                    for (int i = 0; i < accounts.size(); i++) {
                        if (accounts.get(i).equals(acc)) {
                            String okPassword = acc.getPassWord();
                            // 密码正确:展示登录页面
                            if (okPassword.equals(password)) {
                                System.out.println(acc.getUserName() + "登录成功");
                                // 展示操作页面
                                UserCommand(sc, acc, accounts);
                                return;// 直接结束当前方法
                            }
                            // 1密码错误,重新输入
                            else {
                                System.out.println("密码错误,请重新输入");
                            }
                        }
                    }
                } else {
                    System.out.println("卡号错误,请重新输入");
                    break;
                }
            }
        }
 
        /**
         * 用户操作页设计
         */
        private static void UserCommand(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("==选择ATM机用户服务:");
                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:
                        // 转账
                        transferAccounts(sc, accounts, acc);
                        break;
 
                    case 5:
                        // 修改密码
                        changePasswd(sc, acc);
                        break;
 
                    case 6:
                        // 退出
                        System.out.println("欢迎下次光临!");
                        return;// 结束当前方法
 
                    case 7:
                        // 注销
                        accountClosing(sc, acc,accounts);
                        return;
 
                    default:
                        System.out.println("==输入有误,请重新输入==");
                }
            }
        }
 
        /**
         * 查看当前账户功能
         *
         * @param acc
         */
        public static void showAccount(Account acc) {
            System.out.println("==========当前账户信息==========");
            System.out.println("卡号:" + acc.getUserId());
            System.out.println("户主:" + acc.getUserName());
            System.out.println("余额" + acc.getMoney());
            System.out.println("当日限额:" + acc.getQuoteMoney());
        }
 
        /**
         * 存款功能 1.拿出当前账户对象 2.输入存款金额 3.调用账户对象的Setmoney将余额修改为存钱后的金额 4.查看一下账户,确认存钱是否成功
         */
        public static void depositMoney(Scanner sc, Account acc) {
            System.out.println("==========存钱==========");
            System.out.println("==请输入存入金额:");
            double m = sc.nextDouble();
            acc.setMoney(acc.getMoney() + m);// 取 余额+存款 赋值到总金额中
            System.out.println("==存款完成==");
            showAccount(acc);// 检查一下
        }
 
        /**
         * 取款功能 1.判断账户是否有钱 2.有钱则拿到账户对象,取款 3.判断取款是否超过当次限额,以及余额是否足够 4.满足则去取款成功
         *
         * @param sc
         * @param acc
         */
 
        public static void drawMoney(Scanner sc, Account acc) {
            System.out.println("==========取钱==========");
            if (acc.getMoney() <= 100) {
                System.out.println("您的余额不足,不支持使用取款功能");
            } else {
                while (true) { // 需要用到循环功能重复输入取款金额
                    System.out.println("操作限额:" + acc.getQuoteMoney());
                    System.out.println("==请输入取款金额:");
                    double m = sc.nextDouble();
                    if (m > acc.getMoney()) {
                        System.out.println("余额不足,请重新输入");
                    } else if (m > acc.getQuoteMoney()) {
                        System.out.println("该金额超过本次限额,请重新输入");
                        // 不需要用break结束,该分支完成后会继续循环
                    } else {
                        acc.setMoney(acc.getMoney() - m);
                        System.out.println("==取款成功==");
                        showAccount(acc);
                        return;// 取钱结束,结束该方法
                    }
                }
            }
        }
 
        /**
         * 转账功能 1.转账需要两个账户,首先判断系统中是否有这两个账户 2.输入对方账户的户主姓氏,判断账户是否正确 3.转账过程中,转账一方账户是否有钱
         * 4.转账
         *
         * @param sc
         * @param accounts
         */
        public static void transferAccounts(Scanner sc, ArrayList<Account> accounts, Account acc) {
            System.out.println("==========转账==========");
            while (true) {
                // 判断有没有可操作用户
                if (accounts.size() < 2) {
                    System.out.println("没有其他账户可选择,不可以转账");
                    return;// 回到首页
                }
                // 判断该账号有没有钱
                if (acc.getMoney() == 0) {
                    System.out.println("余额不足,不可以转账");
                    return;
                }
                while (true) {
                    System.out.println("==请输入对方卡号:");
                    String cardId2 = sc.next();
                    // 判断对方账号是否存在
                    Account acc2 = getCardId(cardId2, accounts);
                    if (acc2 == null) {
                        System.out.println("该账户不存在,请重新输入");
                    }
                    if (acc2.getUserId().equals(acc.getUserId())) {
                        System.out.println("==请输入他人账户");
                    }
                    while (true) {
                        String name = acc2.getUserName();
                        System.out.println("==请确认对方姓氏:" + "*" + name.substring(1));
                        String perName = sc.next();
                        String okPerName = name.substring(0, 1);
                        if (perName.equals(okPerName)) {
                            System.out.println("==请输入转账金额");
                            double money = sc.nextDouble();
                            if (money > acc.getMoney()) {
                                System.out.println("余额不足,请重新输入");
                            } else if (money > acc.getQuoteMoney()) {
                                System.out.println("该金额超过本次限额,请重新输入");
                                // 不需要用break结束,该分支完成后会继续循环
                            } else {
                                acc.setMoney(acc.getMoney() - money);
                                acc2.setMoney(acc2.getMoney() + money);
                                System.out.println("==转账成功==");
                                showAccount(acc);
                                return;// 取钱结束,结束该方法
                            }
 
                        }
                    }
 
                }
            }
        }
 
        /**
         * 修改密码功能 将当前密码用set方法更新
         *
         * @param sc
         * @param acc
         */
        public static void changePasswd(Scanner sc, Account acc) {
            System.out.println("==========修改密码==========");
            while (true) {
                System.out.println("==请您输入当前密码");
                String passwd = sc.next();
                if (acc.getPassWord().equals(passwd)) {
                    System.out.println("请您输入新密码");
                    String newpass = sc.next();
                    System.out.println("请您再次输入密码");
                    String renewpass = sc.next();
                    if (newpass.equals(renewpass)) {
                        acc.setPassWord(newpass);
                        System.out.println("==修改成功!==");
                        return;
                    } else {
                        System.out.println("输入错误,请重新输入");
                    }
                }
            }
        }
 
        /**
         * 销户功能 从集合中删除当前对象
         *
         * @param acc
         */
        public static void accountClosing(Scanner sc, Account acc,ArrayList<Account> accounts) {
            System.out.println("==========销户==========");
            showAccount(acc);
            System.out.println("==确认销户?(Y/N)==");
            String cheak = sc.next();
            if (cheak == "N") {
                return;
            }
            accounts.remove(acc);
            System.out.println("==销户成功,感谢使用阿崽银行==");
            return;
        }
 
    }
 
}
package com.hp.shr;
 
public class Accounts {
    private String account;  //账号
    private String password; //密码
    private double balance;  //余额
    private String bankName; //银行卡名字
    private String name;     //持卡人姓名
 
    public String getAccount() {
        return account;
    }
 
    public void setAccount(String account) {
        this.account = account;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    public double getBalance() {
        return balance;
    }
 
    public void setBalance(double balance) {
        this.balance = balance;
    }
 
    public String getBankName() {
        return bankName;
    }
 
    public void setBankName(String bankName) {
        this.bankName = bankName;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public enety(String account, String password, double balance, String bankName, String name) {
        this.account = account;
        this.password = password;
        this.balance = balance;
        this.bankName = bankName;
        this.name = name;
    }
    public enety() {
 
    }
 
    @Override
    public String toString() {
        return "enety{" +
                "account='" + account + '\'' +
                ", password='" + password + '\'' +
                ", balance=" + balance +
                ", bankName='" + bankName + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值