JavaSE模拟ATM机

之前我们用面向过程的思想进行了“模拟用户模块”的开发,今天我们要用面向对象的思想,写一个模拟银行ATM机的小程序

User类

首先,分析一波,模拟ATM机的话,需要两个对象,用户和ATM机。
用户需要,账号,密码,存款,我们再加一个登录失败的次数(冻结账号使用)
那么User类的代码就可以写出来了

public class User {
	public String username;
	public String password;
	public double money;
	public int loginNum = 0;

}

ATM机类

接下来就是ATM机的创建,想一下,我们需要什么?
首先,我们需要存储用户的信息,因为没有用到数据库,所以先用数组存储,再定义一个用户的人数

//存储用户注册的信息
	static User[]users =new User[2];
	//用户注册的数量
	static int number = 0;

接下来就是ATM机功能的实现,先分两个大功能,1.注册,2.登录
注册需要用到什么东西?
1.判断用户是否存在
2.判断账号密码是否满足要求
3.判断存储用户的数组是否需要扩容

//判断用户是否存在  返回值为user类型
	public User getUser(String username) {
		//遍历存储用户信息的数组,和用户输入的账号比较
		for(int i=0;i<number;i++) {
			if(username.equals(users[i].username)&&users[i]!=null) {
				return users[i];
			}
		}
		return null;
	}

//这里是判断账号密码的长度
	public User lengthUser(String username,String password) {
		//账号和密码的长度都在6~10之间
		if((username.length()>=6&&username.length()<=10)&&(password.length()>=6&&password.length()<=10)) {
			User user = new User();
			user.username = username;
			user.password = password;
			return user;
		}else {
			return null;
		}
			
	}

	//储存扩容,若存储用户信息的数组已满,进行扩容
	public User[] capacityUsers() {
		User [] newUsers = new User[users.length+10];
		for(int i=0;i<users.length;i++) {
			newUsers[i] = users[i];
		}
		users = newUsers;
		return users;
	}

这3个准备工作做好,就可以写注册的方法了。

//这里是注册
	public void regist(String username,String password,String confirmPassword) {
		 //调用判断用户是否存在的方法getUser
		User isUser =getUser(username);
		if(isUser!=null){
			System.out.println("注册失败");
			System.out.println("账号已存在");
			return;
		}
		//调用lengthUser方法,判断用户输入的账号,密码是否满足长度限制
		User userLength = lengthUser(username, password);
		if(userLength ==null) {
			System.out.println("注册失败");
			System.out.println("账号密码的长度在范围之外");
			return;
		}
		//判断两次密码是否一致(若出现以上两种情况,则不会执行此步骤)
		if(password.equals(confirmPassword)) {
			//初始储存信息(假装的储存信息)
			User registUser = new User();
			registUser.username = username;
			registUser.password = password;
			//判断是否需要扩容
			if(number>=users.length) {
				capacityUsers();
			}
			//真正的储存信息
			users[number] = registUser;
			//注册认识+1
			number++;
			System.out.println("注册成功!");
		}else {
			System.out.println("注册失败");
			System.out.println("输入的两次密码不一致");
		}
	}

接下来是登录,登录的之前准备只有一个1.判断用户是否存在。正好我们之前已经写了,所以可以直接写登录
我们想有冻结账号这个功能怎么实现?在之前的User类里,我们定义了登陆失败的次数,那么就按照银行的规矩来,在判断账号存在的前提下(账号不存在就没有冻结账号这一说了),登陆失败,次数+1,如果次数达到规定次数,则无法登录,打印出来,改账号已冻结,若在这几次机会内,登录成功,则失败次数归0

//这里是登录
	public User login(String username,String password) {
		/*	调用判断账号是否存在的方法getUser
		 * 	若账号存在,则返回该账号的信息
		 * 	判断该账号的密码是否与用户输入的密码一致
		 */
		User user = getUser(username);
		if(user==null) {
			System.out.println("登录失败!");
			System.out.println("账号不存在!");
			return null;
		}else {
			if(password.equals(user.password)&&user.loginNum<=3) {
				System.out.println("登陆成功!");
				//登录失败次数清零
				user.loginNum=0;
				return user;
			}else if(user.loginNum>3){
				System.out.println("你的账号已冻结");
				System.out.println("请到柜台办理相关手续");
				return null;
			}else {
				System.out.println("登录失败!");
				System.out.println("账号密码不匹配!");
				if(3-user.loginNum==0) {
					System.out.println("你的账号已冻结");
					System.out.println("请到柜台办理相关手续");
					return null;
				}
				
				System.out.println("您还有"+(3-user.loginNum)+"次机会");
				user.loginNum++;
				return null;
			}	
		}
	}

登陆成功后,我们就可以进行下一步的操作了,比如存款,取款,查看余额,转账等
这些操作需要判断一下你的余额是否支持你进行操作,所以先写一个方法。

//判断余额是否充足
public static boolean compareMoney(User user,double money) {
	//如果余额不足,返回false
	if(money>user.money) {
		System.out.println("你的余额已不足,请充值");
		return false;
	}else {
		return true;
	}
}

然后,我们就可以写存款,取款,转账的方法了

//存钱
	public void saveMoney(User user,double money) {
		user.money+=money;
		System.out.println("你存了"+money+"元,你的余额为:"+user.money+"元");
	}
	
	//取钱
	public void getMoney(User user,double money) {
		//调用判断余额是否充足的方法compareMoney
		boolean tag = compareMoney(user, money);
		if(tag == true) {
			user.money-=money;
			System.out.println("你取了"+money+"元,你的余额为:"+user.money+"元");
		}
		
	}
	
	//查看余额
	public void findMoney(User user) {
		System.out.println("你的余额为:"+user.money+"元");
	}
	
	//转账,调用的参数,转账人transferUser,到账人getMoneyUser,钱数money
	public void transferMoney(User transferUser,User getMoneyUser,double money) {
		//调用判断余额是否充足的方法compareMoney
		boolean tag = compareMoney(transferUser, money);
		if(tag == true) {
			transferUser.money-=money;
			getMoneyUser.money+=money;
			System.out.println("你向用户"+getMoneyUser.username+"转了"+money+"元");
			System.out.println("你的余额为:"+transferUser.money+"元");
		}
	}

有兴趣的同学,可以再写一个修改密码

//修改密码,只有登录后才可以调用,除了需要传密码参数,还要传需要修改密码的用户user
	public boolean updatePassword(String newPassword,String confirmPassword,User user) {
		/*	调用lengthUser方法,判断用户输入的新密码是否满足长度限制
		 * 	里面的参数,user.username就是修改密码里面传过来的需要修改的用户信息user的账号
		 * 	newPassword即为参数里的newPassword(用户的新密码)
		 */
		User newUser = lengthUser(user.username, newPassword);
		if(newUser == null) {
			System.out.println("修改失败");
			System.out.println("密码的长度在范围之外");
			return false;
		}
		//判断两次密码是否一致
		if(newPassword.equals(confirmPassword)) {
			user.password = newPassword;
			System.out.println("修改成功");
			return true;
		}else {
			System.out.println("修改失败");
			System.out.println("两次密码不一致");
			return false;
		}
	}

Bank类

至此,我们的后台功能模块全部完成,但是现在我们还没有接触前端,所以只能用java来模拟前端,这我们创建一个Bank类
在ATM机上,一个用户用完了,下一个用户来了就可以直接使用,所以,定义为死循环

//main方法
	public static void main(String[] args) {
		//新建Scanner对象和ATM对象
		Scanner scanner = new Scanner(System.in);
		ATM atm = new ATM();
		//无限循环(模拟ATM机的机制,一个用户使用之后,下一个用户可以继续使用)
		while(true) {
			index(scanner,atm);
		}
	}

接下来就是模拟界面,这边不细讲了(之前的博客上有提到,模拟用户模块的那一章节→[传送门]

//初始界面
	public static void index(Scanner scanner,ATM atm) {
		System.out.println("*********************************************");
		System.out.println("客官,里面请");
		System.out.println("请选择您的操作:\n1.注册\n2.登录");
		String tag = scanner.next();
		switch (tag) {
		case "1":
			System.out.println("欢迎来到注册!");
			System.out.println("账号密码应为6~10位");
			System.out.print("请输入账号:");
			String registUsername = scanner.next();
			System.out.print("请输入密码:");
			String registPassword = scanner.next();
			System.out.print("请确认密码:");
			String confirmPassword = scanner.next();
			atm.regist(registUsername,registPassword,confirmPassword);
			break;
		case "2":
			System.out.println("欢迎来到登录!");
			System.out.print("请输入账号:");
			String loginUsername = scanner.next();
			System.out.print("请输入密码:");
			String loginPassword = scanner.next();
			User user = atm.login(loginUsername,loginPassword);
			//登陆成功,跳转到用户界面
			if(user!=null) {
					userIndex(scanner, atm, user);
			}
			break;
		default:
			System.out.println("不要调皮,请重新选择");
			index(scanner,atm);
			break;
		}
	}
	
	//用户登录成功后的界面
	public static void userIndex(Scanner scanner,ATM atm,User user) {
		System.out.println("*********************************************");
		System.out.println("欢迎您:"+user.username);
		System.out.println("请选择您的操作:\n1.存钱\n2.取钱\n3.转账\n4.查询余额\n5.修改密码\n6.退出");
		int number=0;
		String tag = scanner.next();
		switch (tag) {
		case "1":
			System.out.println("这里是存钱");
			System.out.print("请输入你要存的钱数(元):");
			double saveMoney = scanner.nextDouble();
			atm.saveMoney(user, saveMoney);
			userIndex(scanner, atm, user);
			break;
		case "2":
			System.out.println("这里是取钱");
			System.out.print("请输入你要取的钱数(元):");
			double getMoney = scanner.nextDouble();
			atm.getMoney(user, getMoney);
			userIndex(scanner, atm, user);
			break;
		case "3":
			System.out.println("这里是转账");
			System.out.print("请输入你要转的账户:");
			String getMoneyUsername = scanner.next();
			//需要判断到账人的账号是否存在,存在才可以转账
			User getMoneyUser = atm.getUser(getMoneyUsername);
			if(getMoneyUser!=null && getMoneyUser.username!=user.username) {
				System.out.print("请输入你要转的钱数(元):");
				double transferMoney = scanner.nextDouble();
				atm.transferMoney(user,getMoneyUser,transferMoney);
			}else {
				System.out.println("你要转的账户不存在");
				System.out.println("转账错误");
			}
			userIndex(scanner, atm, user);
			break;
		case "4":
			System.out.println("这里是查询余额");
			atm.findMoney(user);
			userIndex(scanner, atm, user);
			break;
		case "5":
			System.out.println("这里是修改密码");
			System.out.println("新密码的长度应为6~10");
			System.out.print("请输入新密码:");
			String newPassword = scanner.next();
			System.out.print("请确认新密码:");
			String confirmPassword = scanner.next();
			boolean or = atm.updatePassword(newPassword, confirmPassword, user);
			//修改密码有三次机会,若三次都错误,返回初始界面
			if(or==false) {
				number++;
				if(number>=3) {
					System.out.println("你的机会已用完,即将退出登录");
					index(scanner, atm);
					break;
				}
				nextUpdatePassword(atm, scanner, user,number);
			}
			userIndex(scanner, atm, user);
			break;
		case "6":
			System.out.println("欢迎下次光临");
			index(scanner,atm);
			break;
		default:
			System.out.println("选择错误,请重新选择您的操作");
			userIndex(scanner, atm, user);
			break;
		}
	}

再加一个,判断是否继续修改密码的方法

//继续修改密码
	public static void nextUpdatePassword(ATM atm,Scanner scanner,User user,int number) {
		System.out.print("你是否继续修改密码(Y/N):");
		String tag = scanner.next();
		switch (tag) {
		case "Y":
		case "y":
			System.out.println("这里是修改密码");
			System.out.print("请输入新密码:");
			String newPassword = scanner.next();
			System.out.print("请确认新密码:");
			String confirmPassword = scanner.next();
			boolean or = atm.updatePassword(newPassword, confirmPassword, user);
			if(or ==false) {
				number++;
				if(number>=3) {
					System.out.println("你的机会已用完,即将退出登录");
					index(scanner, atm);
					break;
				}
				nextUpdatePassword(atm, scanner, user,number);
			}
			break;
		case "N":
		case "n":
			userIndex(scanner, atm, user);
			break;
		default:
			System.out.println("输入错误,请重新输入");
			nextUpdatePassword(atm,scanner,user,number);
			break;
		}
	}

至此,全部结束,代码比较长,感谢您的观看

源码→传送门

猜你喜欢

转载自blog.csdn.net/qq_43336579/article/details/107921245
今日推荐