ATM系统
首先先定义一个Account类存储卡号,用户名,密码,账户余额,以及每次限额(其中在代码中return代表退出当前方法返回上一层,break代表结束循环)
package ATM;
/*
账户类
*/
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;
}
}
ATM系统包括登录,注册账户
package ATM;
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<Account> accounts=new ArrayList<>();
Scanner sc=new Scanner(System.in);
//3.展示系统首页
while (true) {
System.out.println("=================ATM系统=======================");
System.out.println("1.账户登录");
System.out.println("2.注册账户");
System.out.println("请你选择操作");
int command=sc.nextInt();
switch(command){
case 1:
//账户登录
login(accounts,sc);
break;
case 2:
//注册账户
register(accounts,sc);
break;
default:
System.out.println("你输入的操作有误哦~~~");
}
}
}
/**
* 用户注册账户
* @param accounts 接收的账户集合
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
System.out.println("============系统注册账户================");
//1.创建一个账户对象,用于后期封装账号信息
Account account =new Account();
//2.录入当前账户的信息,注册到账户对象中
System.out.println("请输入你的账户名称:");
String userName=sc.next();
account.setUserName(userName);
while (true) {
System.out.println("请你输入账户密码:");
String passWord= sc.next();
System.out.println("请你再次确定你的密码:");
String okpassWord=sc.next();
if(okpassWord.equals(passWord)){
//密码认证通过,可以注入给账户对象
account.setPassWord(okpassWord);
break;
}else {
System.out.println("对不起,你输入2次密码不一致,请从新输入");
}
}
System.out.println("请输入账户当次限额:");
double quotaMoney=sc.nextDouble();
account.setQuotaMoney(quotaMoney);
//为账户随机一个8位且与其他账户不重复的号码
String CardId=getRandomCaraId(accounts);
account.setCardId(CardId);
//3.把账户对象添加到账户集合中
accounts.add(account);
System.out.println("恭喜你"+userName+"你已经注册完账户,你的卡号是:"+CardId+"请妥善保管");
}
/**
* 为账户生成8位与其他账户卡号不同的号码
* @return 返回出新卡号给账户
*/
private static String getRandomCaraId(ArrayList<Account> accounts) {
Random r=new Random();
while (true) {
//1.先生成8位数
String carId="";
for (int i = 0; i < 8; i++) {
carId += r.nextInt(10);
}
//2.判断8位账号与其他账号是否重复
//根据getAccountByCareId方法去查询账户对象
Account acc =getAccountByCareId(carId,accounts);
if(acc==null){
//说明careId此时没有重复,此卡号为新卡号,可以使用这个卡号作为新注册账户卡号
return carId;
}
}
}
/**
* 根据卡号查询出一个账户对象出来
* @param careId 卡号
* @param accounts 账户
* @return 账户对象|null
*/
private static Account getAccountByCareId(String careId,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account acc=accounts.get(i);
if(acc.getCardId().equals(careId)){
return acc;
}
}
return null;//查无此账号
}
/**
* 用户登录
* @param accounts 全部账户集合
* @param sc 扫描器
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("=============系统登录账户================");
//1.判断账户集合中是否存在账户,如果没有,则登录功能不能进行
if(accounts.size()==0){
System.out.println("对不起当前系统中,没有账户,请注册账号,再来登录");
return;
}
//2.进入登录界面
while (true) {
System.out.println("请你输入卡号:");
String careId=sc.next();
Account acc= getAccountByCareId(careId,accounts);
if(careId!=null){
/*卡号存在
输入密码并且判断密码是否正确
*/
while (true) {
System.out.println("请输入密码:");
String passWord=sc.next();
//判断当前账户对象的密码是否与用户输入密码一致
if(passWord.equals(acc.getPassWord())){
//登录成功
System.out.println("恭喜你,"+acc.getUserName()+"登录成功,你的卡号是:"+acc.getCardId());
//展示登录后操作
showCommand(sc,acc,accounts);
return;//结束登录方法
}else{
System.out.println("输入密码有误,请从新输入:");
}
}
}else {
System.out.println("输入的卡号有误,请从新输入");
}
}
}
其中注册账户要生成8位的数字卡号
用Random类来随机生成但是为了随机生成的卡号与你的accounts集合不重复要进行比对
如果比对返回null 则说明随机生成的卡号没有重复
/**
* 根据卡号查询出一个账户对象出来
* @param careId 卡号
* @param accounts 账户
* @return 账户对象|null
*/
private static Account getAccountByCareId(String careId,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account acc=accounts.get(i);
if(acc.getCardId().equals(careId)){
return acc;
}
}
return null;//查无此账号
}
}
进入系统中操作包括 查询账户信息,存款,取款,转账,修改密码,退出用户操作页面,注销账户。
/**
* 展示登陆后的操作页面
*/
private static void showCommand(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("请选择:");
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(sc,acc,accounts)){
//销户成功 回到登录首页
return;//结束当前方法,跳出方法
}else {
//没有跑路,继续在操作页
break;
}
default:
System.out.println("你输入的操作有误哦~~~");
}
}
}
/**
* 销户操作
* @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 rs=sc.next();
switch (rs){
case "yes":
//销户操作
//从当前账户集合中,删除当前账户对象
if(acc.getMoney()>0){
System.out.println("账户余额还有money,不可销户");
}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(passWord.equals(acc.getPassWord())){
while (true) {
//开始修改密码
System.out.println("请你输入修改的密码:");
String newpassWord=sc.next();
System.out.println("请你再次输入确认修改的密码:");
String okpassWord=sc.next();
if(newpassWord.equals(okpassWord)){
//2次密码一致可以修改
acc.setPassWord(okpassWord);
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("==============用户转账操作================");
//1.判断所有账户对象中是否有两个账户
if(accounts.size()<2){
System.out.println("对不起,系统中不足两个账户,不能转账,请先去开户");
return;
}
//2.判断当前的账户是否有钱
if(acc.getMoney()==0){
System.out.println("对不起你的账户余额不足,没钱就不要转账");
return;
}
//3.开始转账
while (true) {
System.out.println("请你输入对方卡号:");
String careId=sc.next();
//判断对方账户是否为自己账户
if(careId.equals(acc.getCardId())){
System.out.println("你不能自己给自己转账");
continue;//结束档次执行
}
//判断这个卡号是否存在:根据卡号去查询对方账户对象
Account account=getAccountByCareId(careId,accounts);
if(account==null){
System.out.println("对不起,对方账户不存在");
}else{
//对方账户存在:继续认证对方账户信息
String username=acc.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()+"RMB");
}else {
//余额充足
acc.setMoney(acc.getMoney()-money);
account.setMoney(account.getMoney()+money);
System.out.println("转账成功,你的余额还有"+acc.getMoney());
showAccount(account);
showAccount(acc);
return;
}
}
}else {
//认证失败
System.out.println("对不起你输入的信息有误~~");
}
}
}
}
/**
* 用户取钱功能
* @param acc 当前登录的账户对象
* @param sc 扫描器
*/
private static void drawMoney(Account acc, Scanner sc) {
System.out.println("=========用户取钱操作===========");
//1.判断账户余额中是否大于100
if(acc.getMoney()<100){
System.out.println("对不起账户余额不足100,ATM机不可能给你施舍");
return;
}
//2.提示用户取钱金额
while (true) {
System.out.println("请输入你的取款金额");
double drawMoney=sc.nextDouble();
//3.判断取款金额,是否大于你的余额,以及是否大于你的取款限额
if(drawMoney>acc.getQuotaMoney()){
System.out.println("你的取款金额大于本次取款限额,你的取款限额为:"+acc.getQuotaMoney());
//没有超过本次取款限额
//4.判断取款金额是否大于账户余额
} else if (drawMoney> acc.getMoney()) {
System.out.println("不好意思,你的账户余额不足,你目前账户余额为:"+acc.getMoney());
}else {
System.out.println("恭喜你,取款"+drawMoney+"RMB,成功!");
//更新账户对像余额
acc.setMoney(acc.getMoney()-drawMoney);
//展示取完钱后账户
showAccount(acc);
return;//结束取钱方法
}
}
}
/**
* 存款
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("===========用户存钱操作=============");
System.out.println("请输入你的存款金额");
double depositMoney=sc.nextDouble();
//更新账户余额:原来的钱+存入的钱
acc.setMoney(acc.getMoney()+depositMoney);
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 接收的账户集合
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
System.out.println("============系统注册账户================");
//1.创建一个账户对象,用于后期封装账号信息
Account account =new Account();
//2.录入当前账户的信息,注册到账户对象中
System.out.println("请输入你的账户名称:");
String userName=sc.next();
account.setUserName(userName);
while (true) {
System.out.println("请你输入账户密码:");
String passWord= sc.next();
System.out.println("请你再次确定你的密码:");
String okpassWord=sc.next();
if(okpassWord.equals(passWord)){
//密码认证通过,可以注入给账户对象
account.setPassWord(okpassWord);
break;
}else {
System.out.println("对不起,你输入2次密码不一致,请从新输入");
}
}
System.out.println("请输入账户当次限额:");
double quotaMoney=sc.nextDouble();
account.setQuotaMoney(quotaMoney);
//为账户随机一个8位且与其他账户不重复的号码
String CardId=getRandomCaraId(accounts);
account.setCardId(CardId);
//3.把账户对象添加到账户集合中
accounts.add(account);
System.out.println("恭喜你"+userName+"你已经注册完账户,你的卡号是:"+CardId+"请妥善保管");
}
每一个操作都定义为方法便于操作
完全代码如下
package ATM;
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<Account> accounts=new ArrayList<>();
Scanner sc=new Scanner(System.in);
//3.展示系统首页
while (true) {
System.out.println("=================ATM系统=======================");
System.out.println("1.账户登录");
System.out.println("2.注册账户");
System.out.println("请你选择操作");
int command=sc.nextInt();
switch(command){
case 1:
//账户登录
login(accounts,sc);
break;
case 2:
//注册账户
register(accounts,sc);
break;
default:
System.out.println("你输入的操作有误哦~~~");
}
}
}
/**
* 用户登录
* @param accounts 全部账户集合
* @param sc 扫描器
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("=============系统登录账户================");
//1.判断账户集合中是否存在账户,如果没有,则登录功能不能进行
if(accounts.size()==0){
System.out.println("对不起当前系统中,没有账户,请注册账号,再来登录");
return;
}
//2.进入登录界面
while (true) {
System.out.println("请你输入卡号:");
String careId=sc.next();
Account acc= getAccountByCareId(careId,accounts);
if(careId!=null){
/*卡号存在
输入密码并且判断密码是否正确
*/
while (true) {
System.out.println("请输入密码:");
String passWord=sc.next();
//判断当前账户对象的密码是否与用户输入密码一致
if(passWord.equals(acc.getPassWord())){
//登录成功
System.out.println("恭喜你,"+acc.getUserName()+"登录成功,你的卡号是:"+acc.getCardId());
//展示登录后操作
showCommand(sc,acc,accounts);
return;//结束登录方法
}else{
System.out.println("输入密码有误,请从新输入:");
}
}
}else {
System.out.println("输入的卡号有误,请从新输入");
}
}
}
/**
* 展示登陆后的操作页面
*/
private static void showCommand(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("请选择:");
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(sc,acc,accounts)){
//销户成功 回到登录首页
return;//结束当前方法,跳出方法
}else {
//没有跑路,继续在操作页
break;
}
default:
System.out.println("你输入的操作有误哦~~~");
}
}
}
/**
* 销户操作
* @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 rs=sc.next();
switch (rs){
case "yes":
//销户操作
//从当前账户集合中,删除当前账户对象
if(acc.getMoney()>0){
System.out.println("账户余额还有money,不可销户");
}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(passWord.equals(acc.getPassWord())){
while (true) {
//开始修改密码
System.out.println("请你输入修改的密码:");
String newpassWord=sc.next();
System.out.println("请你再次输入确认修改的密码:");
String okpassWord=sc.next();
if(newpassWord.equals(okpassWord)){
//2次密码一致可以修改
acc.setPassWord(okpassWord);
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("==============用户转账操作================");
//1.判断所有账户对象中是否有两个账户
if(accounts.size()<2){
System.out.println("对不起,系统中不足两个账户,不能转账,请先去开户");
return;
}
//2.判断当前的账户是否有钱
if(acc.getMoney()==0){
System.out.println("对不起你的账户余额不足,没钱就不要转账");
return;
}
//3.开始转账
while (true) {
System.out.println("请你输入对方卡号:");
String careId=sc.next();
//判断对方账户是否为自己账户
if(careId.equals(acc.getCardId())){
System.out.println("你不能自己给自己转账");
continue;//结束档次执行
}
//判断这个卡号是否存在:根据卡号去查询对方账户对象
Account account=getAccountByCareId(careId,accounts);
if(account==null){
System.out.println("对不起,对方账户不存在");
}else{
//对方账户存在:继续认证对方账户信息
String username=acc.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()+"RMB");
}else {
//余额充足
acc.setMoney(acc.getMoney()-money);
account.setMoney(account.getMoney()+money);
System.out.println("转账成功,你的余额还有"+acc.getMoney());
showAccount(account);
showAccount(acc);
return;
}
}
}else {
//认证失败
System.out.println("对不起你输入的信息有误~~");
}
}
}
}
/**
* 用户取钱功能
* @param acc 当前登录的账户对象
* @param sc 扫描器
*/
private static void drawMoney(Account acc, Scanner sc) {
System.out.println("=========用户取钱操作===========");
//1.判断账户余额中是否大于100
if(acc.getMoney()<100){
System.out.println("对不起账户余额不足100,ATM机不可能给你施舍");
return;
}
//2.提示用户取钱金额
while (true) {
System.out.println("请输入你的取款金额");
double drawMoney=sc.nextDouble();
//3.判断取款金额,是否大于你的余额,以及是否大于你的取款限额
if(drawMoney>acc.getQuotaMoney()){
System.out.println("你的取款金额大于本次取款限额,你的取款限额为:"+acc.getQuotaMoney());
//没有超过本次取款限额
//4.判断取款金额是否大于账户余额
} else if (drawMoney> acc.getMoney()) {
System.out.println("不好意思,你的账户余额不足,你目前账户余额为:"+acc.getMoney());
}else {
System.out.println("恭喜你,取款"+drawMoney+"RMB,成功!");
//更新账户对像余额
acc.setMoney(acc.getMoney()-drawMoney);
//展示取完钱后账户
showAccount(acc);
return;//结束取钱方法
}
}
}
/**
* 存款
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("===========用户存钱操作=============");
System.out.println("请输入你的存款金额");
double depositMoney=sc.nextDouble();
//更新账户余额:原来的钱+存入的钱
acc.setMoney(acc.getMoney()+depositMoney);
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 接收的账户集合
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
System.out.println("============系统注册账户================");
//1.创建一个账户对象,用于后期封装账号信息
Account account =new Account();
//2.录入当前账户的信息,注册到账户对象中
System.out.println("请输入你的账户名称:");
String userName=sc.next();
account.setUserName(userName);
while (true) {
System.out.println("请你输入账户密码:");
String passWord= sc.next();
System.out.println("请你再次确定你的密码:");
String okpassWord=sc.next();
if(okpassWord.equals(passWord)){
//密码认证通过,可以注入给账户对象
account.setPassWord(okpassWord);
break;
}else {
System.out.println("对不起,你输入2次密码不一致,请从新输入");
}
}
System.out.println("请输入账户当次限额:");
double quotaMoney=sc.nextDouble();
account.setQuotaMoney(quotaMoney);
//为账户随机一个8位且与其他账户不重复的号码
String CardId=getRandomCaraId(accounts);
account.setCardId(CardId);
//3.把账户对象添加到账户集合中
accounts.add(account);
System.out.println("恭喜你"+userName+"你已经注册完账户,你的卡号是:"+CardId+"请妥善保管");
}
/**
* 为账户生成8位与其他账户卡号不同的号码
* @return 返回出新卡号给账户
*/
private static String getRandomCaraId(ArrayList<Account> accounts) {
Random r=new Random();
while (true) {
//1.先生成8位数
String carId="";
for (int i = 0; i < 8; i++) {
carId += r.nextInt(10);
}
//2.判断8位账号与其他账号是否重复
//根据getAccountByCareId方法去查询账户对象
Account acc =getAccountByCareId(carId,accounts);
if(acc==null){
//说明careId此时没有重复,此卡号为新卡号,可以使用这个卡号作为新注册账户卡号
return carId;
}
}
}
/**
* 根据卡号查询出一个账户对象出来
* @param careId 卡号
* @param accounts 账户
* @return 账户对象|null
*/
private static Account getAccountByCareId(String careId,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account acc=accounts.get(i);
if(acc.getCardId().equals(careId)){
return acc;
}
}
return null;//查无此账号
}
}