ATM项目练习

1.需求及步骤

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代码部分

package itheima.com.atmm;
//测试类Test
public class Test {
    public static void main(String[] args){
        //1.创建ATM对象,代表ATM系统
        ATM atm = new ATM();

        //2.调用ATM的start方法启动系统
        atm.start();
    }
}
package itheima.com.atmm;
//进行存储信息
public class Account {
    private String cardId;
    private String userName;
    private char sex;
    private String passWord;
    private double money;
    private double limit;//限额
    //右键选择generate生成getter and setter
    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    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;
    }
}
package itheima.com.atmm;

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

//主要的操作ATM的部分
public class ATM {
    //创建了一个大的集合accounts
    private ArrayList<Account> accounts = new ArrayList<>();//[]
    private Scanner sc = new Scanner(System.in);
    private Account loginAcc;//记住登录后的用户账户,方便后续转账等操作

    /*   启动ATM系统展示欢迎界面    */
    public void start() {
        //考虑到可能会输入一些其他的内容,ctrl+alt+t  快速生成死循环,保证输入正确为止
        while (true) {
            System.out.println("===欢迎您进入到了ATM系统===");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.println("请选择: ");
            int command = sc.nextInt();
            //利用不同的命令来选择对应的功能,需要注意的是这里的command是int类型,是考虑真实的实际考虑,ATM按键只会是数字
            switch (command) {
                case 1:
                    //用户登录
                    login();
                    break;
                case 2:
                    //用户开户
                    //将开户功能做一个独立的方法,进行调用使用即可,快捷键:alt+enter快速创建新方法
                    createAccount();
                    break;
                default:
                    System.out.println("没有该操作");
            }
        }
    }

    //完成用户的登录操作
    private void login() {
        System.out.println("==系统登录==");
        //1.判断系统中是否存在账户对象,存在才能进行登录,如果不存在,直接结束登录操作,可以提醒用户进行开户
        if (accounts.size() == 0) {
            System.out.println("当前系统中无任何账户,请先开户之后再来登录");
            return;//跳出方法,也就是结束登录操作
        }
        //2.系统中存在账户对象,可以开始进行登录操作
        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("恭喜您," + loginAcc.getUserName() + "成功登录了系统,您的卡号是:" + loginAcc.getCardId());
                        //这里是登录成功之后的后续操作
                        showUserCommand();
                        return;//跳出并结束当前登录方法(只有已经跳出了showUserCommand方法,才能执行跳出登录方法,回到初始界面
                    } 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:
                    //密码修改
                    updataPassWord();
                    return;//跳出并结束当前方法
                case 6:
                    //退出
                    System.out.println(loginAcc.getUserName() + "您退出系统成功");
                    return;//跳出并结束当前方法
                case 7:
                    //注销登录账户
                    //进行判断,如果真的注销成功了,将返回到欢迎界面
                    if(deleteAccount()){
                        return;
                    }
                default:
                    System.out.println("您当前选择的操作是不存在的,请重新进行输入");
            }
        }

    }

    private void updataPassWord() {
        System.out.println("==账户密码修改操作==");
        //1.提醒用户认证当前密码
        System.out.println("请您输入当前账户的密码:");
        String passWord = sc.next();
        //2.认证当前输入的密码是否正确
        if(loginAcc.getPassWord().equals(passWord)){
            //认证通过
            //3.开始进行修改密码
            while (true) {
                System.out.println("请您输入新密码:");
                String newPassWord = sc.next();
                System.out.println("请您再次输入密码:");
                String okPassWord = sc.next();
                //4.进行判断两次的密码是否是一致的
                if(newPassWord.equals(okPassWord)){
                    //开始进行修改密码
                    loginAcc.setPassWord(okPassWord);
                    System.out.println("恭喜您,您的密码修改成功了");

                }else{
                    System.out.println("您输入的2次密码不一致,请重新进行输入");
                }
            }
        }
        else{
            System.out.println("您当前输入的密码不正确~~");
        }
    }

    //这里用boolean返回值形式,是否进行销户
    private boolean deleteAccount() {
        System.out.println("==进行销户操作==");
        //1.问问用户是否确定要销户,以防是用户误触了
        System.out.println("请问您确认要销户吗? y/n");
        String command = sc.next();
        switch(command){
            case "y":
                //确定要销户
                //2.确定用户的账户中是否有钱:logicAcc
                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 transferMoney() {
        System.out.println("===转账操作==");
        //1.先进行判断系统中是否存在其他的用户
        if(accounts.size()<2) {
            System.out.println("当前系统只有你一个账户,无法为其他账户进行转账操作");
            return;  //直接跳出转帐操作
        }
        //2.判断自己的账户中是否有余额
        if(loginAcc.getMoney() == 0){
            System.out.println("您自己都没钱辣,就别想着给别人转辣");
            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(money > loginAcc.getMoney()){
                            System.out.println("您的余额不足,无法给对方转这么多钱,您最多可以转" + loginAcc.getMoney());
                        }else{
                            //进行转账操作,对自己的余额进行更新
                            loginAcc.setMoney(loginAcc.getMoney()-money);
                            //更新对方的余额
                            acc.setMoney((acc.getMoney()+money));
                            return;   //跳出转账方法
                        }
                    }
                }
                else{
                    System.out.println("对不起,您的姓氏认证有问题,请仔细进行检查");
                }


            }
        }
    }

    /**取钱操作 **/

    private void drawMoney() {
        System.out.println("==取钱操作==");

        //1.假定自己的银行卡余额低于100,此时就不能从ATM取钱了,提示去前台办理取钱业务,需要先进行判断
        if(loginAcc.getMoney()<100){
            System.out.println("您的余额不足以100元,不支持在ATM机进行取钱操作,需要取钱请到前台进行办理");
        }

        while (true) {
            //2.让用户输入取款的金额
            System.out.println("请您输入要取的金额:");
            double money = sc.nextDouble();

            //3.判断余额是否足够
            if(loginAcc.getMoney()>money){
                //说明余额是足够的
                //4.进一步判断取款金额是否超过了取款的限额
                if(money  > loginAcc.getLimit())
                {
                    //进行提示,每次最多取多少
                    System.out.println("您当前的取款金额超过了每次的限额,您每次最多可以取" + loginAcc.getLimit());
                } else{
                    loginAcc.setMoney(loginAcc.getMoney()-money);
                    System.out.println("恭喜您,您取款" + money + "成功,取款后的余额是:" + loginAcc.getMoney());
                    break;
                }
                } else{
                System.out.println("您的余额不足,您的账户余额为" + loginAcc.getMoney());
            }
        }
    }

    //* 存钱操作  **/
    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 showLoginAccount() {
        System.out.println("==当前您的账户信息如下:==");
        System.out.println("卡号" + loginAcc.getCardId());
        System.out.println("户主" + loginAcc.getUserName());
        System.out.println("性别" + loginAcc.getSex());
        System.out.println("余额" + loginAcc.getMoney());
        System.out.println("每次取现的额度" + loginAcc.getLimit());

    }


    //完成用户开户操作
    private void createAccount() {
        //1.创建一个账户对象,用于封装用户的开户信息
        Account acc = new Account();
        //2.需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请您输入您的账户名称:");
        String name = sc.next();
        //利用set方法将内容放在账户对象中
        acc.setUserName(name);
        //尽可能考虑一切的情况,并且给出一些提示加以提醒
        while (true) {
            System.out.println("请您输入您的性别:");
            char sex = sc.next().charAt(0); //取第一个元素的作为性别
            //之所以用sc.next().charAt(0)是因为没有nextchar方法
            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("您输入的2次密码不一致,请您重新输入");
            }
        }
        System.out.println("请您输入您的取款限额:");
        double limit = sc.nextDouble();
        acc.setLimit(limit);


        //重点:需要为这个账户生成一个卡号(由系统自动生成,用8位数字进行表示,但不能与其他账户的卡号有所重复
        //使用createcardId方法来生成一个随机不重复的卡号
        String newCardId = createCardId();
        acc.setCardId(newCardId);

        //3.把这个账户对象,存入到账户集合中去
        accounts.add(acc);
        //为了输出称呼开户人是先生还是女士,稍微对Accout类的UserName稍微进行调整,直接进行封装在一起
        System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的开户卡号是:" + acc.getCardId());
    }

    /*返回一个8位数字的卡号,并且这个卡号不能与其他的账户的卡号重复,有返回值,不能void*/
    private String createCardId() {
        //1.定义了一个String类型的变量来记住8位数字作为一个卡号
        while (true) {
            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.需要对生成的随机卡号,和系统中其他账户是否重复,没有重复时,才可以作为一个新卡号进行返回
            Account acc = getAccountByCardId(cardId);
            if (acc == null) {
                //说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它作为一个新卡号
                return cardId;
            }
        }
    }



/**根据卡号查询账户对象返回accounts =[c1,c2,c3,...]*/
    private Account getAccountByCardId(String cardId) {
        //遍历全部的账户对象
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            //判断这个账户对象acc中的卡号是否是要找的卡号
            if(acc.getCardId().equals(cardId))
            {
                return acc;
            }
        }
        return null;//这个卡号是不存在的,因此也就是可以作为新账户的卡号
    }


}

3.代码运行结果(各个部分的结果)

在这里插入图片描述
开户
在这里插入图片描述
登录
在这里插入图片描述
登录之后
查询信息
在这里插入图片描述
取钱
在这里插入图片描述
转账
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cd6e8b83cf4d4981848603e248ba5888.png
在这里插入图片描述
销户
在这里插入图片描述
在这里插入图片描述

4.总结:

在这里插入图片描述
1.快捷键的使用:

ctrl +c,v,a(复制,粘贴,全选)
ctrl+x,剪切
psvm,main主方法
.sout(打印)
fori 快速生成for循环
alt+enter快速创建新方法
ctrl+alt+t快速生成死循环相关

2.return跳出整个方法
3.break跳出分支(方法已经跳出的情况下,分支就肯定一定跳出去了)
4.使用全局变量private Account loginAcc;//记住登录后的用户账户,尤其方便后续的转账操作
5. private Account getAccountByCardId(String cardId) 这个方法是一个关键,判断是否开户的账户重复了,也能通过该方法判断,是否有转账的对象
6. 什么时候会用到死循环呢,尽可能地多的可能性,不知道会发生些那些,为了让回到正确的选择上,避免bug的出现,使用死循环来进行实现。
后面再有别的想法了,再接着写。
未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值