当前位置: 首页 > backend >正文

ATM存取钱项目

ATM存取钱项目

项目涉及的知识点

1 系统架构搭建

ATM类中使用什么来存储账户的全部信息?

1.1 Account类

public class Account {private String cardId;private String userName;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 getUserName() {return userName;}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;}
}

1.2 ATM类

一些方法也在该类

 private ArrayList<Account> accounts=new ArrayList<>();//存储系统账户信息private Scanner sc=new Scanner(System.in);private Account loginAccount;//记录登录后的账户登录public class ATM {private ArrayList<Account> accounts=new ArrayList<>();//存储系统账户信息private Scanner sc=new Scanner(System.in);}

1.3 Test类

public class Test {public static void main(String[] args) {//1.创建一个ATM对象,代表ATM系统ATM atm = new ATM();//2.调用ATM对象的start方法,启动系统atm.satrt();}
}

2 启动ATM系统,欢迎界面

 public void satrt(){while (true) {System.out.println("===欢迎进入ATM系统===");System.out.println("1,用户登录");System.out.println("2,用户开户");System.out.println("请选择");int choice=sc.nextInt();switch (choice){case 1://用户登录login();break;case 2://用户开户createAccount();break;default:System.out.println("没有该操作");}}}

3 开户功能的实现

3.1 开户功能的需求

3.2 开户功能实现需要哪几步操作

3.2.1 创建一个账户对象,用于封装用户信息
System.out.println("==系统开户操作==");
//1.创建一个账户对象,用于封装用户信息
Account account=new Account();
3.2.2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请输入您的账户名称:");
String name=sc.next();
account.setUserName(name);
3.2.3 输入账户性别
while (true) {System.out.println("请输入您的性别");char sex=sc.next().charAt(0);//if (sex=='男'||sex=='女'){account.setSex(sex);break;}else {System.out.println("您输入的性别有问题--只能是男或女");}
}
3.2.4 输入账户密码
while (true) {System.out.println("请您输入你的账户密码:");String password=sc.next();System.out.println("请输入您的确认密码:");String password2=sc.next();//判断;两次密码是否一样if(password.equals(password2)){account.setPassWord(password2);break;}else {System.out.println("输入的两次密码不一致,请您确认==");}
}
3.2.5 设置取现额度
System.out.println("请输入您的取现额度");
double limit=sc.nextDouble();
account.setLimit(limit);
3.2.6 生成卡号

3.2.6.1 根据卡号查询账户返回
private Account getAccountByCardId(String cardId){//遍历全部的账户对象for (Account account:accounts) {Account account1=account;if(account1.getCardId().equals(cardId)){return account1;}}return null;//查无此账户,这个卡号不存在
}
3.2.6.2 返回一个8位数字的卡号,并且这个卡号不能与其他账户卡号重复
private String createCardId(){while (true) {//1.定义一个String类型的变量记住8位数字作为一个卡号String cardId="";//2.使用循环,循环8次,每次产生一个随机数给cardId链接起来Random random=new Random();for (int i = 0; i < 8; i++) {int number= random.nextInt(10);cardId+=number;}//3.判断cardId记录的卡号是否与其他账户卡号是否重复Account account=getAccountByCardId(cardId);if(account==null){//说明cardId未找到,这个id没有被其他账户占有,// 因此,可以返回它作为一个新卡号return cardId;}}
}
3.2.7 把这个账户对象,存入账户集合中
accounts.add(account);
System.out.println("恭喜您"+account.getUserName()+"开户成功,您的卡号是:" );

3.3 用户登录功能

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 account=getAccountByCardId(cardId);if (account==null){//卡号不存在System.out.println("您输入的卡号不存在,请确认~~");}else {//卡号存在while (true) {System.out.println("请您输入密码:");String password=sc.next();//判断密码是否正确if (account.getPassWord().equals(password)){loginAccount=account;//密码正确,登录成功System.out.println("恭喜您,"+account.getUserName()+"登录成功,您的卡号是:"+account.getCardId());//展示登录后的操作界面showUserCommand();return;//退出并结束当前方法}else {System.out.println("您输入的密码不正确,请确认~~");}}}}}

3.4 用户操作页设计

3.4.1 展现当前账户信息
private void showLoginAccount(){System.out.println("==当前账户信息如下:==");System.out.println("卡号:"+loginAccount .getCardId());System.out.println("户主"+loginAccount.getUserName());System.out.println("性别"+loginAccount.getSex());System.out.println("余额"+loginAccount.getMoney());System.out.println("单次限额"+loginAccount.getLimit());
}

3.5 存取款的实现

3.5.1用户存款
private void depositMoney() {System.out.println("==存钱操作==");System.out.println("请您输入存款金额:");double money=sc.nextDouble();//更新当前账户的余额loginAccount.setMoney(loginAccount.getMoney()+money);System.out.println("恭喜您,您存钱:"+money+"成功,存钱后余额是:"+loginAccount .getMoney());}
3.5.2 用户取款
private void drawMoney() {System.out.println("==取钱操作==");//1.先判断账户余额是否达到100元,若是不够100,则不允许该账户取钱if (loginAccount.getMoney()<100){System.out.println("您的余额不足100元,不允许取钱~~");return;}//2.让用户输入取款金额while (true) {System.out.println("请输入存款金额:");double money=sc.nextDouble();//3.判断用户余额是否足够if (loginAccount.getMoney()>=money){//账户余额足够//4.取款金额不允许超过限额if (money>loginAccount.getLimit()){System.out.println("您当前取款金额超过了每次限额,您每次最多可取:"+loginAccount.getLimit()+"~~");}else {//可以开始取钱,更新当前账户余额即可loginAccount.setMoney(loginAccount.getMoney()-money);System.out.println("您取款"+money+"成功,取款后余额:"+loginAccount.getMoney());break;}}else {System.out.println("余额不足,您账户的余额是:"+loginAccount.getMoney()+"~~");}}
}

3.6 转账

private void transferMoney() {System.out.println("用户转账");//1.判断系统中是否存在其他账户if(accounts.size()<2){System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");return;}//2.判断自己账户中是否有钱if (loginAccount.getMoney()==0){System.out.println("您自己都没钱,就别转帐了~~");return;}while (true) {//3.真正开始转账System.out.println("请您输入对方的卡号:");String idCard=sc.next();//4.判断卡号是否正确Account account=getAccountByCardId(idCard);if (account==null){System.out.println("卡号输入错误~~");}else {//对方账户存在,继续让用户认证姓氏String name = "*"+account.getUserName().substring(1);//substring(1) - 截取用户名字符串从第2个字符开始到末尾的子串System.out.println("请您输入【"+name+"】的姓氏");String preName=sc.next();//5.判断这个姓氏是否正确if (account.getUserName().startsWith(preName)){while (true) {//认证通过了,真正开始转账System.out.println("请输入转给对方的金额:");double money=sc.nextDouble();//6.判断这个金额是否超过自己的余额if(loginAccount .getMoney()>=money){//转给对方//更新自己的账户余额以及对方的账户余额loginAccount.setMoney(loginAccount.getMoney()-money);//更新对方账户余额account.setMoney(account.getMoney()+money);System.out.println("恭喜您转账成功,您当前账户余额为:"+loginAccount.getMoney());return;//直接跳出转账方法}else {System.out.println("您余额不足,无法给对方转账这么多余额,最多可转:"+loginAccount .getMoney()+"~~");}}}else {System.out.println("对不起,您认证的姓氏有问题~~");}}}
}

3.7 销户功能

private boolean deleteAccount() {System.out.println("==销户操作==");//1.问用户是否确定要销户?System.out.println("请问确认要销户吗?y/n");String choice=sc.next();switch (choice){case "y"://进行销户//2.判断用户账户是否还有余额if (loginAccount.getMoney()==0){//真的销户了accounts.remove(loginAccount);System.out.println("您好,您的账户销户成功~~");return true;}else {System.out.println("对不起,您的账户还有余额不允许销户~~");return false;}default :System.out.println("好的,您的账户保留!");return false;}}

3.8 密码修改

private void updatePassWord() {System.out.println("==账户密码修改操作==");while (true) {//1.提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String password=sc.next();//2.认证密码是否正确if(loginAccount.getPassWord().equals(password)){//认证通过while (true) {//3.真正开始修改密码System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}}private void updatePassWord() {System.out.println("==账户密码修改操作==");while (true) {//1.提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String password=sc.next();//2.认证密码是否正确if(loginAccount.getPassWord().equals(password)){//认证通过while (true) {//3.真正开始修改密码System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}
}

源代码

一.Account类

package com.xie;public class Account {private String cardId;private String userName;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 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;}
}

二.ATM类

package com.xie;import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class ATM {private ArrayList<Account> accounts=new ArrayList<>();//存储系统账户信息private Scanner sc=new Scanner(System.in);private Account loginAccount;//记录登录后的账户登录//启动ATM系统,欢迎界面public void satrt(){while (true) {System.out.println("===欢迎进入ATM系统===");System.out.println("1,用户登录");System.out.println("2,用户开户");System.out.println("请选择");int choice=sc.nextInt();switch (choice){case 1://用户登录login();break;case 2://用户开户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 account=getAccountByCardId(cardId);if (account==null){//卡号不存在System.out.println("您输入的卡号不存在,请确认~~");}else {//卡号存在while (true) {System.out.println("请您输入密码:");String password=sc.next();//判断密码是否正确if (account.getPassWord().equals(password)){loginAccount=account;//密码正确,登录成功System.out.println("恭喜您,"+account.getUserName()+"登录成功,您的卡号是:"+account.getCardId());//展示登录后的操作界面showUserCommand();return;//退出并结束当前方法}else {System.out.println("您输入的密码不正确,请确认~~");}}}}}//完成用户开户操作private void createAccount(){System.out.println("==系统开户操作==");//1.创建一个账户对象,用于封装用户信息Account account=new Account();//2.需要用户输入自己的开户信息,赋值给账户对象System.out.println("请输入您的账户名称:");String name=sc.next();account.setUserName(name);//输入账户性别while (true) {System.out.println("请输入您的性别");char sex=sc.next().charAt(0);//if (sex=='男'||sex=='女'){account.setSex(sex);break;}else {System.out.println("您输入的性别有问题--只能是男或女");}}//输入账户密码while (true) {System.out.println("请您输入你的账户密码:");String password=sc.next();System.out.println("请输入您的确认密码:");String password2=sc.next();//判断;两次密码是否一样if(password.equals(password2)){account.setPassWord(password2);break;}else {System.out.println("输入的两次密码不一致,请您确认==");}}System.out.println("请输入您的取现额度");double limit=sc.nextDouble();account.setLimit(limit);//重点:我们需要为这个账户生成一个卡号//(由系统自动生成,8位数字表示,不能与其他账户卡号重复)String newCardId=createCardId();account.setCardId(newCardId);//3.把这个账户对象,存入账户集合中accounts.add(account);System.out.println("恭喜您"+account.getUserName()+"开户成功,您的卡号是:"+account.getCardId() );}//返回一个8位数字的卡号,并且这个卡号不能与其他账户卡号重复private String createCardId(){while (true) {//1.定义一个String类型的变量记住8位数字作为一个卡号String cardId="";//2.使用循环,循环8次,每次产生一个随机数给cardId链接起来Random random=new Random();for (int i = 0; i < 8; i++) {int number= random.nextInt(10);cardId+=number;}//3.判断cardId记录的卡号是否与其他账户卡号是否重复Account account=getAccountByCardId(cardId);if(account==null){//说明cardId未找到,这个id没有被其他账户占有,// 因此,可以返回它作为一个新卡号return cardId;}}}//根据卡号查询账户返回 accountsprivate Account getAccountByCardId(String cardId){//遍历全部的账户对象for (Account account:accounts) {Account account1=account;if(account1.getCardId().equals(cardId)){return account1;}}return null;//查无此账户,这个卡号不存在}//展示登录后的操作界面private void showUserCommand(){while (true) {System.out.println(loginAccount.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 choice=sc.nextInt();switch (choice){case 1://查询当前账户showLoginAccount();break;case 2://存款操作depositMoney();break;case 3://取款drawMoney();break;case 4://转账transferMoney();return;case 5://密码修改updatePassWord();return;case 6://退出System.out.println(loginAccount.getUserName()+"您退出系统成功!");return;//退出并结束当前方法case 7://注销当前账户if (deleteAccount()) {//销户成功了,回到欢迎界面return;}break;default:System.out.println("当前选择的操作是不存在的,请确认~~");}}}//展现当前账户信息private void showLoginAccount(){System.out.println("==当前账户信息如下:==");System.out.println("卡号:"+loginAccount .getCardId());System.out.println("户主"+loginAccount.getUserName());System.out.println("性别"+loginAccount.getSex());System.out.println("余额"+loginAccount.getMoney());System.out.println("单次限额"+loginAccount.getLimit());}//存款private void depositMoney() {System.out.println("==存钱操作==");System.out.println("请您输入存款金额:");double money=sc.nextDouble();//更新当前账户的余额loginAccount.setMoney(loginAccount.getMoney()+money);System.out.println("恭喜您,您存钱:"+money+"成功,存钱后余额是:"+loginAccount .getMoney());}//取钱private void drawMoney() {System.out.println("==取钱操作==");//1.先判断账户余额是否达到100元,若是不够100,则不允许该账户取钱if (loginAccount.getMoney()<100){System.out.println("您的余额不足100元,不允许取钱~~");return;}//2.让用户输入取款金额while (true) {System.out.println("请输入存款金额:");double money=sc.nextDouble();//3.判断用户余额是否足够if (loginAccount.getMoney()>=money){//账户余额足够//4.取款金额不允许超过限额if (money>loginAccount.getLimit()){System.out.println("您当前取款金额超过了每次限额,您每次最多可取:"+loginAccount.getLimit()+"~~");}else {//可以开始取钱,更新当前账户余额即可loginAccount.setMoney(loginAccount.getMoney()-money);System.out.println("您取款"+money+"成功,取款后余额:"+loginAccount.getMoney());break;}}else {System.out.println("余额不足,您账户的余额是:"+loginAccount.getMoney()+"~~");}}}//转账private void transferMoney() {System.out.println("用户转账");//1.判断系统中是否存在其他账户if(accounts.size()<2){System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");return;}//2.判断自己账户中是否有钱if (loginAccount.getMoney()==0){System.out.println("您自己都没钱,就别转帐了~~");return;}while (true) {//3.真正开始转账System.out.println("请您输入对方的卡号:");String idCard=sc.next();//4.判断卡号是否正确Account account=getAccountByCardId(idCard);if (account==null){System.out.println("卡号输入错误~~");}else {//对方账户存在,继续让用户认证姓氏String name = "*"+account.getUserName().substring(1);//substring(1) - 截取用户名字符串从第2个字符开始到末尾的子串System.out.println("请您输入【"+name+"】的姓氏");String preName=sc.next();//5.判断这个姓氏是否正确if (account.getUserName().startsWith(preName)){while (true) {//认证通过了,真正开始转账System.out.println("请输入转给对方的金额:");double money=sc.nextDouble();//6.判断这个金额是否超过自己的余额if(loginAccount .getMoney()>=money){//转给对方//更新自己的账户余额以及对方的账户余额loginAccount.setMoney(loginAccount.getMoney()-money);//更新对方账户余额account.setMoney(account.getMoney()+money);System.out.println("恭喜您转账成功,您当前账户余额为:"+loginAccount.getMoney());return;//直接跳出转账方法}else {System.out.println("您余额不足,无法给对方转账这么多余额,最多可转:"+loginAccount .getMoney()+"~~");}}}else {System.out.println("对不起,您认证的姓氏有问题~~");}}}}//销户private boolean deleteAccount() {System.out.println("==销户操作==");//1.问用户是否确定要销户?System.out.println("请问确认要销户吗?y/n");String choice=sc.next();switch (choice){case "y"://进行销户//2.判断用户账户是否还有余额if (loginAccount.getMoney()==0){//真的销户了accounts.remove(loginAccount);System.out.println("您好,您的账户销户成功~~");return true;}else {System.out.println("对不起,您的账户还有余额不允许销户~~");return false;}default :System.out.println("好的,您的账户保留!");return false;}}//修改密码private void updatePassWord() {System.out.println("==账户密码修改操作==");while (true) {//1.提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String password=sc.next();//2.认证密码是否正确if(loginAccount.getPassWord().equals(password)){//认证通过while (true) {//3.真正开始修改密码System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}}
}

三.Test类

package com.xie;public class Test {public static void main(String[] args) {//1.创建一个ATM对象,代表ATM系统ATM atm = new ATM();//2.调用ATM对象的start方法,启动系统atm.satrt();}
}System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}}
}

三.Test类

package com.xie;public class Test {public static void main(String[] args) {//1.创建一个ATM对象,代表ATM系统ATM atm = new ATM();//2.调用ATM对象的start方法,启动系统atm.satrt();}
}
http://www.xdnf.cn/news/12079.html

相关文章:

  • 【DeepSeek 学大模型推理】Fused Residual LayerNorm with Reduce-Scatter
  • MySQL事务:从ACID特性到高并发优化的深度解析
  • day 44
  • K8S主机漏洞扫描时检测到kube-服务目标SSL证书已过期漏洞的一种永久性修复方法
  • 【论文写作】如何撰写基于模型拼接(A+B)的创新性论文
  • leetcode 二叉搜索树中第k小的元素 java
  • SiFli 567+emmc Standby休眠报错问题
  • 重装系统+驱动+磁盘分区
  • day19 leetcode-hot100-37(二叉树2)
  • 5.29-6.4解决问题归纳
  • 银行用户信誉等级
  • 前端面试宝典---vite原理解析
  • Numpy——结构化数组和Numpy文件
  • 【电赛培训课程】电子设计竞赛工程基础知识
  • 使用qt 定义全局钩子 捕获系统的键盘事件
  • 《人性的弱点》核心总结
  • AI基础认知
  • 【Python连接数据库基础 06】Pandas与SQL协同:解锁大规模数据处理新境界,让分析效率飙升10倍
  • 代理IP:6G标准化进程中的隐形推手
  • 如何在 React 中监听 div 的滚动事件
  • Pendulum:优雅处理 Python 中的日期与时间
  • vue3动态插入iframe,内容被取消的原因
  • pack 布局管理器
  • 第十三节:第三部分:集合框架:Map集合的遍历方式
  • 数码相片冲印规格参考表
  • Docker load 后镜像名称为空问题的解决方案
  • 国芯思辰ADE芯片成功替代ADS1296R,除颤仪核心部件实现自主可控
  • git删除本地分支和远程分支
  • 非对称加密
  • MuLogin浏览器如何使用Loongproxy?