首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础---简易提款机

Java基础---简易提款机

作者头像
李志伟
发布2019-12-17 17:27:06
4900
发布2019-12-17 17:27:06
举报
文章被收录于专栏:为学为学

需求:

简易自动提款机

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();
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档