需求描述
用Java实现一个ATM系统,用于实现存款,取款、转账、修改密码等操作。
系统欢迎页面展示如下:
系统能够实现的功能有下面7种:
代码实现
Test类
package com.itheima.atm;
public class Test {
public static void main(String[] args) {
ATM atm = new ATM();
atm.start();
}
}
Account类
package com.itheima.atm;
public class Account {
//银行卡号
private String cardId;
//姓名
private String userName;
//性别
private char sex;
//密码
private String passWord;
//余额
private double money;
//每次取现额度
private double limit;
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName + (sex == '男'? "先生":"女士");
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char 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;
}
}
ATM类
package com.itheima.atm;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
ArrayList<Account> accounts = new ArrayList<>();
Scanner sc = new Scanner(System.in);
//记录当前登录的账户
private Account loginAcc;
//启动ATM机,进入ATM欢迎界面
public void start(){
while (true) {
System.out.println("------欢迎您进入到了ATM系统------");
System.out.println("1-用户登录");
System.out.println("2-用户开户");
System.out.println("3-退出");
System.out.println("请输入您需要的操作:");
int command = sc.nextInt();
switch (command){
case 1:
//用户登录
login();
break;
case 2:
//用户开户
createAccount();
break;
case 3:
//退出ATM系统
System.out.println("欢迎下次再来");
return;
default:
System.out.println("您输入的命令不正确,请重新输入");
break;
}
}
}
//完成用户登录
private void login() {
System.out.println("------欢迎进入登录系统------");
//判断系统中是否存在账户,如果存在则进行登录,如果不存在则结束程序
if (accounts.size() == 0) {
System.out.println("系统中不存在任何账户,即将退出登录系统");
return;
}
while (true) {
System.out.println("请输入您的卡号:");
//从系统中遍历用户输入的账户
String cardId = sc.next();
Account acc = getAccountByCardID(cardId);
//判断用户输入的账户是否存在
if (acc == null) {
System.out.println("您输入的卡号不存在,请确认~~");
} else {
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
//如果密码正确
if (password.equals(acc.getPassWord())) {
loginAcc = acc;
System.out.println("恭喜您," + acc.getUserName() + "登录成功,您的卡号是:" + acc.getCardId());
//展示登录后的操作界面
showUserCommand();
return;
} else {
System.out.println("您输入的密码不正确,请您确认~~");
}
}
}
}
}
//展示登录后的操作界面
private void showUserCommand() {
while (true) {
System.out.println(loginAcc.getUserName() + ",登录页面可以有以下操作:");
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:
//存款
dipositMoney();
break;
case 3:
//取款
drawMoney();
break;
case 4:
//转账
transforMoney();
break;
case 5:
//修改密码
modifyPassWord();
return;
case 6:
//退出
System.out.println(loginAcc.getUserName() + "欢迎下次再来!!!");
return;
case 7:
//注销当前账户
if (deleteAccount()) {
return;
}
break;
default:
System.out.println("您输入的命令有误,请重新输入!!!");
}
}
}
//修改密码
private void modifyPassWord() {
System.out.println("您接下来进行修改密码操作!!!");
while (true) {
//提醒用户认证当前密码
System.out.println("请您输入旧的密码:");
String passWord = sc.next();
//判断输入密码与旧密码是否一致
if (loginAcc.getPassWord().equals(passWord)) {
while (true) {
//开始修改密码
System.out.println("请输入新密码:");
String newPassWord = sc.next();
//确认新密码
System.out.println("请确认新密码:");
String okPassWord = sc.next();
//判断两次输入密码是否一致
if (newPassWord.equals(okPassWord)) {
loginAcc.setPassWord(okPassWord);
System.out.println("恭喜你,密码修改成功!!!");
return;
} else {
System.out.println("您两次输入密码不一致,请确认!!!");
}
}
} else {
System.out.println("您输入的旧密码有误!!!");
}
}
}
//销户
private boolean deleteAccount() {
System.out.println("您接下来进行销户操作!!!");
System.out.println("您确定要销户吗?y/n");
String command = sc.next();
switch (command) {
case "y":
//判断当前账户是否有钱
if (loginAcc.getMoney() != 0) {
System.out.println("你当前账户中有钱,无法销户!!!");
return false;
} else {
//确认销户
accounts.remove(loginAcc);
System.out.println("销户成功!!!");
return true;
}
default:
System.out.println("保留您的账户!!!");
return false;
}
}
//转账
private void transforMoney() {
System.out.println("您接下来将进行转账操作!!!");
//判断当前系统中是否有别的账户,没有无法转账
if (accounts.size() < 2) {
System.out.println("当前系统中就你一个账户,无法转账");
return;
}
//判断自己系统中是否有钱
if (loginAcc.getMoney() == 0) {
System.out.println("您的账户系统中没钱!!!");
return;
}
//让用户输入对方的卡号,判断对方账户是否存在,如果存在,还需要进行户主姓氏认证
while (true) {
System.out.println("请您输入要转账的账户卡号:");
String cardId = sc.next();
//判断卡号是否存在
Account acc = getAccountByCardID(cardId);
if (acc != null) {
//卡号存在,认证对方账户的姓氏
String name = "*" + loginAcc.getUserName().substring(1);
System.out.println("请您输入【" + name + "】的姓:");
String preName = sc.next();
if (acc.getUserName().startsWith(preName)) {
//认证通过
while (true) {
System.out.println("恭喜您认证通过,请输入转账金额:");
double money = sc.nextDouble();
//判断转账金额是否小于等于自己的余额
if (loginAcc.getMoney() > money) {
//可以转账
loginAcc.setMoney(loginAcc.getMoney() - money);
acc.setMoney(acc.getMoney() + money);
System.out.println("转账成功");
return;
} else {
System.out.println("您余额不足,当前最多可转金额是:" + loginAcc.getMoney());
}
}
} else {
System.out.println("您输入的姓氏有误,请确认!!!");
}
} else {
System.out.println("您输入的卡号不存在,请确认!!!");
}
}
}
//取款
private void drawMoney() {
System.out.println("您接下来将进行取钱操作!!!");
//判断账户金额是否大于等于100元,如果大于等于100元就能取,否则无法取款
if (loginAcc.getMoney() < 100) {
System.out.println("您的余额不足100元,不允许取款!!!");
return;
}
while (true) {
System.out.println("请输入您想要的取款金额:");
double money = sc.nextDouble();
//判断要取的金额是否小于等于账户金额,如果小于等于就能取,否则余额不足
if (loginAcc.getMoney() > money) {
//判断是否达到了取现额度,如果达到了取现额度,重新输入取现金额,否则取现成功
if (loginAcc.getLimit() >= money) {
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("取款成功,当前余额是:" + loginAcc.getMoney());
break;
} else {
System.out.println("您当前取款金额已达到了取现额度,请确认!!!当前取现额度为:" + loginAcc.getLimit());
}
} else {
System.out.println("您的账户余额不足!!!当前余额是:" + loginAcc.getMoney());
}
}
}
//存款
private void dipositMoney() {
System.out.println("您接下来将进行存钱操作!!!");
System.out.println("请输入您的存钱金额:");
double money = sc.nextDouble();
loginAcc.setMoney(loginAcc.getMoney() + money);
System.out.println("您存入" + money + "元成功,存钱后您的余额是:" + loginAcc.getMoney());
}
//查询账户信息(展示当前账户登录信息)
private void showLoginAccount() {
System.out.println("当前您的账户信息如下:");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
//开户功能
private void createAccount(){
System.out.println("------欢迎进入开户系统------");
//1、创建一个账户对象
Account acc = new Account();
//2、需要用户输入自己的账户信息,将账户信息封装在第一步创建的账户对象中
//输入姓名
System.out.println("请输入您的账户姓名:");
String name = sc.next();
acc.setUserName(name);
//输入性别
while (true) {
System.out.println("请输入您的性别:");
char sex = sc.next().charAt(0);
if (sex == '男' || sex == '女'){
acc.setSex(sex);
break;
}else {
System.out.println("您输入的性别有误~请重新输入!提示:只能是男或者女");
}
}
//输入密码
while (true) {
System.out.println("请输入您的密码:");
String password = sc.next();
System.out.println("请确认您的密码:");
String okpassword = sc.next();
if (okpassword.equals(password)){
acc.setPassWord(okpassword);
break;
} else {
System.out.println("您两次输入的密码不一致,请您重新输入!!");
}
}
//输入取现额度
System.out.println("请输入您的取现额度:");
double limit = sc.nextDouble();
acc.setLimit(limit);
//系统为用户自动生产卡号,用8位数字表示,且不能与其他账户的卡号重复
String newCard = createCardId();
acc.setCardId(newCard);
//3、将账户对象存放到ATM的账户中
accounts.add((acc));
System.out.println("恭喜您" + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
}
//系统为开户用户自动生成8位数字的卡号,且与其他卡号不重复
private String createCardId() {
while (true) {
//定义一个变量,记录生成的卡号
String cardId = "";
Random r = new Random();
//定义一个循环,随机生成8位数字
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10);
cardId += data;
}
//判断生成的卡号在所有账户中有没有重复的,没有重复才可以返回,有重复需要重新生成没有重复的卡号
Account acc = getAccountByCardID(cardId);
if (acc == null) {
//说明卡号没重复,可以返回
return cardId;
}
}
}
//根据卡号查询账户返回
private Account getAccountByCardID(String cardID){
//遍历账户
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
//判断账户acc中的卡号是否是我们要找的卡号
if (cardID.equals(acc.getCardId())) {
return acc;
}
}
//查无此类账户,该卡号不存在
return null;
}
}