模拟银行存取款业务(无界面图形GUI)

一、实验目的

(1)全面检验面向对象编程思想,巩固Java面向对象、集合和常用API类等方面知识的应用;
(2)加强实践动手能力,能够将从书本上学习到的理论知识用到了实践上。

二、实验内容

模拟网上银行业务,当用户登录时需判断银行卡号和银行卡密码,当输入的卡号和密码都正确时,登录成功,提示当前登录的账户名,并进入下一步选择操作类型。操作类型包括四种(存款:1 取款:2 余额:3 修改个人密码:4 退出:0),输入数字1、2时,将进行存取款操作,此时需要输入存取的金额,并进行正确的金额加减计算;输入数字3时,显示当前账户的余额;输入数字4时,可修改当前账户的密码;输入数字0时将退出整个系统。提示:可利用HashMap集合存储模拟的账户信息,其中key值用于存储银行卡号,value值用于存储整个账户对象。

三、总体设计(设计原理、设计方案及流程等)

设计原理:
1.把银行用户放入到一个hashMap中,每次进入和退出程序,都会把hashMap表中的数据读取到properties文件中,达到保留数据的功能。
2.用户登入必须要输入对的userName与passWord才可以登入进去,bank界面可以实现存款,取款,查看余额,修改账户密码等等,都可以通过修改hashMap表中的数据来达到效果,然后再存入到properties文件中保留数据,保证下次登入时可以重新恢复数据.

四、实验步骤(包括主要步骤、代码分析等)

在这里插入图片描述

package homeWork03;

import org.junit.Test;

import java.util.HashMap;
import java.util.Scanner;

/**
 * @author 
 * @date 2021/11/23 15:24
 * @details bank前台相关服务信息
 */
public class Bank {
    private static int account = 10000;//银行账户初始有10000元
    private User user;

    public void login(){
        DataBaseUtil dbu = DataBaseUtil.getInstance();
        System.out.println("*****欢迎进入网上银行系统!*****");

        while(true){
            Scanner in = new Scanner(System.in);
            System.out.println("请输入银行卡号:");
            String cardId = in.nextLine();
            System.out.println("请输入银行卡密码:");
            String cardPwd = in.nextLine();

            if(dbu.getUsers().containsKey(cardId) &&
                    dbu.getUser(cardId).getCardPwd().equals(cardPwd)){
                user = dbu.getUser(cardId);
                System.out.println("登录成功!欢迎" + user.getUserName() + "先生");
                break;
            }else{
                System.out.println("银行卡号或密码错误!");
                continue;
            }
        }
    }

    public void operate() {
        while (true) {
            System.out.println("请输入您要进行的操作类型,按回车键结束");
            System.out.println("存款:1" + "\t" + "取款:2" +
                    "\t" + "余额:3" + "\t" + "修改个人密码: 4\t" + "退出:5");
            char choice = Utility.readMenuSelection();
            switch (choice) {
                case '1':
                    System.out.println("请输入要存入的钱(限制5位)");
                    int num_1 = Utility.readInt();//num限制5位数
                    income(num_1);
                    break;
                case '2':
                    System.out.println("请输入要取出的钱(限制5为)");
                    int num_2 = Utility.readInt();//num限制5位数
                    takeout(num_2);
                    break;
                case '3':
                    System.out.println(user.getUserName()+"账户的余额为"+user.getAccount());
                    break;
                case '4':
                    System.out.println("请输入要修改的密码:");
                    HashMap<String,User> hashMap = DataBaseUtil.getUsers();
                    String rePassWord = Utility.readString(20);
                    user.setCardPwd(rePassWord);
                    System.out.println("用户" + user.getCardId());
                    System.out.println("密码" + user.getCardPwd());
                    System.out.println("修改完成");
                    break;
                case '5':
                    return;
            }


        }
    }
    /**
     *
     * @param num
     */
    public void income(int num){
        account += num;
        user.setAccount(user.getAccount() + num);
        System.out.println("存入金额" + num + "元成功!");
    }

    /**
     *
     * @param num
     */
    public void takeout(int num){
        if(account >= num && user.getAccount() >= num){
            account -= num;
            user.setAccount(user.getAccount() - num);
        }else{
            System.out.println("由于银行余额或者你的个人余额不足造成取款失败");
        }
    }
}

 private static DataBaseUtil instance = null;
    private static HashMap<String,User> users = new HashMap<>();

    private DataBaseUtil(){
        User user01 = new User();
        user01.setUserName("WJ");
        user01.setCardId("123456");
        user01.setCardPwd("123456");
        user01.setCallNum("000000");
        user01.setAccount(1000);
        users.put(user01.getCardId(),user01);

        User user02 = new User();
        user02.setUserName("XXY");
        user02.setCardId("1234567");
        user02.setCardPwd("1234567");
        user02.setCallNum("0000000");
        user02.setAccount(1000);
        users.put(user02.getCardId(),user02);

        User user03 = new User();
        user03.setUserName("GB");
        user03.setCardId("12345678");
        user03.setCardPwd("12345678");
        user03.setCallNum("00000000");
        user03.setAccount(1000);
        users.put(user03.getCardId(),user03);
    }

    public static DataBaseUtil getInstance(){//懒汉式单例模式,使所有对象唯一了
        if(instance == null){//同步代码块p371
            synchronized (DataBaseUtil.class){
                instance = new DataBaseUtil();
            }
        }
        return instance;
    }

    //根据id获得用户个人信息
    public User getUser(String account){
        return users.get(account);
    }

    public static HashMap<String,User> getUsers(){
        return users;
    }

package homeWork03;

/**
 * @author 
 * @date 2021/11/23 16:40
 * @details
 */
public class Test {
    public static void main(String[] args) {
        Bank b = new Bank();
        b.login();
        b.operate();
    }
}

 private String cardId;//用户id
    private String cardPwd;//用户密码
    private String userName;//用户名
    private String callNum;//用户电话号码
    private int account;//用户账户余额

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getCardPwd() {
        return cardPwd;
    }

    public void setCardPwd(String cardPwd) {
        this.cardPwd = cardPwd;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCallNum() {
        return callNum;
    }

    public void setCallNum(String callNum) {
        this.callNum = callNum;
    }

    public int getAccount() {
        return account;
    }

    public void setAccount(int account) {
        this.account = account;
    }
package homeWork03;


/**
	工具类的作用:
	处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
*/

import java.util.*;
/**

	
*/
public class Utility {
	//静态属性。。。
    private static Scanner scanner = new Scanner(System.in);

    
    /**
     * 功能:读取键盘输入的一个菜单选项,值:1——5的范围
     * @return 1——5
     */
	public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);//包含一个字符的字符串
            c = str.charAt(0);//将字符串转换成字符char类型
            if (c != '1' && c != '2' && 
                c != '3' && c != '4' && c != '5') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }

	/**
	 * 功能:读取键盘输入的一个字符
	 * @return 一个字符
	 */
    public static char readChar() {
        String str = readKeyBoard(1, false);//就是一个字符
        return str.charAt(0);
    }
    /**
     * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
     * @param defaultValue 指定的默认值
     * @return 默认值或输入的字符
     */
    
    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }
	
    /**
     * 功能:读取键盘输入的整型,长度小于2位
     * @return 整数
     */
    public static int readInt() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(5, false);//一个整数,长度<=2位
            try {
                n = Integer.parseInt(str);//将字符串转换成整数
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     * 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
     * @param defaultValue 指定的默认值
     * @return 整数或默认值
     */
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, true);
            if (str.equals("")) {
                return defaultValue;
            }
			
			//异常处理...
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串
     * @param limit 限制的长度
     * @return 指定长度的字符串
     */

    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
     * @param limit 限制的长度
     * @param defaultValue 指定的默认值
     * @return 指定长度的字符串
     */
	
    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("")? defaultValue : str;
    }


	/**
	 * 功能:读取键盘输入的确认选项,Y或N
	 * 将小的功能,封装到一个方法中.
	 * @return Y或N
	 */
    public static char readConfirmSelection() {
        System.out.println("请输入你的选择(Y/N)");
        char c;
        for (; ; ) {//无限循环
        	//在这里,将接受到字符,转成了大写字母
        	//y => Y n=>N
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }

    /**
     * 功能: 读取一个字符串
     * @param limit 读取的长度
     * @param blankReturn 如果为true ,表示 可以读空字符串。 
     * 					  如果为false表示 不能读空字符串。
     * 			
	 *	如果输入为空,或者输入大于limit的长度,就会提示重新输入。
     * @return
     */
    private static String readKeyBoard(int limit, boolean blankReturn) {
        
		//定义了字符串
		String line = "";

		//scanner.hasNextLine() 判断有没有下一行
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();//读取这一行
           
			//如果line.length=0, 即用户没有输入任何内容,直接回车
			if (line.length() == 0) {
                if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                else continue; //如果blankReturn=false,不接受空串,必须输入内容
            }

			//如果用户输入的内容大于了 limit,就提示重写输入  
			//如果用户如的内容 >0 <= limit ,我就接受
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }

        return line;
    }
}

五、结果分析与总结

在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值