一、实验目的
(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;
}
}
五、结果分析与总结