一、项目需求分析
可以完成收益入账、消费、查看明细、退出系统等功能
界面如下
先使用过程编程,后面改成OOP版本
二、项目代码
化繁为简
1、先完成显示菜单,并可以选择
package com.lmdedu.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.println("请选择(1~4)");
key = scanner.next();
//使用switch分支控制
switch(key){
case "1":
System.out.println("1 零钱通收益");
break;
case "2":
System.out.println("2 收益入账");
break;
case "3":
System.out.println("3 消费");
break;
case "4":
System.out.println("4 退 出");
//将退出的循环变量设为false即可
loop = false;
break;
default:
System.out.println("菜单选择有误,请重新选择");
}
}while(loop);
System.out.println("-----------退出了零钱通项目----------");
}
}
2、完成零钱通明细
分析零钱通一共就两个业务,一个是收益入账,一个是消费
这里没有采用数组的方式,因为还没学习数组的动态扩容
采用的是字符串拼接的方式
3、完成收益入账
接受入账金额,日期,余额:
4、完成消费
初步代码
package com.lmdedu.smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
//2、完成零钱通明细
//3、完成收益入账
//4、完成消费
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//date是java.util.Date类型,表示日期
Date date = null;
//创建一个可以用于日期格式化的工具,名为sdf
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//定义相关变量
boolean loop = true;
String key = "";
//2、完成零钱通明细
// 1)可以将收益入账和消费,保存在数组中 2)可以使用对象 3)简单的话可以使用String拼接
String details = "-------------零钱通明细-------------";
//3、完成收益入账
// 接受入账金额,日期,余额: 定义新的变量
//收益
double money = 0;
//余额
double balance = 0;
//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.println("请选择(1~4)");
key = scanner.next();
//使用switch分支控制
switch(key){
case "1":
System.out.println(details);
break;
case "2":
//获取收益金额
System.out.println("收益入账金额");
money = scanner.nextDouble();
//money的值范围应该校验
//余额+收益
balance+=money;
//拼接收益入账信息到details
//获取到当前日期
date = new Date();
details += "\n收益入账" + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "3":
//获取消费金额及消费去向
System.out.println("3 消费");
//money的值范围应该校验
System.out.println("输入消费金额");
money = scanner.nextDouble();
System.out.println("请输入消费去向");
note = scanner.next();
//获取到当前日期
date = new Date();
//余额-消费
balance -= money;
//拼接消费信息到details
details += "\n" + note + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "4":
System.out.println("4 退 出");
//将退出的循环变量设为false即可
loop = false;
break;
default:
System.out.println("菜单选择有误,请重新选择");
}
}while(loop);
System.out.println("-----------退出了零钱通项目----------");
}
}
5、改进
完成1、
case "4":
System.out.println("4 退 出");
//用户输入4退出时,给出提示 "你确定要退出吗? y/n" 必须输入正确的y或n否则循环输入指令
//1、定义一个变量choice接受用户的输入
String choice;
//2、使用while加break,来处理接受到的输入是否为 y/n
while(true){
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if(choice.equals("y") || choice.equals("n")) {
break;
}else{
System.out.println("输入有误请重新输入,y/n");
}
}
//3、退出while后再判断是y还是n
if(choice.equals("y")){
loop = false;
}
break;
完成2、
要学会检验条件时,这种找不正确条件的 编程思维
case "2":
//获取收益金额
System.out.println("收益入账金额");
money = scanner.nextDouble();
//money的值范围应该校验,收益金额必须大于0,若不满足条件,给出提示,并break
//思路技巧:尽量去找不正确的条件,当成闯关游戏,若条件满足则下一关(下一个if),不满足则break
if(money <= 0) {
System.out.println("请输入正确的入账金额,收益金额必须 > 0");
break;
}//通过这个条件检验才能向下执行,否则就break直接GG
//余额+收益
balance += money;
//拼接收益入账信息到details
//获取到当前日期
date = new Date();
details += "\n收益入账" + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "3":
//获取消费金额及消费去向
System.out.println("3 消费");
System.out.println("输入消费金额");
money = scanner.nextDouble();
System.out.println("请输入消费去向");
note = scanner.next();
//获取到当前日期
date = new Date();
//money的值范围应该校验
//检验消费金额是否 大于 0,否则break
if(money <= 0) {
System.out.println("请正确输入,消费金额必须大于0");
break;
}
//检验消费金额是否 小于 余额,否则break
if(money >= balance) {
System.out.println("余额不足,消费金额必须小于余额");
break;
}
//检验完上面的条件,全部通过后,才能进行余额更新
//余额-消费
balance -= money;
//拼接消费信息到details
details += "\n" + note + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
6、面向过程完整版代码
package com.lmdedu.smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
//2、完成零钱通明细
//3、完成收益入账
//4、完成消费
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//date是java.util.Date类型,表示日期
Date date = null;
//创建一个可以用于日期格式化的工具,名为sdf
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//定义相关变量
boolean loop = true;
String key = "";
//2、完成零钱通明细
// 1)可以将收益入账和消费,保存在数组中 2)可以使用对象 3)简单的话可以使用String拼接
String details = "-------------零钱通明细-------------";
//3、完成收益入账
// 接受入账金额,日期,余额: 定义新的变量
//收益
double money = 0;
//余额
double balance = 0;
//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.println("请选择(1~4)");
key = scanner.next();
//使用switch分支控制
switch(key){
case "1":
System.out.println(details);
break;
case "2":
//获取收益金额
System.out.println("收益入账金额");
money = scanner.nextDouble();
//money的值范围应该校验,收益金额必须大于0,若不满足条件,给出提示,并break
//思路技巧:尽量去找不正确的条件,当成闯关游戏,若条件满足则下一关(下一个if),不满足则break
if(money <= 0) {
System.out.println("请输入正确的入账金额,收益金额必须 > 0");
break;
}//通过这个条件检验才能向下执行,否则就break直接GG
//余额+收益
balance += money;
//拼接收益入账信息到details
//获取到当前日期
date = new Date();
details += "\n收益入账" + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "3":
//获取消费金额及消费去向
System.out.println("3 消费");
System.out.println("输入消费金额");
money = scanner.nextDouble();
System.out.println("请输入消费去向");
note = scanner.next();
//获取到当前日期
date = new Date();
//money的值范围应该校验
//检验消费金额是否 大于 0,否则break
if(money <= 0) {
System.out.println("请正确输入,消费金额必须大于0");
break;
}
//检验消费金额是否 小于 余额,否则break
if(money >= balance) {
System.out.println("余额不足,消费金额必须小于余额");
break;
}
//检验完上面的条件,全部通过后,才能进行余额更新
//余额-消费
balance -= money;
//拼接消费信息到details
details += "\n" + note + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "4":
System.out.println("4 退 出");
//用户输入4退出时,给出提示 "你确定要退出吗? y/n" 必须输入正确的y或n否则循环输入指令
//1、定义一个变量choice接受用户的输入
String choice;
//2、使用while加break,来处理接受到的输入是否为 y/n
while(true){
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if(choice.equals("y") || choice.equals("n")) {
break;
}else{
System.out.println("输入有误请重新输入,y/n");
}
}
//3、退出while后再判断是y还是n
if(choice.equals("y")){
loop = false;
}
break;
default:
System.out.println("菜单选择有误,请重新选择");
}
}while(loop);
System.out.println("-----------退出了零钱通项目----------");
}
}
7、改为面向对象OOP版
OOP代码
package com.lmdedu.smallchange.oop;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 该类是完成零钱通的各个功能的类
* 使用OOP(面向对象编程)
* 讲各个功能对应一个方法,
*/
public class SmallChangeSysOOP {
//属性属性属性属性属性
Scanner scanner = new Scanner(System.in);
//date是java.util.Date类型,表示日期
Date date = null;
//创建一个可以用于日期格式化的工具,名为sdf
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//定义相关变量
boolean loop = true;
String key = "";
//2、完成零钱通明细
// 1)可以将收益入账和消费,保存在数组中 2)可以使用对象 3)简单的话可以使用String拼接
String details = "-------------零钱通明细-------------";
//3、完成收益入账
// 接受入账金额,日期,余额: 定义新的变量
//收益
double money = 0;
//余额
double balance = 0;
//4、消费
//定义新变量
//消费说明
String note = "";
//方法方法方法方法
//1、先完成显示菜单,并可以选择菜单,给出对应提示
public void mainMenu(){
//本质就是将面向过程代码中的主方法里面的变量,变成了OOP这个类的属性
//将各个功能分别封装到 各个方法中去
//再将各个方法融合到主菜单中
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.println("请选择(1~4)");
key = scanner.next();
//使用switch分支控制
switch(key){
case "1":
//调用detail()方法
this.detail();
break;
case "2":
//调用income()方法
this.income();
break;
case "3":
//调用pay()方法
this.pay();
break;
case "4":
this.exit();
break;
default:
System.out.println("菜单选择有误,请重新选择");
}
}while(loop);
}
//2、完成零钱通明细
public void detail(){
System.out.println(details);
}
//3、完成收益入账
public void income(){
//获取收益金额
System.out.println("收益入账金额");
money = scanner.nextDouble();
//money的值范围应该校验,收益金额必须大于0,若不满足条件,给出提示,并return
//思路技巧:尽量去找不正确的条件,当成闯关游戏,若条件满足则下一关(下一个if),不满足则return
if(money <= 0) {
System.out.println("请输入正确的入账金额,收益金额必须 > 0");
return;//退出方法,不再执行后面的代码
}//通过这个条件检验才能向下执行,否则就return直接GG
//余额+收益
balance += money;
//拼接收益入账信息到details
//获取到当前日期
date = new Date();
details += "\n收益入账" + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
}
//4、消费
public void pay(){
//获取消费金额及消费去向
System.out.println("3 消费");
System.out.println("输入消费金额");
money = scanner.nextDouble();
System.out.println("请输入消费去向");
note = scanner.next();
//获取到当前日期
date = new Date();
//money的值范围应该校验
//检验消费金额是否 大于 0,否则return
if(money <= 0) {
System.out.println("请正确输入,消费金额必须大于0");
return;//退出方法,不再执行后面的代码
}
//检验消费金额是否 小于 余额,否则return
if(money >= balance) {
System.out.println("余额不足,消费金额必须小于余额");
return;//退出方法,不再执行后面的代码
}
//检验完上面的条件,全部通过后,才能进行余额更新
//余额-消费
balance -= money;
//拼接消费信息到details
details += "\n" + note + "\t" + money + "\t" + sdf.format(date) + "\t" + balance;
}
//5、退出
public void exit(){
System.out.println("4 退 出");
//用户输入4退出时,给出提示 "你确定要退出吗? y/n" 必须输入正确的y或n否则循环输入指令
//1、定义一个变量choice接受用户的输入
String choice;
//2、使用while加break,来处理接受到的输入是否为 y/n
while(true){
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if(choice.equals("y") || choice.equals("n")) {
break;
}else{
System.out.println("输入有误请重新输入,y/n");
}
}
//3、退出while后再判断是y还是n
if(choice.equals("y")){
loop = false;
}
}
}
package com.lmdedu.smallchange.oop;
/**
* 这里我们直接调用SmallChangeOOP的对象,显示主菜单即可
*/
public class SmallChangeSysApp {
public static void main(String[] args) {
SmallChangeSysOOP smallChangeSysOOP = new SmallChangeSysOOP();
smallChangeSysOOP.mainMenu();
}
}
效果