Java简易提款机
吾人为学 人气:0需求:
简易自动提款机
1.创建用户类User(包含卡号、姓名、密码、余额等属性),用户开卡时录入的姓名和密码(自动分配一个卡号、初始金额设置为0)。
2.使用ArrayList或LinkedList存储全部注册用户
形式如:ArrayList<User> userList = new ArrayList<User>();
3.实现功能
(1)存款
(2)取款(如果余额不足要提示)
(3)查询余额(只能查看当前卡号的余额)
4. 技术要求,使用异常处理用户的错误输入(即程序保护容错功能)。
实例:
1.创建自定义异常:
public class OptionsException extends RuntimeException{ /** * */ private static final long serialVersionUID = 6307237273922255816L; public OptionsException() { super(); // TODO Auto-generated constructor stub } public OptionsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO Auto-generated constructor stub } public OptionsException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } public OptionsException(String message) { super(message); // TODO Auto-generated constructor stub } public OptionsException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } }
2.对用户信息(卡号、姓名、密码、余额、存款金额、取款金额)进行封装,并对部分属性进行异常处理:
public class User { private String cardNumber; private String userName; private int code; private int balance = 0; private int deposit; //存款金额 private int withdrawMoney; //取款金额 public String getCardNumber() { return cardNumber; } public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getCode() { return code; } public void setCode(int code) throws OptionsException{ Integer temp = (Integer) code; if(temp.toString().length() == 6){ this.code = code; }else{ throw new OptionsException("您输入的位数有误!"); } } public int getBalance() { return balance; } public void setBalance(int balance) throws OptionsException{ if(balance >= 0){ this.balance = balance; }else{ throw new OptionsException("余额不足!"); } } public int getDeposit() { return deposit; } public void setDeposit(int deposit) throws OptionsException{ if(deposit >= 0){ this.deposit = deposit; }else{ throw new OptionsException("存入金额错误!"); } } public int getWithdrawMoney() { return withdrawMoney; } public void setWithdrawMoney(int withdrawMoney) throws OptionsException{ if(withdrawMoney >= 0){ if(this.getBalance() - withdrawMoney < 0){ this.withdrawMoney = withdrawMoney; }else{ throw new OptionsException("余额不足!"); } }else{ throw new OptionsException("取款金额错误!"); } } }
3.新建一个类,定义用户可进行的操作方法:
import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class UserOptions { /**定义一个ArrayList 来存储注册的银行卡信息*/ public static ArrayList accounts = new ArrayList (); Scanner scanner = new Scanner(System.in); /**调用User 类访问该类下封装的用户信息*/ User user = new User(); //为新用户注册银行卡信息 public void register() throws Exception { System.out.println("请输入您的姓名:"); user.setUserName(scanner.next()); String cardNumber = randomCardNumber(); System.out.println("您的卡号为:" + cardNumber); user.setCardNumber(cardNumber); //用户输入密码时,可能会出现密码不足或超过6位 try{ System.out.println("请设置您的密码(6位数字):"); int code = scanner.nextInt(); user.setCode(code); }catch(OptionsException o){ o.printStackTrace(); }finally{ System.out.println("您卡内目前余额为:" + user.getBalance()); accounts.add(user); } } //随机生成卡号 public String randomCardNumber(){ StringBuilder str=new StringBuilder();//定义变长字符串 Random random=new Random(); /**设立一个flag, * 在随机卡号生成后,用于判断生成的卡号是否已经存在。 * 如果该卡号已经存在,则再进行一次该方法重新生成卡号,直到生成的卡号不存在为止 * 如果该卡号不存在,则将其返回并赋给register()中的user.setCardNumber(); */ boolean flag = true; //随机生成数字,并添加到字符串 /**因为本人持有的银行卡号为19位,所以设置该卡号为19位*/ for(int i=0;i<19;i++){ str.append(random.nextInt(10)); } String cardNumber = str.toString(); /**对生成的卡号进行存在判断 * 如果该卡号已经存在,则flag的值变为false,并中断循环 * 如果循环结束,该卡号仍不存在,则将其返回 */ for(int i = 0 ; i < accounts.size() ; i ++){ if(cardNumber.equals(accounts.get(i).getCardNumber())){ flag = false; break; } } /**flag的值若为true,则证明生成的卡号不存在,可以返回; * 若为false,则证明生成的卡号已经存在,需要重新生成,直到生成的卡号不存在为止*/ if(flag){ return cardNumber; }else{ return randomCardNumber(); } } //存款 public void depositMoney(){ /**设立一个flag,辅助判断输入的卡号是否存在*/ boolean flag = false; /**设立一个index,当卡号存在时,index 接收此时的索引值,方便存款*/ int index = 0; System.out.println("请输入您的卡号:"); String cardNumber = scanner.next(); /**遍历查询accouts 中是否存在用户输入的卡号 * 若存在,flag的值变为true,同时结束循环,*/ for(int i = 0 ; i < accounts.size() ; i ++){ if(cardNumber.equals(accounts.get(i).getCardNumber())){ flag = true; index = i; break; } } /**若卡号存在,则需要用户输入密码,密码正确才可以进行操作*/ if(flag){ System.out.println("请输入您的密码:"); int code = scanner.nextInt(); if(code == accounts.get(index).getCode()){ /**判断用户输入的金额是否大于0, 若小于0,则报错,并退出程序。 * 若正确,则将金额加到余额中*/ try{ System.out.println("请输入您想要存储的金额:"); accounts.get(index).setDeposit(scanner.nextInt()); int newBalance = accounts.get(index).getBalance() + accounts.get(index).getDeposit(); accounts.get(index).setBalance(newBalance); }catch(OptionsException o){ o.printStackTrace(); }finally{ System.out.println("您目前的余额为:" + accounts.get(index).getBalance()); } } }else{ System.out.println("您输入的卡号不存在,操作已结束!"); } } //取款 public void withdraMoney(){ /**设立一个flag,辅助判断输入的卡号是否存在*/ boolean flag = false; /**设立一个index,当卡号存在时,index 接收此时的索引值,方便取款*/ int index = 0; System.out.println("请输入您的卡号:"); String cardNumber = scanner.next(); /**遍历查询accouts 中是否存在用户输入的卡号 * 若存在,flag的值变为true,同时结束循环,*/ for(int i = 0 ; i < accounts.size() ; i ++){ if(cardNumber.equals(accounts.get(i).getCardNumber())){ flag = true; index = i; break; } } /**若卡号存在,则需要用户输入密码,密码正确才可以进行操作*/ if(flag){ System.out.println("请输入您的密码:"); int code = scanner.nextInt(); if(code == accounts.get(index).getCode()){ //注意如果用户要取出的金额大于其余额,要报错 /**判断用户输入的金额是否大于0, 若小于0,则报错,并退出程序。 * 若正确,则将金额加到余额中*/ try{ System.out.println("请输入您想要取出的金额:"); accounts.get(index).setWithdrawMoney(scanner.nextInt()); int newBalance = accounts.get(index).getBalance() - accounts.get(index).getWithdrawMoney(); accounts.get(index).setBalance(newBalance); }catch(OptionsException o){ o.printStackTrace(); }finally{ System.out.println("您取出了" +accounts.get(index).getWithdrawMoney()); System.out.println("取出后的余额为:" + accounts.get(index).getBalance()); } } } if(!flag) System.out.println("该卡号不存在!"); } //按照卡号查询余额 public void queryBalance(){ /**设立一个flag,辅助判断输入的卡号是否存在*/ boolean flag = false; /**设立一个index,当卡号存在时,index 接收此时的索引值,方便存款*/ int index = 0; System.out.println("请输入您的卡号:"); String cardNumber = scanner.next(); /**遍历查询accouts 中是否存在用户输入的卡号 * 若存在,flag的值变为true,同时结束循环,*/ for(int i = 0 ; i < accounts.size() ; i ++){ if(cardNumber.equals(accounts.get(i).getCardNumber())){ flag = true; index = i; break; } } /**若卡号存在,则需要用户输入密码,密码正确才可以进行操作*/ if(flag){ System.out.println("请输入您的密码:"); int code = scanner.nextInt(); if(code == accounts.get(index).getCode()){ System.out.println("您目前的余额为:" + accounts.get(index).getBalance()); } } if(!flag) System.out.println("该卡号不存在!"); } }
4.再新建一个类,在该类中写一个方法由用户选择调用上个步骤中写的各个方法(即设置菜单,进行功能选择):
* 1.开户 * 2.存款 * 3.取款 * 4.查询余额
import java.util.Scanner; public class UserService { UserOptions uo = new UserOptions(); Scanner scanner = new Scanner(System.in); /**设置菜单,进行功能选择: * 1.开户 * 2.存款 * 3.取款 * 4.查询余额*/ @SuppressWarnings("finally") public void menu(){ bulletin(); while(true){ System.out.println("请选择您要使用的功能:"); int choice = scanner.nextInt(); switch(choice){ case 1: try { uo.register(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ break; } case 2: uo.depositMoney(); break; case 3: uo.withdraMoney(); break; case 4: uo.queryBalance(); break; case -1: System.exit(0); } System.out.println("------------------------------\n"); } } public void bulletin(){ System.out.println("欢迎使用\"不坑你坑谁\"牌自动取款机"); System.out.println("本机提供以下功能,请自助选择:"); System.out.println("1.开户"); System.out.println("2.存款"); System.out.println("3.取款"); System.out.println("4.查询余额"); System.out.println("输入-1结束操作"); System.out.println("------------------------------\n"); } }
5.最后再主方法中将上一个类进行实例化并使用:
public class Demo { public static void main(String[] args) { UserService us = new UserService(); us.menu(); } }
加载全部内容