这是用户类
package atmdemo;
//1,定义一个账户类至少包含: 卡号,姓名,性别,密码,余额,每次取现额度;
public class Account {
private String cardId;
private String name;
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 getName() {
return name+(sex=='男'?"先生":"女士");
}
public void setName(String name) {
this.name = name;
}
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 atmdemo;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
//2,定义一个ATM类,提供所有业务需求
public class ATM {
//(1),首先提供一个容器,装账户
Scanner sc = new Scanner(System.in);
private ArrayList<Account> account = new ArrayList<>();
private Account loginacc;//记住登陆后的用户
//(2)设计以方法负责展示欢迎界面
public void start() {
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();
break;
case 2:
//用户开户,用一个方法写
createAccount();
break;
default:
System.out.println("没有该操作");
break;
}
}
}
//4,完成用户登录功能
private void login() {
System.out.println("==系统登录==");
//(1),判断系统中是否存在账户对象,存在才能登录,反之结束登录操作
if (account.size() == 0) {
System.out.println("当前系统中无任何账户,请先开户再来登录");
return;//跳出登录操作
}
//(2),系统中存在账户对象,可以登录
while (true) {
System.out.println("请输入您的卡号:");
String cardId = sc.next();
//(3)判断这个卡号是否存在,调用查询账户的方法
Account acc = getAccountByCar(cardId);
if (acc == null) {
//卡号不存在,就写个死循环重新输入
System.out.println("您输入的卡号不存在,请确认!");
} else {
//卡号存在
while (true) {
System.out.println("请您输入登录密码:");
String passWord = sc.next();
//判断密码是否正确
if (acc.getPassWord().equals(passWord)) {
System.out.println("恭喜您" + acc.getName() + "成功登录系统,您的卡号是:" + acc.getCardId());
//展示登陆后的操作页面,写一个方法来实现,需要用一个账户变量来记住当前账户,以便于操作
loginacc = acc;
showUserCommand();
return;//跳出当前登录方法,到调用该方法的位置
} else {
System.out.println("您输入的密码不正确,请确认!");
}
}
}
}
}
//展示登陆后的操作页面
private void showUserCommand() {
while (true) {
System.out.println(loginacc.getName() + "您可以选择如下功能:");
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:
//要写个方法
depositMoney();
break;
case 3:
drawMoney();
break;
case 4:
//要写个方法
transferMoney();
break;
case 5:
updatePassWord();
return;回到欢迎界面
case 6:
System.out.println(loginacc.getName() + "您成功退出系统");
return;//跳出当前方法,到调用该方法的位置
case 7:
if (deleteAccount()) {
//销户成功
return;//回到欢迎界面
}
break;
default:
System.out.println("您当前的操作不存在,请确认!");
break;
}
}
}
//修改密码
private void updatePassWord() {
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 oknewPassWord = sc.next();
//判断两次密码是否一致
if (oknewPassWord.equals(newPassWord)) {
//可以修改密码
loginacc.setPassWord(newPassWord);
System.out.println("恭喜您,您的密码修改成");
return;
} else {
System.out.println("您的两次密码不正确");
}
}
} else {
System.out.println("您输入的密码不正确");
}
}
}
//注销当前账户,如果注销失败则返回操作界面,如果注销成果,则返回欢迎页面,返回值用boolean,
//成功:true,失败:false
private boolean deleteAccount() {
System.out.println("==销户操作==");
//问用户是否销户
System.out.println("您确认销户吗?y/n");
String command = sc.next();
switch (command) {
case "y":
//销户
//判断该用户是否有钱
if (loginacc.getMoney() == 0) {
//销户
account.remove(loginacc);
System.out.println("您好,您的账户已销户");
return true;
} else {
System.out.println("对不起,您的账户中还有余额,不可以为您销户");
return false;
}
default:
System.out.println("好的,您的账户保留");
return false;
}
}
//转账
private void transferMoney() {
System.out.println("==用户转账==");
//判断系统中是否存在其他账号
if (account.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 = getAccountByCar(cardId);
if (acc == null) {
System.out.println("您输入的对方卡号不存在");
} else {
//对方卡号存在,继续进行账户认证
String name = "*" + acc.getName().substring(1);
System.out.println("请您输入【" + name + "】的姓氏");
String preName = sc.next();
//判断这个姓氏是否正确
if (acc.getName().startsWith(preName)) {
//认证通过,可以转账
while (true) {
System.out.println("请您输入转给对方的金额:");
double money = sc.nextDouble();
//判断这个金额是否超过自己的余额
if (money > loginacc.getMoney()) {
System.out.println("对不起,您转账的金额超过您的余额,您的余额是:" + loginacc.getMoney());
} else {
//可转给对方
//更新自己的余额
loginacc.setMoney(loginacc.getMoney() - money);
//更新对方的余额
acc.setMoney(acc.getMoney() + money);
System.out.println("您转账成功");
return;
}
}
} 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 (money > loginacc.getLimit()) {
System.out.println("您当前取款金额超过每次限额,您每次最多可取:" + loginacc.getLimit());
} else {
//可以取钱,但要实现取完后要更新当前余额
loginacc.setMoney(loginacc.getMoney() - money);
System.out.println("您取款:" + money + "成功,当前余额为:" + loginacc.getMoney());
break;//可以跳出方法,因为while循环中没有第二个循环
}
} else {
System.out.println("余额不足,您的账户余额是:" + loginacc.getMoney());
}
}
}
//存款
private void depositMoney() {
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.getName());
System.out.println("性别:" + loginacc.getSex());
System.out.println("余额:" + loginacc.getMoney());
System.out.println("每次取现额度:" + loginacc.getLimit());
}
//3,完成开户操作
private void createAccount() {
System.out.println("==系统开户操作==");
//创建一个账户对象,用于封装用户的开户信息
Account acc = new Account();
//需要用户输入自己的开户信息并赋给账户对象
System.out.println("请输入您的账户名称:");
String name = sc.next();
acc.setName(name);
while (true) {
System.out.println("请输入您的性别:");
//这里输入字符然后调用String类方法.charAt(),然后再赋给一个字符变量即可
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 (passWord.equals(okpassWord)) {
acc.setPassWord(okpassWord);
break;
} else {
System.out.println("您输入的两次密码不一样,请确认!");
}
}
System.out.println("请您输入每次取款的取现额度:");
Double limit = sc.nextDouble();
acc.setLimit(limit);
//重点:我们需要为这个账户生成一个卡号(有系统自动生成,为八位数,不能与其他卡号重复)
//需要写一个方法实现
String newCardId = crteateCardId();
acc.setCardId(newCardId);
//把这个账户对象,存入到账户集合中去
account.add(acc);
System.out.println("恭喜您" + acc.getName() + "开户成功,您的卡号是:" + acc.getCardId());
}
//设计一个方法,返回一个八位数字的卡号,且不能与其他卡号重复
private String crteateCardId() {
Random r = new Random();
//(1)定义String类型的变量记住一个八位数字的卡号
while (true) {
String cardId = "";
//(2)写一个循环,每次产生一个随机数都给cardId,共循环八次
for (int i = 0; i < 8; i++) {
int index = r.nextInt(10);
cardId += index;
}
//(3)判断cardId中记住的卡号是否与其他卡号重复,没有重复才可以作为一个新的卡号,需要写一个方法实现
Account acc = getAccountByCar(cardId);
if (acc == null) {
//该账户不存在,因此cardId没有与其他账户的卡号重复,可以把它作为一个新卡号返回该卡号
return cardId;
//如果acc不等于null,就说明存在这个卡号,就要重新循环,所以要在外面套一个死循环
}
}
}
//设计一个方法,根据卡号查询账户对象返回,要传一个实参卡号进来
private Account getAccountByCar(String cardId) {
//遍历全部账户对象
for (int i = 0; i < account.size(); i++) {
Account acc = account.get(i);
//判断cardId是否与其他账户的卡号重复,有就返回出出去,告诉他是这个
if (acc.getCardId().equals(cardId)) {
return acc;
}
}
return null;//没有此账号,
}
}
这是测试类
package atmdemo;
//3,定义一个测试类,对ATM进行测试
public class Test {
public static void main(String[] args){
//(1)创建一个ATM对象
ATM atm=new ATM();
//(2)调用ATM类中start()方法,启动系统
atm.start();
}
}