此案例是通过学习黑马程序员的视频学习仿写的,如有雷同,纯属意外
~~~~~~~~~~~~~~~~~~~~~~~~~~~源代码在文章最下方~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
目录
银行ATM系统技术选型分析:
1. 账户类,首页设计
2. 用户开户功能实现
3. 用户登录功能实现
4. 用户操作页设计,查询账户,退出账户功能
5. 用户存款,取款功能设计
6. 用户转账功能
7. 修改密码和销户
银行ATM系统技术选型分析:
①
面向对象编程
每个用户对象要对应一个账户对象: 所以需要设计账户类Account
②
使用集合容器
系统需要提供一个容器用于存储这些账户对象的信息,我们选ArrayList集合。
③
程序流程控制
需要结合分支、循环、跳转等相关操 作控制程序的业务逻辑。
④
使用常见API
内容比较,分析,数据处理等需要用 到String等常用API
---------------------------------------------------------------------------------------------------------------------------
1. 账户类,首页设计
分析
①
每个用户一个账户对象,需要设计账户类,账户类至少包含
(
卡号、用户名、余额、取现额度、密码
)
②
需要定义一个
ArrayList
的集合用于存储账户对象
③
需要展示欢迎页包含
2
个功能:注册开户、登录账户
定义的账户类
package ATM案例;
public class account {
private String cardNumber;//卡号
private String passWord;//密码
private String name;//开户名
private double money;//余额
private double limitMoney;//限制当前取额
public account() {
}
public account(String cardNumber, String passWord, String name , double limitMoney) {
this.cardNumber = cardNumber;
this.passWord = passWord;
this.name = name;
this.money = money;
this.limitMoney = limitMoney;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimitMoney() {
return limitMoney;
}
public void setLimitMoney(double limitMoney) {
this.limitMoney = limitMoney;
}
}
2. 用户开户功能实现
分析
① 开户功能应该独立定义成方法,并传入当前集合对象给该方法
②
需要提示用户输入个人信息,
开户的卡号是系统自动生成的
8
位数
③
注意:自动生成的卡号不能与其他用户的卡号重复
④
最终把用户开户的信息封装成
Account对象,存入到集合中
3. 用户登录功能实现
分析
①
需要根据卡号去集合中查询对应的账户对象
②
如果找到了账户对象,说明卡号存在,继续输入密码
③
如果密码也正确,则登录成功
4. 用户操作页设计,查询账户,退出账户功能
分析
①
需要根据卡号去集合中查询对应的账户对象
②
如果找到了账户对象,说明卡号存在,继续输入密码
③
如果密码也正确,则登录成功
5. 用户存款,取款功能设计
存款分析
①
存款是拿到当前用户的账户对象
②
通过调用账户对象的
set
方法修改其余额
③当存钱完成后提示用户账户余额
取款分析
①先判断账户余额是否大于等于100
②再判断取款金额是否超过账户余额
③再判断取款金额是否超过此次限额
④
通过调用账户对象的
set
方法修改其余额,取款成功后提示账户余额
6. 用户转账功能
分析
①先判断系统中是否存在两个及以上的账号
②判断自己账户是否有钱,接下来输入对方卡号,判断其卡号是否存在
③对方账户存在还需要确认对方的姓氏
④满足所有要求即可转账到对方账户中去
7. 修改密码和销户
分析
①
修改密码就是把当前对象的密码属性使用
set
方法进行更新。
②
销户是从集合对象中删除当前对象,并回到首页。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~全部代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package ATM案例;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//1.定义一个账户信息类account用于存储账户信息
//2.定义一个Arraylist集合,用于存储账户信息
ArrayList accounts = new ArrayList<>();
//3.创建欢迎界面,封装成方法
showMain(accounts, sc);
}
//登录的方法
private static void enterUser(ArrayList accounts, Scanner sc) {
//1.先判断系统中是否存在用户
if (accounts.size() > 0) {
System.out.println("=======欢迎进入勇士Warriors银行登录详情界面======");
while (true) {
//2.让用户输入卡号
System.out.println("请输入你要登录的卡号");
String cardId = sc.next();
//3.调用查询用户的方法,判断用户输入的卡号是否存在
account acc = judgeRe(accounts, cardId);
if (acc != null) //存在该卡号
{
//4.判断用户输入的密码是否正确
while (true) {
System.out.println("请输入密码:");
String passWord = sc.next();
if (passWord.equals(acc.getPassWord())) {
//密码正确
System.out.println("勇士" + acc.getName() + "贵宾,欢迎您进入系统,您的卡号是" + acc.getCardNumber());
//5.密码输入正确进入操作页
userInterface(accounts, acc, sc);//进去操作页界面
return;//继续结束登录方法
} else {
System.out.println("密码输入错误,请重新输入");
}
}
} else {
System.out.println("此卡号不存在,请重新输入");
}
}
} else {//不存在该卡号
System.out.println("系统中没有账户,请先注册账户");
}
}
//操作页方法
private static void userInterface(ArrayList accounts, account acc, Scanner sc) {
while (true) {
System.out.println("=======欢迎进入勇士Warriors银行用户操作界面======");
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 userChoice = sc.nextInt();
switch (userChoice) {
case 1:
//查询
inquire(acc);
break;
case 2:
//存款
deposit(acc, sc);
break;
case 3:
//取款
fetchMoney(acc, sc);
break;
case 4:
// 转账
transferMoney(accounts, acc, sc);
break;
case 5:
//修改密码
amendPassWord(acc,sc);
break;
case 6:
//退出
System.out.println("欢迎下次光临~~");
return;//结束当前操作的方法
case 7:
//注销当前账户
logoutAccount(accounts,acc,sc);
return;
default:
System.out.println("没有该命令,请重新选择:");
}
}
}
//注销账户的方法
private static void logoutAccount(ArrayList accounts ,account acc, Scanner sc) {
System.out.println("===========注销账户==============");
while (true) {
System.out.println("您正在进行销户操作,请知晓!");
System.out.println("请输入确定来销户");
String rs= sc.next();
if (rs.equals("确定"))
{
accounts.remove(acc);
System.out.println("销户成功");
return;
}
}
}
//修改密码的方法
private static void amendPassWord(account acc, Scanner sc) {
System.out.println("===========修改密码==============");
//通过两次确认密码来修改
while (true) {
System.out.println("请输入你要修改的密码:");
String passWord1= sc.next();
System.out.println("请再次输入你要修改的密码:");
String passWord2= sc.next();
if (passWord1.equals(passWord2))
{
acc.setPassWord(passWord1);
System.out.println("密码修改成功,修改后的密码是:" + acc.getPassWord() + ",请妥善保管");
break;
}else
System.out.println("两次密码输入不一致,请重新输入两次密码");
}
}
//转账的方法
private static void transferMoney(ArrayList accounts, account acc, Scanner sc) {
//1.判断自己账户是否有钱
if (acc.getMoney() <= 0) {
System.out.println("自己都没钱就别转了吧!!!");
return;
}
//2.判断系统中是否存在两个及以上的账号
if ((accounts.size() >= 2)) {
System.out.println("============欢迎进入到转账界面======");
while (true) {
//3.输入对方卡号
System.out.println("请输入对方卡号:");
String sideCardNum = sc.next();
//4.根据卡号查询出集合中的账户对象,判断其卡号是否存在
account otherAcc = judgeRe(accounts, sideCardNum);
//5.判断账户对象是否存在,而且这个账户对象不能是自己。
if (otherAcc != null) {
if (otherAcc.getCardNumber().equals(acc.getCardNumber())) {
System.out.println("不能给自己转账");
} else {
//~~~~~~~~~~~~所有条件通过,进入正式的转账逻辑~~~~~~~~~~~~~~~
//6.通过get出姓名然后通过ArrayList自带的API startWith来判断是否以输入的姓氏开始
String rs = '*' + otherAcc.getName().substring(1);
System.out.println("您当前要为" + rs + "转账");
System.out.println("请您输入姓氏来确认");
String c = sc.next();
//7.姓氏输入正确,进入转账
if (otherAcc.getName().startsWith(c)) {
while (true) {
System.out.println("请您输入转账的金额,您最多可以转账" + acc.getMoney() + "元");
double money = sc.nextDouble();
if (money > acc.getMoney()) {
System.out.println("转账金额大于您账户当前金额,无法完成转账!!!");
} else {
acc.setMoney(acc.getMoney() - money);
otherAcc.setMoney(otherAcc.getMoney() + money);
System.out.println("转账完成,您账户当前余额为:" + acc.getMoney() + "元");
return;
}
}
} else {
System.out.println("输入姓氏有误!");
}
}
} else {
System.out.println("对方卡号不存在!!!");
}
}
} else {
System.out.println("系统中账户低于两个,无法完成转账");
}
}
//取款方法
private static void fetchMoney(account acc, Scanner sc) {
System.out.println("===========取款操作==============");
//1.判断账户余额是否大于等于100
if (acc.getMoney() >= 100) {
while (true) {
// 2.输入取钱的金额
System.out.println("请输入你要取款的金额");
double takeMoney = sc.nextDouble();
// 3.判断当前取钱金额是超过了账户的余额
if (takeMoney > acc.getMoney()) {
System.out.println("取款金额超过账户余额,余额不足~~~~~");
} else {
//4.判断当前取钱金额是超过了此次限额
if (takeMoney > acc.getLimitMoney()) {
System.out.println("此次取款金额超过当次限额!!!!");
} else {
//5.更新账户余额并输出
acc.setMoney(acc.getMoney() - takeMoney);
System.out.println("取款成功,您的账户余额为:" + acc.getMoney() + "元");
break;
}
}
}
} else {
System.out.println("账户余额低于100元,请先去存款");
return;
}
}
//存款方法
private static void deposit(account acc, Scanner sc) {
System.out.println("===========存钱操作==============");
System.out.println("请您输入需要存款的金额");
double storeMoney = sc.nextDouble();
//将账户余额和存入金额相加
storeMoney += acc.getMoney();
acc.setMoney(storeMoney);
System.out.println("您已存款成功,您当前账户有" + acc.getMoney() + "元存款");
}
//用户查询的方法
private static void inquire(account acc) {
System.out.println("===========查询账户信息操作=========");
System.out.println("您的账户信息如下:");
System.out.println("卡号:" + acc.getCardNumber());
System.out.println("姓名:" + acc.getName());
System.out.println("余额:" + acc.getMoney());
System.out.println("当前取现额度:" + acc.getLimitMoney());
}
//将欢迎界面封装成的方法
public static void showMain(ArrayList accounts, Scanner sc) {
System.out.println("=======欢迎进入勇士Warriors银行用户注册界面======");
while (true) {
System.out.println("1.登录账户");
System.out.println("2.注册账户");
System.out.println("请输入命令1,2选择对应的操作:");
int command = sc.nextInt();
switch (command) {
case 1:
//登录
enterUser(accounts, sc);//调用登录的方法
break;
case 2:
//开户
openAccount(accounts, sc);//调用开户的方法
break;
default:
System.out.println("你输入的命令不存在,请重新输入:");
break;
}
}
}
//开户的方法
public static void openAccount(ArrayList accounts, Scanner sc) {
//1.录取相关的账户信息
System.out.println("=======欢迎进入勇士Warriors银行开户界面======");
System.out.println("请输入您的开户名:");
String Name = sc.next();
String passWord = "";
while (true) {
System.out.println("请输入您的密码:");
passWord = sc.next();
System.out.println("请再次确认密码");
String okPassWord = sc.next();
//判断两次密码是否相同
if (passWord.equals(okPassWord)) {
break;
} else
System.out.println("两次密码必须一致~~~~:");
}
System.out.println("请您输入当次限额:");
double limitMoney = sc.nextDouble();
//2.生成八位不重复的账户卡号
String cardNum = createCardNum(accounts);
//3.创建一个用户对象封装账户的信息,这里初始金额不能自己指定,需要改造一下有参构造器
account account = new account(cardNum, passWord, Name, limitMoney);
//4.将账户信息添加到账户集合中去
accounts.add(account);
System.out.println("恭喜你开户成功,卡号为:" + account.getCardNumber());
}
//生成八位数不重复的卡号的方法
public static String createCardNum(ArrayList accounts) {
Random num = new Random();
while (true) {
String cardNum = "";//定义一个String变量存储卡号
//随机生成八位数卡号
for (int i = 0; i < 8; i++) {
int j = num.nextInt(10);
cardNum += j;
}
//判断卡号是否重复
account acc = judgeRe(accounts, cardNum);
if (acc == null) {
//说明卡号没有重复
return cardNum;
}
}
}
//根据卡号查询对象
public static account judgeRe(ArrayList accounts, String cardNum) {
for (int i = 0; i < accounts.size(); i++) {
account acc = accounts.get(i);
if (acc.getCardNumber().equals(cardNum)) {
return acc;
}
}
return null;
}
}