文章目录
- ATM
- 题目描述
- 代码
- 运行结果
- 问题
-
- 为什么使用String类型接收sc.cextLine()还没有键盘输入直接就结束了
- 循环条件
- print大法
- [跳出外层循环 OUT](#跳出外层循环 OUT)
ATM
题目描述


代码

ATM
java
package Test;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-07
*/
public class ATM {
ArrayList<Account> accounts = new ArrayList<>();
Scanner sc = new Scanner(System.in);
private Account loginAccount;//记住登录后的账户
/*欢迎界面*/
public void start() {
while (true) {
System.out.println("==欢迎进入森林银行ATM系统==");
System.out.println("1.用户登录");
System.out.println("2.用户开户");
System.out.println("3.退出ATM");
System.out.println("请选择您要操作的命令:");
Scanner scanner = new Scanner(System.in);
int command = scanner.nextInt();
switch (command) {
case 1:
login();
break;
case 2:
createAccount();
break;
case 3:
return;
default:
System.out.println("您输入的命令有误,请检查后再输入~~");
break;
}
}
}
/* 登录*/
public void login() {
System.out.println("==系统登陆==");
if (accounts.isEmpty()) {
System.out.println("系统当前账户为空,先去开户吧~~~");
start();
} else {
System.out.println("请输入您的卡号:");
String newCardId = sc.next();
Account account = getAccountByCardId(newCardId);
if (account == null) {
System.out.println("该卡号不存在");
} else {
while (true) {
System.out.println("请输入账号密码:");
String password = sc.next();
if (account.getPassword().equals(password)) {
loginAccount = account;
System.out.println("登陆成功!已经进入" + account.getName() + "的账户,您的卡号是:" + account.getCardId());
//展示登录后的界面
showUserCommand();
return;
} else {
System.out.println("您输入的密码有误,请检查后再输入");
}
}
}
}
}
private Account getAccountByCardId(String cardId) {
/* for(int i = 0; i<accounts.size(); i++){
Account account = accounts.get(i);
if(account.getCardId().equals(cardId)){
return account;
}
}*/
for (Account account : accounts) {
if (account.getCardId().equals(cardId)) {
return account;
}
}
return null;
}
/*展示登录后的界面*/
private void showUserCommand() {
while (true) {
System.out.println(loginAccount.getName() + "您可以进行以下操作:");
System.out.println("1.查询账户");
System.out.println("2.存款");
System.out.println("3.取款");
System.out.println("4.转账");
System.out.println("5.修改密码");
System.out.println("6.退出账户");
System.out.println("7.注销当前账户");
System.out.println("请选择您要操作的命令:");
int command = sc.nextInt();
switch (command) {
case 1:
showLoginAccount();
break;
case 2:
addMoney();
break;
case 3:
drawMoney();
break;
case 4:
tranceferMoney();
break;
case 5:
String oddPassword = loginAccount.getPassword();
changePassword();
if (loginAccount.getPassword().equals(oddPassword)) {
break;
}//要是修改了密码,就退出用户,回到欢迎页面重新登录;
//要是没修改,就是break
case 6:
//退出页面 指的是要回到欢迎界面,如果你只是单纯的跳转到start(),会出现嵌套问题,所以应该结束对应的方法以返回start()界面。而不能跳转。
System.out.println(loginAccount.getName() + "您已退出登录");
return;
case 7:
int oddsize = accounts.size();
removeAccoumt();
if (oddsize > accounts.size()) {
return;
}
break;
default:
System.out.println("您输入的命令不正确,请检查后再输入~~~");
}
}
}
private void removeAccoumt() {
System.out.println("您确定要注销账户吗?您的一切信息都将无法找回 y/n");
switch (sc.next()) {
case "y":
if (loginAccount.getMoney() == 0) {
accounts.remove(loginAccount);
System.out.println("您的账户已注销!");
} else {
System.out.println("您的账户还有余额,请先取出后再注销账户");
System.out.println("余额:" + loginAccount.getMoney());
}
case "n":
default:
}
}
private void tranceferMoney() {
if (accounts.size() == 1) {
System.out.println("系统中只有一个账户,无法进行转账");
return;
}
if (loginAccount.getMoney() == 0) {
System.out.println("您的账户中余额为0,无法进行转账");
}
while (true) {
System.out.println("请输入对方卡号:");
String cardId = sc.next();
Account account = getAccountByCardId(cardId);//接收账户
if (account == null) {
System.out.println("卡号有误,请重新输入:");
} else {
String name = "*" + account.getName().substring(1);
System.out.println("请输入" + name + "的姓氏");
String perName = sc.next();
if (account.getName().startsWith(perName)) {
System.out.println("请输入转账金额:");
double money = sc.nextDouble();
if (money <= loginAccount.getMoney() && money <= loginAccount.getLimit()) {
loginAccount.setMoney(loginAccount.getMoney() - money);
account.setMoney(account.getMoney() + money);
System.out.println("转账成功, 您的余额为" + loginAccount.getMoney());
break;
} else {
System.out.println("余额不足或者超过取款限额");
System.out.println("您的余额是" + loginAccount.getMoney());
System.out.println("取款限额是" + loginAccount.getLimit());
return;
}
} else {
System.out.println("姓氏有误");
}
}
}
}
private void showLoginAccount() {
System.out.println(loginAccount.toString());
}
private void addMoney() {
System.out.println("==存款==");
System.out.println("您要存入多少钱:");
double addmoney = sc.nextDouble();
loginAccount.setMoney(loginAccount.getMoney() + addmoney);
System.out.println("存钱成功!您的余额是" + loginAccount.getMoney());
}
private void drawMoney() {
System.out.println("==取款==");
System.out.println("您要取出多少钱:");
double drawmoney = sc.nextDouble();
if (drawmoney <= loginAccount.getMoney() && drawmoney <= loginAccount.getLimit()) {
loginAccount.setMoney(loginAccount.getMoney() - drawmoney);
System.out.println("取款成功!!!当前余额:" + loginAccount.getMoney());
} else {
System.out.println("余额不足或者超过取款限额");
System.out.println("您的余额是" + loginAccount.getMoney());
System.out.println("取款限额是" + loginAccount.getLimit());
}
}
private void changePassword() {
System.out.println("==修改密码==");
System.out.println("您确定要修改密码吗?y/n");
switch (sc.next()) {
case "y":
OUT:
while (true) {
System.out.println("请输入旧密码:");
String oddPassword = sc.next();
if (loginAccount.getPassword().equals(oddPassword)) {
while (true) {
System.out.println("请输入新密码:");
String newPassword = sc.next();
if (!loginAccount.getPassword().equals(newPassword)) {
System.out.println("再次输入新密码:");
if (sc.next().equals(newPassword)) {
loginAccount.setPassword(newPassword);
System.out.println("修改成功!须使用新密码重新登录");
break OUT;
} else {
System.out.println("两次输入密码不一致");
}
} else {
System.out.println("新密码不能与旧密码一致!!");
}
}
} else {
System.out.println("旧密码有误!!");
}
}
case "n":
default:
break;
}
}
/*开户*/
private void createAccount() {
Account account = new Account();
System.out.println("请输入您的姓名:");
String name = sc.next();
account.setName(name);
System.out.println("请输入您的性别:男/女");
while (true) {
String sex = sc.next();
if (sex.equals("男") || sex.equals("女")) {
// System.out.println(account.getSex());
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别格式有误,请重新输入:");
}
}
while (true) {
String password = null;
System.out.println("请输入您的密码:");
password = sc.next();
/* if(password == null){
System.out.println("密码不能为空");
}else{
break;
}*/
System.out.println("再次输入密码:");
String OKPassword = sc.next();
if (password.equals(OKPassword)) {
account.setPassword(password);
break;
} else {
System.out.println("两次密码不一致,请重新设置密码");
}
}
System.out.println("请输入每次提现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
String cardId = randomCardId();
account.setCardId(cardId);
System.out.println("开户成功,您的卡号是:" + account.getCardId());
accounts.add(account);
System.out.println("恭喜您" + account.getName() + ",开户成功");
}
/* 检测是否与已存在的卡号重复
*/
private boolean isCardExisting(String cardId) {
for (int i = 0; i < accounts.size(); i++) {
if (accounts.get(i).getCardId().equals(cardId)) {
return true;
}
}
return false;
}
/*生成8位数字组成的卡号(且卡号不能重复)
*生成验证码的思路
* */
private String randomCardId() {
//生成
String cardId = "";
String str = "0123456789";
do {
for (int i = 0; i < 8; i++) {
int index = (int) (Math.random() * str.length());
cardId += str.charAt(index);
}
//检测是否与已存在的卡号重复
if (loginAccount != null && (loginAccount.getCardId().equals(cardId) || isCardExisting(cardId))) {
continue;
}
break;
} while (true);
return cardId;
}
}
Account
java
package Test;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-07
*/
public class Account {
private String cardId;
private String name;
private String sex;
private String password;
private double money;
private double limit;//限额
public Account(String cardId, String name, String sex, String password, double money, double limit) {
this.cardId = cardId;
this.name = name;
this.sex = sex;
this.password = password;
this.money = money;
this.limit = limit;
}
public Account() {
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getName() {
if(sex.equals("男")){
return name+"先生";
}else {
return name+"女士";
}
//return name + sex.equals("男") ? "先生" : "女士";
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
@Override
public String toString() {
return "欢迎"+getName()+
",卡号:" + cardId +
", 密码:'" + password + '\'' +
", 余额:" + money;
}
}
Test
java
package Test;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-07
*/
public class Test {
public static void main(String[] args) {
ATM atm = new ATM();
atm.start();
}
}
运行结果

问题
为什么使用String类型接收sc.cextLine()还没有键盘输入直接就结束了

循环条件
总是会用错循环条件或者分界条件
智能补全一定要看检查,补全挖坑!!!!
print大法
逻辑有问题或者跳转有问题都能用
跳出外层循环 OUT
