1.JAVA小项目(零钱通)

一、说明

博客内容:B站韩顺平老师的视频,以及代码的整理。此项目分为两个版本:

  1. 面向过程思路实现
  2. 面向对象思路实现
    韩老师视频地址:【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh411y7R8/?p=342&share_source=copy_web&vd_source=656bca56998f14127313f0283f22ac0a
    【注意】:仅限学习,如有侵权,请联系本人删除。

项目实现–面向过程思路

先贴代码,项目的完整代码如下:

package smallchange;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;/*** @author cdj* @Version1.0*/
public class SmallChangeSys {// 1. 先完成显示菜单,并可以选择菜单,给出对应提示// 2. 完成零钱通明细// 3. 完成收益入账// 4. 完成消费// 5. 退出// 6. 用户输入4退出时,给出提示”你要退出吗? y/n“,必须要正确的输入y/n,否则循环输入指令,直到输入y 或者 n// 7. 在收益入账和消费时,判断金额是否合理,并给出相应的提示public static void main(String[] args) {// 定义相关的变量boolean loop = true;Scanner sc = new Scanner(System.in);String key = "";// 2.完成零钱通明细// (1) 可以把收益入账和消费,保存到数组 (2)可以使用对象 (3)简单的会可以使用String拼接String detils = "------------------零钱通明细--------------------";// 3. 完成收益入账,完成功能驱动程序员增加新的变化和代码// 定义新的变量double money = 0;double balance = 0;Date date = null;   // data 是 java.util.Data类型,表示日期SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");    // 可以用于日期格式化的// 4. 消费// 定义新的变量,保存消费的原因String note = null;do{System.out.println("\n===================零钱通菜单================");System.out.println("\t\t\t\t\t1 零钱通明细");System.out.println("\t\t\t\t\t2 收益入账");System.out.println("\t\t\t\t\t3 消费");System.out.println("\t\t\t\t\t4 退             出");System.out.print("请选择(1-4): ");key = sc.nextLine();// 使用 switch 分支控制switch (key){case "1":System.out.println(detils);break;case "2":System.out.print("收益入账金额:");money = sc.nextDouble();// 清空输入缓冲区sc.nextLine();// money 的值应该校验// 找出不正确的金额条件,然后给出提示,就直接breakif(money <= 0){System.out.println("收益入账金额需要大于0");break;}balance += money;// 获取当前日期date = new Date();// 拼接收益入账信息到detailsdetils += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t" + balance;break;case "3":System.out.print("收益消费金额:");money = sc.nextDouble();sc.nextLine();  // 清空输入缓冲区// money 的值应该校验 TODO// 找出金额不正确的情况if(money <= 0 || money > balance){System.out.println("你的消费金额应该在 0-" + balance);break;}System.out.print("消费说明: ");note = sc.next();sc.nextLine();balance -= money;// 拼接消费信息到detailsdate = new Date(); // 获取到当前时间detils += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;break;case "4":// 用户输入4退出时,给出提示”你要退出吗? y/n“,必须要正确的输入y/n// (1) 定义一个变量 choice,接收用户的输入// (2) 使用 while + break,来处理接收的输入时 y 或者 n// (3) 退出while后,再判断choice是y还是n,就可以决定是否退出。// (4) 建议一段代码完成一个小功能,尽量不要混在一起String choice = "";while (true) {  // 要求用户必须输入 y/n,否则就一直循环System.out.println("你确定要退出吗? y/n");choice = sc.nextLine();if ("y".equals(choice) || "n".equals(choice)) {break;}}// 当用户退出后,再进行判断if (choice.equals("y")) {loop = false;}break;default:System.out.println("选择有误,请重新选择");}}while(loop);System.out.println("------------------退出了零钱通项目------------------");}
}

代码思路

先看一下项目需求(资料来源:【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh411y7R8/?p=335&share_source=copy_web&vd_source=656bca56998f14127313f0283f22ac0a)
在这里插入图片描述
首先先理一下需要完成的几个功能:

  1. 界面显示
  2. 零钱通明细
  3. 收益入账
  4. 消费
  5. 退出

将这几个功能分别完成(一个代码块只实现一个功能)

1.界面显示

在界面显示的时候,我们需要完成的任务有以下两个:

  • (1) 完成显示菜单
  • (2) 可以选择菜单,并给出对应提示
    关于任务(1),我们可以考虑直接使用Println语句将菜单打印出来:
 System.out.println("\n===================零钱通菜单================");System.out.println("\t\t\t\t\t1 零钱通明细");System.out.println("\t\t\t\t\t2 收益入账");System.out.println("\t\t\t\t\t3 消费");System.out.println("\t\t\t\t\t4 退             出");

实现了任务(1)之后,我们需要考虑的就是如何使得我们可以根据提示进行选择。那我们就需要去思考,哪个语句可以提供选择功能,很自然的想到了switch语句。先看一下switch语句的语法:

switch (expression) {case value1:// 当 expression 的值等于 value1 时执行这里的代码// 可以有多行代码break;case value2:// 当 expression 的值等于 value2 时执行这里的代码// 可以有多行代码break;// 可以有更多的 case 语句default:// 当 expression 的值与所有 case 不匹配时执行这里的代码
}

switch语法可以得出:我们需要定义一个expression让我们去选择哪条case语句。根据菜单给的提示,我们选择定义一个String类型的变量,去存储我们的选择。由于我们需要去输入我们的选择,那我们就需要一个输入的功能Scanner
由以上分析,我们就可以搭建一个程序框架:

public class SmallChangeSys {// 1. 先完成显示菜单,并可以选择菜单,给出对应提示public static void main(String[] args) {// 定义相关的变量Scanner sc = new Scanner(System.in);String key = "";System.out.println("\n===================零钱通菜单================");System.out.println("\t\t\t\t\t1 零钱通明细");System.out.println("\t\t\t\t\t2 收益入账");System.out.println("\t\t\t\t\t3 消费");System.out.println("\t\t\t\t\t4 退             出");System.out.print("请选择(1-4): ");key = sc.nextLine();// 使用 switch 分支控制switch (key){case "1":// TODObreak;case "2":// TODObreak;case "3":// TODObreak;case "4":// TODObreak;default:// TODObreak;}
}

上述代码能让我们完成任务(1)和任务(2),但是它只能执行一次,选择一个功能。我们需要多次执行,而且考虑到不管什么情况,都会执行一次。那就想到do while。先看一下do while的语法:

do {// 循环体代码块
} while (condition);

while 关键字后面跟着一个循环条件。只要循环条件为 true,循环将继续执行;否则循环终止。为了使我们退出循环的时候方便,这里我们选择定义一个bool类型的变量loop。当我们需要退出时,只需要将它置为false即可。将上述代码修改:

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

这样,整个程序的框架就已经搭建好了。下面使用代码块分别实现各个功能。

2. 零钱通明细

我们需要实现下图功能,那我们就需要一个变量进行显示。实现的方式有三种

  1. 把收入入账和消费,保存到数组(数组扩容比较麻烦)
  2. 使用对象
  3. 使用String拼接
    此处考虑使用String进行拼接,所以需要定义一个String类型的变量:
String detils = "------------------零钱通明细--------------------";

在定义完变量后,我们需要把它放入菜单的选择中(case1),当我们需要查看明细时,只需要将这个字符串打印出来即可(在后续操作过程中有可能会修改字符串)。

case "1":System.out.println(detils);break;

在这里插入图片描述

3.收益入账

首先需要一个变量用来存储收益,所以先定义一个存储收益的变量money:

double money = 0;

我们的代码中已经有一个sc用于交互,所以money的值可以直接由我们输入。但是在编写代码过程中我发现如果没有清除缓存的话,代码会直接跳转到switch中的defalut语句,所以在输入money加入了一个清理缓存的语句:

money = sc.nextDouble();
sc.nextLine();  // 清空输入缓冲区

当我们有收益时,我们的余额也会发生改变,所以此处我们添加一个存储余额的变量balacnce:

double balance = 0;

有了balance用来存储余额,在实现收益功能的代码块中,自然balance += money。再看一下打印的信息里面还有一个data信息,所以需要添加时间相关的信息:

Date date = null;   // data 是 java.util.Data类型,表示日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");    // 可以用于日期格式化的
date = new Date();

因为我们用的时String进行的拼接,那么现在要将新增的记录拼接到我们的details中:

// 拼接收益入账信息到details
detils += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t" + balance;

注意看拼接的过程中是先拼接了一个\n,所以无论最终我们的details有多长,它都只是一个变量。
最终收益入账功能实现的代码如下:

case "2":System.out.print("收益入账金额:");money = sc.nextDouble();// 清空输入缓冲区sc.nextLine();// money 的值应该校验// 找出不正确的金额条件,然后给出提示,就直接breakif(money <= 0){System.out.println("收益入账金额需要大于0");break;}balance += money;// 获取当前日期date = new Date();// 拼接收益入账信息到detailsdetils += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t" + balance;break;

除去上述将的内容,在其中还添加了检验money值得功能。
其它功能实现方式和上述方式大同小异,此处就不再进行书写。

总结

在项目实现过程中,首先是分析项目的需求,然后根据项目的需求将整个代码的框架搭建出来。在搭建过程中,遵循每个代码块实现一个功能,并且在需要什么变量的时候就定义什么变量(根据实际需求去定义变量)。在听课过程中,韩老师给的两个建议是十分重要的:

  1. 一段代码完成一个小功能,不要混在一起。
  2. 找出不正确的条件用来判断,而不是找正确的条件。

项目实现–面向对象思路

先贴代码,分为两个文件

  1. SmallChangeSysOOP:实现各种功能
  2. SmallChangeSysAPP:调用
    SmallChangeSysOPP代码如下:
package smallchange.oop;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;/*** @author cdj* @Version1.0* 完成零钱通的各个功能* 将各个功能对应一个方法*/
public class SmallChangeSysOOP {// 属性boolean loop = true;Scanner sc = new Scanner(System.in);String key = "";String detils = "------------------零钱通明细---------------";double money = 0;double balance = 0;Date date = null;   // data 是 java.util.Data类型,表示日期SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");    // 可以用于日期格式化的String note = null;// 显示菜单,并可以选择public void mainMenu() {do{System.out.println("\n===================零钱通菜单================");System.out.println("\t\t\t\t\t1 零钱通明细");System.out.println("\t\t\t\t\t2 收益入账");System.out.println("\t\t\t\t\t3 消费");System.out.println("\t\t\t\t\t4 退             出");System.out.print("请选择(1-4): ");key = sc.nextLine();// 使用 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(detils);}// 完成收益入账public void income() {System.out.print("收益入账金额:");money = sc.nextDouble();// 清空输入缓冲区sc.nextLine();// money 的值应该校验// 找出不正确的金额条件,然后给出提示,就直接breakif(money <= 0){System.out.println("收益入账金额需要大于0");return; // 退出方法,不再执行后面的方法}balance += money;// 获取当前日期date = new Date();// 拼接收益入账信息到detailsdetils += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t" + balance;}// 消费public void pay() {System.out.print("收益消费金额:");money = sc.nextDouble();sc.nextLine();  // 清空输入缓冲区// money 的值应该校验 TODO// 找出金额不正确的情况if(money <= 0 || money > balance){System.out.println("你的消费金额应该在 0-" + balance);return;}System.out.print("消费说明: ");note = sc.next();sc.nextLine();balance -= money;// 拼接消费信息到detailsdate = new Date(); // 获取到当前时间detils += "\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 = sc.nextLine();if ("y".equals(choice) || "n".equals(choice)) {break;}}// 当用户退出后,再进行判断if (choice.equals("y")) {loop = false;System.out.println("------------------退出了零钱通项目------------------");}}
}

SmallChangeSysAPP代码如下:

package smallchange.oop;/*** @author cdj* @Version1.0* 调用SmallChangeSysOOP 对象*/
public class SmallChangeSysAPP {public static void main(String[] args) {new SmallChangeSysOOP().mainMenu();}
}

在Structure(使用alt+7打开)界面下可以查看OOP类下面的属性和方法:
在这里插入图片描述
将其中的各个功能封装进OOP类下面的方法中,后续我们只用调用它的方法就可以了。对于其它人想用我们的代码,或者说后续添加方法,都是比面向过程更加方便的。

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

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

相关文章

Spring 源码:深度解析AOP源码配置解析

文章目录 一、 解析AOP配置的入口1.1 从XML配置到AOP Namespace的解析流程1.2 分析注解驱动的AOP配置解析流程 二、AOP配置解析的核心流程2.1 ConfigBeanDefinitionParser 类2.2 parse()2.3 parseAdvisor()2.4 parseAspect()2.5 parsePointcut()2.6 createAdvisorBeanDefinitio…

算法每日一题(python,2024.05.29) day.11

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 法一&#xff1a;切片函数法 直接用python中的切片函数直接解决 法二&#xff1a;交换法 从俩头开始交换字符串的数字&#xff0c;若为奇数&#xff…

GITLAB常见问题总结

Troubleshooting GitLab Pages administration (FREE SELF) 原文地址 stage: Plan group: Knowledge info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/…

STM8单片机变频器设计

变频调速技术是现代电力传动技术的重要发展方向,而作为变频调速系统的核心—变频器的性能也越来越成为调速性能优劣的决定因素,除了变频器本身制造工艺的“先天”条件外,对变频器采用什么样的控制方式也是非常重要的。随着电力电子技术、微电子技术、计算机网络等高新技术的…

Kompas AI:智能生活的开启者

引言 在现代社会&#xff0c;**人工智能&#xff08;AI&#xff09;**已经深刻地影响了我们的生活和工作。无论是智能家居、自动驾驶&#xff0c;还是医疗诊断&#xff0c;AI的应用无处不在。而在众多AI平台中&#xff0c;Kompas AI 作为一个先进的对话式AI平台&#xff0c;通过…

R语言数据分析-针对芬兰污染指数的分析与考察

1. 研究背景及意义 近年来&#xff0c;随着我国科技和经济高速发展&#xff0c;人们生活质量也随之显著提高。但是&#xff0c; 环境污染问题也日趋严重&#xff0c;给人们的生活质量和社会生产的各个方面都造成了许多不 利的影响。空气污染作为环境污染主要方面&#xff0c;更…

【漏洞复现】海康威视综合安防管理平台 orgManage/v1/orgs/download 任意文件读取漏洞

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

7-8 矩阵字符

给定一个仅包含小写字母的字符串S,用这些字符恰好排成一个n行m列的矩阵(m≥n)&#xff0c;请找出所有符合要求的矩阵中最接近于正方形的那个矩阵。然后从第一列开始&#xff0c;逐列按照从上到下的顺序输出矩阵中的字符。 例如&#xff1a;S "abcdefgh"。按要求m≥…

动态规划-求买卖股票所能获得的最大收益(hard)

一、问题描述 二、解题思路 1.先看有哪几个可变参数&#xff1a; (1).当前第几天 nowday(范围&#xff1a;0->n-1) (2).剩余交易次数 restTime(范围&#xff1a;k->0) (3).当天可买入还是可卖出 isnowHold(0 表示当前未持有可买入&#xff0c;1 表示当前持有可卖出) 2.…

WIN10环境下xposed环境搭建

禁止拿来干坏事&#xff0c;仅做学习为目的 环境需求 1.夜神模拟器7.1 2.Android stdio 2022.3.1 3. Adb环境配置 具体实现 1.安装xposed 打开可一键安装&#xff0c;重启 2.连接虚拟机 adb connect 127.0.0.1:620013.打开as,进入project 4.在lib下添加准备好的jar包 …

AD软件底层丝印反转

快捷键VB&#xff0c;翻转后底部视图所有显示就正常了&#xff0c;当底层确认之后再按VB就回到正常状态。 否则你就看到一个镜像的丝印。 快捷键VB后 注意&#xff0c;经过VB反转BOTTOM后TOP层的丝印变镜像翻转了。 设计完毕后调整过来即可。

查询语言:ClickHouse的SQL基础与特点

1.背景介绍 查询语言&#xff1a;ClickHouse的SQL基础与特点 作者&#xff1a;禅与计算机程序设計艺術 1. 背景介绍 1.1 ClickHouse简介 ClickHouse是Yandex开源的一个高性能分布式 column-oriented DBSMS (Column-based Distributed SQL Management System)&#xff0c;它…

怎么下载 jar 包

一、在Maven仓库里面下载 Maven仓库 网址&#xff1a;https://mvnrepository.com/ 二、搜索需要的 jar 包&#xff08;以 druid 为例&#xff09; 三、找到 druid jar包&#xff0c;点进去 四、找到自己需要的版本&#xff0c;点进去 五、 点 jar 下载

【漏洞复现】SpringBlade tenant/list SQL 注入漏洞

0x01 产品简介 SpringBlade ,是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpingBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade 后台框架 /api/blade-system/tenantist路径存在SQL注入漏洞&#xff0c;攻击者除了可以利用 SQL 注…

关于网络编程

目录 1、InetAdress类 2、Socket套接字 3、UDP数据报套接字编程 &#xff08;1&#xff09;DatagramSocket 类 &#xff08;2&#xff09;DatagramPacket类 &#xff08;3&#xff09;处理无连接问题 UdpEchoServer.java UdpEchoClient.java 4、TCP流套接字编程 &…

为什么我觉得C/C++好简单?

有几个可能的原因解释为什么您觉得C/C简单。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 适应性&#xff1a;如果…

气膜建筑的膜材更换与维护—轻空间

气膜建筑作为一种新型建筑形式&#xff0c;因其独特的优势和广泛的应用而受到关注。膜材是气膜建筑的核心组成部分&#xff0c;其质量和维护状况直接影响到建筑的使用寿命和性能。本文将详细探讨气膜建筑的膜材使用寿命、维护及更换的重要性。 膜材的使用寿命 气膜建筑的膜材通…

软件设计详细需求分析报告-word(直接套用实际文档)

第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 5.6 其他信息安全措施 第6章 其他非功能需求 6.1 性能设计 6.2 稳定性设计 6.3 安全性设计 6.4 兼容性设计…

【随笔】Git 实战篇 -- 开心 commit 之后,发现有一处bug还需要改,只能 reset 撤销然后再次提交 -- git reset --(四十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

Tween.js在Three.js中的应用:为3D动画添加流畅过渡

前言 在Web开发领域&#xff0c;Three.js已经成为构建精彩3D内容的首选库之一。它让开发者能够轻松地在浏览器中创建和展示复杂的3D场景。然而&#xff0c;要让这些场景栩栩如生&#xff0c;平滑的动画效果是必不可少的。这就引入了Tween.js——一个轻量级但功能强大的JavaScr…