1.需求及步骤
2.代码部分
package itheima.com.atmm;
//测试类Test
public class Test {
public static void main(String[] args){
//1.创建ATM对象,代表ATM系统
ATM atm = new ATM();
//2.调用ATM的start方法启动系统
atm.start();
}
}
package itheima.com.atmm;
//进行存储信息
public class Account {
private String cardId;
private String userName;
private char sex;
private String passWord;
private double money;
private double limit;//限额
//右键选择generate生成getter and setter
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
//利用三元运算符,以便更好地称呼开户人是先生还是女士
return userName+(sex == '男' ? "先生" : "女士");
}
public void setUserName(String userName) {
this.userName = userName;
}
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;
}
}
package itheima.com.atmm;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
//主要的操作ATM的部分
public class ATM {
//创建了一个大的集合accounts
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
private Account loginAcc;//记住登录后的用户账户,方便后续转账等操作
/* 启动ATM系统展示欢迎界面 */
public void start() {
//考虑到可能会输入一些其他的内容,ctrl+alt+t 快速生成死循环,保证输入正确为止
while (true) {
System.out.println("===欢迎您进入到了ATM系统===");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择: ");
int command = sc.nextInt();
//利用不同的命令来选择对应的功能,需要注意的是这里的command是int类型,是考虑真实的实际考虑,ATM按键只会是数字
switch (command) {
case 1:
//用户登录
login();
break;
case 2:
//用户开户
//将开户功能做一个独立的方法,进行调用使用即可,快捷键:alt+enter快速创建新方法
createAccount();
break;
default:
System.out.println("没有该操作");
}
}
}
//完成用户的登录操作
private void login() {
System.out.println("==系统登录==");
//1.判断系统中是否存在账户对象,存在才能进行登录,如果不存在,直接结束登录操作,可以提醒用户进行开户
if (accounts.size() == 0) {
System.out.println("当前系统中无任何账户,请先开户之后再来登录");
return;//跳出方法,也就是结束登录操作
}
//2.系统中存在账户对象,可以开始进行登录操作
while (true) {
System.out.println("请您输入您的登录卡号:");
String cardId = sc.next();
//3.判断这个卡号是否在系统中存在(用之前开户比较方法进行判断)
Account acc = getAccountByCardId(cardId);
if (acc == null) {
System.out.println("您输入的登录卡号不存在,请重新输入");
} else {
//死循环,直到密码输入正确为止
while (true) {
//卡号存在了,让用户输入登录密码
System.out.println("请您输入登录密码:");
String passWord = sc.next();
//4.判断密码是否正确
if (acc.getPassWord().equals(passWord)) {
loginAcc = acc;
System.out.println("恭喜您," + loginAcc.getUserName() + "成功登录了系统,您的卡号是:" + loginAcc.getCardId());
//这里是登录成功之后的后续操作
showUserCommand();
return;//跳出并结束当前登录方法(只有已经跳出了showUserCommand方法,才能执行跳出登录方法,回到初始界面
} else {
System.out.println("您输入的密码不正确,请重新进行输入~");
}
}
}
}
}
/**展示登录之后的操作界面**/
private void showUserCommand() {
while (true) {
System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户的处理===");
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:
//密码修改
updataPassWord();
return;//跳出并结束当前方法
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功");
return;//跳出并结束当前方法
case 7:
//注销登录账户
//进行判断,如果真的注销成功了,将返回到欢迎界面
if(deleteAccount()){
return;
}
default:
System.out.println("您当前选择的操作是不存在的,请重新进行输入");
}
}
}
private void updataPassWord() {
System.out.println("==账户密码修改操作==");
//1.提醒用户认证当前密码
System.out.println("请您输入当前账户的密码:");
String passWord = sc.next();
//2.认证当前输入的密码是否正确
if(loginAcc.getPassWord().equals(passWord)){
//认证通过
//3.开始进行修改密码
while (true) {
System.out.println("请您输入新密码:");
String newPassWord = sc.next();
System.out.println("请您再次输入密码:");
String okPassWord = sc.next();
//4.进行判断两次的密码是否是一致的
if(newPassWord.equals(okPassWord)){
//开始进行修改密码
loginAcc.setPassWord(okPassWord);
System.out.println("恭喜您,您的密码修改成功了");
}else{
System.out.println("您输入的2次密码不一致,请重新进行输入");
}
}
}
else{
System.out.println("您当前输入的密码不正确~~");
}
}
//这里用boolean返回值形式,是否进行销户
private boolean deleteAccount() {
System.out.println("==进行销户操作==");
//1.问问用户是否确定要销户,以防是用户误触了
System.out.println("请问您确认要销户吗? y/n");
String command = sc.next();
switch(command){
case "y":
//确定要销户
//2.确定用户的账户中是否有钱:logicAcc
if(loginAcc.getMoney()==0){
//真的进行销户
accounts.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("===转账操作==");
//1.先进行判断系统中是否存在其他的用户
if(accounts.size()<2) {
System.out.println("当前系统只有你一个账户,无法为其他账户进行转账操作");
return; //直接跳出转帐操作
}
//2.判断自己的账户中是否有余额
if(loginAcc.getMoney() == 0){
System.out.println("您自己都没钱辣,就别想着给别人转辣");
return;
}
//3.开始进行转账操作
while (true) {
System.out.println("请您输入对方的卡号:");
String cardId = sc.next();
//4.判断这个卡号是否存在于系统中呢
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("该用户不存在,请重新进行输入");
}else{
//对方的账户存在,继续通过姓氏进行认证
String name = "*" + acc.getUserName().substring(1);
System.out.println("请您输入【" + name + "】的姓氏:");
String preName = sc.next();
//5.判断这个姓氏是否正确*/
if(acc.getUserName().startsWith(preName)){
//认证通过了,开始进行转账
while (true) {
System.out.println("请您输入转给对方的金额:");
double money = sc.nextDouble();
//6.判断转账的金额是否超过了自己的余额
if(money > loginAcc.getMoney()){
System.out.println("您的余额不足,无法给对方转这么多钱,您最多可以转" + loginAcc.getMoney());
}else{
//进行转账操作,对自己的余额进行更新
loginAcc.setMoney(loginAcc.getMoney()-money);
//更新对方的余额
acc.setMoney((acc.getMoney()+money));
return; //跳出转账方法
}
}
}
else{
System.out.println("对不起,您的姓氏认证有问题,请仔细进行检查");
}
}
}
}
/**取钱操作 **/
private void drawMoney() {
System.out.println("==取钱操作==");
//1.假定自己的银行卡余额低于100,此时就不能从ATM取钱了,提示去前台办理取钱业务,需要先进行判断
if(loginAcc.getMoney()<100){
System.out.println("您的余额不足以100元,不支持在ATM机进行取钱操作,需要取钱请到前台进行办理");
}
while (true) {
//2.让用户输入取款的金额
System.out.println("请您输入要取的金额:");
double money = sc.nextDouble();
//3.判断余额是否足够
if(loginAcc.getMoney()>money){
//说明余额是足够的
//4.进一步判断取款金额是否超过了取款的限额
if(money > loginAcc.getLimit())
{
//进行提示,每次最多取多少
System.out.println("您当前的取款金额超过了每次的限额,您每次最多可以取" + loginAcc.getLimit());
} else{
loginAcc.setMoney(loginAcc.getMoney()-money);
System.out.println("恭喜您,您取款" + money + "成功,取款后的余额是:" + loginAcc.getMoney());
break;
}
} 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.getUserName());
System.out.println("性别" + loginAcc.getSex());
System.out.println("余额" + loginAcc.getMoney());
System.out.println("每次取现的额度" + loginAcc.getLimit());
}
//完成用户开户操作
private void createAccount() {
//1.创建一个账户对象,用于封装用户的开户信息
Account acc = new Account();
//2.需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
//利用set方法将内容放在账户对象中
acc.setUserName(name);
//尽可能考虑一切的情况,并且给出一些提示加以提醒
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //取第一个元素的作为性别
//之所以用sc.next().charAt(0)是因为没有nextchar方法
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 (okPassWord.equals(passWord)) {
acc.setPassWord(passWord);
break;
} else {
System.out.println("您输入的2次密码不一致,请您重新输入");
}
}
System.out.println("请您输入您的取款限额:");
double limit = sc.nextDouble();
acc.setLimit(limit);
//重点:需要为这个账户生成一个卡号(由系统自动生成,用8位数字进行表示,但不能与其他账户的卡号有所重复
//使用createcardId方法来生成一个随机不重复的卡号
String newCardId = createCardId();
acc.setCardId(newCardId);
//3.把这个账户对象,存入到账户集合中去
accounts.add(acc);
//为了输出称呼开户人是先生还是女士,稍微对Accout类的UserName稍微进行调整,直接进行封装在一起
System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的开户卡号是:" + acc.getCardId());
}
/*返回一个8位数字的卡号,并且这个卡号不能与其他的账户的卡号重复,有返回值,不能void*/
private String createCardId() {
//1.定义了一个String类型的变量来记住8位数字作为一个卡号
while (true) {
String cardId = "";
//2.使用循环,循环8次,每次产生一个随机数给cardId连接起来
Random r = new Random();
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10);//0-9
cardId += data;
}
//3.需要对生成的随机卡号,和系统中其他账户是否重复,没有重复时,才可以作为一个新卡号进行返回
Account acc = getAccountByCardId(cardId);
if (acc == null) {
//说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它作为一个新卡号
return cardId;
}
}
}
/**根据卡号查询账户对象返回accounts =[c1,c2,c3,...]*/
private Account getAccountByCardId(String cardId) {
//遍历全部的账户对象
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
//判断这个账户对象acc中的卡号是否是要找的卡号
if(acc.getCardId().equals(cardId))
{
return acc;
}
}
return null;//这个卡号是不存在的,因此也就是可以作为新账户的卡号
}
}
3.代码运行结果(各个部分的结果)
开户
登录
登录之后
查询信息
取钱
转账
销户
4.总结:
1.快捷键的使用:
ctrl +c,v,a(复制,粘贴,全选)
ctrl+x,剪切
psvm,main主方法
.sout(打印)
fori 快速生成for循环
alt+enter快速创建新方法
ctrl+alt+t快速生成死循环相关
2.return跳出整个方法
3.break跳出分支(方法已经跳出的情况下,分支就肯定一定跳出去了)
4.使用全局变量private Account loginAcc;//记住登录后的用户账户,尤其方便后续的转账操作
5. private Account getAccountByCardId(String cardId) 这个方法是一个关键,判断是否开户的账户重复了,也能通过该方法判断,是否有转账的对象
6. 什么时候会用到死循环呢,尽可能地多的可能性,不知道会发生些那些,为了让回到正确的选择上,避免bug的出现,使用死循环来进行实现。
后面再有别的想法了,再接着写。
未完待续…