【java】小练习--零钱通

文章目录

  • 前言
  • 一、项目开发流程说明
  • 二、功能实现
    • 2.1 菜单
    • 2.2 零钱通明细
    • 2.3 零钱通收益
    • 2.4 零钱通消费
    • 2.5 零钱通退出确认
    • 2.6 零钱通金额校验
    • 2.7 完整代码
  • 三、零钱通OOP版

前言

本文是我跟着B站韩顺平老师的 Java 教程学习时动手实现“零钱通”项目的学习笔记,主要用于记录自己的学习过程,方便复习和巩固

一、项目开发流程说明

  1. 项目需求说明

使用java开发零钱通项目,可以完成收益入账,消费,查看明细,退出系统等功能

  1. 项目界面

在这里插入图片描述

  1. 项目代码实现

编写文件 SmallChangeSys.java 完成基本功能(过程编程)

我们先使用过程编程,后面改成OOP版本

  1. 项目代码实现改进

在实现零钱通的基本功能后,我们还需要对项目代码进行改进,例如:

(1)用户输入4退出时,给出提示信息“你确定要退出吗?y/n”,必须输入正确的 y/n,否则循环输入指令,直到输入 y 或者 n

(2)在 收益入账 和 消费 时,判断金额是否合理,并给出相应的提示

(3)将面向过程的代码修改成面向对象的方法,编写 SmallChangeSysOOP.java类,并使用 SmallChangeSysApp.java 完成测试

二、功能实现

2.1 菜单

我们首先先完成 【显示菜单,并可以选择】

img

思路:

1)打印菜单,因为我们希望用户选择菜单的某个选项之后还可以继续选择其他选项,所以我们使用do-while将菜单包起来,并定义一个布尔类型的变量 loop,默认为true,作为循环的条件

2)打印菜单后,用户应该是可以选择选项的,所以我们需要定义Scanner,用Scanner对象来接收用户输入的数据,并用 String 类型的变量 key 用来接收用户输入的字符串

3)用户输入选择之后,我们需要判断用户的选择,并完成相应的功能。我们这里使用 switch-case

当用户输入“退出”的对应的选项后,需要退出循环,所以我们需要将 loop 变量的值改为 false

package smallchange;import java.util.Scanner;public class SmallChangeSys {//1.先完成显示菜单,并可以选择菜单,给出对应的提示public static void main(String[] args) {//定义相关变量boolean loop = true;Scanner scanner = new Scanner(System.in);String key = "";do{System.out.println("-------------零钱通菜单--------------");System.out.println("\t\t\t1 零钱通明细");System.out.println("\t\t\t2 收益入账");System.out.println("\t\t\t3 消费");System.out.println("\t\t\t4 退    出");System.out.print("请选择(1-4):");key = scanner.next();//使用 switch 分支控制switch (key) {case "1":System.out.println("显示零钱通明细");break;case "2":System.out.println("收益入账");break;case "3":System.out.println("消费");break;case "4":System.out.println("退出");loop = false;break;default:System.out.println("选择有误,请重新输入");}}while(loop);System.out.println("--------已退出零钱通项目---------");}
}

2.2 零钱通明细

接下来我们来完成零钱通明细,下面的三种方式都可以:

(1)可以把收益入账和消费,保存到数组

(2)可以使用对象

(3)可以使用String拼接

我们这里使用第三种方式

//在main方法中定义details变量
String details = "-------------零钱通明细--------------";//...
case "1":System.out.println(details);break;

2.3 零钱通收益

img

首先需要定义三个变量

  1. 接收入账的金额
  2. 入账的时间
  3. 余额

入账的时间我们这里用Date类型,但是由于默认的日期格式是国外的风格

img

所以我们还需要定义一个SimpleDateFormat对象,到时候用来把我们得到的日期格式化

double money = 0; // 入账金额
double balance = 0; // 余额
Date date = null; // date 是 java.util.Date类型,表示日期
double money = 0;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 可以用于日期格式化

然后完成零钱通收益的功能

  1. 接收用户输入的入账金额并做检验(校验部分我们后面再实现)
  2. 获取当前日期
  3. 拼接到 details 字符串中
case "2":System.out.print("收益入账金额:");money = scanner.nextDouble();//money 的值范围应该校验//...balance += money;//拼接收益入账信息到 detailsdate = new Date(); // 获取当前日期details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + balance;break;

2.4 零钱通消费

消费部分需要定义一个新变量,用来保存消费的原因

String note = "";

然后完成零钱通消费的功能

  1. 接收用户输入的消费金额和消费原因(校验部分我们后面再实现)
  2. 对用户输入的金额进行校验
  3. 获取当前日期
  4. 拼接到 details 字符串中
case "3":System.out.print("消费金额:");money = scanner.nextDouble();System.out.print("消费说明:");note = scanner.next();//money 的值范围应该校验//...balance -= money;date = new Date();details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;break;

2.5 零钱通退出确认

用户输入 4 退出时,给出提示信息“你确定要退出吗?y/n”,必须输入正确的 y/n,否则循环输入指令,直到输入 y 或者 n

思路分析

(1)定义一个变量 choice

(2)使用 while(true) 无限循环,直到输入正确的 y 或 n 才break退出循环

(3)退出循环后,再判断 choice 是 y 还是 n ,就可以决定是否退出

case "4":
String choice = "";
while(true) { // 要求用户必须输入 y/n ,否则就一直循环System.out.println("你确定要退出吗?y/n");choice = scanner.next();if("y".equals(choice) || "n".equals(choice)) {break;}
}
//当用户退出while后,进行判断
if("y".equals(choice)) {loop = false;
}
break;

2.6 零钱通金额校验

在收益入账消费时,判断金额是否合理,并给出相应的提示

思路: 找出不正确的金额,然后给出提示

校验收益金额是否合理:

//输入收益金额后,校验金额
if(money <= 0) {System.out.println("收益入账失败,收益金额需要大于 0");break;
}

校验消费金额是否合理:

//输入消费金额后,校验金额
if(money <= 0 || money > balance) {System.out.println("你的消费金额应该在 0~" + balance);break;
}

2.7 完整代码

package smallchange;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;public class SmallChangeSys {//1.先完成显示菜单,并可以选择菜单,给出对应的提示public static void main(String[] args) {//定义相关变量boolean loop = true;Scanner scanner = new Scanner(System.in);String key = "";//        2.完成零钱通明细
//        三种方式都可以:
//        (1)可以把收益入账和消费,保存到数组
//        (2)可以使用对象
//        (3)简单地话,可以使用String拼接String details = "----------------零钱通明细-----------------";//3.完成收益入账 完成功能驱动程序员增加新的变化和代码//思路:定义新变量double money = 0;double balance = 0;Date date = null; // date 是 java.util.Date类型,表示日期SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 可以用于日期格式化//4.消费//定义新变量,保存消费的原因String note = "";do{System.out.println("\n----------------零钱通菜单-----------------");System.out.println("\t\t\t1 零钱通明细");System.out.println("\t\t\t2 收益入账");System.out.println("\t\t\t3 消费");System.out.println("\t\t\t4 退    出");System.out.print("请选择(1-4):");key = scanner.next();//使用 switch 分支控制switch (key) {case "1":System.out.println(details);break;case "2":System.out.print("收益入账金额:");money = scanner.nextDouble();//money 的值范围应该校验//思路:找出不正确的金额,然后给出提示if(money <= 0) {System.out.println("收益入账失败,收益金额需要大于 0");break;}balance += money;//拼接收益入账信息到 detailsdate = new Date(); // 获取当前日期details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + balance;break;case "3":System.out.print("消费金额:");money = scanner.nextDouble();System.out.print("消费说明:");note = scanner.next();//money 的值范围应该校验//思路:找出不正确的金额,然后给出提示if(money <= 0 || money > balance) {System.out.println("你的消费金额应该在 0~" + balance);break;}balance -= money;date = new Date();details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;break;case "4"://用户输入 4 退出时,给出提示信息“你确定要退出吗?y/n”,//必须输入正确的 y/n,否则循环输入指令,直到输入 y 或者 n
//                    思路
//                    (1)定义一个变量 choice
//                    (2)使用 while(true) 无限循环,直到输入正确的 y 或 n 才break退出循环
//                    (3)退出循环后,再判断 choice 是 y 还是 n ,就可以决定是否退出String choice = "";while(true) { // 要求用户必须输入 y/n ,否则就一直循环System.out.println("你确定要退出吗?y/n");choice = scanner.next();if("y".equals(choice) || "n".equals(choice)) {break;}}//当用户退出while后,进行判断if("y".equals(choice)) {loop = false;}break;default:System.out.println("选择有误,请重新输入");}}while(loop);System.out.println("--------已退出零钱通项目---------");}
}

三、零钱通OOP版

将面向过程的代码修改成面向对象的方法,编写 SmallChangeSysOOP.java类,并使用 SmallChangeSysApp.java 完成测试

SmallChangeSysOOP.java类主要用于完成零钱通的各个功能,而SmallChangeSysApp.java 通过调用SmallChangeSysOOP.java中的相关方法,使用零钱通的功能,二者关系如下:

img

SmallChangeSysOOP.java 类中代码如下:

package smallchange.oop;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;/*** 该类是完成零钱通的各个功能的类* 使用OOP(面向对象编程)* 将各个功能对应一个方法*/
public class smallChangeSysOOP {//属性boolean loop = true; // 循环条件Scanner scanner = new Scanner(System.in); // 接收用户输入String key = ""; // 用户的选择String details = "----------------零钱通明细-----------------";double money = 0; // 收益/消费的金额double balance = 0; // 余额Date date = null; // date 是 java.util.Date类型,表示日期SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 可以用于日期格式化String note = ""; // 消费的原因//完成显示菜单,并可以选择public void mainMenu() {do{System.out.println("\n----------------零钱通菜单-----------------");System.out.println("\t\t\t1 零钱通明细");System.out.println("\t\t\t2 收益入账");System.out.println("\t\t\t3 消费");System.out.println("\t\t\t4 退    出");System.out.print("请选择(1-4):");key = scanner.next();//使用 switch 分支控制switch (key) {case "1":this.detail();break;case "2":this.income();break;case "3":this.pay();break;case "4":this.exit();break;default:System.out.println("选择有误,请重新输入");}}while(loop);}//完成零钱通明细public void detail() {System.out.println(details);}//完成收益入账public void income() {System.out.print("收益入账金额:");money = scanner.nextDouble();//money 的值范围应该校验//思路:找出不正确的金额,然后给出提示if(money <= 0) {System.out.println("收益入账失败,收益金额需要大于 0");return;}balance += money;//拼接收益入账信息到 detailsdate = new Date(); // 获取当前日期details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + balance;}//消费public void pay() {System.out.print("消费金额:");money = scanner.nextDouble();System.out.print("消费说明:");note = scanner.next();//money 的值范围应该校验//思路:找出不正确的金额,然后给出提示if(money <= 0 || money > balance) {System.out.println("你的消费金额应该在 0~" + balance);return;}balance -= money;date = new Date();details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;}//退出public void exit() {String choice = "";while(true) { // 要求用户必须输入 y/n ,否则就一直循环System.out.println("你确定要退出吗?y/n");choice = scanner.next();if("y".equals(choice) || "n".equals(choice)) {break;}}//当用户退出while后,进行判断if("y".equals(choice)) {loop = false;}}
}

SmallChangeSysApp.java 中的代码如下

package smallchange.oop;/*** 这里我们直接调用 SmallChangeSysOOP 对象,显示主菜单即可*/
public class smallChangeSysApp {public static void main(String[] args) {smallChangeSysOOP smallChangeSysOOP = new smallChangeSysOOP();smallChangeSysOOP.mainMenu();}
}

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

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

相关文章

人工智能数学基础实验(四):最大似然估计的-AI 模型训练与参数优化

一、实验目的 理解最大似然估计&#xff08;MLE&#xff09;原理&#xff1a;掌握通过最大化数据出现概率估计模型参数的核心思想。实现 MLE 与 AI 模型结合&#xff1a;使用 MLE 手动估计朴素贝叶斯模型参数&#xff0c;并与 Scikit-learn 内置模型对比&#xff0c;深入理解参…

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南 一、创建隔离开发环境 1. 使用虚拟环境&#xff08;推荐venv&#xff09; # 在项目目录打开终端执行 python -m venv douban_env # 创建虚拟环境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…

STM32八股【11】-----Linux Bootloader (U-Boot)

参考U-Boot U-Boot是什么 嵌入式Linux系统需要一个bootloader来加载系统 U-boot就是一个通用开源的嵌入式Linux bootloader 主要实现的功能&#xff1a; 初始化硬件资源&#xff08;如内存、串口、存储器等&#xff09;从存储介质加载Linux内核到内存中传递启动参数给内核启…

【设计模式】责任链+模板+工程模式使用模板

前言 方便写出优雅&#xff0c;解耦&#xff0c;高内聚&#xff0c;高复用的代码。 Demo // 1. 定义验证器接口&#xff08;责任链模式&#xff09; public interface Validator {Validator setNext(Validator next);boolean validate(Data data); }// 2. 创建抽象验证器&am…

Unity3D仿星露谷物语开发49之创建云杉树

1、目标 创建一颗既可以生长又可以砍伐的云杉树&#xff0c;这个和之前创建橡树类似。 2、创建云杉树预制体 创建新物体命名为CropTreeBlueSpruce&#xff0c;并且添加Box Collider 2D和Crop组件。 在CropTreeBlueSpruce下创建子物体命名为CropSprite&#xff0c;添加3个组件…

【C#】消息队列的使用

在C#中使用消息队列&#xff0c;通常是指使用微软的Message Queuing (MSMQ)技术。MSMQ提供了一种异步通信协议&#xff0c;允许应用程序通过暂时存储要发送到目的地的消息来相互通信。 安装MSMQ 首先&#xff0c;确保你的开发机器和部署服务器上都安装了MSMQ。可以通过“控制…

IP-guard发布新版本4.87.2241.0

IP-guard发布新版本4.87.2241.0 新版本下载地址: https://www.tec-development.com/down/IPguard/Release/V4/IPguard4.87.2241.0.zip?s=901D45ADB22CBBFE5C612DC40AFD6BFB1551A9CD54EF418D5E86BBD256813867 新版本升级地址:

【Linux 服务器磁盘映像备份与恢复实战指南】虚拟机备份,物理机上云都可以用这套方案!

Linux 服务器磁盘映像备份与恢复实战指南 背景 在服务器运维中&#xff0c;磁盘健康度下降可能导致数据丢失风险&#xff0c;特别是在未配置 RAID 的情况下。针对这种情况&#xff0c;备份磁盘数据并恢复到新设备是确保数据安全的关键。本文记录了使用 dd 命令通过 NFS 实现全…

深入理解 Linux 的 set、env 和 printenv 命令

在 Linux 和类 Unix 系统中&#xff0c;环境变量是配置和管理 Shell 及进程行为的核心机制。set、env 和 printenv 是与环境变量交互的三个重要命令&#xff0c;每个命令都有其独特的功能和用途。本文将详细探讨这三个命令的区别&#xff0c;帮助大家更好地理解和使用这些命令。…

icexmoon-tree

icexmoon-tree 一个轻量级的 Java 工具库&#xff0c;提供树形结构操作功能。 安装 <dependency><groupId>cn.icexmoon</groupId><artifactId>icexmoon-tree</artifactId><version>1.0.0</version> </dependency>使用 构建…

机器学习在智能水泥基复合材料中的应用与实践

“机器学习在智能水泥基复合材料中的应用与实践” 课程 内容 机器学习基础模型与复合材料研究融合 机器学习在复合材料中的应用概述机器学习用于复合材料研究的流程复合材料数据收集与数据预处理 实例&#xff1a;数据的收集和预处理 复合材料机器学习特征工程与选择 实例&a…

微软 Build 2025:开启 AI 智能体时代的产业革命

在 2025 年 5 月 19 日的微软 Build 开发者大会上&#xff0c;萨提亚・纳德拉以 "我们已进入 AI 智能体时代" 的宣言&#xff0c;正式拉开了人工智能发展的新纪元。这场汇聚了奥特曼、黄仁勋、马斯克三位科技领袖的盛会&#xff0c;不仅发布了 50 余项创新产品&#…

[Java恶补day6] 15. 三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…

《黄帝内经》数学建模与形式化表征方式的重构

黄帝内经的数学概括&#xff1a;《黄帝内经》数学建模与形式化表征方式的重构 摘要&#xff1a;《黄帝内经》通过现代数学理论如动力系统、代数拓扑和随机过程&#xff0c;被重构为一个形式化的人体健康模型。该模型包括阴阳动力学的微分几何、五行代数的李群结构、经络拓扑与同…

理论篇五:如何优化Webpack的打包速度

优化 Webpack 打包速度是提升前端开发效率的关键。以下是 10 种核心优化策略,涵盖开发和生产环境,附带具体配置和实测效果对比: 一、缩小文件搜索范围 1. 指定解析路径(Resolve) resolve: {extensions: [.js, .jsx],

[Windows] 游戏常用运行库- Game Runtime Libraries Package(6.2.25.0409)

游戏常用运行库 合集 整合了许多游戏会用到的运行库&#xff0c;支持 Windows XP – Windows 11 系统&#xff0c;并且支持自动检测系统勾选推荐的运行库&#xff0c;方便快捷。 本版特点&#xff1a; By&#xff1a;mefcl 整合常见最新游戏所需运行库 根据系统自动勾选推荐…

JDK8中的 Stream流式编程用法优化(工具类在文章最后)

Java从JDK8起提供了Stream流这个功能&#xff0c;于是项目里出现了大量基于Stream流的写法。随着项目的进行&#xff0c;慢慢的代码中铺天盖地的都是下面的写法&#xff1a; List<User> userList null;if (condition) {userList new ArrayList<>();userList.add(…

uni-app学习笔记十二-vue3中组件传值(对象传值)

一.单对象传值 父组件定义对象的值 <template><view><UserInfo :obj"userinfo"></UserInfo></view> </template><script setup>import {ref} from "vue"const userinfo ref({name:"蛛儿",avatar:&…

UV-python环境管理工具 入门教程

在学习使用 MCP 的时候接触到了 UV 这个环境管理工具&#xff0c;经过对比&#xff0c;发现它在诸多方面比 venv、conda 等工具更为出色&#xff0c;因此整理了这份简单的入门学习笔记&#xff0c;希望能帮助大家快速上手。 介绍 UV 是一款集 Python 版本管理、虚拟环境创建与…

【漫话机器学习系列】277.梯度裁剪(Gradient Clipping)

【深度学习】什么是梯度裁剪&#xff08;Gradient Clipping&#xff09;&#xff1f;一张图彻底搞懂&#xff01; 在训练深度神经网络&#xff0c;尤其是 RNN、LSTM、Transformer 这类深层结构时&#xff0c;你是否遇到过以下情况&#xff1a; 模型 loss 突然变成 NaN&#xf…