当前位置:网站首页>零钱通项目(两个版本)含思路详解
零钱通项目(两个版本)含思路详解
2022-07-27 19:07:00 【小唐学抓娃】
========= 零钱通项目 ========
前言:从七月中旬开始算是系统地学java编程,到现在也有一个月了(不算中间休息的一段时间) 总算能写一个小小的项目了(啥也不是),但是还是挺开心的。因为代码都是自己一行一行敲的(要是早点遇到自己喜欢的学习资源就好了…只能怪自己不上进了,加油追!!)
此项目有两个版本,一是面向过程版,还有就是面向对象(OOP)版本了。主要是为了通过两个版本的比较能够体会到OOP的好处。
下面是项目要求
= = = = = = = = = 一、面向过程版 = = = = = = = =
1、思路:有菜单界面一般先考虑switch语句,先做出菜单选择->scanner、再把相应的功能写出(由简到繁,由易到难)写出基本的功能后再逐步完善代码。这里我认为**主要的难点在于怎么把每一条的明细最后都打印出来 。**结尾会说,可以先考虑一下(字符串、数组、对象(面向对象))
2、下面直接上代码,代码中大多数注释都有些编程思路。
package com.tzwJava.chapter08.smallChange_;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/*
-----------零钱通菜单----------
1零钱通明细
2收益入账
3消费
4退出
思路:
1、零钱通明细:有收益入账和消费两个项目及对应的时间,还有当时的余额。
2、收益入账:只进行收益入账项目的记录,以及时间和余额
3、消费:只进行消费项目的记录,以及时间和余额
4、退出结束
*/
public class ChangeMoney {
public static void main(String[] args) {
double entryNum = 0;//收益金额
double consumeNum = 0;//消费金额
double balance = 0;//余额
String chargedetail = "----------------零钱通明细----------------";//字符串拼接核心
String consumeName = " "; //消费项目
//显示当时时间:
Date date = new Date();//new一个时间类
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd hh:mm:ss");//格式化显示时间
do {
System.out.println("\n-----------零钱通菜单----------");
System.out.println("\t\t1零钱通明细");
System.out.println("\t\t2收益入账");
System.out.println("\t\t3消费");
System.out.println("\t\t4退\t出");
System.out.println("请选择1-4:");
Scanner myScanner = new Scanner(System.in);
int choiceNum = myScanner.nextInt();
switch (choiceNum) {
case 1:
System.out.println(chargedetail);//菜单
break;
case 2:
System.out.println("-----------收益入账----------");
entryNum = myScanner.nextDouble();//收益金额
if (entryNum <= 0) {//过关斩将编程思想
System.out.println("你输入的收益金额有误!");
break;
}
balance += entryNum;//收益后的余额
//明细用字符串拼接
chargedetail += "\n收益入账\t+" + entryNum + "\t" + sdf.format(date) + "\t" + "余额:" + balance;
//sdf.format(date) sdf对象调用格式化方法format,把date对象传进去
break;
case 3:
System.out.println("-----------消费----------");
System.out.println("请输入消费项目:");
consumeName = myScanner.next();
System.out.println("请输入消费金额:");
consumeNum = myScanner.nextDouble();
//过五关斩六将编程思想 ,先判断错误思想
//把所有错误条件先写出来,错误就break,直到都满足条件了再执行目标代码
if (consumeNum <= 0) {//消费金额不能小于0
System.out.println("输入消费金额需要大于0!");
break;
}
if (consumeNum > balance) {//消费金额不能大于余额
System.out.println("余额不足!");
break;
}
balance -= consumeNum; //计算余额
//明细用字符串拼接
chargedetail += "\n" + consumeName + "\t-" + consumeNum + "\t" + sdf.format(date) + "\t余额:" + balance;
break;
case 4:
String anser = "";
while (true) {
System.out.println("是否确认退出?yes/no");
anser = myScanner.next();
if (anser.equals("yes") || anser.equals("no")) {
break;
}
}//while循环只要求输入的值为yes或no,不然就一直循环
//这里体现了低耦合的编程思想,一个代码块实现一个功能(扩展性好)
// 代码耦合性就低,也就更健壮,更易于维护与修改添加功能
if (anser.equals("yes")) {
System.out.println("你已退出!");
return;
}
break;
default:
System.out.println("你的选择有误!");
}
} while (true);
}
}
= = = = = = = 一、面向对象版 = = = = = = =
1、面向对象与面向过程相比较,最大的好处就是把各个功能用方法和属性来封装起来。
2、本代码创建了两个类。一个类(SmallChangeSysOOP)是完成功能的(相当于开发者),一个类(SmallChangeSysApp)是使用功能的(相当于使用者、用户)代码分别为:
①SmallChangeSysOOP:
package com.tzwJava.chapter08.smallChangeOOP;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSysOOP {
//先定义属性(过程需要随时添加)
//属性都用private封装起来,然后用get 和set方法
private double entryNum;//收入金额
private String consumeName;//消费项目名
private double consumeNum;//消费金额
private double balance;//余额
private String chargedetail = "";//明细
private boolean condition_ = true;//退出循环的条件,相对于面向过程版本更加简洁健壮。
public double getEntryNum() {
return entryNum;
}
public void setEntryNum(double entryNum) {
this.entryNum = entryNum;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getConsumeName() {
return consumeName;
}
public void setConsumeName(String consumeName) {
this.consumeName = consumeName;
}
public double getConsumeNum() {
return consumeNum;
}
public void setConsumeNum(double consumeNum) {
this.consumeNum = consumeNum;
}
//完成显示菜单,并可以选择
public void menuDisplay() {//返回一个选择的数字
do {
System.out.println("\n-----------零钱通菜单----------");
System.out.println("\t\t1零钱通明细");
System.out.println("\t\t2收益入账");
System.out.println("\t\t3消费");
System.out.println("\t\t4退\t出");
System.out.println("请选择1-4:");
Scanner myScanner = new Scanner(System.in);
int choiceNum = myScanner.nextInt();
switch (choiceNum) {
case 1://零钱通明细
System.out.println("=========零钱通明细========");
chargedetail_();
break;
case 2://收益入账
incomeEntry();
// chargedetail += this.incomeEntry();
//
break;
case 3://消费
consume();
break;
case 4:
esc();
condition_ = false;
break;
default:
System.out.println("你的选择有误!");
}
} while (condition_);//这里故意与面向过程版本不同,实际那个版本一样可以这么控制循环。
}
//收益入账模块
public void incomeEntry() {
System.out.println("请输入收益金额 ");
Scanner myScanner = new Scanner(System.in);
this.entryNum = myScanner.nextDouble();
if (this.entryNum <= 0) {//过五关斩六将编程思想
System.out.println("你输入的收益金额有误!");
}
this.balance += this.entryNum;//收益后的余额
Date date = new Date();//new一个时间类
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd hh:mm:ss");//格式化显示时间
//打印当前收益记录
System.out.println("收益入账\t" + this.entryNum + "\t" + sdf.format(date) + "\t\t" + "余额:" + this.balance + "\n");
//chargedetail是明细,还是用字符串拼接所有的消费、收益记录
chargedetail += "收益入账\t" + this.entryNum + "\t" + sdf.format(date) + "\t\t" + "余额:" + this.balance + "\n";
}
//消费模块
public void consume() {
System.out.println("-----------消费----------");
System.out.println("请输入消费项目:");
Scanner myScanner = new Scanner(System.in);
this.consumeName = myScanner.next();
System.out.println("请输入消费金额:");
this.consumeNum = myScanner.nextDouble();
if (this.consumeNum <= 0) {//过五关斩六将编程思想 ,先判断错误思想
//把所有错误条件先写出来,错误就break,直到都满足条件了再执行目标代码
System.out.println("输入消费金额需要大于0!");
return;
}
if (this.consumeNum > this.balance) {
System.out.println("余额不足!");
return;
}
this.balance -= this.consumeNum;
Date date = new Date();//new一个时间类
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd hh:mm:ss");//格式化显示时间
//chargedetail是明细,还是用字符串拼接所有的消费、收益记录
chargedetail += this.consumeName + "\t-" + this.consumeNum + "\t" + sdf.format(date) + "\t余额:" + this.balance + "\n";
//打印当前消费记录
System.out.println(this.consumeName + "\t-" + this.consumeNum + "\t" + sdf.format(date) + "\t余额:" + this.balance + "\n");
}
//退出模块
public void esc() {
String anser;
while (true) {
System.out.println("是否确认退出?yes/no");
Scanner myScanner = new Scanner(System.in);
anser = myScanner.next();
if (anser.equals("yes") || anser.equals("no")) {
break;
}
}
//while循环只要求输入的值为yes或no,不然就一直循环
//这里体现了低耦合的编程思想,一个代码块实现一个功能(扩展性好)
// 代码耦合性就低,也就更健壮,更易于维护与修改添加功能
if (anser.equals("yes")) {
System.out.println("你已退出!");
return;
}
return;
}
public void chargedetail_() {//零钱通明细
System.out.println(chargedetail);//打印时打印之前所有的消费、收益记录。
}
}
②SmallChangeSysApp
package com.tzwJava.chapter08.smallChangeOOP;
public class SmallChangeSysApp {
public static void main(String[] args) {
new SmallChangeSysOOP().menuDisplay();//创建一个临时对象
// 也可以这样:
// SmallChangeSysOOP sCSOOP = new SmallChangeSysOOP();
// sCSOOP.menuDisplay();
}
}
以上就是零钱通项目的全部内容~~创作不易,点个赞支持一下吧~
月终学习小总结:从七月中旬到现在实际学习天数只有30天左右(今天是第 32 天) 有半个月的时间也是荒废了…一周是各种家里七七八八地事情,也给自己放了几天假…感觉一个暑假就没了呀,还没学到啥东西,这效率也太低了。还有半个月开学上网课了,加油吧!!这一个月地日均学习时长也才6个小时的样子。以后学java用番茄to do 去打卡专注时长,把任务都用时间量化(同时保证学习质量)。冲冲冲!
边栏推荐
- 软件测试面试题:请说出这些测试最好由那些人员完成,测试的是什么?
- Daily Mathematics Series 60: February 29
- Can single mode and multi-mode of industrial switches replace each other?
- Design of noise reduction link based on DSP
- Software testing interview question: what aspects should be considered when designing test cases, that is, which aspects should different test cases be tested for?
- Acwing3715. Minimum exchange times (simulation idea of bubble sorting method)
- OPPO造芯计划正式公布:首款芯片或为OPPO M1
- 看起来是线程池的BUG,但是我认为是源码设计不合理。
- Software test interview questions: the steps to write test cases by drawing cause and effect diagrams are___ And transforming the cause and effect diagram into a state diagram in five steps. What are
- 【2022牛客多校第二场】K-Link with Bracket Sequence I
猜你喜欢

Comprehensively design an oppe homepage -- Design of selected accessories on the page

STL源码剖析

单核CPU, 1G内存,也能做JVM调优吗?

Worthington phospholipase A2 study phosphatidylcholine 2-acetylhydrolase

CBAM学习笔记

Chinese and English instructions - human alpha fetoprotein (AFP) ELISA quantitative Kit

Why use MQ message oriented middleware? These questions must be solved

Can single mode and multi-mode of industrial switches replace each other?

中英文说明书丨 AbFluor 488 细胞凋亡检测试剂盒

Idea connects to MySQL database and performs SQL query operations
随机推荐
UNITY--读取Excel
一篇文章带你走进pycharm的世界----别再问我pycharm的安装和环境配置了!!!
@The difference between Autowired annotation and @resource annotation
Dedecms dream weaving last article next article free controllable output link, title, thumbnail, time
Huawei establishes global ecological development department: fully promote HMS global ecological construction
XML writing gap animation popupwindow realizes the animation of emergence and exit
Recursion / backtracking (Part 1)
Qt取出输入框字符串,lineEdit
Worthington磷脂酶A2研究丨磷脂酰胆碱2-乙酰水解酶
LInkedList底层源码
Multi person collaborative development specification
@Autowired注解与@Resource注解的区别
Yyds dry inventory learn how to write function overloads in typescript
JVM-内存模型 面试总结
Guava Cache 原理分析与最佳实践
C语言-入门-语法-指针(十二)
Worthington phospholipase A2 study phosphatidylcholine 2-acetylhydrolase
首发展锐5G芯片!纯国产5G手机海信F50曝光:搭载虎贲T710+春藤510
监听服务器jar运行,及重启脚本
Acwing3715. 最少交换次数(冒泡排序法的模拟思路)