项目初体验——ATM机

最近在哔哩哔哩网站上观看黑马程序员的课,我在里面的视频讲解中观看了有关ATM机项目的内容,视频中的老师提到这个项目是对之前内容的练习,于是我跟着视频的思路自己做了一遍这个项目

项目需求:

1.建立一个ATM机虚拟案例,打开程序里面包含开户与登录界面

2.登录账户后,里面有 查询、存款、取款、修改密码、转账、退出、销户等操作

3、通过开户获得一个随机的卡号,通过卡号与密码进行登录。

我先建立了一个ATM类用来存储信息

package atm;

public class ATM {
      
    private String cardId;
    private String userName;//用户名
    private String passWord;//密码
    private double money;//账户余额
    private double quotaMoney;//每次取钱额度
    public String getCardId() {
        return cardId;
    }
    public void setCardId(String cardId) {
        this.cardId = cardId;
    }
    public String getUserName() {
        return userName;
    }
    public  void setUserName(String userName) {
        this.userName = userName;
    }
    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 getQuotaMoney() {
        return quotaMoney;
    }
    public void setQuotaMoney(double quotaMoney) {
        this.quotaMoney = quotaMoney;
    }
    

}

后来建立了ATMamange类,用来实现不同功能

源码如下

package atm;
/*
 * ATM系统的入口
 */
import java.util.ArrayList;
import java.util.Scanner;
import  java.util.Random;
public class ATMmanage {
    public static void main(String[]args)
    {
        //1.定义账户类
        //2.定义一个集合容器,负责以后存储全部的账户对象,进行相关业务操作
        ArrayList <ATM> accounts=new ArrayList<>();    
        Scanner sc=new Scanner(System.in);
        //3.显示系统的首页
        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( accounts,sc);
                break;
            case 2:
                //用户账户开户
                register(accounts,sc);
                break;
                default:
                    System.out.println("您输入的操作命令不存在");
            }
        }
    }/*
    登录功能
    */
    
    private static void login(ArrayList<ATM>accounts,Scanner sc)
    {
        System.out.println("===================账户登录操作======================");
        //1.系统集合中是否存在账户,如果不存在账户,登录功能不能进行
        if(accounts.size()==0)
        {
            System.out.println("对不起,当前系统中,无任何账户,请先开户,再来登录");
            return ;
        }
        //2.进入登录功能
        while (true)
        {
        System.out.println("请您输入登录卡号:");
        String cardId=sc.next();
        //3.判断卡号是否存在
        ATM ac= getAccountBycardId(cardId,accounts);
        if(ac!=null)
        {
            while(true)
            {
            //卡号存在
            //让用户输入密码
            System.out.println("请您输入账户密码:");
            String passWord=sc.next();
            //判断密码的对错
            if(ac.getPassWord().equals(passWord))
            {
                System.out.println("恭喜您,"+ac.getUserName()+"先生/女生登录成功,您的卡号为:"+ac.getCardId());
                menu(sc,ac,accounts);
                return ;//退出登录界面
            }
            else
            {
                System.out.println("对不起,您输入的密码有误,请重新输入");
            }
            }
        }
        else {
            System.out.println("对不起,该账户中没有该卡号");
        }
        }
        
    }
    /*
     * 用户开户功能的实现
     * 
     */
    private static  void register(ArrayList<ATM> accounts ,Scanner sc)
    {
        System.out.println("===================账户开户操作======================");
        // 1.创建一个账户对象,用于后期封装客户信息
        ATM atm =new ATM();
        //2.录入当前账户的信息,注入到账户对象
        System.out.println("请您输入账户用户名:");
        String userName=sc.next();
        atm.setUserName(userName);
        
        while(true)
        {
            System.out.println("请您输入账户密码:");
            String passWord=sc.next();
            System.out.println("请您输入确认密码:");
            String okpassWord=sc.next();
            if(okpassWord.equals(passWord))
            {
                atm.setPassWord(okpassWord);
                break;//密码录入成功,跳出循环
            }
            else
            {
                System.out.println("对不起,您输入的两次密码不一致,请您重新确认");
            }
        }
        System.out.println("请您输入账户当次限额");
        double quotaMoney=sc.nextDouble();
        atm.setQuotaMoney( quotaMoney);
        //为账户随机生成一个不与其他账户重复的号码
        String cardId=getRandomCardId(accounts);
        atm.setCardId(cardId);
        //3.把账户对象添加到账户集合中去
        accounts.add(atm);
        System.out.println("恭喜您,"+userName+"先生/女生,您开户成功,您的账户为"+cardId+",请您妥善保管");
        
        
    }
    public static void menu(Scanner sc,ATM ac,ArrayList<ATM>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、注销当前账户:");
        int num=sc.nextInt();
        switch(num)
        {
        case 1://查询
            showaccount(ac);
            break;
        case 2://存款
            depositMoney(sc,ac);
            break;
        case 3://取款
            drawMoney(sc,ac);
            break;
        case 4://转账
            transferMoney(ac,sc,accounts);
            break;
        case 5://修改密码
            updatePassWord(sc,ac);
            return ;
        case 6://退出
            System.out.println("退出成功,欢迎下次光临");
            return ;//退出菜单界面
        case 7://注销当前账户
            deleteAccount(ac,sc,accounts);
            return ;
            default :
                System.out.println("对不起,您的操作有误,请重新输入");
        }
        }
    }
    /*
     * 查询界面
     */
    private static void showaccount(ATM ac)
    {
        System.out.println("=============当前账户信息=================");
        System.out.println("卡号:"+ac.getCardId());
        System.out.println("户主:"+ac.getUserName());
        System.out.println("余额:"+ac.getMoney());
        System.out.println("限额:"+ac.getQuotaMoney());
    }
    /*
     *存钱
     */
    private static void depositMoney(Scanner sc,ATM ac)
    {
        System.out.println("=============用户存钱操作=================");
        System.out.println("请您输入存款金额:");
        double money=sc.nextDouble();
        //更改账户余额,原来的钱加存入的钱
        ac.setMoney(money+ac.getMoney());
         
        System.out.println("恭喜您,存款成功");
        showaccount(ac);
    }
    /*
     * 取钱功能
     */
    private static void drawMoney(Scanner sc,ATM ac)
    {
        //1.判断余额是否超过100元
        if(ac.getMoney()<100)
        {
            System.out.println("对不起,当前余额不足100元,不能取钱");
            return ;
        }
        //2.提示用户输入取钱金额
        System.out.println("请您输入取款金额:");
        double money =sc.nextDouble();
        
        //3.判断这个金额是否满足要求
        if(money>ac.getQuotaMoney())
        {
            System.out.println("对不起,您取款的金额超过了每次限额,每次最多取"+ac.getQuotaMoney()+"元");
        }
        else
            //没有超过限额
            //4.判断是否超过余额
        {
            if(money>ac.getMoney())
            {
                System.out.println("对不起,您的账户余额不足,现在余额为"+ac.getMoney()+"元");
            }
            else {
                //可以取钱
                System.out.println("恭喜您,取款成功");
                //更新余额
                ac.setMoney(ac.getMoney()-money);
                showaccount(ac);
                return ;
            }
        }
    }
    /*
     * 转账功能
     */
    private static void transferMoney(ATM ac,Scanner sc, ArrayList<ATM>accounts)
    {
        System.out.println("=============用户转账操作=================");
        //1.判断是否足够两个账户
        if(accounts.size()<2)
        {
            System.out.println("当前系统中,不足2个账户,请先去开户");
            return ;
        }
        //2.判断自己账户是否有钱
        if(ac.getMoney()==0)
        {
            System.out.println("对不起,您自己都没钱了,不要再转账了");
            return ;
        }
        //3.开始转账
        while(true)
        {
        System.out.println("请你输入对方账户的卡号:");
        String cardId=sc.next();
        if(cardId.equals(ac.getCardId()))
        {
            System.out.println("对不起,您不可以给自己转账");
            continue;
        }
        //判断账户是否存在
        ATM account=getAccountBycardId(cardId, accounts);
        if(account==null)
        {
            System.out.println("对不起,您输入的这个账号不存在");
        }
        else
        {
            //这个账户存在,继续确定姓氏
            String userName=account.getUserName();
            String tip="*"+userName.substring(1);
            System.out.println("请您输入["+tip+"]的姓氏");
            String preName =sc.next();
            //认证姓氏是否认证
            if(userName.startsWith(preName))
            {
                while(true)
                {
                //认证通过,开始转账
                System. out.println("请输入您要转账的金额:");
                double money=sc.nextDouble();
                //判断金额是否足够
                if(money>ac.getMoney())
                {
                    System.out.println("对不起,您的余额不足,您最多可以转账:"+ac.getMoney());
                }
                else
                {
                    ac.setMoney(ac.getMoney()-money);
                    account.setMoney(account.getMoney()+money);
                    System.out.println("转账成功,您的账户余额为"+ac.getMoney());
                    return ;
                }
                }
                }
            else{
                    System.out.println("对不起,您输入的姓氏有误,请重新输入");
                }
            
        }
        
        }
        
    }
    /*
     * 修改密码
     */
    private static void updatePassWord(Scanner sc,ATM ac)
    {
        System.out.println("=============用户密码修改=================");
        while(true)
        {
            System.out.println("请您输入当前密码");
            String passWord=sc.next();
            //判断这个密码是否正确
            if(passWord.equals(ac.getPassWord()))
            {
                //密码正确
                //输入新密码
                System.out.println("请您输入新密码:");
                String newPassWord=sc.next();
                System.out.println("请您确认新密码:");
                String okPassWord=sc.next();
                //判断是否相等
                if(newPassWord.equals(okPassWord))
                {

                    //两次密码一致
                    ac.setPassWord(okPassWord);
                    System.out.println("恭喜您,密码修改成功");
                    return ;
                }
                else
                {
                    System.out.println("您输入的2次密码不一致");
                }
            }
        }
    }
    private static void deleteAccount(ATM ac,Scanner sc,ArrayList<ATM>accounts)
    {
         System.out.println("您真的要销户?y/n");
         String rs =sc.next();
         switch(rs)
         {
         case "y":
             //真正的销户
             if(ac.getMoney()>0)
             {
                 System.out.println("您账户中还有钱没有取完,不允许销户");
             }
             else
             {
                 accounts.remove(ac);
                 System.out.println("您的账户销户完成");
             }
             break;
             default :
                 System.out.println("好的,您的账户继续保留");
                 
         }
    }
    /*/
     为用户随机生成一个随机号码
     */
    private static String getRandomCardId(ArrayList <ATM> accounts)
    {
        //1.生成8位数字
        Random r=new Random();
        while(true)
        {
        String cardId="";
        for(int i=0;i<8;i++)
        {
            cardId+=r.nextInt(10);
        }
        //2.判断这个号码是否重复
        ATM ac= getAccountBycardId(cardId,accounts);
         if(ac==null)
         {
             return cardId;
         }
        }
    }
    private static ATM getAccountBycardId(String cardId,ArrayList<ATM> accounts)
    {
        for(int i=0;i<accounts.size();i++)
        {
            ATM ac=accounts.get(i);
            if(ac.getCardId().equals(cardId))
            {
                return ac;
            }
        }
        return null;//没有重复账号
        
    }

}

我花费了一整天的时间写完了这个小项目,通过这个项目,我了解到了如何利用传递的功能来进行分解操作,将不同的功能分解成不同的函数,利用数据传递来讲程序串联在一起,这样分部编写,边写边测,避免了写完一堆代码不知道错哪的问题。

posted @ 2022-09-13 21:05  伽澄  阅读(78)  评论(0编辑  收藏  举报