java基础练习缺少项目?看这篇文章就够了(下)!

公众号:全干开发 。 专注分享简洁但高质量的动图技术文章!

回顾

在上节内容中,我们实现了用户开户的功能createAccount

    public void start(){System.out.println("===欢迎您进入到了ATM系统===");System.out.println("1、用户登录");System.out.println("2、用户开户");System.out.println("请选择:");int command = sc.nextInt();switch (command) {case 1://用户登录  TODO// login()  等待开发的功能!break;case 2://用户开户createAccount();start();break;default:System.out.println("操作错误!");start();}}

现在,我们要实现另一个核心功能:用户登录。登录后,用户还可以进行转账等一些列操作,这也是我们要完善的功能。

用户登录

我们先来看一下用户登录的login功能

登录的流程大致如下:

  • 如果系统没有任何账户对象,则不允许登录
  • 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示
  • 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示;如果密码也正确,则给出登录成功的提示
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(password.equals(acc.getPassWord())){System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);// TODO: 登录后的其他操作,如转账等等....}else {System.out.println("密码输入错误");}}}}
}

现在,我们在start中执行这个方法即可

 public void start(){// ...省略...switch (command) {case 1://用户登录login();// 用户操作完,重新进入系统首页start();break;case 2://用户开户createAccount();// 开户完,重新进入系统首页start();break;default:System.out.println("操作错误!");// 输入错误重新进入开始页start();}
}

账户操作

框架搭建

用户登录成功,我们需要进入账户处理界面

我们定义一个showUserCommand方法来实现

// 登录成功后的操作
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、注销账户");int command = sc.nextInt();switch (command){case 1://查询操作break;case 2://存款break;case 3://取款break;case 4://转账break;case 5://密码修改break;case 6://退出break;case 7://注销账户break;default:System.out.println("您的操作有误!请重新输入");}}
}

这里的loginAcc是我们储存的用户登录成功后的账户信息,详细的代码如下:

public class ATM {private ArrayList<Account> accounts = new ArrayList<>();private Account loginAcc; // 储存登录成功后的用户信息// .....// 用戶登录private void login(){// .....// 判断用户输入的密码与账户对象中储存的密码是否一致if(password.equals(acc.getPassWord())){loginAcc = acc;System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);// 登录后的其他操作,如转账等等....// 展示用户操作界面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、注销账户");int command = sc.nextInt();switch (command){case 1://查询操作break;case 2://存款break;case 3://取款break;case 4://转账break;case 5://密码修改break;case 6://退出break;case 7://注销账户break;default:System.out.println("您的操作有误!请重新输入");}}}
}

现在,我们逐个完善showUserCommand中的方法即可

查询操作

在上述代码中,我们使用了loginAcc储存了登录用户的信息,我们创建个query方法,用于展示loginAcc对象中储存的信息

private void showLoginAccount(){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());
}

我们在showUserCommand()方法中执行下

 private void showUserCommand(){while (true) {// ....int command = sc.nextInt();switch (command){case 1://查询操作showLoginAccount();break;// ....case 7://注销账户break;default:System.out.println("您的操作有误!请重新输入");}}}

退出操作

退出操作,不需要执行额外的方法,我们只要能回到登录页即可。退出前我们进行简单的提示即可

 private void showUserCommand(){while (true) {// ...switch (command){// ...case 6://退出System.out.println(loginAcc.getUserName() + "您已经成功退出");break;// ...}}}

注意,当用户输出6后,break会结束switch语句,但无法跳出while循环,switch会重新执行。

所以,我们需要把break改成return结束当前程序。

 private void showUserCommand(){while (true) {// ...switch (command){// ...case 6://退出System.out.println(loginAcc.getUserName() + "您已经成功退出");breturn;// ...}}}

现在,我们就跳出了showUserCommand()程序,回到了login方法里。

private void login(){// ...// 系统中存在账户,开始进行登录操作while (true) {// ...if(acc == null){System.out.println("卡号输入错误!请重新输入");}else{// 卡号存在,输入密码while (true) {// ...showUserCommand();// ...}}}
}

同样的,我们需要结束login方法中的while循环,回到start方法中

private void login(){// ...// 系统中存在账户,开始进行登录操作while (true) {// ...if(acc == null){System.out.println("卡号输入错误!请重新输入");}else{// 卡号存在,输入密码while (true) {// ...showUserCommand();// ...return;}}}
}

我们测试下:

存款及取款

存款

我们定义depositMoney的存款方法,在showUserCommand()的switch 中执行。

这次骚一点,我们用编译器的快捷键帮我们生成方法。在switch中直接执行depositMoney,然后点击【alt+enter】键就可以自动帮我们创建好这个方法了!

  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 showUserCommand(){while (true) {// ...int command = sc.nextInt();switch (command){case 1://查询操作showLoginAccount();break;case 2://存款depositMoney();break;case 3://取款drawMoney();break;// ...}}}
    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){// 钱是足够的// 判断当前取款金额是否超出了限额if(money>loginAcc.getLimit()){System.out.println("超出限额!");}else {loginAcc.setMoney(loginAcc.getMoney()-money);System.out.println("取款成功!剩余:" + loginAcc.getMoney());break;}}else {System.out.println("账户余额不足!您的余额是:" + loginAcc.getMoney());}}}

转账

private void showUserCommand(){while (true) {// ...int command = sc.nextInt();switch (command){// ...case 4://转账transferMoney();break;// ...}}}
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 {//5 账户存在,确认姓名String name = "*" + acc.getUserName().substring(1);System.out.println("请输入:"+name+"的姓氏");String preName = sc.next();// 判断姓氏是否正确if(acc.getUserName().startsWith(preName)){// 认证通过,开始转账System.out.println("请输入转账金额");double money = sc.nextDouble();// 6 判断是否超出自己的金额if(loginAcc.getMoney() >=money){//转给对方了//变更自己的账户余额loginAcc.setMoney(loginAcc.getMoney()-money);//更新对方的余额acc.setMoney(acc.getMoney() + money);return;}else {System.out.println("账户余额不足");}}else {System.out.println("输入的姓名有有误");}}}}

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

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

相关文章

滚珠螺杆在航天工业领域中的重要性

滚珠螺杆是重要的航天工业配件之一&#xff0c;在航天工业领域中具有非常重要的地位和作用。 首先&#xff0c;滚珠螺杆作为一种高精度、高刚度的传动元件&#xff0c;能够提供准确的传动和定位精度&#xff0c;从而保证航天器的可靠性和性能。航天器在飞行过程中需要精确控制其…

【算法挨揍日记】day21——64. 最小路径和、174. 地下城游戏

64. 最小路径和 64. 最小路径和 题目描述&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 解题思路&#xff1a; 状态表示&…

[Kettle] 获取系统信息

系统信息是指Kettle系统环境的信息&#xff0c;包括了计算机系统的日期、星期等时间类型信息&#xff0c;计算机名称、IP地址等设备信息&#xff0c;Kettle系统转换过程中的信息等 需求&#xff1a;为方便读取计算机上的本月最后一天的交易数据文件&#xff0c;需要通过获取系…

excel-gen.js 导出excel 功能

目录 概要 整体架构流程 html部分&#xff1a; js部分&#xff1a; json部分&#xff1a; 小结 概要 功能会使用到如下插件&#xff1a; jszip.min.js FileSaver.js jquery.min.js excel-gen.js highcharts.js exporting.js export_data.js 主要是highcharts图表…

移动端获取ua头的值

目录&#xff1a; 1、检测地址2、测试结果 1、检测地址 http://www.ip138.com/useragent/ 2、测试结果 成功的拿到了ua头的值了&#xff0c;亲测可行&#xff01;&#xff01;&#xff01;

三十分钟学会Linux

Linux 一、配置虚拟机 企业级应用&#xff1a;RHEL/CentOS 桌面平台&#xff1a;Ubuntu 开源服务器&#xff1a;CentOS 1.配置网络 路径可以通过TAB键自动补齐 vi /etc/sysconfig/network-scripts/ifcfg-ens332.克隆虚拟机 链接克隆&#xff1a; 当前节点文件夹只存储差…

海外IP代理如何助力跨境电商?

黑五作为下半年年度尤为重要的一个节日&#xff0c;是各大商家的必争之地&#xff0c;那么海外代理是如何帮助跨境商家做好店铺管理和营销呢&#xff1f; 为什么跨境人都关注海外代理&#xff0c;下面我们来进行介绍。 一、什么是海外代理 海外代理就是我们所说的&#xff1a…

从工业互联走向工业AI,国产工业操作系统的机遇和使命

随着科技的飞速发展&#xff0c;工业领域正在经历一场由工业互联网&#xff08;IndustrialInternet&#xff09;到工业AI&#xff08;ArtificialIntelligence&#xff09;的革命性变革。 民用互联网顾名思义即实现人与互联网的连接&#xff0c;服务于人民生活的方方面面。自19…

高并发分布式架构的演进之路

目录 单体架构 应用数据分离架构 应用数据集群架构 读写分离 / 主从分离架构 引⼊缓存⸺冷热分离架构 垂直分库 业务拆分-微服务 单体架构 一个系统初期&#xff0c;我们需要利⽤我们精⼲的技术团队&#xff0c;快速将业务系统投⼊市场进⾏检验&#xff0c;并且可以迅速…

求臻医学受邀参加第三届基因检测行业发展高峰论坛并斩获三项荣誉

2023年11月18日&#xff0c;备受瞩目的第三届基因检测行业发展高峰论坛暨年度评选活动颁奖典礼在广州圆满召开。作为基因检测领域的佼佼者&#xff0c;求臻医学应邀参加了此次高峰论坛并斩获了基因检测行业年度风云企业奖、基因检测行业最具投资价值奖、基因检测行业最佳产品奖…

NX二次开发UF_CAM_ask_doc_template_name 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_doc_template_name Defined in: uf_cam.h int UF_CAM_ask_doc_template_name(const char * * doc_template_filename ) overview 概述 This function provides the name of the file th…

二叉树题目:二叉树的最近公共祖先

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的最近公共祖先 出处&#xff1a;236. 二叉树的最近公共祖先 难度 5 级 题目描述 要求 给定一个二叉树&…