今天的小练手,难度在于用对象类型的数组的合理引用,以及登录时的逻辑判断。(循环和3次登录锁定)
代码要求:
出现问题:
- login出现逻辑错误,登录失败打印出来好多遍。
- Account类里面有参构造函数没有传值(this.balance = balance)。
- 程序不能返回重新选择功能。
- 程序无法正常终止。
错误login代码:
private static boolean login() {
// 输入一共有三次机会
/*
* String username = "zhangsan"; 字符串的比对使用equals方法进行比对
* username.equals("zhangsan") -- true username.equals("zhangsa") -- false
*
* 一共有三次机会
*
* 1.返回一个boolean的参数,代表着登录成功还是失败 2.如果登录成功了,则把比对成功的用户对象使用成员变量account来保存,方便以后的操作
*/
// 定义一个循环,最多执行三次
for (int i = 1; i <= 3; i++) {
// 接收从控制台输入的用户名、密码
System.out.println("请输入账号:");
String username = scanner.next();
System.out.println("请输入密码:");
String password = scanner.next();
// 与accounts数组中的对象进行匹配
for (int j = 0; j < accounts.length; j++) {
// 取出当前对象
Account a = accounts[j];
// 拿到用户的用户名、密码
String un = a.getUsername();
String pw = a.getPassword();
// 比对用户名、密码是否正确
if (username.equals(un) && password.equals(pw)) {
System.out.println("登录成功!");
// 将比对成功的对象保存一下,方便进行取款、存款操作
account = a;
// 条件满足则直接返回true
return true;
} else {
// 判断一下当前是第三次机会
if (i == 3) {
System.out.println("连续三次输入失败,程序退出!");
return false;
}
System.out.println("用户名/密码输入失败,请重新输入!还剩余" + (3 - i) + "次机会!");
}
}
}
return false;
}
原因分析:
- 去掉else,把else里面的if放在里层循环外面。把判断是否为3次的for循环放为外循环,里面的for用来遍历数组。逻辑是:拿着用户名、密码去accounts数组中查看的操作最多三次,查找一次不成功,则需要重新输入用户名、密码,用新的用户名、密码再去查找。
- 别忘记传完参赋值。
- 用switch语句while循环,用login的布尔类型返回值判断是否开始循环(重要!不能重新设定一个,否则就会出现程序不能正常终止的问题),在退出时把signal改为false再break。
解决方案:
改正代码如下:
/**
*
*/
package f24_day911;
/**
* Account类,用javabean自动生成setter与getter
*/
public class Account {
/**
* @param username
* @param password
* @param Balance
*/
String username;
String password;
int Balance;
public Account() {
// 无参初始化
}
public Account(String username, String password, int balance) {
// 有参初始化
this.username = username;
this.password = password;
this.Balance = balance;
}
/**
* @return the username
*/
String getUsername() {
return username;
}
/**
* @param username the username to set
*/
void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
String getPassword() {
return password;
}
/**
* @param password the password to set
*/
void setPassword(String password) {
this.password = password;
}
/**
* @return the Balance
*/
int getBalance() {
return Balance;
}
/**
* @param Balance the Balance to set
*/
void setBalance(int Balance) {
this.Balance = Balance;
}
}
/**
*
*/
package f24_day911;
import java.util.Scanner;
/**
* 莫名其妙出错的ATM
*/
public class ATM1 {
// 数组存储数据
public static Account[] accounts = { new Account("zhangsan", "123456", 10000), new Account("lisi", "123456", 10000),
new Account("wangwu", "123456", 10000) };
// 創建一個賬戶來儲存目前賬戶
static Account nowAccount = new Account();
// 主函數
public static void main(String[] args) {
// 從鍵盤獲取用戶名和密碼
Scanner scanner = new Scanner(System.in);
// login函數
boolean signal = login();
while (signal) {
menu(signal);
switch (scanner.nextInt()) {
case 1:
System.out.println(nowAccount.getBalance());
break;
case 2:
System.out.println("输入取款金额:");
int money = scanner.nextInt();
withdrawal(money);
break;
case 3:
System.out.println("输入存款金额:");
int money1 = scanner.nextInt();
save(money1);
break;
case 4:
System.out.println("请输入您要更改的密码:");
String newPassword = scanner.next();
nowAccount.setPassword(newPassword);
break;
case 5:
System.out.print("退出系统成功!再见!");
signal = false;
break;
}
}
}
/**
* 存钱
*/
private static void save(int money) {
// 存钱:先判断money是否>0,然后再改余额
if (money <= 0) {
System.out.println("存款数额错误,请重新输入!");
} else {
nowAccount.setBalance(nowAccount.getBalance() + money);
System.out.println("存款成功!现有余额:" + nowAccount.getBalance());
}
}
/**
* 取钱
*/
private static void withdrawal(int money) {
// 取钱:先判断取得钱是否小于等于用户余额,再扣除钱,再显示余额
if (money <= nowAccount.Balance) {
nowAccount.setBalance(nowAccount.getBalance() - money);
System.out.println("取款成功,现有余额:" + nowAccount.getBalance());
} else {
System.out.println("取款失败,余额不足,现有余额:" + nowAccount.getPassword());
}
}
// 登录操作
public static boolean login() {
for (int i = 1; i <= 3; i++) {
// 從數組循環
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的用户名:");
String username = scanner.next();
System.out.println("请输入您的密码:");
String password = scanner.next();
for (int j = 0; j < accounts.length; j++) {
nowAccount = accounts[j];
String un = nowAccount.getUsername();
String pw = nowAccount.getPassword();
if (username.equals(un) && password.equals(pw)) {
System.out.println("登陆成功");
return true;
}
}
if (i == 3) {
System.out.println("连续三次输入失败,程序退出!");
return false;
}
System.out.println("用户名或密码错误,您还有" + (3 - i) + "次机会输入");
}
return false;
}
public static void menu(boolean signal) {
if (signal == true) {
System.out.println("1.查询余额\n2.取款\n3.存款\n4.更改密码\n5.退出系统\n请输入您想执行的操作编号");
}
}
}