项目初体验——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;//没有重复账号 } }
我花费了一整天的时间写完了这个小项目,通过这个项目,我了解到了如何利用传递的功能来进行分解操作,将不同的功能分解成不同的函数,利用数据传递来讲程序串联在一起,这样分部编写,边写边测,避免了写完一堆代码不知道错哪的问题。