JAVA基础的ATM机存款项目

news/2025/10/19 18:10:29/文章来源:https://www.cnblogs.com/bingzhuo/p/19151186

定义一些ATM机中会运用到的基本元素

package NEW;public class Account {private String userName;//用户名private String passWord;//账户密码private String ueserId;//卡号private char sex;//用户性别private double limit;//限额private double money;//余额public double getLimit() {return limit;}public void setLimit(double limit) {this.limit = limit;}public char getSex() {return this.sex;}public void setSex(char sex) {this.sex = sex;}public String getUserName() {return userName+(sex == '男' ? "先生" : "女士");}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public String getUeserId() {return ueserId;}public void setUeserId(String ueserId) {this.ueserId = ueserId;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}
}

支撑ATM机实现各种功能的方法

package NEW;import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class ATM {ArrayList<Account> accounts =  new ArrayList<>();Scanner sc = new Scanner(System.in);private Account loginac;//记录登录后的用户账户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循环switch (command) {case 1://用户登录login();break;case 2://用户开户createAccount();break;default:System.out.println("无该操作");//用while循环去重置该界面break;}}}/*账户登录操作*/private void login(){System.out.println("====系统登录====");//判断系统之中是否有对象if(accounts.size()==0){System.out.println("当前系统中无任何账户,请先注册");return;}//存在对象,开始登录进程while(true){System.out.println("请输入您的登录卡号");String cardId = sc.next();Account acc = getAccountByCardId(cardId);if(acc==null){//该卡号不存在System.out.println("您的卡号输入错误,请确认");}else{while (true) {//卡号存在,让用户输入密码System.out.println("请输入您的账号密码");String password = sc.next();//判断密码是否正确if(acc.getPassWord().equals(password)){loginac = acc;//密码正确,登录成功System.out.println("恭喜您"+acc.getUserName()+"登录成功"+"您的卡号是"+acc.getUeserId());//展示登录后的操作界面showUserCommand();return;}else{System.out.println("您的密码输入错误,请确认");}}}}}/**展示登录后的操作界面*/private void showUserCommand(){while (true) {System.out.println(loginac.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.注销当前账户");int command = sc.nextInt();switch (command) {case 1://查账户showLoginAccount();break;case 2://取款drawMoney();break;case 3://转账tranforMoney();break;case 4://存款depositMoney();break;case 5:// 密码修改updatePassWord();break;case 6://退出System.out.println(loginac.getUserName()+"您退出系统成功!");return;case 7://注销账户if(delectAccount()){//销户成功,返回欢迎界面return;}break;default:System.out.println("您的输入错误,请确认");}}}/**更改账户密码*/private void updatePassWord() {System.out.println("=====密码修改操作=====");while (true) {//让用户认证当前密码System.out.println("请输入当前账号密码");String passWord = sc.next();if(passWord.equals(loginac.getPassWord())){System.out.println("认证通过");System.out.println("请您输入新密码");String newPassWord = sc.next();System.out.println("请您在一次确认您的新密码");String confirmPassWord = sc.next();if(newPassWord.equals(confirmPassWord)){loginac.setPassWord(newPassWord);System.out.println("密码修改成功");break;}else{System.out.println("您的新密码两次输入不一致,修改失败,请确认");}}else{System.out.println("您的密码错误,请确认");}//询问用户是否继续修改密码System.out.println("您是否继续修改密码:Y/N");String c =  sc.next();if(!"Y".equalsIgnoreCase(c)){break;}}}/**销户*///销户这个操作执行到最后实际上是返回一个销户成功或失败的结果,所以这个方法的返回值应设置为booleanprivate boolean delectAccount() {System.out.println("=====销户操作=====");System.out.println("请您确定要进行对这个账户的销户:Y/N");String command = sc.next();switch (command) {case "Y"://确认要销户//进一步确认该账户中是否有钱,有钱则无法销户if(loginac.getMoney()==0){//符合销户标准,进行销户accounts.remove(loginac);System.out.println("您已成功销户");return true;}else{System.out.println("您的账户中存在余额,无法销户");return false;}default:System.out.println("您的账户保留");return false;}}/**转账*/private void tranforMoney() {System.out.println("=====转账操作=====");//首先要判断转账的两个前提//1.系统里是否有两及个以上的账户,起码有两个才能相互转账//2.转账出去的那个账户是否有余额if(accounts.size()<2){System.out.println("当前系统中只有您一个账户,无法转账,请确认");return;}if(loginac.getMoney()==0){System.out.println("您的账户中没有余额,请确认");return;}while (true) {//正式开始转账System.out.println("请您输入对方的卡号:");String cardId = sc.next();//判断这个卡号是否正确Account acc = getAccountByCardId(cardId);if(acc==null){System.out.println("对方的卡号不存在");}else{//对方的账户存在,进行姓氏认证String name ="*"+acc.getUserName().substring(1);//substring是用来将*与用户名的第一个字发生替换的System.out.println("请您输入【"+name+"】:");String personName =  sc.next();//判断该姓氏是否正确if(acc.getUserName().startsWith(personName)){while (true) {//认证通过,开始转账System.out.println("请输入您的转账金额:");double money = sc.nextDouble();//判断该金额是否超过了自己的余额,即是否转的起if(loginac.getMoney()>=money){//够的话就开始更新双方的账号余额信息了//自己的loginac.setMoney(acc.getMoney()-money);//对方的acc.setMoney(acc.getMoney()+money);System.out.println("您的余额为:"+acc.getMoney());return;//跳出转账方法}else{System.out.println("您的余额不足,请确认,您最多能转:"+loginac.getMoney());}}}else{System.out.println("您的认证错误,请确认");}}}}private void drawMoney() {System.out.println("=====取钱操作=====");//判断当前余额是否大于100,小于100则无法取出if(loginac.getMoney()<100){System.out.println("您的存款金额不足100元,无法取出");return;}//大于100可以取钱,让用户输入取款金额while (true) {System.out.println("请输入您的取款金额:");double money = sc.nextDouble();//判断余额是否充足if(money<loginac.getMoney()){//当前余额充足//还要判断是否超过了单次的取款限额,即再嵌套一个if循环if(money>loginac.getLimit()){System.out.println("您此次的取款超过了单次的限额,您的限额为:"+loginac.getLimit());}else{//若都满足要求,则正式开始取钱,即更新账户内的余额loginac.setMoney(loginac.getMoney()-money);System.out.println("您取款:"+money+"\n"+"取款之后您的余额为"+loginac.getMoney());break;}}else{//余额不足System.out.println("您的余额不足,您的余额为:"+loginac.getMoney());}}}/**存钱*/private void depositMoney() {System.out.println("======存钱操作======");System.out.println("请输入您的存款金额:");double money = sc.nextDouble();//之后更新账户的余额loginac.setMoney(money+loginac.getMoney());System.out.println("恭喜您,您此次存钱:"+money+"您存钱之后的总额为"+loginac.getMoney());}/**展现账户登录信息*/private void showLoginAccount(){System.out.println("您的账号信息如下");System.out.println("姓名"+loginac.getUserName());System.out.println("存款"+loginac.getMoney());System.out.println("卡号"+loginac.getUeserId());System.out.println("性别"+loginac.getSex());System.out.println("单次限额"+loginac.getLimit());}/**账户开户操作 */public void createAccount() {System.out.println("=====开户操作=====");Account acc = new Account();System.out.println("请输入您的姓名");String name = sc.next();acc.setUserName(name);while (true) {System.out.println("请输入你的性别");char sex = sc.next().charAt(0);//charAT的作用是获取输入的字符串的第一位因为没有提供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 (password.equals(okpassword)) {acc.setPassWord(okpassword);break;} else {System.out.println("您的两次密码输入不一致,请确认");}}System.out.println("请输入您的限额:");double limit = sc.nextDouble();acc.setLimit(limit);//重难点:为这个账户生成一个卡号,且不能与其他以存在的账户卡号重复String newCard = creatCardId();acc.setUeserId(newCard);accounts.add(acc);System.out.println("恭喜您" + acc.getUserName() + "开户成功"+"您的卡号是"+acc.getUeserId());}/*返回一个8位数的卡号,并且不能与其他账户的卡号重复*///1.首先定义一个String类型的变量去记住8个数字作为一个卡号private String creatCardId() {while (true) {String cardId = "";//2.使用循环随机生成8个数字作为新生成的卡号Random r = new Random();for (int i = 0; i < 8; i++) {int date = r.nextInt(10);//0~9cardId += date;}//3.对上一步中产生的卡号进行判断,是否与其他账户重复了Account acc = getAccountByCardId(cardId);if(acc == null){return cardId;}}}//根据卡号查询账户对象返回private Account getAccountByCardId(String cardId) {//遍历全部账户对象的卡号for (int i = 0; i <accounts.size(); i++) {Account acc = accounts.get(i);//逐个取出accounts集合里的账户集合,方便后续对比卡号//判断这个账户对象acc中的卡号是否符合不重复的要求if(acc.getUeserId().equals(cardId)){return acc;}}return null;//查无此号,即这个卡号再已有的账户卡号之中并不重复}
}

测试能否正常执行

package NEW;public class Test {public static void main(String[] args) {ATM atm = new ATM();atm.start();}
}

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

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

相关文章

对话式AI竞赛决赛队伍揭晓

第五届大学团队进入Alexa Prize社交机器人挑战赛决赛,将角逐50万美元大奖。比赛旨在推动对话式AI技术发展,要求机器人能与人类就时事话题进行20分钟连贯有趣的交流。Alexa Prize社交机器人挑战赛4决赛队伍揭晓 五支大…

2025年安装厂家权威推荐榜单:管道/电气/生物医药工厂机电/暖通空调/空压系统/纯水系统/厂房通风/车间配电/机械设备/工业设备安装公司精选

2025年安装厂家权威推荐榜单:管道/电气/生物医药工厂机电/暖通空调/空压系统/纯水系统/厂房通风/车间配电/机械设备/工业设备安装公司精选随着工业和制造业的快速发展,各种安装工程的需求日益增长。为了帮助企业在众…

嵌入式实验3串口通信---任务一串口传输文件实验

一、硬件连接方案 所需设备: 2台笔记本电脑 2个USB/TTL转RS232模块(如CH340、PL2303、FT232等) 杜邦线(至少3根:TX、RX、GND) 大文件:图片、视频、压缩包等 连接方式: 笔记本A USB → TTL模块A TX → 杜邦线 →…

Spring Cloud RabbitMQ 详解:从基础概念到秒杀实战 - 详解

Spring Cloud RabbitMQ 详解:从基础概念到秒杀实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

实用指南:Matlab通过GUI实现点云的GICP配准

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年粉末涂料厂家推荐排行榜,广东粉末,绝缘粉,钣金粉,烤漆粉,专业品质与市场口碑深度解析!

2025年粉末涂料厂家推荐排行榜,广东粉末,绝缘粉,钣金粉,烤漆粉,专业品质与市场口碑深度解析!随着工业技术的不断进步和环保要求的日益严格,粉末涂料因其优异的性能和环保特性,在多个行业中得到了广泛应用。尤其…

Boids算法

在Unity中实现了 Boids 算法,实现类鸟运动行为模拟。该模拟从单个 boid 遵循一组规中产生复杂的涌现行为。下面程序实现行为模拟,加ComputerShader运算优化。 主要规则 Boids 算法由 Craig Reynolds 于 1986 年创建,…

35跬步本手@数学学习+计算机学习+语言学习@20251019

要分散结合集中,阶段设立里程碑。要区分先后,串行完成任务。

【容器日志采集】【 四】消费kafka保存到es

📡 第四步:部署 Fluent Bit Kafka → Elasticsearch(消费端) 在第三步我们实现了日志采集端的 DaemonSet 部署,将日志采集并推送到 Apache Kafka。 这一阶段的目标是: ✅ 订阅 Kafka 中的日志 → 解析 payload …

嵌入式实验3串口通信---任务二串口传输文件实验

一、硬件连接方案 所需设备: 2台笔记本电脑 2个USB/TTL转RS232模块(如CH340、PL2303、FT232等) 杜邦线(至少3根:TX、RX、GND) 大文件:图片、视频、压缩包等 连接方式: 笔记本A USB → TTL模块A TX → 杜邦线 →…

题解:loj6703 小 Q 的序列

题意:定义一个序列 \(a\) 的权值为 \(\prod\limits_{i=1}^k (a_i+i)\)。求给出一个序列 \(a\) 的 \(2^n-1\) 个所有非空子序列的权值和。\(n\le 10^5\)。 做法: 这里给出两个做法,我觉得都很天才。 首先有个简单的 …

【容器日志采集】【二】fluent-bit配置文件

下面是第二步:创建配置文件(ConfigMap)的完整文档,包括详细说明、字段解释以及一键可用的命令👇🧾 第二步:创建配置文件(ConfigMap) 🧠 1. 什么是 ConfigMap? 在 Kubernetes 中,ConfigMap 用于将配置信…

【容器日志采集】【三】创建daemonsets采集日志发送到kafka

🚀 第三步:部署 DaemonSet 🧠 1. 什么是 DaemonSet? 在 Kubernetes 中,DaemonSet 是一种特殊的控制器,它会确保集群中每个节点上都运行一个 Pod。 适合以下场景:系统级守护进程(如监控、日志采集) 节点本地…

2025年保洁公司权威推荐榜单:驻场/钟点/开荒/外包/商场/办公楼/工厂/医院/企业保洁服务优选指南

2025年保洁公司权威推荐榜单:驻场/钟点/开荒/外包/商场/办公楼/工厂/医院/企业保洁服务优选指南随着社会经济的快速发展和城市化进程的加快,保洁服务已经成为现代企业和公共设施不可或缺的一部分。无论是大型商场、办…

常见问题解决 --- 为什么我导出的apk不包含dex文件

常见问题解决 --- 为什么我导出的apk不包含dex文件这是因为rom开启了dex优化功能。 开启后dex会从apk中剥离出来并优化后单独的存放。 用mt管理器打开app对应的apk路径下找到oat目录找到优化后的odex,vdex文件

2025年润滑油厂家推荐排行榜,工业润滑油,汽车润滑油,发动机润滑油,甲醇发动机润滑油,全合成润滑油,长效发动机润滑油公司推荐!

2025年润滑油厂家推荐排行榜,工业润滑油,汽车润滑油,发动机润滑油,甲醇发动机润滑油,全合成润滑油,长效发动机润滑油公司推荐!随着工业和汽车行业的发展,润滑油的需求日益增长。润滑油不仅在机械运行中起到润滑…

【容器日志采集】【一】创建命名空间、角色

下面是一份补全后的文档,基于你上传的 YAML 内容,整理为 Markdown 说明文档,方便团队使用和复用。文中还特别标注了注意事项 ⚠️,帮助避免常见配置错误。📦 Kubernetes 命名空间与权限配置文档 本文档示例演示了…

深入解析:Spring Cloud Netflix Eureka:从微服务基础到高可用集群实战

深入解析:Spring Cloud Netflix Eureka:从微服务基础到高可用集群实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

2025年电源适配器厂家推荐排行榜,电脑/手机/平板电源适配器,高品质充电解决方案!

2025年电源适配器厂家推荐排行榜,电脑/手机/平板电源适配器,高品质充电解决方案!随着科技的快速发展,电源适配器作为电子设备不可或缺的组成部分,其重要性日益凸显。无论是电脑、手机还是平板,都需要一个高效、稳…

解题报告-洛谷SCP2025T2 P14254 分割(divide)

洛谷SCP2025T2 P14254 分割(divide) 题目描述 你是洛咕咕王国的土地测绘官。洛咕咕王国并购了一块新的领土,这块新的领土正等待被分配。 这块领土可被认为是一棵有 \(n\) 个结点、结点编号为 \(1\) 到 \(n\) 的树,…