亲宝软件园·资讯

展开

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();
    }
}

加载全部内容

相关教程
猜你喜欢
用户评论