模拟ATM系统
项目大致实现功能:
1.系统准备、首页设计
2.用户开户功能
3.用户登录功能
4.用户操作页设计 、查询账号、退出账号功能
5.用户存款功能
6.用户取款功能
7.用户转账功能
8.用户修改密码、注销账号功能
//定义一个账户类
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;
}
}
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATMSystem {
public static void main(String[] args) {
//定义一个集合,存储账户信息
ArrayList<Account> accounts = new ArrayList<>();
//展示登录界面
Scanner sc = new Scanner(System.in);
while (true) { //按住CTRL + ALT + T键可快速实现while死循环
System.out.println("===============ATM系统===============");
System.out.println("1、账户登录");
System.out.println("2、账户注册");
System.out.println("请输入操作指令(1、2):");
int command = sc.nextInt();
switch (command) {
case 1:
//实现账户登录
login(accounts,sc);
break;
case 2:
//实现账户注册,快捷生成方法:alt加回车
register(accounts,sc);
break;
default:
System.out.println("您所输入的操作码不存在~~");
}
}
}
/**
* 定义一个方法来进行登录
* @param accounts 导入数据集合
* @param sc 导入扫描器
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
if (accounts.size() == 0) {
System.out.println("请您先注册账号~~" + "\n");
return;//卫语言风格,结束方法的执行
}
while (true) {
System.out.println("请您输入您的账号:");
String carId = sc.next();
Account acc = getAccountByCarId(carId,accounts);
if (acc != null) {
while (true) {
System.out.println("请您输入密码:");
String passWord = sc.next();
if (passWord.equals(acc.getPassWord())) {
System.out.println("恭喜您,登陆成功!");
//展示登陆后的界面
showUserCommand(sc,acc,accounts);
return;
}else {
System.out.println("对不起,您输入的密码有误,请重新输入。");
//修改成几次输入错误后会跳出忘记密码
}
}
}else {
System.out.println("该账户不存在!");
//可以提供两个选择,一是继续输入,二是去注册账户
}
}
}
/**
* 定义方法用来展示登录界面
* @param sc 扫描器
* @param acc 用户信息
*/
private static void showUserCommand(Scanner sc, Account acc,ArrayList<Account> 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("请输入您想进行的操作(1~7):");
int command = sc.nextInt();
switch (command) {
case 1://查询账户
showAccount(acc);
break;
case 2://存款
depositMoney(sc,acc);
break;
case 3://取款
drawMoney(sc,acc);
break;
case 4://转账
transferMoney(sc,acc,accounts);
break;
case 5://修改密码
updatePassword(sc,acc);
break;
case 6://退出
return;
case 7://注销账户
if (deleteAccount(sc,acc,accounts)) {
return;
}else {
break;
}
default:
break;
}
}
}
/**
* 进行销户操作
* @param sc 扫描器
* @param acc 用户
* @param accounts 用户集
*/
private static boolean deleteAccount(Scanner sc, Account acc, ArrayList<Account> accounts) {
System.out.println("===============账户注销操作==============");
System.out.println("请问您是否需要销户?(Yes/No)");
String YN = sc.next();
if (YN.equals("Yes")) {
//进行销户操作
if (acc.getMoney() != 0) {
System.out.println("您的账户还有余额,无法进行销户操作。");
}else {
accounts.remove(acc);
System.out.println("已为您进行销户,欢迎您的下次使用。");
return true;
}
}else {
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();
if (passWord.equals(acc.getPassWord())) {
//输入新密码并修改acc
while (true) {
System.out.println("请输入新密码:");
String newPassWord1 = sc.next();
System.out.println("请确认新密码:");
String newPassWord2 = sc.next();
if (newPassWord1.equals(newPassWord2)) {
acc.setPassWord(newPassWord1);
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<Account> accounts) {
System.out.println("===============转账操作==============");
//判断集合中是否有超过两个账户
if (accounts.size() == 1) {
System.out.println("当前系统中无其它账户存在");
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 = getAccountByCarId(cardId, accounts);
if (account != null) {
//输入对方姓氏并确认
String userName = account.getUserName();
String tip = "*" + userName.substring(1);
while (true) {
System.out.println("请您输入[" + tip + "先生/女士" + "]的用户名");
String reName = sc.next();
if (reName.equals(account.getUserName())) {
//输入转账金额并判断是否超出存取额度以及余额
System.out.println("请您输入转账金额:");
double money = sc.nextDouble();
if (money > acc.getQuotaMoney()) {
System.out.println("已超出存取限度!");
}else {
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("您输入的姓氏不正确!");
}
}
}else {
System.out.println("您输入的账号不存在!");
}
}
}
/**
* 实现取钱操作
* @param sc 扫描器
* @param acc 用户
*/
private static void drawMoney(Scanner sc, Account acc) {
System.out.println("===============取钱操作==============");
if (acc.getMoney() < 100) {
System.out.println("您的余额为:" + acc.getMoney() + ",无法进行取钱,请去人工柜台进行取钱操作");
return;
}
System.out.println("请输入取款金额:");
double money = sc.nextDouble();
if (money < 100) {
System.out.println("金额少于100元,请去人工柜台进行取钱操作");
return;
}
if (money > acc.getQuotaMoney()) {
System.out.println("您的取钱金额已超出存取限度!");
}else {
if (money > acc.getMoney()) {
System.out.println("您的取钱金额超出余额!您当前的余额为:" + acc.getMoney());
}else {
acc.setMoney(acc.getMoney() - money);
System.out.println("取钱成功,您当前的余额更新为:" + acc.getMoney());
}
}
}
/**
* 实现存钱
* @param sc 扫描器
* @param acc 用户
*/
private static void depositMoney(Scanner sc, Account acc) {
System.out.println("===============存钱操作==============");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
if ((money > acc.getQuotaMoney()) || (money < 100)) {
System.out.println("输入的存款金额无法办理,请去人工柜台进行存款");
}else {
acc.setMoney(acc.getMoney() + money);
System.out.println("您已存款成功!");
showAccount(acc);
}
}
/**
* 实现查询账户
* @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 接收用户账号集合
* @param sc 接收上面的扫描器
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
System.out.println("===============系统注册账户操作===============");
//1、定义一个account来封装账户信息
Account account = new Account();
//2、录入账户信息
System.out.println("请您输入用户名:");
String userName = sc.next();
account.setUserName(userName);
while (true) { //按住CTRL + ALT + T键可快速实现while死循环
System.out.println("请您输入密码:");
String passWard = sc.next();
System.out.println("请您确认密码:");
String okPassWard = sc.next();
if (passWard.equals(okPassWard)) {
account.setPassWord(okPassWard);
break;
}else {
System.out.println("您输入的两次密码不一致,请重新输入");
}
}
System.out.println("请您输入您的每日存取额度:");
double quotaMoney = sc.nextDouble();
account.setQuotaMoney(quotaMoney);
//为用户随机生成一个8位数且与其他用户不重复的cardId
String cardId = getRandomCardId(accounts);
account.setCardId(cardId);
//3、将账户信息录入到集合accounts中去
accounts.add(account);
System.out.println("恭喜您,尊敬的:" + userName + "先生/女士,您已成功注册账户,您的账号为:" + cardId + ",请您妥善保管。");
}
/**
* 定义一个创建不重复cardId的方法
* @param accounts 传递账户集合用于比对是否重复
* @return 返回不重复的id,或者返回null
*/
private static String getRandomCardId(ArrayList<Account> accounts) {
Random r = new Random();
String cardId = "";
while (true) {
for (int i = 0; i < 8; i++) {
cardId += r.nextInt(10);
}
//利用方法比对是否存在相同carId
Account acc = getAccountByCarId(cardId,accounts);
if (acc == null) {
return cardId;
}
}
}
//定义一个方法用来比对carId是否与集合中的元素存在相同
private static Account getAccountByCarId(String cardId, ArrayList<Account> accounts) {
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
if (acc.getCardId().equals(cardId)) {
return acc;
}
}
return null;
}
}