【Java】自动取款机ATM案例

目录

      • 1. 封装数据
      • 2. 欢迎界面
      • 3. 实现开户功能
      • 4. 生成卡号
      • 5. 登录功能
      • 6. 展示用户操作界面
      • 7. 查询账户
      • 8. 存款
      • 9. 取款
      • 10. 转账
      • 11. 修改密码
      • 12. 注销


  用户输入密码,如果密码校验通过,就会进入ATM机的主操作界面:有查询、取款、存款、转账等业务功能。

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 + ( 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;}
}

2. 欢迎界面

编写一个ATM类,负责对每一个账户对象进行管理,并编写欢迎界面

public class ATM {//创建一个存储账户对象的集合;后面每开一个账户,就往集合中添加一个账户对象private ArrayList<Account> accounts = new ArrayList<>(); private Scanner sc = new Scanner(System.in);/**展示欢迎界面 */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:// 用户登录System.out.println("进入登录功能");break;case 2:// 用户开户System.out.println("进入开户功能");break;default:System.out.println("没有该操作~~");}}}
}

3. 实现开户功能

  • 创建一个账户对象,用于封装用户的开户信息
  • 需要用户输入自己的开户信息,赋值给账户对象
    • 输入账户名,设置给账户对象
    • 输入性别,如果性别是’男’或者’女’,将性别设置给账户对象;否则重新录入性别知道录入正确为止。
    • 输入账户、并且输入两次密码,只有两次密码相同,才将账户和密码设置给账户对象。
    • 输入提现限额,并且设置给账户对象
  • 输出开户成功,的提示语句。
private void createAccount(){System.out.println("==系统开户操作==");// 1、创建一个账户对象,用于封装用户的开户信息Account acc = new Account();// 2、需要用户输入自己的开户信息,赋值给账户对象System.out.println("请您输入您的账户名称:");String name = sc.next();acc.setUserName(name);while (true) {System.out.println("请您输入您的性别:");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();// 判断2次密码是否一样。if(okPassWord.equals(passWord)){acc.setPassWord(okPassWord);break;}else {System.out.println("您输入的2次密码不一致,请您确认~~");}}System.out.println("请您输入您的取现额度:");double limit = sc.nextDouble();acc.setLimit(limit);// 3、把这个账户对象,存入到账户集合中去accounts.add(acc);System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
}

4. 生成卡号

  • 遍历存储Account对象的集合,得到每一个Account对象,获取对象的卡号
  • 如果卡号存在,返回该卡号对应的Account对象
  • 如果卡号不存在,返回null
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; // 查无此账户,这个卡号不存在的
}
  • 生成卡号,先随机产生8个[0,9]范围内的随机数,拼接成一个字符串
  • 然后再调用getAccountByCardId方法,判断这个卡号字符串是否存在
  • 判断生成的卡号是否存在
    • 如果生成的卡号不存在,说明生成的卡号是有效的,把卡号返回,
    • 如果生成的卡号存在,说明生成的卡号无效,循环继续生产卡号。
private String createCardId(){while (true) {// 1、定义一个String类型的变量记住8位数字作为一个卡号String cardId = "";// 2、使用循环,循环8次,每次产生一个随机数给cardId连接起来Random r = new Random();for (int i = 0; i < 8; i++) {int data = r.nextInt(10); // 0 - 9cardId += data;}// 3、判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复,才可以做为一个新卡号返回。Account acc = getAccountByCardId(cardId);if(acc == null){// 说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它做为一个新卡号return cardId;}}
}

5. 登录功能

  • 判断系统中是否存在账户对象,存在才能登录,如果不存在,我们直接结束登录操作
  • 输入登录的卡号,并判断卡号是否存在
  • 如果卡号不存在,直接给出提示
  • 如果卡号存在,接着输入用户密码,并判断密码是否正确
  • 如果密码也正确,则登录成功,并且记录当前的登录账户
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("恭喜您," + acc.getUserName() + "成功登录了系统,您的卡号是:" + acc.getCardId());                return;}else {System.out.println("您输入的密码不正确,请确认~~");}}}}
}

6. 展示用户操作界面

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://TODO 查询当前账户break;case 2://TODO 存款break;case 3://TODO取款break;case 4://TOD 转账break;case 5://TODO 密码修改return;// 跳出并结束当前方法case 6://TODO 退出System.out.println(loginAcc.getUserName() + "您退出系统成功!");return; // 跳出并结束当前方法case 7:// 注销当前登录的账户if(deleteAccount()){// 销户成功了,回到欢迎界面return;}break;default:System.out.println("您当前选择的操作是不存在的,请确认~~");}}
}

7. 查询账户

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());
}

8. 存款

  • 键盘录入要存入的金额
  • 在原有余额的基础上,加上存入金额,得到新的余额
  • 再将新的余额设置给当前账户对象
private void depositMoney() {System.out.println("==存钱操作==");System.out.println("请您输入存款金额:");double money = sc.nextDouble();// 更新当前登录的账户的余额。loginAcc.setMoney(loginAcc.getMoney() + money);System.out.println("恭喜您,您存钱:" + money + "成功,存钱后余额是:" + loginAcc.getMoney());
}

9. 取款

  • 判断账户余额是否达到了100元,如果不够100元,就不让用户取钱了

  • 让用户输入取款金额

  • 判断账户余额是否足够

    • 如果余额足够, 继续判断当前取款金额是否超过了每次限额

      • 如果超过限额,提示“每次只能取xxx限额的钱”

      • 如果不超过限额,则在当前余额上减去取钱的金额,得到新的余额

      • 并将新的余额设置给账户对象。

    • 如果余额不足,提示“你的余额不足,你的账户余额是xxx元”

private void drawMoney() {System.out.println("==取钱操作==");// 1、判断账户余额是否达到了100元,如果不够100元,就不让用户取钱了if(loginAcc.getMoney() < 100){System.out.println("您的账户余额不足100元,不允许取钱~~");return;}// 2、让用户输入取款金额while (true) {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());}}
}

10. 转账

  • 判断系统中是否存在其他账户
  • 判断自己的账户中是否有钱
  • 真正开始转账了,输入对方卡号
  • 判断对方卡号是否正确啊?
  • 如果卡号正确,就继续让用户输入姓氏, 并判断这个姓氏是否正确?
  • 如果姓氏正确,继续判断这个转账金额是否超过自己的余额。
  • 果对方卡号存在、姓氏匹配、余额足够,就完成真正的转账操作
private void transferMoney() {System.out.println("==用户转账==");// 1、判断系统中是否存在其他账户。if(accounts.size() < 2){System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");return;}// 2、判断自己的账户中是否有钱if(loginAcc.getMoney() == 0){System.out.println("您自己都没钱,就别转了~~");return;}while (true) {// 3、真正开始转账了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(loginAcc.getMoney() >= money){// 7、转给对方了// 更新自己的账户余额loginAcc.setMoney(loginAcc.getMoney() - money);// 更新对方的账户余额acc.setMoney(acc.getMoney() + money);System.out.println("您转账成功了~~~");return; // 跳出转账方法。。}else {System.out.println("您余额不足,无法给对方转这么多钱,最多可转:" + loginAcc.getMoney());}}}else {System.out.println("对不起,您认证的姓氏有问题~~");}}}
}

11. 修改密码

  • 提醒用户输入当前密码
  • 认证当前密码是否正确
  • 如果认证密码正确,开始修改密码,修改密码时需要用户输入2次新密码
  • 判断2次 密码是否一致
private void updatePassWord() {System.out.println("==账户密码修改操作==");while (true) {// 1、提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String passWord = sc.next();// 2、认证当前密码是否正确啊if(loginAcc.getPassWord().equals(passWord)){while (true) {// 3、真正开始修改密码了System.out.println("请您输入新密码:");String newPassWord = sc.next();System.out.println("请您再次输入密码:");String okPassWord = sc.next();// 4、判断2次 密码是否一致if(okPassWord.equals(newPassWord)){// 可以真正开始修改密码了loginAcc.setPassWord(okPassWord);System.out.println("恭喜您,您的密码修改成功~~~");return;}else {System.out.println("您输入的2次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}
}

12. 注销

  • 先确认是否需要注销账户,让用户输入y或者n
  • 输入y后,继续判断当前用户的账户是否有钱
private boolean deleteAccount() {System.out.println("==进行销户操作==");// 1、问问用户是否确定要销户System.out.println("请问您确认销户吗?y/n");String command = sc.next();switch (command) {case "y":// 确实要销户// 2、判断用户的账户中是否有钱:loginAccif(loginAcc.getMoney() == 0) {// 销户accounts.remove(loginAcc);System.out.println("您好,您的账户已经成功销户~~");return true;}else {System.out.println("对不起,您的账户中存钱金额,不允许销户~~");return false;}default:System.out.println("好的,您的账户保留!!");return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/58499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器与虚拟化技术:Docker compose部署LNMP

目录 一、理论 1.LNMP架构 2.背景 3.Dockerfile部署LNMP 3.准备Nginx镜像 4.准备MySQL容器 5.准备PHP镜像 6.上传wordpress软件包 7.编写docker-compose.yml 8.构建与运行docker-compose 9.启动 wordpress 服务 10.浏览器访问 11.将运行中的 docker容器保存为 doc…

智能设计师的崛起:探寻智元兔AI设计师的神奇之旅

AI绘图是指利用人工智能技术来生成或改善绘图作品的方法和工具。通过使用深度学习和生成对抗网络等算法&#xff0c;人工智能可以学习和模仿艺术家的创作风格&#xff0c;生成逼真的艺术作品。 智元兔-AI设计师是一款基于人工智能设计工具&#xff0c;利用机器学习和深度学习技…

什么是ChatGPT水印,ChatGPT生成的内容如何不被检测出来,原理什么?

太长不看版 1. 什么是ChatGPT水印&#xff1f; ChatGPT水印是AI以伪随机方式生成的独特tokens序列。该序列用来作为水印&#xff0c;以区分AI生成内容和人类原创内容。 2. 如何规避ChatGPT水印&#xff1f; 一种规避方法是使用其他AI模型改写ChatGPT生成的文本。这会破坏水…

启动线程方法 start ()和 run ()有什么区别

在Java中,线程可以通过调用start()方法或者直接调用run()方法来执行。这两种方式有着重要的区别: start() 方法:当你调用线程的start()方法时,它会使线程进入就绪状态,等待系统调度。系统会为该线程分配资源,并在合适的时机执行线程的run()方法。实际上,start()方法会启…

大数据(二)大数据行业相关统计数据

大数据&#xff08;二&#xff09;大数据行业相关统计数据 目录 一、大数据相关的各种资讯 二、转载自网络的大数据统计数据 2.1、国家大数据政策 2.2、产业结构分析 2.3、应用结构分析 2.4、数据中心 2.5、云计算 一、大数据相关的各种资讯 1. 据IDC预测&#xff0…

SpringBoot 读取配置文件的值为 Infinity

1.配置信息 appid&#xff1a;6E212341234 2.获取方式 Value("${admin}")private String admin; 获取到结果 Infinity 3.修改方案 配置信息上加号 appid&#xff1a;‘6E212341234 yml中使用[单引号]不会转换单引号里面的特殊字符&#xff0c;使用""[双…

vue3使用canvas实现图层的移动、缩放、旋转等其他编辑操作

一、Canvas的点击区域检测以及如何监听Canvas上各种图形的点击事件 1、利用数学的力量 一些简单有规则的图形,比如矩形,椭圆,多边形......我们可以使用一些数学函数来计算判断。 这种方式非常棒,当你的画布上没有大量的图形时,他可能是非常快的。 但是这种方式很难处理…

JOJO的奇妙冒险

JOJO,我不想再做人了。 推荐一部动漫 JOJO的奇妙冒险 荒木飞吕彦创作的漫画 《JOJO的奇妙冒险》是由日本漫画家荒木飞吕彦所著漫画。漫画于1987年至2004年在集英社的少年漫画杂志少年JUMP上连载&#xff08;1987年12号刊-2004年47号刊&#xff09;&#xff0c;2005年后在集英…

全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

展示突破性创新技术&#xff0c;共话行业发展趋势。8月25日&#xff0c;全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下&#xff0c;由浙…

DBO优化SVM的电力负荷预测,附MATLAB代码

今天为大家带来一期基于DBO-SVM的电力负荷预测。 原理详解 文章对支持向量机(SVM)的两个参数进行优化&#xff0c;分别是&#xff1a;惩罚系数c和 gamma。 其中&#xff0c;惩罚系数c表示对误差的宽容度。c越高&#xff0c;说明越不能容忍出现误差,容易过拟合。c越小&#xff0…

Pytorch-以数字识别更好地入门深度学习

目录 一、数据介绍 二、下载数据 三、可视化数据 四、模型构建 五、模型训练 六、模型预测 一、数据介绍 MNIST数据集是深度学习入门的经典案例&#xff0c;因为它具有以下优点&#xff1a; 1. 数据量小&#xff0c;计算速度快。MNIST数据集包含60000个训练样本和1000…

Go学习-Day4

文章目录 Go学习-Day4函数值传递&#xff0c;引用传递常用的函数 异常处理数组Slice切片 Go学习-Day4 个人博客&#xff1a;CSDN博客 函数 值传递&#xff0c;引用传递 值传递直接拷贝值&#xff0c;一般是基本数据类型&#xff0c;数组&#xff0c;结构体也是引用传递传递…

【程序员必知必会2】中英文混合超长字符串如何截断(C++)

背景 用户输入的搜索关键词可能是包含中英文、特殊字符混合的字符串&#xff0c;如果长度超长&#xff0c;可能会导致下游服务的报错&#xff0c;需要提前对keyword做截断。 版本一 (只考虑中英文) bool CutOff(std::string keyword){int query_length keyword.length();// …

网络编程 http 相关基础概念

文章目录 表单是什么http请求是什么http请求的结构和说明关于http方法 GET和POST区别http常见状态码http响应http 请求是无状态的含义html是什么 &#xff08;前端内容&#xff0c;了解即可&#xff09;html 常见标签 &#xff08;前端内容&#xff0c;了解即可&#xff09;关于…

App卡帧与BlockCanary

作者&#xff1a;图个喜庆 一&#xff0c;前言 app卡帧一直是性能优化的一个重要方面&#xff0c;虽然现在手机硬件性能越来越高&#xff0c;明显的卡帧现象越来越少&#xff0c;但是了解卡帧相关的知识还是非常有必要的。 本文分两部分从app卡帧的原理出发&#xff0c;讨论屏…

Mainline Linux 和 U-Boot编译

By Toradex胡珊逢 Toradex 自从 Linux BSP v6 开始在使用 32位处理器的 Arm 模块如 iMX6、iMX6ULL、iMX7 上提供 mainline/upstream kernel &#xff0c;部分 64位处理器模块如 Verdin iMX8M Mini/Plus 也提供实验性支持。文章将以季度发布版本 Linux BSP V6.3.0 为例介绍如何下…

detour编译问题及导入visual studio

Detours是经过微软认证的一个开源Hook库&#xff0c;Detours在GitHub上&#xff0c;网址为 https://github.com/Microsoft/Detours 注意版本不一样的话也是会出问题的&#xff0c;因为我之前是vs2022的所以之前的detours.lib不能使用&#xff0c;必须用对应版本的x64 Native To…

python的安装(推荐)

torch安装与卸载推荐链接1推荐链接2 推荐链接3 安装pytorch步骤推荐链接 python关键字&#xff1a;

Java简单算法题(面试准备)

一、两数之和 public int[] twoSum(int[] nums, int target) {for (int i 0; i < nums.length; i) {for (int j i 1; j < nums.length; j) {if (nums[i] nums[j] target) {return new int[]{i, j};}}}throw new IllegalArgumentException("No two sum solutio…

4 hadoop集群配置案例

3&#xff09;配置集群 &#xff08;1&#xff09;核心配置文件&#xff0c;core-site.xml cd $HADOOP_HOME/etc/hadoopvim core-site.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text…