1. 项目要求
2. Java代码
package testbank;
import java.util.ArrayList; // 引入ArrayList类,用于存储用户信息
import java.util.List; // 引入List接口
import java.util.Scanner; // 引入Scanner类,用于获取用户输入
// 主类
class TestBank {
public static void main(String[] args) {
Bank bank = new Bank(); // 创建Bank对象
bank.login(); // 调用登录方法
}
}
// 银行类
class Bank {
Scanner input = new Scanner(System.in); // 创建Scanner对象用于获取输入
List<User> users = new ArrayList<>(); // 创建List集合users存储用户User信息
int post = -1; // 存储当前操作账户的下标(索引)
// 构造函数,初始化用户信息
public Bank() {
initial(); // 调用初始化用户信息的方法
}
// 初始化用户信息的方法
private void initial() {
// 添加三个用户信息到用户列表
users.add(new User("6222020200001234567", "123456", "13900000000", "11010119910203", 2000.0));
users.add(new User("6222020200001237777", "123456", "13900000123", "11010119914567", 3000.0));
users.add(new User("6222020200001238888", "123456", "13900055667", "11010119914321", 4000.0));
}
// 登录方法(登录成功-进入操作界面;不成功,提示用户名不存在或是密码错误)
public void login() {
System.out.println("-----欢迎使用百知ATM自助终端-----");
System.out.println("-------根据提示请先登录---------");
System.out.print("请输入卡号:");
String acc = input.next(); // 获取用户输入的卡号
System.out.print("请输入密码:");
String pwd = input.next(); // 获取用户输入的密码
// 判断:卡号和密码是否正确
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
// String类型的数据的比较不能用==,而是应用 equals
if (user.getAccount().equals(acc) && user.getPassword().equals(pwd)) {
post = i; // 记录当前用户的下标(索引)
System.out.println("登录成功!"); // 显示登录成功信息
showMenu(); // 调用显示菜单的方法
return; // 登录成功后退出方法
}
}
System.out.println("用户名不存在或密码错误!"); // 登录失败提示
}
// 显示操作菜单
public void showMenu() {
int choice; // 用户选择的操作编号
do {
System.out.println("-----------欢迎使用XXXATM自助终端操作界面--------");
System.out.println("1.查询余额 2.修改密码 3.存款 4.取款 5.转账 6.退出");
System.out.println("---------------根据提示进行操作-------------------");
System.out.print("请输入操作编号:");
choice = input.nextInt(); // 获取用户输入的操作编号
switch (choice) {
case 1:
System.out.println("查询余额");
this.queryBalance(); // 调用查询余额的方法
break; // 添加break语句以防止fall-through
case 2:
System.out.println("修改密码");
this.updatePassword(); // 调用修改密码的方法
break; // 添加break语句
case 3:
System.out.println("存款");
this.save(); // 调用存款的方法
break;
case 4:
System.out.println("取款");
this.take(); // 调用取款的方法
break;
case 5:
System.out.println("转账");
this.transfer(); // 调用转账的方法
break;
case 6:
System.out.println("退出"); // 显示退出信息
break;
default:
System.out.println("输入错误,请重新输入!"); // 提示用户输入错误
break;
}
} while (choice != 6); // 循环条件修正,当选择6时退出循环
}
// 查询余额方法
public void queryBalance() {
User user = users.get(post); // 获取当前用户信息
System.out.println("当前余额:" + user.getBalance() + "元"); // 显示余额
}
// 修改密码方法(重新输入密码进行校验,正确之后再修改,修改时有二次确认)
public void updatePassword() {
User user = users.get(post); // 获取当前用户信息
System.out.print("请输入原始密码:");
String originalPassword = input.next(); // 获取原始密码输入
// 校验原始密码是否正确
if (user.getPassword().equals(originalPassword)) {
System.out.print("请输入新密码:");
String newPassword = input.next(); // 获取新密码输入
System.out.print("请再次输入新密码:");
String confirmPassword = input.next(); // 获取确认密码输入
// 校验新密码与确认密码是否一致
if (newPassword.equals(confirmPassword)) {
user.setPassword(newPassword); // 更新密码
System.out.println("密码修改成功!"); // 修改成功提示
} else {
System.out.println("两次输入的密码不一致!"); // 提示密码不一致
}
} else {
System.out.println("原始密码错误!"); // 提示原始密码错误
}
}
// 存款方法
public void save() {
User user = users.get(post); // 获取当前用户信息
System.out.print("请输入存款金额:");
double amount = input.nextDouble(); // 获取存款金额输入
// 校验存款金额的合理性
if (amount > 0) {
user.setBalance(user.getBalance() + amount); // 更新余额
System.out.println("存款成功!当前余额:" + user.getBalance() + "元"); // 显示当前余额
} else {
System.out.println("存款金额不合理!"); // 提示存款金额不合理
}
}
// 取款方法
public void take() {
User user = users.get(post); // 获取当前用户信息
System.out.print("请输入取款金额:");
double amount = input.nextDouble(); // 获取取款金额输入
// 校验取款金额的合理性
if (amount > 0 && amount <= user.getBalance()) {
user.setBalance(user.getBalance() - amount); // 更新余额
System.out.println("取款成功!当前余额:" + user.getBalance() + "元"); // 显示当前余额
} else {
System.out.println("取款金额不合理!"); // 提示取款金额不合理
}
}
// 转账方法
public void transfer() {
User user = users.get(post); // 获取当前用户信息
System.out.print("请输入转账账户:");
String targetAccount = input.next(); // 获取转账账户输入
User targetUser = null; // 定义目标用户
// 查找目标用户
for (User u : users) {
if (u.getAccount().equals(targetAccount)) {
targetUser = u; // 找到目标用户
break; // 找到后退出循环
}
}
// 校验目标用户是否存在
if (targetUser != null) {
System.out.print("请输入转账金额:");
double amount = input.nextDouble(); // 获取转账金额输入
// 校验转账金额的合理性
if (amount > 0 && amount <= user.getBalance()) {
user.setBalance(user.getBalance() - amount); // 更新当前用户余额
targetUser.setBalance(targetUser.getBalance() + amount); // 更新目标用户余额
System.out.println("转账成功!当前余额:" + user.getBalance() + "元"); // 显示当前余额
} else {
System.out.println("转账金额不合理!"); // 提示转账金额不合理
}
} else {
System.out.println("目标账户不存在!"); // 提示目标账户不存在
}
}
}
// 注意:需要对 User类完成封装!!!!!!!!!!!!!!!!!
// 用户类
class User {
String account; // 账户
String password; // 密码
String phone; // 电话
String idCard; // 身份证
double balance; // 余额
// 默认构造函数
public User() {
}
// 带参数的构造函数
public User(String account, String password, String phone, String idCard, double balance) {
this.account = account; // 初始化账户
this.password = password; // 初始化密码
this.phone = phone; // 初始化电话
this.idCard = idCard; // 初始化身份证
this.balance = balance; // 初始化余额
}
// Getter和Setter方法
public String getAccount() {
return account; // 获取账户
}
public void setAccount(String account) {
this.account = account; // 设置账户
}
public String getPassword() {
return password; // 获取密码
}
public void setPassword(String password) {
this.password = password; // 设置密码
}
public String getPhone() {
return phone; // 获取电话
}
public void setPhone(String phone) {
this.phone = phone; // 设置电话
}
public String getIdCard() {
return idCard; // 获取身份证
}
public void setIdCard(String idCard) {
this.idCard = idCard; // 设置身份证
}
public double getBalance() {
return balance; // 获取余额
}
public void setBalance(double balance) {
this.balance = balance; // 设置余额
}
// 重写toString方法
@Override
public String toString() {
return "User{" +
"account='" + account + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
", idCard='" + idCard + '\'' +
", balance=" + balance +
'}'; // 返回用户信息的字符串表示
}
}
3. 优化
package testbank;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class MyTestBank {
public static void main(String[] args) {
Bank bank = new Bank();
bank.L(); // 调用登录方法 L (Login)
}
}
class Bank {
Scanner input = new Scanner(System.in); // 用于接收用户输入的Scanner对象
// 创建集合 us 存储 User信息
List<User> us = new ArrayList<>(); // 用于存储用户信息的集合
int post; // 存储当前操作账户的下标
// 初始化方法,初始化用户信息
public void I() {
// 方法名 I (Initialize)
// 添加预设的用户信息到集合中
us.add(new User("6222020200001234567", "123456", "13900000000", "11010119910203", 2000.0, "张三"));
us.add(new User("6222020200001237777", "123456", "13900000123", "11010119914567", 3000.0, "李四"));
us.add(new User("6222020200001238888", "123456", "13900055667", "11010119914321", 4000.0, "王五"));
}
// 登录方法,用户通过输入卡号和密码进行登录
public void L() {
// 方法名 L (Login)
this.I(); // 初始化用户信息
System.out.println("========================================================================");
System.out.println(" 欢迎使用 百知银行 ATM自助终端 ");
System.out.println("========================================================================");
System.out.println(" 百知银行始终秉承以客户为中心的服务理念,为您提供安全、便捷、专业的金融服务。");
System.out.println(" 我们致力于让每一位客户享受到贴心的金融体验,感谢您的信赖与支持!");
System.out.println("========================================================================");
System.out.println(" 请根据提示进行登录 ");
System.out.println("========================================================================");
int attempts = 3; // 登录尝试次数
while (attempts > 0) {
System.out.print("请输入卡号:");
String acc = input.next(); // 获取用户输入的卡号
System.out.print("请输入密码:");
String pwd = input.next(); // 获取用户输入的密码
// 验证卡号和密码是否正确
for (int i = 0; i < us.size(); i++) {
User user = us.get(i); // 获取集合中的用户信息
if (user.getAccount().equals(acc) && user.getPassword().equals(pwd)) {
// 验证卡号和密码是否匹配
post = i; // 保存当前操作的用户下标
SM(); // 显示操作菜单
return;
}
}
attempts--; // 减少一次尝试机会
System.out.println("卡号或密码错误,您还有 " + attempts + " 次机会。");
}
// 尝试次数为0,进行身份验证
System.out.println("您已连续三次输入错误,请进行身份验证。");
System.out.print("请输入您的身份证号码:");
String idCard = input.next(); // 获取用户输入的身份证号码
System.out.print("请输入您的电话号码:");
String phone = input.next(); // 获取用户输入的电话号码
System.out.print("请输入您的姓名:");
String name = input.next(); // 获取用户输入的姓名
// 遍历用户集合,验证身份证、电话和姓名是否匹配
for (int i = 0; i < us.size(); i++) {
User user = us.get(i);
if (user.getIdentityCard().equals(idCard) && user.getPhone().equals(phone) && user.getName().equals(name)) {
post = i;
System.out.println("身份验证成功,请重新输入密码。");
LWA(user.getAccount()); // 重新输入密码登录,调用方法 LWA (Login With Account)
return;
}
}
System.out.println("身份验证失败,账户已锁定。请联系客户服务。");
}
// 重新登录方法,用户通过输入密码进行登录
private void LWA(String account) {
// 方法名 LWA (Login With Account)
int attempts = 3; // 登录尝试次数
while (attempts > 0) {
System.out.print("请输入密码:");
String pwd = input.next(); // 获取用户输入的密码
User user = us.get(post); // 获取当前操作的用户信息
if (user.getAccount().equals(account) && user.getPassword().equals(pwd)) {
// 验证账户和密码是否匹配
System.out.println("登录成功!");
SM(); // 显示操作菜单,调用方法 SM (Show Menu)
return;
}
attempts--; // 减少一次尝试机会
System.out.println("密码错误,您还有 " + attempts + " 次机会。");
}
System.out.println("连续三次输入密码错误,账户已锁定。请联系客户服务。");
}
// 显示ATM操作菜单
public void SM() {
// 方法名 SM (Show Menu)
int choice; // 用户的操作选择
do {
System.out.println("=======================================");
System.out.println(" 欢迎使用 百知银行 ATM自助终端操作界面 ");
System.out.println("=======================================");
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("=======================================");
System.out.print("请输入操作编号:");
while (!input.hasNextInt()) {
// 检查输入是否为整数
System.out.println("输入错误,请重新输入!");
input.next(); // 清除错误输入
System.out.print("请输入操作编号:");
}
choice = input.nextInt(); // 获取用户的选择
switch (choice) {
case 1:
QB(); // 查询余额,调用方法 QB (Query Balance)
break;
case 2:
UP(); // 修改密码,调用方法 UP (Update Password)
break;
case 3:
S(); // 存款,调用方法 S (Save)
break;
case 4:
T(); // 取款,调用方法 T (Take)
break;
case 5:
TR(); // 转账,调用方法 TR (Transfer)
break;
case 6:
System.out.println("感谢您的使用,百知银行祝您生活愉快!"); // 退出系统
break;
default:
System.out.println("输入错误,请重新输入!"); // 提示输入错误
break;
}
} while (choice != 6); // 如果选择不为6,则继续显示菜单
}
// 查询余额方法
public void QB() {
// 方法名 QB (Query Balance)
User user = us.get(post); // 获取当前操作的用户信息
System.out.println("当前余额为:" + user.getBalance() + "元"); // 输出用户余额
System.out.println("请按任意键继续...");
input.nextLine(); // 等待用户按键
input.nextLine(); // 防止回车被误读
}
// 修改密码方法,重新输入密码进行校验,修改时有二次确认
public void UP() {
// 方法名 UP (Update Password)
System.out.print("请输入当前密码:");
String currentPwd = input.next(); // 获取用户输入的当前密码
User user = us.get(post); // 获取当前操作的用户信息
if (user.getPassword().equals(currentPwd)) {
// 验证当前密码是否正确
System.out.print("请输入新密码:");
String newPwd = input.next(); // 获取用户输入的新密码
if (newPwd.equals(currentPwd)) {
// 检查新密码是否与旧密码一致
System.out.println("新密码不能与旧密码一致,是否重新修改?(1:是 2:否)");
int retryChoice = getValidChoice(); // 获取用户选择
if (retryChoice == 1) {
UP(); // 重新调用修改密码方法
} else {
System.out.println("已取消修改密码。");
}
return;
}
System.out.print("请再次输入新密码:");
String confirmPwd = input.next(); // 再次确认新密码
if (newPwd.equals(confirmPwd)) {
// 验证两次输入的新密码是否一致
user.setPassword(newPwd); // 设置新密码
System.out.println("密码修改成功!"); // 提示密码修改成功
} else {
System.out.println("两次输入的密码不一致,是否重新修改?(1:是 2:否)");
int retryChoice = getValidChoice(); // 获取用户选择
if (retryChoice == 1) {
UP(); // 重新调用修改密码方法
} else {
System.out.println("已取消修改密码。");
}
}
} else {
System.out.println("当前密码错误,是否重新尝试?(1:是 2:否)");
int retryChoice = getValidChoice(); // 获取用户选择
if (retryChoice == 1) {
UP(); // 重新调用修改密码方法
} else {
System.out.println("已取消修改密码。");
}
}
}
// 获取有效的选择输入(仅限于1和2)
private int getValidChoice() {
int choice;
while (true) {
while (!input.hasNextInt()) {
// 检查输入是否为整数
System.out.println("输入无效,请输入1或2。");
input.next(); // 清除错误输入
}
choice = input.nextInt();
if (choice == 1 || choice == 2) {
// 只接受1或2作为有效输入
return choice;
} else {
System.out.println("输入无效,请输入1或2。");
}
}
}
// 存款方法,校验金额是否大于0
public void S() {
// 方法名 S (Save)
System.out.print("请输入存入金额:");
double amount = input.nextDouble(); // 获取用户输入的存款金额
if (amount > 0) {
// 判断金额是否大于0
User user = us.get(post); // 获取当前操作的用户信息
user.setBalance(user.getBalance() + amount); // 更新用户余额
System.out.println("存款成功!"); // 提示存款成功
QB(); // 显示存款后的余额
} else {
System.out.println("输入金额无效,请重新输入!"); // 提示输入金额无效
S(); // 重新调用存款方法
}
}
// 取款方法,校验金额是否大于0且余额充足
public void T() {
// 方法名 T (Take)
System.out.print("请输入取款金额:");
double amount = input.nextDouble(); // 获取用户输入的取款金额
User user = us.get(post); // 获取当前操作的用户信息
if (amount > 0 && amount <= user.getBalance()) {
// 判断金额是否大于0且小于等于余额
user.setBalance(user.getBalance() - amount); // 更新用户余额
System.out.println("取款成功!"); // 提示取款成功
QB(); // 显示取款后的余额
} else {
System.out.println("输入金额无效或余额不足,是否重新取款?(1:是 2:否)");
int retryChoice = getValidChoice(); // 获取用户选择
if (retryChoice == 1) {
T(); // 重新调用取款方法
} else {
System.out.println("已取消取款。");
}
}
}
// 转账方法,校验转账金额和目标账户是否存在
public void TR() {
// 方法名 TR (Transfer)
System.out.print("请输入目标账户:");
String targetAccount = input.next(); // 获取用户输入的目标账户
System.out.print("请输入目标账户的电话:");
String targetPhone = input.next(); // 获取用户输入的目标账户的电话
System.out.print("请输入目标账户的姓名:");
String targetName = input.next(); // 获取用户输入的目标账户的姓名
User targetUser = null; // 存储目标用户信息
for (User user : us) {
// 遍历用户集合查找目标账户
if (user.getAccount().equals(targetAccount) && user.getPhone().equals(targetPhone) && user.getName().equals(targetName)) {
// 判断目标账户、电话和姓名是否匹配
targetUser = user; // 保存目标用户信息
break; // 找到目标账户后退出循环
}
}
if (targetUser != null) {
// 判断目标用户是否存在
System.out.print("请输入转账金额:");
double amount = input.nextDouble(); // 获取用户输入的转账金额
User currentUser = us.get(post); // 获取当前操作的用户信息
if (amount > 0 && amount <= currentUser.getBalance()) {
// 判断金额是否大于0且小于等于当前用户余额
currentUser.setBalance(currentUser.getBalance() - amount); // 更新当前用户余额
targetUser.setBalance(targetUser.getBalance() + amount); // 更新目标用户余额
System.out.println("转账成功!"); // 提示转账成功
QB(); // 显示转账后的余额
} else {
System.out.println("输入金额无效或余额不足,是否重新转账?(1:是 2:否)");
int retryChoice = getValidChoice(); // 获取用户选择
if (retryChoice == 1) {
TR(); // 重新调用转账方法
} else {
System.out.println("已取消转账。");
}
}
} else {
System.out.println("目标账户、电话或姓名信息错误,是否重新转账?(1:是 2:否)");
int retryChoice = getValidChoice(); // 获取用户选择
if (retryChoice == 1) {
TR(); // 重新调用转账方法
} else {
System.out.println("已取消转账。");
}
}
}
}
class User {
private String account; // 账户
private String password; // 密码
private String phone; // 电话
private String identityCard; // 身份证
private double balance; // 余额
private String name; // 姓名
// 用户类的构造方法,初始化用户信息
public User(String account, String password, String phone, String identityCard, double balance, String name) {
this.account = account; // 设置账户
this.password = password; // 设置密码
this.phone = phone; // 设置电话
this.identityCard = identityCard; // 设置身份证
this.balance = balance; // 设置余额
this.name = name; // 设置姓名
}
// 获取账户信息
public String getAccount() {
return account; // 返回账户
}
// 获取密码信息
public String getPassword() {
return password; // 返回密码
}
// 设置新密码
public void setPassword(String password) {
this.password = password; // 更新密码
}
// 获取余额信息
public double getBalance() {
return balance; // 返回余额
}
// 设置新的余额
public void setBalance(double balance) {
this.balance = balance; // 更新余额
}
// 获取身份证
public String getIdentityCard() {
return identityCard; // 返回身份证
}
// 获取电话信息
public String getPhone() {
return phone; // 返回电话
}
// 获取姓名信息
public String getName() {
return name; // 返回姓名
}
}
最后,感谢您的阅读,期待您的一键三连!