面向对象程序设计——银行ATM机系统

文章目录

  • 针对于面向对象设计——做一个简单的银行ATM机系统
    • ATM机需求分析
      • 用户类
      • ATM机类
      • 银行类
    • 注册操作的大概流程
    • 登录操作的大概流程
    • 用户类代码
    • ATM机类代码
    • bank类代码(主类)
  • 总结

针对于面向对象设计——做一个简单的银行ATM机系统

ATM机需求分析

  1. 模拟用户注册,登录,修改密码,存钱,取钱
  2. 参与的事物有:用户,ATM机,银行(环境类)

用户类

  • 账号
  • 密码
  • 余额

ATM机类

  • 登录界面功能
    • 注册
    • 登录
  • 登录成功后的界面功能
    • 存钱
    • 取钱
    • 查询余额
    • 转账
    • 修改密码
    • 退出

银行类

  • main方法
  • 判断是否需要继续登录方法(用户密码输入错误三次后,会提示账号冻结)
  • 登录界面
  • 登录成功界面

注册操作的大概流程

1 提示用户输入账号和两次密码,将用户的输入传入到方法

2 检查用户输入的账号和密码的长度是否在6-16位之间

​ 如果不符合条件,提示用户输入的账号密码长度不符合条件 ,提示用户是否需要继续注册

​ 如果符合

3 检查用户输入的账号是否存在

​ 如果存在,提示用户用户已存在,并提示用户是否需要重新注册

​ 如果不存在

4 检查用户输入的两次密码是否一致

​ 如果不一致,提示用户两次密码输入不一致,并提示用户是否需要重新注册

​ 如果一致

5 将该对象的存入到数组中(如果数组长度足够时)

​ 将数组进行扩容(当用户的个数大于或等于数组长度时)

​ 并将记录用户个数的变量,加一

​ 提示用户注册成功

登录操作的大概流程

  • 提示用户输入账号和两次密码
  • 检查用户输入的账号是否存在

如果不存在,提示用户,该账号不存在,是否需要注册

如果存在

  • 检查用户输入的账号和密码是否匹配
* 			如果匹配,提示登录成功,跳转到登录成功界面
* 			如果不匹配,提示用户登录失败,是否需要继续登录
      * 			记录用户登录失败次数,如果登录失败次数大于三次,跳出登录界面并提示账号已被冻结

用户类代码

public class User {
	String username;	//账号
	String password;	//密码
	double balance;		//余额
}

ATM机类代码

import java.util.Scanner;

public class ATM {
	//创建一个用户类型的数组
	User[] userArray = new User[10];

	//创建一个记录用户个数的变量
	int count = 0 ;

	/**
	 * 注册界面
	 * @param registUsername  用户输入的注册账号
	 * @param registPassword1	用户输入的第一次密码
	 * @param registPassword2	用户输入的第二次密码
	 */
	void registUser(Scanner scanner){
		System.out.println();
		System.out.print("请输入您要注册的账号:");
		String registUsername = scanner.next();
		System.out.print("请输入您要注册的密码:");
		String registPassword1 = scanner.next();
		System.out.print("请再次输入密码:");
		String registPassword2 = scanner.next();

		//判断用户输入的账户密码是否符合规范
		if (! judgeLong(registUsername, registPassword1, registPassword2)) {
			return;
		}

		//判断注册的用户是否存在
		User isUserExist =isUserExist(registUsername);
		if (isUserExist != null) {
			System.out.println("账号已存在,请重新注册");
			return;
		}

		//判断两次密码是否一致
		if (isSamePassword(registPassword1, registPassword2)) {
			//将用户注册的账号和密码存入到数组中
			User newUser = new User();
			newUser.username = registUsername;
			newUser.password = registPassword1;
			userArray[count] = newUser;
			count++;
			System.out.println("注册成功");
			//判断数组是否需要扩容
			expansionArray();
		}else{
			System.out.println("两次密码输入不一致");
		}
	}


	/**
	 * 判断用户输入的账号和密码长度是否满足
	 * @param registUsername	用户输入的注册账号
	 * @param registPassword1	用户输入的第一遍注册密码
	 * @param registPassword2	用户输入的第二遍注册密码
	 * @return	如果返回false,证明用户输入不规范;反之用户输入正确
	 */
	boolean judgeLong(String registUsername,String registPassword1,String registPassword2){
		if (registUsername.length() <6 ||registUsername.length() > 16) {
			System.out.println("账号长度输入不正确(账号密码长度应在6~16位)");
			return false;
		}
		if (registPassword1.length() <6 ||	registPassword1.length() > 16) {
			System.out.println("密码长度输入不正确(账号密码长度应在6~16位)");
			return false;
		}
		if (registPassword2.length() <6 ||	registPassword2.length() > 16) {
			System.out.println("密码长度输入不正确(账号密码长度应在6~16位)");
			return false;
		}
		return true;
	}


	/**
	 * 判断账号是否存在
	 * @param registUsername
	 * @return	返回true,证明账户存在;如果返回false,证明账户不存在
	 */
	User isUserExist(String registUsername){
		for(int i = 0 ; i < userArray.length ; i++ ){
			if (userArray[i]!=null &&userArray[i].username .equals(registUsername)) {

				return userArray[i];
			}
		}
		return null;
	}

	/**
	 * 判断用户两次输入的密码是否一致
	 * @param registPassword1		用户第一次输入的密码
	 * @param registPassword2		用户第二次输入的密码
	 * @return	如果返回true,表示用户输入的两次密码一致;反之,两次密码输入不一致
	 */
	boolean isSamePassword(String registPassword1 , String registPassword2){
		if (registPassword1.equals(registPassword2)) {
			return true;
		}
		return false;
	}

	/**
	 * 数组扩容
	 */
	void expansionArray(){
		if (count > userArray.length) {
			User[] newUserArray =new User[userArray.length+1];
			for (int i = 0; i < userArray.length; i++) {
				newUserArray[i]= userArray[i];
			}
			userArray =  newUserArray;
		}
	}

	/**
	 * 登陆界面
	 * @param scanner
	 * @param num 	记录用户登录失败次数,密码输入不正确时count++,其他情况不增加
	 * @return
	 */
	User loginUser(Scanner scanner ) {
		System.out.println();
		System.out.print("请输入您要登录的账号:");
		String loginUsername = scanner.next();
		System.out.print("请输入您的密码:");
		String loginPassword = scanner.next();

		//判断账号是否存在
		User isUserExist = isUserExist(loginUsername)	;

		/*	//如果账号不存在,询问是否需要跳转到注册页面
		if ( isUserExist == null) {
			while(true){
				System.out.println("账号不存在,是否需要注册?Y/N");
				String tag = scanner.next();

				switch(tag){
				case "Y":	case "y":
					registUser(scanner);
					this.num = 0;
					return null;
				case "N": case "n" :
					this.num = 0 ;
					return null;
				default:
					System.out.println("输入错误,请重新输入");
					break;
				}
			}
		}*/

		//如果账号不存在,提示用户账号不存在
		if (isUserExist == null) {
			System.out.println("用户不存在");
			return null;
		}

		//判断账号密码是否匹配
		if (loginPassword.equals(isUserExist.password)) {
			//账号密码匹配
			User loginUser = isUserExist;
			System.out.println("登录成功");
			return loginUser;

		}else{
			return null;
		}
	}

	/**
	 * 存款
	 * @param loginUser	登录成功的用户
	 * @param scanner
	 */
	void setMoney(User loginUser , Scanner scanner){
		System.out.print("请输入您要存款的金额:");
		double money = scanner.nextDouble();
		loginUser.balance += money;
		System.out.println("您存款的金额为: " + money + "\n您的余额为"+loginUser.balance);
	}

	/**
	 * 取款
	 * @param loginUser	登录成功的用户
	 * @param scanner
	 */
	void getMoney(User loginUser ,Scanner scanner){
		System.out.print("请输入您的取款金额:");
		double money = scanner.nextDouble();
		loginUser.balance -= money;
		System.out.println("您本次取款金额为:" + money + "\n您账户余额为:" + loginUser.balance);
	}

	/**
	 * 查询余额
	 * @param loginUser	登录成功的用户
	 */
	void inquireMoney(User loginUser){
		System.out.println("您当前账户余额为:" + loginUser.balance);
	}

	/**
	 * 转账
	 * @param loginUser	登录成功的用户
	 * @param scanner
	 */
	void transferMoney(User loginUser  ,Scanner scanner){
		System.out.println();
		System.out.print("请输入您要转账的用户:");
		String username = scanner.next();

		//判断转账的用户是否存在
		if (isUserExist(username) == null) {
			System.out.println("您要转账的用户不存在,请重新输入");
		}else{
			System.out.print("请输入您要转账的金额:");
			double money =scanner.nextDouble();
			if (loginUser.balance < money) {
				System.out.println("您账户余额不足,请重新输入转账金额");
			}else{
				isUserExist(username).balance += money;
				loginUser.balance -= money;
				System.out.println("转账成功,您当前账户余额为:" + loginUser.balance);
			}
		}
	}

	/**
	 * 修改密码界面
	 * @param loginUser
	 * @param scanner
	 */
	void changePassword(User loginUser , Scanner scanner){
		System.out.println("请输入您要修改的密码:");
		String password1 = scanner.next();
		System.out.println("请再次输入密码:");
		String password2 = scanner.next();

		//判断两次密码是否输入相同
		if (isSamePassword(password1,	 password2)) {
			//判断密码长度是否满足密码规范
			if (password1.length() < 6 || password1.length() > 16 || password2.length() < 6 || password2.length() > 16) {
				System.out.println("密码长度输入不正确(账号密码长度应在6~16位)");
				return;
			}else{
				loginUser.password = password1;
				System.out.println("密码修改成功");
			}
		}
	}
}


bank类代码(主类)

public class Bank { 
	//记录用户登录失败次数
	static 	int num = 1 ;
	static Scanner scanner = new Scanner(System.in);
	static ATM atm = new ATM();
	public static void main(String[] args) {
		login(atm, scanner);
	}
	/**
	 * 登陆界面
	 * @param atm		ATM类的对象
	 * @param scanner
	 */
	public static void login(ATM atm , Scanner scanner) {
		while(true){
			System.out.println();
			System.out.println("欢迎来到ICBC银行");
			System.out.println("请输入您要办理的业务");
			System.out.println("1.登录\n2.注册");
			String tag=scanner.next();

			switch(tag){
			case "1" :
				User loginUser = atm.loginUser(scanner);
				if (loginUser != null) {
					//如果登录界面的返回值不是null,跳转到登录成功界面
					System.out.println("登录成功");
					successfullLogin(loginUser, scanner);
				}else {
					//如果是null,跳转到询问用户是否需要继续登录界面
					isNextLogin(scanner);
				}
				break;
			case "2":
				atm.registUser(scanner);
				break;
			default:
				System.out.println("输入错误,请重新输入");
				break;
			}
		}
	}


	/**
	 * 判断是否需要继续登录
	 * @param scanner
	 */
	public static void isNextLogin(Scanner scanner){
		while(num <=3){
			if (num == 3) {
				num = 1;
				System.out.println("登录失败次数过多,账号冻结");
				return;
			}else{
				System.out.println("登录失败,是否需要继续登录?Y/N");
				String tag = scanner.next();

				switch(tag){
				case "Y":  case "y":
					num++;
					User loginUser = atm.loginUser(scanner);
					if (loginUser ==null) {
						isNextLogin(scanner);
					}else {
						//跳转到登录界面
						System.out.println("登录成功");
						successfullLogin(loginUser, scanner);
						return ;
					}
				case "N": case "n":
					num = 1 ;
					return;
				default:
					System.out.println("输入错误,请重新输入");
					break;
				}
			}
		}
	}

	/**
	 * 登录成功界面
	 * @param loginUser	登录成功的用户
	 * @param scanner		
	 */
	public static void successfullLogin(User loginUser , Scanner scanner){
		while(true){
			System.out.println("欢迎来到ATM机自助银行服务");
			System.out.println("请选择您要办理的业务");
			System.out.println("1.存款\n2.取款\n3.查询余额\n4.转账\n5.修改密码\n0.退出");

			String tag = scanner.next();
			switch (tag) {
			case "1":	
				atm.setMoney(loginUser, scanner);
				break;
			case "2":
				atm.getMoney(loginUser, scanner);
				break;
			case "3":
				atm.inquireMoney(loginUser);
				break;
			case "4":
				atm.transferMoney(loginUser, scanner);
				break;
			case "5":
				atm.changePassword(loginUser, scanner);
				break;
			case "0":
				return;
			default:
				System.out.println("输入有误,请重新输入");
				break;
			}
		}
	}
}

总结

该项目完成了基本的ATM机业务,由于因为一些原因,只能用面向对象方法完成该项目,在写的过程中,有许多不方便的地方。比如:用户信息的存储。如果可以用别的方法,该代码可以更加简洁。

你可能感兴趣的:(JAVA实战项目,java,面向对象编程)