首页 > 编程语言 >Java入门基础-09综合案例ATM系统

Java入门基础-09综合案例ATM系统

时间:2024-07-23 16:27:16浏览次数:17  
标签:09 Java String ATM System loginAcc 卡号 println out

Java入门基础-09综合案例ATM系统

本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记

Java入门基础课程视频地址

上一章: Java入门基础-08常用API

目录


前言

全部代码在最后面。
后面的课程为面向对象高级

本章是Java入门基础的重点内容之一

在这里插入图片描述

01 系统构架搭建、欢迎页设计

系统构架搭建:

① 定义一个账户类Account,至少需要包含(卡号、姓名、性别、密码、余额、每次取现额度)
② 定义一个ATM类,用来代表ATM系统,负责提供所有的业务需求,比如:展示ATM的系统欢迎页、开通帐户、转账……
③ 定义一个测试类Test,负责对我们开发的ATM系统进行测试。系统欢迎页设计

系统欢迎页设计:

在ATM类中设计一个方法start(),方法里负责展示欢迎界面。

Account.java

package atm;

public class Account {
    private String cardTd;
    private String userName;
    private char sex;
    private String passWord;
    private double money;
    private double limit; // 限额

    public Account() {
    }

    public Account(String cardTd, String userName, char sex, String passWord, double money, double limit) {
        this.cardTd = cardTd;
        this.userName = userName;
        this.sex = sex;
        this.passWord = passWord;
        this.money = money;
        this.limit = limit;
    }

    public String getCardTd() {
        return cardTd;
    }

    public void setCardTd(String cardTd) {
        this.cardTd = cardTd;
    }

    public String getUserName() {
        return userName;
    }

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

    public char getSex() {
        return sex;
    }

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

    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 getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
}

ATM.java

package atm;

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

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>(); // 一定要私有化
    private Scanner sc = new Scanner(System.in);

    /** 启动ATM系统 展示欢迎界面*/
    public void start(){
        System.out.println("========欢迎您进入到了ATM系统========");
        System.out.println("1、用户登录");
        System.out.println("2、用户开户");
        System.out.println("请选择:");
        int command = sc.nextInt();
        switch (command){
            case 1:
                // 用户登录
                break;
            case 2:
                // 用户开户
                break;
            default:
                System.out.println("没有该操作~");
        }
    }

}

Test.java

package atm;

public class Test {
    public static void main(String[] args) {
        // 1、创建一个ATM对象,代表ATM系统
        ATM atm = new ATM();

        // 2、调用ATM对象的start方法,启动系统
        atm.start(); // 对start()方法进行测试
    }
}

对start()方法进行测试,运行结果:

在这里插入图片描述

总结

1、咱们ATM系统的架构是怎么样的?

  • 定义了一个账户类Account,定义系统关心的账户信息。
  • 定义了一个ATM类,代表ATM系统,负责处理账户相关的业务需求
  • 定义了一个Test类,负责测试系统:创建ATM对象代表ATM系统并启动。

2、ATM类中使用什么来存储系统全部用户的账户信息的?

ArrayList accounts = new ArrayList<>();

02 开户功能实现

用户开户功能:

就是新增一个账户,也就是往系统的账户集合中添加一个账户对象。(在ATM中实现)

账户的要求:

  • 用户信息包含:姓名、性别、密码、每次取现额度、卡号。
  • 注意:卡号由系统生成,要求是8位的数字组成的(且卡号不能重复)。

ATM.java

    /** 完成用户开户操作*/
    private void createAccoount(){
        System.out.println("=====系统开户操作=====");
        // 1. 创建一个账户对象,用于封装用户的开户信息
        Account acc = new Account();

        // 2. 需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请输入您的账号名称:");
        String name = sc.next();
        acc.setUserName(name);

        while (true){
            System.out.println("请输入您的性别:");
            char sex = sc.next().charAt(0);
            if (sex == '男' || sex == '女'){
                acc.setSex(sex);
                break;
            }else {
                System.out.println("您的输入有误,只能输入男或女");
            }
        }
        while (true) {
            System.out.println("请输入您的账号密码:");
            String passWord = sc.next();
            System.out.println("请输入您的确认密码:");
            String okpassWord = sc.next();
            // 判断两次输入的密码是否相同
            if (okpassWord.equals(passWord)) {
                acc.setPassWord(passWord);
                break;
            } else {
                System.out.println("您输入的两次密码不一致,请重新输入~");
            }
        }
        System.out.println("请输入您的取现额度:");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

         // 给用户生成一个卡号
        String newCardId = createCardId();
        acc.setCardTd(newCardId);

        // 3. 把这个账户对象,存入到账户集合中去
        accounts.add(acc);
        // 在getUserName()进行对称呼的封装,将语句return userName 改为为:return userName + (sex == '男' ? "先生" : "女士");
        System.out.println("恭喜您, " + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardTd());
    }

总结:
1、开户功能的实现需要哪几步操作?

  • 定义一个开户方法:createAccount。
  • 在方法里创建一个Account账户对象,负责封装用户的账户信息(姓名、性别、密码、卡号等等)。
  • 卡号需要由系统自动生成(卡号要求是8位的数字组成的,且不能重复,等下详细讲解这个)
  • 把账户对象存入到账户集合中去。
  • 提示开户成功!

为新用户的账号生成一个新卡号

需求:卡号要求是8位的数字组成的,且不能重复;新卡号得到后,需要赋值给当前账户对象。(在ATM.java中开发)

代码:

    /**卡号要求是8位的数字组成的,且不能重复*/
    public String createCardId(){
        while (true) {
            // 1. 定义一个String类型的变量记住8位数的数字作为一个卡号
            String cardId = "";
            // 2.利用循环,循环8次,每次产生一个随机数给cardId连接起来
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int data = r.nextInt(10); // 0 - 9
                cardId += data;
            }

            // 3. 判断cardId中记住的卡号,是否与其他账号的卡号重复,没有重复,才可以作为一个新卡号返回。
            Account acc = getAccountByCardId(cardId);
            if (acc == null) {
                return cardId;
            }
        }
    }

    /** 根据卡号查询账户对象返回*/
    private Account getAccountByCardId(String cardId) {
        // 遍历全部的账户对象
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            // 判断这个账号对象acc中的卡号是否是我们要找的卡号
            if(acc.getCardTd().equals(cardId)){
                return acc;
            }
        }
        return null;
    }

总结

1、账户的新卡号是如何生成的?

  • 定义了一个方法:createCardId(),用来返回一个不重复的新卡号。
  • 方法里,使用循环生成了8个随机的数字连起来作为卡号。
  • 接着判断该卡号是否与其他账户的卡号重复。
  • 根据该卡号去账户集合中查询账户对象,如果没有查询到账户对象,该卡号不重复,即可返回。
  • 如果查询到了账户对象,则使用循环重复以上(2、3、4)步操作。

03 登录功能实现

用户登录功能

① 如果系统没有任何账户对象,则不允许登录。
② 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示。
③ 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示,如果密码也正确,则给出登录成功的提示。
方法要私有化
在ATM.java 中前几行记得加: private Account loginAcc; // 用于记住登陆后的用户账号

ATM.java

/** 用户登录功能*/
    private void login(){
        System.out.println("======系统登录=====");
        
        // 1. 判断系统中是否存在账户对象,若不存在,直接结束登录操作
        if (accounts.size() == 0){
            System.out.println("当前系统中不存在用户,请先开户再来登录~");
            return; // 跳出登录方法
        }

        // 2. 系统中存在账户对象,进行登录操作
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您的卡号:");
            String cardId = sc.next();
            // 3. 判断这个卡号是否存在
            Account acc = getAccountByCardId(cardId);
            if (acc == null){
                System.out.println("您输入的卡号不存在,请重新确认~");
            }else {
                while (true) {
                    // 卡号存在,输入密码
                    System.out.println("请输入您的登录密码:");
                    String passWord = sc.next();
                    // 4.判断密码是否正确
                    if (acc.getPassWord().equals(passWord)){
                        loginAcc = acc;
                        System.out.println("恭喜 " + acc.getUserName() + "登录成功, 您的卡号为:" + acc.getCardTd());
                    }else {
                        System.out.println("您输入的密码有误,请重新输入:");
                    }
                }
            }
        }
    }

总结

登录功能如何实现的?

  • 设计一个登录方法:login,负责完成用户的登录。
  • 方法里:如果系统无任何账户对象,直接结束登录操作。
  • 有账户对象,则让用户输入卡号,根据卡号去账户集合中查询账户对象。
  • 如果没有找到账户对象,说明登录卡号不存在,提示继续输入卡号。
  • 如果找到了账户对象,说明卡号存在,继续输入密码。
  • 如果密码不正确,提示继续输入密码。
  • 如果密码也正确,则登陆成功,并给出相应的提示。

04 操作页展示、查询账户、退出账户

操作页展示、查询账户、退出账户分析

① 用户登录成功后,需要进入用户操作页。
② 查询就是直接展示当前登录成功的用户的账户信息。
③ 退出账户就是回到欢迎页面。

ATM.java

 /** 展示用户登录成功的操作界面*/
    private void showUserCommand(){
        while (true) {
            System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户的处理操作:");
            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("请选择:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    // 查询账户
                    showLoginAccount();
                    break;
                case 2:
                    // 存款
                    break;
                case 3:
                    // 取款
                    break;
                case 4:
                    // 转账
                    break;
                case 5:
                    // 密码修改
                    break;
                case 6:
                    // 退出
                    System.out.println(loginAcc.getUserName() + "您退出系统成功,欢迎下次再来");
                    return;
                case 7:
                    // 注销当前账户
                    break;
                default:
                    System.out.println("没有此选择,请重新输入:");
                    break;
                    
                
            }
        }

    }

    
    /** 展示当前用户的账户信息*/
    private void showLoginAccount() {
        System.out.println("====当前您的账户信息如下====");
        System.out.println("卡号:" + loginAcc.getCardTd());
        System.out.println("户主:" + loginAcc.getUserName());
        System.out.println("性别:" + loginAcc.getSex());
        System.out.println("余额:" + loginAcc.getMoney());
        System.out.println("每次取款限额:" + loginAcc.getLimit());
    }

05 存款、取款功能实现

用户存款功能

就是用户为自己的账户存钱,存钱后更新账户的余额即可。

用户取款功能

就是从自己的账户中取钱,取钱的要求:

  1. 需要先判断账户的余额是否大于 >= 100元,如果够,让用户输入取款金额。
  2. 需要判断取款金额是否超过了当次限额,以及余额是否足够。

ATM.java

    /** 存款*/
    private void depositMoney() {
        System.out.println("===存款操作===");
        System.out.println("请输入您的存款金额:");
        double money = sc.nextDouble();

        loginAcc.setMoney(loginAcc.getMoney() + money);
        System.out.println("您以存款:" + money + "元,存款后余额为:" + loginAcc.getMoney());
    }


    /** 取款*/
    private void drawMoney() {
        while (true) {
            System.out.println("===取款操作===");
            // 1. 需要先判断账户的余额是否大于 >= 100元,如果够,让用户输入取款金额。
            if (loginAcc.getMoney() < 100){
                System.out.println("您的金额不足100元,无法取出");
                return;
            }
            // 2.可以取款
            System.out.println("请输入您的取款金额:");
            double money = sc.nextDouble();
            // 3.需要判断取款金额是否超过了当次余额与限额,以及余额是否足够。
            if (loginAcc.getMoney() >= money){
                // 取款金额小于用户余额,判断是否大于限额
                if (loginAcc.getLimit() >= money){
                    loginAcc.setMoney((loginAcc.getMoney() - money));
                    System.out.println("您以取出:" + money + "元,取款后余额为:" + loginAcc.getMoney());
                    break;
                }else {
                    System.out.println("您当前的取款金额超过了每次限额,您每次最多可以取款:" + loginAcc.getLimit());
                }
            }else {
                System.out.println("您当前的取款金额超过了余额,您当前余额为:" + loginAcc.getMoney());
            }
        }
    }


06 转账功能实现

用户转账功能

  • 把钱转给别人,转账前需要判断:
  1. 自己账户是否有钱,系统中是否有其他账户。
  2. 接下来让用户输入对方卡号,判断对方账户是否存在,账户如果存在,还需要认证对方账户的户主姓氏。

ATM.java

/** 用户转账功能*/
    private void transferMoney(){
        System.out.println("===用户转账===");
        // 1.判断系统中是否有其他账户
        if (accounts.size() < 2){
            System.out.println("当前系统只有您一个用户,无法为其他用户转账");
            return;
        }

        // 2. 判断自己账户是否有钱
        if (loginAcc.getMoney() == 0){
            System.out.println("您当前的余额为:0,无法转账");
            return;
        }

        // 3.开始转账
        while (true){
            System.out.println("请输入对方的卡号:");
            String cardId = sc.next();

            // 4.判断卡号是否正确
            Account acc = getAccountByCardId(cardId);
            if (acc == null){
                System.out.println("您输入的卡号有误");
            }else {
                // 卡号存在,让用户认证姓氏
                String name = "*" + acc.getUserName().substring(1);
                System.out.println("请您输入【" + name + "】的姓氏");
                String preName = sc.next();

                // 5.判断这个姓氏是否正确
                if (acc.getUserName().startsWith(preName)){
                    while (true){
                        // 认证通过
                        System.out.println("请输入您要转账的金额:");
                        double money = sc.nextDouble();
                        // 6. 判断转账金额是否大于余额
                        if (loginAcc.getMoney() > money){
                            // 更新自己账户余额
                            loginAcc.setMoney(loginAcc.getMoney() - money);
                            System.out.println("您转账金额为:" + money + "您的余额为:" + loginAcc.getMoney());
                            // 更新对方账户余额
                            acc.setMoney(acc.getMoney() + money);
                            return;

                        }else {
                            System.out.println("您的余额小于转账金额,无法转账,您的余额为:" + loginAcc.getMoney());
                        }
                    }
                }else {
                    System.out.println("您输入的姓氏错误,请重新输入:");
                }
            }
        }
    }

07 销户功能实现

销户操作的基本需求

销户就是从系统中删除当前账户,销户的要求:

  1. 首先要询问用户是否确定要销户,如果不确定,则回到操作界面。
  2. 如果确定,要判断用户的账户中是否有钱,有则不允许销户,并回到操作界面。
  3. 如果没钱,则完成销户,并回到欢迎页。

ATM.java

/**销户操作的基本需求*/
    private boolean deleteAccount(){
        System.out.println("===销户操作==");
        // 1.问一下用户是否要销户
        System.out.println("请问您确认要销户吗?y/n");
        String command = sc.next();

        switch (command){
            case "y":
                // 2.判断用户的账户中是否有钱
                if (loginAcc.getMoney() == 0){
                    accounts.remove(loginAcc);
                    System.out.println("您的账户已经成功注销");
                    return true;
                }else {
                    System.out.println("您的账户还有余额,无法注销");
                    return false;
                }
            default:
                System.out.println("已取消销户操作");
                return false;
        }
    }

08 用户密码修改

密码修改

就是更改账户的密码,修改密码的要求:

  1. 需要先认证用户当前的密码。
  2. 认证通过后,需要让用户输入2次新密码。
  3. 两次密码一样,则更新账户密码,并回到欢迎界面。

ATM.java

/** 密码修改*/
    private void updatePassWord(){
        System.out.println("===密码修改==");
        while (true){
            // 1.需要先认证用户当前的密码
            System.out.println("请输入当前的密码:");
            String passWord = sc.next();
            if (loginAcc.getPassWord().equals(passWord)){
                while (true){
                    System.out.println("请输入新的的密码:");
                    String newPassWord = sc.next();
                    System.out.println("请再次输入密码:");
                    String okNewPassWord = sc.next();
                    if (okNewPassWord.equals(newPassWord)){
                        loginAcc.setPassWord(okNewPassWord);
                        System.out.println("密码修改成功!");
                        return;
                    }else {
                        System.out.println("您两次输入的密码不一致,请重新输入");
                    }
                }
            }else {
                System.out.println("您输入的密码错误,请重新输入");
            }
        }

    }

全部代码

Account.java

public class Account {
    private String cardTd;
    private String userName;
    private char sex;
    private String passWord;
    private double money;
    private double limit; // 限额

    public Account() {
    }

    public Account(String cardTd, String userName, char sex, String passWord, double money, double limit) {
        this.cardTd = cardTd;
        this.userName = userName;
        this.sex = sex;
        this.passWord = passWord;
        this.money = money;
        this.limit = limit;
    }

    public String getCardTd() {
        return cardTd;
    }

    public void setCardTd(String cardTd) {
        this.cardTd = cardTd;
    }

    public String getUserName() {
        return userName + (sex == '男' ? "先生" : "女士");
    }

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

    public char getSex() {
        return sex;
    }

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

    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 getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
}

ATM.java

package atm;

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

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>(); // 一定要私有化
    private Scanner sc = new Scanner(System.in);
    private Account loginAcc; // 记住登陆后的用户账号

    /** 启动ATM系统 展示欢迎界面*/
    public void start(){
        while (true) {
            System.out.println("========欢迎您进入到了ATM系统========");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.println("请选择:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    // 用户登录
                    login();
                    break;
                case 2:
                    // 用户开户
                    createAccoount();
                    break;
                default:
                    System.out.println("没有该操作~");
            }
        }
    }


    /** 完成用户开户操作*/
    private void createAccoount(){
        System.out.println("=====系统开户操作=====");
        // 1. 创建一个账户对象,用于封装用户的开户信息
        Account acc = new Account();

        // 2. 需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请输入您的账号名称:");
        String name = sc.next();
        acc.setUserName(name);

        while (true){
            System.out.println("请输入您的性别:");
            char sex = sc.next().charAt(0);
            if (sex == '男' || sex == '女'){
                acc.setSex(sex);
                break;
            }else {
                System.out.println("您的输入有误,只能输入男或女");
            }
        }
        while (true) {
            System.out.println("请输入您的账号密码:");
            String passWord = sc.next();
            System.out.println("请输入您的确认密码:");
            String okpassWord = sc.next();
            // 判断两次输入的密码是否相同
            if (okpassWord.equals(passWord)) {
                acc.setPassWord(passWord);
                break;
            } else {
                System.out.println("您输入的两次密码不一致,请重新输入~");
            }
        }
        System.out.println("请输入您的取现额度:");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

        // 给用户生成一个卡号
        String newCardId = createCardId();
        acc.setCardTd(newCardId);

        // 3. 把这个账户对象,存入到账户集合中去
        accounts.add(acc);
        // 在getUserName()进行对称呼的封装,将语句return userName 改为为:return userName + (sex == '男' ? "先生" : "女士");
        System.out.println("恭喜您, " + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardTd());
    }


    /**卡号要求是8位的数字组成的,且不能重复*/
    public String createCardId(){
        while (true) {
            // 1. 定义一个String类型的变量记住8位数的数字作为一个卡号
            String cardId = "";
            // 2.利用循环,循环8次,每次产生一个随机数给cardId连接起来
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int data = r.nextInt(10); // 0 - 9
                cardId += data;
            }

            // 3. 判断cardId中记住的卡号,是否与其他账号的卡号重复,没有重复,才可以作为一个新卡号返回。
            Account acc = getAccountByCardId(cardId);
            if (acc == null) {
                return cardId;
            }
        }
    }


    /** 根据卡号查询账户对象返回*/
    private Account getAccountByCardId(String cardId) {
        // 遍历全部的账户对象
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            // 判断这个账号对象acc中的卡号是否是我们要找的卡号
            if(acc.getCardTd().equals(cardId)){
                return acc;
            }
        }
        return null;
    }


    /** 用户登录功能*/
    private void login(){
        System.out.println("======系统登录=====");

        // 1. 判断系统中是否存在账户对象,若不存在,直接结束登录操作
        if (accounts.size() == 0){
            System.out.println("当前系统中不存在用户,请先开户再来登录~");
            return; // 跳出登录方法
        }

        // 2. 系统中存在账户对象,进行登录操作
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您的卡号:");
            String cardId = sc.next();
            // 3. 判断这个卡号是否存在
            Account acc = getAccountByCardId(cardId);
            if (acc == null){
                System.out.println("您输入的卡号不存在,请重新确认~");
            }else {
                while (true) {
                    // 卡号存在,输入密码
                    System.out.println("请输入您的登录密码:");
                    String passWord = sc.next();
                    // 4.判断密码是否正确
                    if (acc.getPassWord().equals(passWord)){
                        loginAcc = acc;
                        System.out.println("恭喜 " + acc.getUserName() + "登录成功, 您的卡号为:" + acc.getCardTd());
                        // 展示登陆后用户操作界面
                        showUserCommand();
                        return; // 跳出并结束当前方法
                    }else {
                        System.out.println("您输入的密码有误,请重新输入:");
                    }
                }
            }
        }
    }


    /** 展示用户登录成功的操作界面*/
    private void showUserCommand(){
        while (true) {
            System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户的处理操作:");
            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("请选择:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    // 查询账户
                    showLoginAccount();
                    break;
                case 2:
                    // 存款
                    depositMoney();
                    break;
                case 3:
                    // 取款
                    drawMoney();
                    break;
                case 4:
                    // 转账
                    transferMoney();
                    break;
                case 5:
                    // 密码修改
                    updatePassWord();
                    break;
                case 6:
                    // 退出
                    System.out.println(loginAcc.getUserName() + "您退出系统成功,欢迎下次再来");
                    return;
                case 7:
                    // 注销当前账户
                    if(deleteAccount()){
                        return;
                    }
                    break;
                default:
                    System.out.println("没有此选择,请重新输入:");
                    break;


            }
        }
    }


    /** 展示当前用户的账户信息*/
    private void showLoginAccount() {
        System.out.println("====当前您的账户信息如下====");
        System.out.println("卡号:" + loginAcc.getCardTd());
        System.out.println("户主:" + loginAcc.getUserName());
        System.out.println("性别:" + loginAcc.getSex());
        System.out.println("余额:" + loginAcc.getMoney());
        System.out.println("每次取款限额:" + loginAcc.getLimit());
    }


    /** 存款*/
    private void depositMoney() {
        System.out.println("===存款操作===");
        System.out.println("请输入您的存款金额:");
        double money = sc.nextDouble();

        loginAcc.setMoney(loginAcc.getMoney() + money);
        System.out.println("您以存款:" + money + "元,存款后余额为:" + loginAcc.getMoney());
    }


    /** 取款*/
    private void drawMoney() {
        while (true) {
            System.out.println("===取款操作===");
            // 1. 需要先判断账户的余额是否大于 >= 100元,如果够,让用户输入取款金额。
            if (loginAcc.getMoney() < 100){
                System.out.println("您的金额不足100元,无法取出");
                return;
            }
            // 2.可以取款
            System.out.println("请输入您的取款金额:");
            double money = sc.nextDouble();
            // 3.需要判断取款金额是否超过了当次余额与限额,以及余额是否足够。
            if (loginAcc.getMoney() >= money){
                // 取款金额小于用户余额,判断是否大于限额
                if (loginAcc.getLimit() >= money){
                    loginAcc.setMoney((loginAcc.getMoney() - money));
                    System.out.println("您以取出:" + money + "元,取款后余额为:" + loginAcc.getMoney());
                    break;
                }else {
                    System.out.println("您当前的取款金额超过了每次限额,您每次最多可以取款:" + loginAcc.getLimit());
                }
            }else {
                System.out.println("您当前的取款金额超过了余额,您当前余额为:" + loginAcc.getMoney());
            }
        }
    }


    /** 用户转账功能*/
    private void transferMoney(){
        System.out.println("===用户转账===");
        // 1.判断系统中是否有其他账户
        if (accounts.size() < 2){
            System.out.println("当前系统只有您一个用户,无法为其他用户转账");
            return;
        }

        // 2. 判断自己账户是否有钱
        if (loginAcc.getMoney() == 0){
            System.out.println("您当前的余额为:0,无法转账");
            return;
        }

        // 3.开始转账
        while (true){
            System.out.println("请输入对方的卡号:");
            String cardId = sc.next();

            // 4.判断卡号是否正确
            Account acc = getAccountByCardId(cardId);
            if (acc == null){
                System.out.println("您输入的卡号有误");
            }else {
                // 卡号存在,让用户认证姓氏
                String name = "*" + acc.getUserName().substring(1);
                System.out.println("请您输入【" + name + "】的姓氏");
                String preName = sc.next();

                // 5.判断这个姓氏是否正确
                if (acc.getUserName().startsWith(preName)){
                    while (true){
                        // 认证通过
                        System.out.println("请输入您要转账的金额:");
                        double money = sc.nextDouble();
                        // 6. 判断转账金额是否大于余额
                        if (loginAcc.getMoney() > money){
                            // 更新自己账户余额
                            loginAcc.setMoney(loginAcc.getMoney() - money);
                            System.out.println("您转账金额为:" + money + "您的余额为:" + loginAcc.getMoney());
                            // 更新对方账户余额
                            acc.setMoney(acc.getMoney() + money);
                            return;

                        }else {
                            System.out.println("您的余额小于转账金额,无法转账,您的余额为:" + loginAcc.getMoney());
                        }
                    }
                }else {
                    System.out.println("您输入的姓氏错误,请重新输入:");
                }
            }
        }
    }

    /**销户操作的基本需求*/
    private boolean deleteAccount(){
        System.out.println("===销户操作==");
        // 1.问一下用户是否要销户
        System.out.println("请问您确认要销户吗?y/n");
        String command = sc.next();

        switch (command){
            case "y":
                // 2.判断用户的账户中是否有钱
                if (loginAcc.getMoney() == 0){
                    accounts.remove(loginAcc);
                    System.out.println("您的账户已经成功注销");
                    return true;
                }else {
                    System.out.println("您的账户还有余额,无法注销");
                    return false;
                }
            default:
                System.out.println("已取消销户操作");
                return false;
        }
    }

    /** 密码修改*/
    private void updatePassWord(){
        System.out.println("===密码修改==");
        while (true){
            // 1.需要先认证用户当前的密码
            System.out.println("请输入当前的密码:");
            String passWord = sc.next();
            if (loginAcc.getPassWord().equals(passWord)){
                while (true){
                    System.out.println("请输入新的的密码:");
                    String newPassWord = sc.next();
                    System.out.println("请再次输入密码:");
                    String okNewPassWord = sc.next();
                    if (okNewPassWord.equals(newPassWord)){
                        loginAcc.setPassWord(okNewPassWord);
                        System.out.println("密码修改成功!");
                        return;
                    }else {
                        System.out.println("您两次输入的密码不一致,请重新输入");
                    }
                }
            }else {
                System.out.println("您输入的密码错误,请重新输入");
            }
        }

    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        // 1、创建一个ATM对象,代表ATM系统
        ATM atm = new ATM();

        // 2、调用ATM对象的start方法,启动系统
        atm.start(); // 对start()方法进行运行


    }
}

标签:09,Java,String,ATM,System,loginAcc,卡号,println,out
From: https://blog.csdn.net/m0_64126885/article/details/140574400

相关文章

  • 三种语言实现计算逆序对的数量(C++/Python/Java)
    题目给定一个长度为......
  • 第二章-Java内存区域与内存溢出异常-随笔
    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。1.程序计数器程序计数器可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序......
  • 第一百七十六节 Java IO教程 - Java内存通道、Java文件锁
    JavaIO教程-Java内存通道对文件执行I/O的另一种方法是将文件的一个区域映射到物理内存,并将其作为内存数组。我们可以使用MappedByteBuffer来执行内存映射文件I/O。要使用内存映射文件I/O,请为文件获取FileChannel对象,并使用FileChannel的map()方法获取MappedByteBuffer。......
  • 第一百七十六节 Java IO教程 - Java文件系统、Java路径
    JavaIO教程-Java文件系统Java7引入了新的输入/输出2(NIO.2)API并提供了一个新的 I/OAPI。它向Java类库添加了三个包:java.nio.file,java.nio.file.attribute和java.nio.file.spi。文件系统FileSystem类的对象表示Java程序中的文件系统。FileSystem对象用于执行两个任务......
  • Java实现七大排序(二)
    一.交换排序1.冒泡排序这个太经典了,每个学编程都绕不开的。原理跟选择排序差不多,不过冒泡排序是直接交换。publicstaticvoidbubbleSort(int[]array){for(inti=0;i<array.length-1;i++){for(intj=0;j<array.length-1-i;j++)......
  • 三种语言实现归并排序(C++/Python/Java)
    题目给定你一个长度为......
  • 系统整容纪:揭秘Java编程之美:掌握这些编码规范,让你的代码一跃成为行业典范
     分享工作中的点点滴滴,贯彻千里之行,始于足下,最终以微不足道的量变引起化蝶的质变精神。以自己为例拒绝在舒适的中央区域安逸的躺着,以便在不知不觉中被社会所淘汰,也不盲目的直接跃迁进困哪区域,在受挫的同时又跌回原有的舒适区域内,造成这样一个浑浑噩噩的让人无法进步的循环怪圈......
  • 力扣209. 长度最小的子数组C++、窗口写法
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例1:输入:target=7,nums=[2,3,1,2,4,3]......
  • 实例说明如何使用Java 8的Function接口使得代码更加简洁以及降低重复性
    什么是Function接口?Function接口是Java8中引入的一个功能性接口,位于java.util.function包下。它代表了一个接受一个参数并产生结果的函数。这个接口只有一个抽象方法apply(Tt),用于对传入的参数应用某种操作并返回一个结果。@FunctionalInterfacepublicinterfaceFunct......
  • JAVA面试题:HashMap和HashTable的区别
    一、先说结论        HashMap和HashTable都是Map接口的实现类。HashMap采用数组、链表和红黑树的数据结构,非线性安全且无序,查找效率高,初始化默认容量为2^4,每次扩容为原来的2倍;而HashTable采用数组和链表的数据结构,线性安全,键值均不允许为null,默认初始大小......