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.rhkb.cn/news/339355.html

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

相关文章

Django基础学习(一)

前端开发 目的&#xff1a;开发一个平台(网站)- 前端开发&#xff1a; HTML, CSS,JavaScript- web框架&#xff1a;接收请求并进行处理- MySQL数据库&#xff1a;存储相应的数据1.快速开发网站 pip install flask创建项目并导入flask框架,然后建立网址和函数的对应关系。 fr…

mysql DDL——增删改

简略版&#xff1a; 文字化&#xff1a; 1.对全部字段添加数据&#xff1a;insert into 表名 values (值1&#xff0c;值2&#xff0c;值3...); 2.对指定字段添加数据&#xff1a;insert into 表名 (字段名1&#xff0c;字段名2...) values &#xff08;值1&#xff0c;值2..…

远程桌面连接不上的解决方法?

随着远程办公的兴起&#xff0c;远程桌面连接成为了日常工作中必不可少的工具之一。有时我们可能会遇到无法连接或连接不稳定的情况。本文将介绍一些常见的远程桌面连接问题及其解决方法。 问题一&#xff1a;无法连接远程桌面 当我们尝试连接远程桌面时&#xff0c;有时会遇到…

uniapp 怎么设置凸起的底部tabbar

1. uniapp 怎么设置凸起的底部tabbar 1.1. 方案一系统提供 1.1.1. 使用uniapp官方提供的属性midButton 使用时&#xff0c;list数组须为偶数 &#xff08;1&#xff09;pages.json "tabBar": {"custom": true,"color": "#8F8F94",&q…

树莓派4B 学习笔记3: 系统自动更新时间_测试CSI摄像头_安装OpenCv_4.6(未成功编译源码)_备份树莓派镜像

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本文我只是安装了OpenCv 4.6&#xff0c;但编译源码失败了&#xff01;有关 OpenCv 部分仅做笔记暂存&#xff01; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令…

【记录】打印|用浏览器生成证件照打印PDF,打印在任意尺寸的纸上(简单无损!)

以前我打印证件照的时候&#xff0c;我总是在网上找在线证件照转换或者别的什么。但是我今天突然就琢磨了一下&#xff0c;用 PDF 打印应该也可以直接打印出来&#xff0c;然后就琢磨出来了&#xff0c;这么一条路大家可以参考一下。我觉得比在线转换成一张 a4 纸要方便的多&am…

基于PHP+MySQL组合开发的720VR全景小程序源码系统 一键生成三维实景 前后端分离带网站的安装代码包以及搭建教程

系统概述 这款源码系统是专门为实现 720VR 全景展示而设计的。它结合了先进的技术和创新的理念&#xff0c;能够将真实场景以全景的形式呈现给用户&#xff0c;让用户仿佛身临其境。该系统采用 PHP 进行后端开发&#xff0c;MySQL 作为数据库管理系统&#xff0c;确保了系统的…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识&#xff0c;BOM&#xff0c;作业手顺&#xff08;工艺路线&#xff09;&#xff0c;作业区&#xff08;工作中心&#xff09;&#xff0c;MRP&#xff0c;MPS等概念&#xff0c;现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM&#xff0c;派生BO…

17、Spring系列-SpringMVC-请求源码流程

前言 Spring官网的MVC模块介绍&#xff1a; Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就已包含在Spring框架中。正式名称“ Spring Web MVC”来自其源模块的名称&#xff08;spring-webmvc&#xff09;&#xff0c;但它通常被称为“ Spring MVC…

【C++奇妙冒险】日期类Date的实现

文章目录 前言日期类Date的接口设计构造函数和打印函数获取日期并判断日期是否合法日期类的大小比较关系<运算符重载 判断小于运算符重载 判断相等<运算符重载 判断小于等于>运算符重载 判断大于> 运算符重载 判断大于等于! 运算符重载 不等于 日期类计算日期天数日…

C++ 的 Tag Dispatching(标签派发) 惯用法

目录 1.概述 2.标准库中的例子 3.使用自己的 Tag Dispatching 3.1.使用 type traits 技术 3.2.使用 Type_2_Type 技术 4.Tag Dispatching的使用场景 5.总结 1.概述 一般重载函数的设计是根据不同的参数决定具体做什么事情&#xff0c;编译器会根据参数匹配的原则确定正确…

数据库之函数、存储过程

函数、存储过程 1.函数 函数&#xff0c;常用于对一个或多个输入参数进行操作&#xff0c;主要目的是返回一个结果值&#xff0c;就是一种方法&#xff0c;在postgre里存放的位置叫function&#xff0c;比如创建一个计算长方面积的函数。 举例&#xff1a;建立一个计算长方形…

基于GTX 8B10B编码的自定义PHY接收模块(高速收发器十三)

点击进入高速收发器系列文章导航界面 前文完成了发送模块的设计&#xff0c;本文接着完成接收模块的设计&#xff0c;接收模块相对发送模块会更加麻烦。 1、设计思路 前文在讲解官方示例工程时&#xff0c;提到GTX IP的接收部分没有做字对齐&#xff0c;需要用户自己编写字对齐…

---初始Linux---

一、认识计算机 计算机 硬件 软件 硬件&#xff1a;就是计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称&#xff08;CPU\GPU\...&#xff09; 软件&#xff1a;是用户和计算机硬件之间及进行交流的工具 然而一个简单的计算机或者说基本的计算机就是有两大…

Android开机动画,framework修改Bootanimation绘制文字。

文章目录 Android开机动画&#xff0c;framework修改Bootanimation动画绘制文字。 Android开机动画&#xff0c;framework修改Bootanimation动画绘制文字。 frameworks/base/cmds/bootanimation/bootanimation.cpp 绘制时间的一个方法 // We render 12 or 24 hour time. void…

Linux 僵尸进程和孤儿进程

一.Z(zombie)-僵尸进程 1.僵死状态&#xff08;Zombies&#xff09;是一个比较特殊的状态。当进程退出并且父进程&#xff08;使用wait()系统调用后&#xff09;没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 2.僵死进程会以终止状态保持在进程表中&#xff0c;并且会…

Spring 中如何控制 Bean 的加载顺序?

如果你脱口而出说添加 Order 注解或者是实现 Ordered 接口&#xff0c;那么恭喜&#xff0c;你掉坑了。 一 Order 注解和 Ordered 接口 在 Spring 框架中&#xff0c;Order 是一个非常实用的元注解&#xff0c;它位于 spring-core 包下&#xff0c;主要用于控制某些特定上下文…

SQL实验 带函数查询和综合查询

一、实验目的 1&#xff0e;掌握Management Studio的使用。 2&#xff0e;掌握带函数查询和综合查询的使用。 二、实验内容及要求 1&#xff0e;统计年龄大于30岁的学生的人数。 --统计年龄大于30岁的学生的人数。SELECT COUNT(*) AS 人数FROM StudentWHERE (datepart(yea…

小公司的软件开发IT工具箱

目录 工具链困境 难题的解决 达到的效果 资源要求低 工具箱一览 1、代码管理工具 2、自动化发版&#xff08;测试&#xff09;工具 3、依赖库&#xff08;制品包&#xff09;管理 4、镜像管理 5、授权管理&#xff08;可选&#xff09; 待讨论&#xff1a;为什么不是…

基于全志T507-H的Linux-RT实时性测试案例分享

本文将为各位工程师演示全志T507-H工业评估板&#xff08;TLT507-EVM&#xff09;基于IgH EtherCAT控制伺服电机方法&#xff0c;生动说明Linux-RT Igh EtherCAT的强大之处&#xff01; Linux-RT系统的优势 内核开源、免费、功能完善。 RT PREEMPT补丁&#xff0c;使Linux内…