Java基础综合练习-ATM系统
先创建一个project -> 再创建module -> 创建包package 包名com.domain -> 创建定义 class
例如:整合课程是一个project 每天是一个模块module
包结构示例:
ATMSystem.java
package com.domain;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/**
* ATM 系统的入口类
*/
public class ATMSystem {
public static void main(String[] args) {
// 1、定义账户类
// 2、定义一个集合容器,负责存储全部账户对象负责业务操作
ArrayList accounts = new ArrayList<>();
Scanner sc = new Scanner(System.in);
// ctrl + alt + T 包成死循环
while (true){
// 3、展示系统的首页
System.out.println("-----------------------ATM系统-------------------------");
System.out.println("1、账户登录");
System.out.println("2、账户注册");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
login(accounts, sc);
break;
case 2:
// 用户账户开户 Alt + 回车 自动生成函数
register(accounts);
break;
default:
System.out.println("对不起,您操作的命令不存在!");
}
}
}
private static void login(ArrayList accounts,Scanner sc) {
System.out.println("==================系统登陆操作================");
if(accounts.size() == 0) {
System.out.println("当前系统还没有账号");
return;
}
while (true) {
System.out.println("请您输入登陆卡号");
String cardId = sc.next();
// 判断卡号是否存在
Account acc = getAccountByCardId(cardId, accounts);
if(acc != null) {
System.out.println("请输入登陆密码:");
String pwd = sc.next();
if(acc.getPassWord().equals(pwd)) {
// 登陆成功
System.out.println("恭喜您" + acc.getUserName() + "登陆成功,您的卡号是" + acc.getCardId());
// 展示登陆后的操作页
showUserCommand(sc, acc, accounts);
return;
} else {
System.out.println("您输入的密码有误");
}
}else{
System.out.println("抱歉,卡号不存在");
}
}
}
/**
展示登陆后的操作页
*/
private static void showUserCommand(Scanner sc, Account acc, ArrayList accounts) {
while (true) {
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("7、注销账户");
System.out.println("请选择");
int command = sc.nextInt();
switch(command){
case 1:
// 查询账户
showAccount(acc);
break;
case 2:
// 存款
depositMoney(acc, sc);
break;
case 3:
// 取款
drawMoney(acc, sc);
break;
case 4:
// 转账
transferMoney(sc, acc, accounts);
break;
case 5:
// 修改密码
updatePassWord(sc, acc);
return;
case 6:
// 退出
System.out.println("退出成功");
return; // 当前方法停止执行
case 7:
// 注销账户
if(deleteAccount(acc, sc, accounts)) {
// 销户成功,回到首页
return;
} else {
break;
}
default:
System.out.println("您输入的操作命令不正确");
}
}
}
/**
* 销户功能
* @param acc
* @param sc
* @param accounts
*/
private static boolean deleteAccount(Account acc, Scanner sc, ArrayList accounts) {
System.out.println("==================用户销户================");
System.out.println("您真的要销户? y/n");
String rs = sc.next();
switch (rs) {
case "y":
// 销户开始
if(acc.getMoney() > 0){
System.out.println("您还有资金,无法销户");
} else {
accounts.remove(acc);
System.out.println("销户完成");
return true;
}
break;
default:
System.out.println("账户继续保留");
}
return false;
}
/**
* 修改密码
* @param sc 扫描器
* @param acc 当前登录成功账户
*/
private static void updatePassWord(Scanner sc, Account acc) {
System.out.println("==================用户密码修改================");
while (true) {
System.out.println("请您输入当前密码:");
String passWord = sc.next();
// 1、 判断密码是否正确
if(acc.getPassWord().equals(passWord)) {
// 密码正确,输入新密码
System.out.println("请输入新密码:");
String newPassWord = sc.next();
System.out.println("请确认新密码:");
String okPassWord = sc.next();
if(newPassWord.equals(okPassWord)) {
// 两次密码输入一致可以修改
acc.setPassWord(newPassWord);
System.out.println("恭喜,密码修改成功");
return;
} else {
System.out.println("两次密码输入不一致");
}
} else {
System.out.println("您输入的密码不正确");
}
}
}
/**
* 转账
* @param sc
* @param acc
* @param accounts
*/
private static void transferMoney(Scanner sc, Account acc, ArrayList accounts) {
System.out.println("==================用户转账================");
if (accounts.size() < 2) { System.out.println("当前系统中不足2个账户"); return; } if (acc.getMoney() == 0) { System.out.println("余额为0,不能转账"); return; } while (true) { System.out.println("请输入对方账户卡号:"); String cardId = sc.next(); if (cardId.equals(acc.getCardId())) { System.out.println("对不起,不能给自己转账"); continue; } // 判断卡号是否存在 Account account = getAccountByCardId(cardId, accounts); if (account == null) { System.out.println("对方卡号不存在"); } else { String userName = account.getUserName(); String tip = "*" + userName.substring(1); System.out.println("请您输入["+ tip +"]的姓氏"); String preName = sc.next(); // 判断姓氏是否正确 if(userName.startsWith(preName)) { while (true) { // 认证通过开始转账 System.out.println("请输入转账金额:"); double money = sc.nextDouble(); if (money > acc.getMoney()) {
System.out.println("对不起余额不足,您最多可以转账" + acc.getMoney());
} else {
// 余额充足,开始转账
acc.setMoney(acc.getMoney() - money);
account.setMoney(account.getMoney() + money);
System.out.println("转账成功!您的账户剩余" + acc.getMoney());
return;
}
}
} else {
System.out.println("对不起,您输入的信息有误");
}
}
}
}
/**
* 存款
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("==================用户存款================");
System.out.println("请输入存款金额:");
double money = sc.nextDouble();
acc.setMoney(acc.getMoney() + money);
System.out.println("恭喜,存款成功,账户信息:");
showAccount(acc);
}
/**
* 取款
* @param acc
* @param sc
*/
private static void drawMoney(Account acc, Scanner sc) {
System.out.println("==================用户取款================");
if (acc.getMoney() < 100) { System.out.println("金额不足100元"); return; } System.out.println("请输入取款金额"); double money = sc.nextDouble(); if (money > acc.getQuotaMoney()) {
System.out.println("取款超过单次限额,限额" + acc.getQuotaMoney());
} else {
// 检查余额
if (money > acc.getMoney()) {
System.out.println("余额不足,当前余额:" + acc.getMoney());
} else {
acc.setMoney(acc.getMoney() - money);
System.out.println("取款成功,当前账户信息:");
showAccount(acc);
return;
}
}
}
/**
* 展示账户信息
* @param acc
*/
private static void showAccount(Account acc) {
System.out.println("==================当前账户信息如下================");
System.out.println("卡号" + acc.getCardId());
System.out.println("姓名" + acc.getUserName());
System.out.println("余额" + acc.getMoney());
System.out.println("限额" + acc.getQuotaMoney());
}
/**
* 用户开户功能的实现
* @param accounts 接收账户的集合
*/
private static void register(ArrayList accounts) {
System.out.println("==================系统开户操作================");
// 1、创建一个账户集合
Account account = new Account();
// 2、录入账户信息
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String userName = sc.next();
account.setUserName(userName);
while(true) {
System.out.println("请输入密码:");
String pwd1 = sc.next();
System.out.println("再次输入密码:");
String pwd2 = sc.next();
if(pwd2.equals(pwd1)){
// 两次密码输入一致
account.setPassWord(pwd1);
break;
}else{
System.out.println("两次密码输入不一致,请检查");
}
}
System.out.println("请输入当前限额:");
double quotaMoney = sc.nextDouble();
account.setQuotaMoney(quotaMoney);
// 为账户随机生成8位不重复卡号
String cardId = getRandCardId(accounts);
account.setCardId(cardId);
// 3、添加到集合中
accounts.add(account);
System.out.println("恭喜您" + userName + "成功开卡,卡号 "+ cardId);
}
/**
* 为账户生成8位随机不重复卡号
* @return
*/
private static String getRandCardId(ArrayList accounts){
Random r = new Random();
while(true) {
String randNumber = "";
for (int i = 0; i < 8; i++) {
randNumber += r.nextInt(10);
}
// 判断卡号是否重复
Account acc = getAccountByCardId(randNumber, accounts);
if(acc == null) {
return randNumber;
}
}
}
/**
* 根据卡号获取账户
* @param cardId 卡号
* @param accounts 账户集合
* @return
*/
private static Account getAccountByCardId(String cardId, ArrayList accounts){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
if(cardId.equals(acc.getCardId())) {
return acc;
}
}
return null;
}
}
Account.java
package com.domain;
/**
* 账户类
*/
public class Account {
/**
* 成员变量 私有
*/
private String cardId;
private String userName; // 用户名
private String passWord; // 密码
private double money; // 账户余额
private double quotaMoney; // 每次取现额度
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
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 getQuotaMoney() {
return quotaMoney;
}
public void setQuotaMoney(double quotaMoney) {
this.quotaMoney = quotaMoney;
}
}
