面向对象程序设计——银行ATM机系统
程序员文章站
2022-06-28 17:11:27
文章目录针对于面向对象设计——做一个简单的银行ATM机系统ATM机需求分析用户类ATM机类银行类注册操作的大概流程登录操作的大概流程用户类代码ATM机类代码bank类代码(主类)总结针对于面向对象设计——做一个简单的银行ATM机系统ATM机需求分析模拟用户注册,登录,修改密码,存钱,取钱参与的事物有:用户,ATM机,银行(环境类)用户类账号密码余额ATM机类登录界面功能注册登录登录成功后的界面功能存钱取钱查询余额转账修改密码退出银行类mai...
文章目录
针对于面向对象设计——做一个简单的银行ATM机系统
ATM机需求分析
- 模拟用户注册,登录,修改密码,存钱,取钱
- 参与的事物有:用户,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机业务,由于因为一些原因,只能用面向对象方法完成该项目,在写的过程中,有许多不方便的地方。比如:用户信息的存储。如果可以用别的方法,该代码可以更加简洁。
本文地址:https://blog.csdn.net/weixin_44742255/article/details/107882739
上一篇: 二叉树的遍历(代码+图文详解)
下一篇: JAVA堆区栈区方法区