项目说明
基本需求:
追加需求:
- 用户输入4退出时,给出提示信息“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n。
- 在收益入账和消费时,判断金额是否合理,并给出相应的提示。
- 将面向过程的代码修改成面向对象的方法
目的:体会面向对象编程的特点和好处
实现步骤
整体思路:化繁为简
第一步:先完成显示菜单并可以选择
//用于控制循环的结束
boolean flag = true;
//用于存储用户的输入
Scanner scanner = new Scanner(System.in);
String choice = "";
//dowhile循环
do {
//菜单页面
System.out.println("==========零钱通菜单=========");
System.out.println("tt1 零钱通明细");
System.out.println("tt2 收益入账");
System.out.println("tt3 消 费");
System.out.println("tt4 退 出");
System.out.print("请选择(1~4):");
choice = scanner.next();
System.out.println("");
//根据选择,显示不同的信息
switch (choice){
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 退 出");
flag = false;
break;
default:
System.out.println("你输入的选择有误");
}
} while (flag);
第二步:完成零钱通明细
思路:(1)第一种用数组存储数据,但是动态数组还没学到(2)可以用对象(3)可以用String拼接
//选择方法三,比较简单
//用字符串拼接的方式显示零钱通明细
String details = "----------零钱通明细---------";
//将 case "1" 的情况重写
case "1":
System.out.println(details);
break;
第三步:完成收益入账
思路:根据要求创建新的变量,然后新的信息拼接在字符串上
//money存储收入的金钱,balance存储余额
//获取时间的方式后面会学到,先用着
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//将 case "2" 的情况重写
case "2":
System.out.print("收益入账金额:");
money = scanner.nextDouble();
balance += money;
date = new Date();
details += "n收益入账t+" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
break;
第四步:完成消费
思路:和收益入账类似
//存储消费项目的名称
String consume = "";
//将 case "3" 的情况重写
case "3":
System.out.print("消费项目:");
consume = scanner.next();
System.out.print("消费金额:");
money = scanner.nextDouble();
balance -= money;
date = new Date();
details += "n" + consume + "t-" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
break;
第五步:完善追加需求的退出功能
//存储退出时的判断
String judge = "";
//将 case "4" 的情况重写
case "4":
// do {
// System.out.println("你确定要退出吗?y/n");
// judge = scanner.next();
// if ("y".equals(judge)) {
// flag = false;
// System.out.println("退出成功");
// } else if ("n".equals(judge)) {
// break;
// } else {
// System.out.println("你的输入不符合规范,请重新输入");
// }
// } while (flag);
while (true) {
System.out.println("你确定要退出吗?y/n");
judge = scanner.next();
if ("y".equals(judge) || "n".equals(judge)) {
break;
} else {
System.out.println("你的输入不符合规范,请重新输入");
}
}
if ("y".equals(judge)) {
flag = false;
System.out.println("退出成功");
}
break;
以这个退出功能为例,写了两种方法,建议使用未注释掉的写法,这体现了下面这种编程思想:
一种编程思想:一段代码就完成一个小功能,尽量不要混在一起,这样代码的耦合性就会比较低,之后想要追加修改一些新的功能也会更方便一些
第六步:完善追加的判断在收益入账和消费时金额是否合理功能
//在 case "2" 和 case "3" 中增加判断
case "2":
System.out.print("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("输入的收益入账金额有误,必须是正数");
break;
}
balance += money;
date = new Date();
details += "n收益入账t+" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
break;
case "3":
System.out.print("消费项目:");
consume = scanner.next();
System.out.print("消费金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("输入的消费金额有误,必须是正数");
break;
}
if (money > balance) {
System.out.println("你的消费金额大于你的余额,消费失败");
break;
}
balance -= money;
date = new Date();
details += "n" + consume + "t-" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
break;
面向过程编程的完整代码
package com.zy.smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
public static void main(String[] args) {
//用于控制循环的结束
boolean flag = true;
//用于存储用户的输入
Scanner scanner = new Scanner(System.in);
String choice = "";
//用字符串拼接的方式显示零钱通明细
String details = "----------零钱通明细----------";
//money存储收入的金钱,balance存储余额
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//存储消费项目的名称
String consume = "";
//存储退出时的判断
String judge = "";
//dowhile循环
do {
//菜单页面
System.out.println("==========零钱通菜单==========");
System.out.println("tt1 零钱通明细");
System.out.println("tt2 收益入账");
System.out.println("tt3 消 费");
System.out.println("tt4 退 出");
System.out.print("请选择(1~4):");
choice = scanner.next();
System.out.print("");
//根据选择,显示不同的信息
switch (choice) {
case "1":
System.out.println(details);
break;
case "2":
System.out.print("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("输入的收益入账金额有误,必须是正数");
break;
}
balance += money;
date = new Date();
details += "n收益入账t+" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
break;
case "3":
System.out.print("消费项目:");
consume = scanner.next();
System.out.print("消费金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("输入的消费金额有误,必须是正数");
break;
}
if (money > balance) {
System.out.println("你的消费金额大于你的余额,消费失败");
break;
}
balance -= money;
date = new Date();
details += "n" + consume + "t-" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
break;
case "4":
// do {
// System.out.println("你确定要退出吗?y/n");
// judge = scanner.next();
// if ("y".equals(judge)) {
// flag = false;
// System.out.println("退出成功");
// } else if ("n".equals(judge)) {
// break;
// } else {
// System.out.println("你的输入不符合规范,请重新输入");
// }
// } while (flag);
while (true) {
System.out.println("你确定要退出吗?y/n");
judge = scanner.next();
if ("y".equals(judge) || "n".equals(judge)) {
break;
} else {
System.out.println("你的输入不符合规范,请重新输入");
}
}
if ("y".equals(judge)) {
flag = false;
System.out.println("-------成功退出零钱通-------");
}
break;
default:
System.out.println("你输入的选择有误");
}
} while (flag);
}
}
面向对象编程的完整代码
就是将面向过程编程的各个步骤封装成一个个方法,使用时创建对象来调用方法即可
建议自己先试着写一写,体会面向对象编程的特点和好处
SmallChangeSysOOP 类:
package com.zy.smallchange.oop;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSysOOP {
//用于控制循环的结束
private boolean flag = true;
//用于存储用户的输入
Scanner scanner = new Scanner(System.in);
private String choice = "";
//用字符串拼接的方式显示零钱通明细
private String details = "----------零钱通明细----------";
//money存储收入的金钱,balance存储余额
private double money = 0;
private double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//存储消费项目的名称
private String consume = "";
//存储退出时的判断
private String judge = "";
//菜单页面
public void mainMenu() {
do {
System.out.println("==========零钱通菜单==========");
System.out.println("tt1 零钱通明细");
System.out.println("tt2 收益入账");
System.out.println("tt3 消 费");
System.out.println("tt4 退 出");
System.out.print("请选择(1~4):");
choice = scanner.next();
System.out.print("");
//根据选择,显示不同的信息
switch (choice) {
case "1":
this.details();
break;
case "2":
this.income();
break;
case "3":
this.consume();
break;
case "4":
this.exit();
break;
default:
System.out.println("你输入的选择有误");
}
} while (flag);
}
public void details() {
System.out.println(details);
}
public void income() {
System.out.print("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("输入的收益入账金额有误,必须是正数");
return;
}
balance += money;
date = new Date();
details += "n收益入账t+" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
}
public void consume() {
System.out.print("消费项目:");
consume = scanner.next();
System.out.print("消费金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("输入的消费金额有误,必须是正数");
return;
}
if (money > balance) {
System.out.println("你的消费金额大于你的余额,消费失败");
return;
}
balance -= money;
date = new Date();
details += "n" + consume + "t-" + money + "t" + sdf.format(date) + "t" + "余额:" + balance;
}
public void exit() {
while (true) {
System.out.println("你确定要退出吗?y/n");
judge = scanner.next();
if ("y".equals(judge) || "n".equals(judge)) {
break;
} else {
System.out.println("你的输入不符合规范,请重新输入");
}
}
if ("y".equals(judge)) {
flag = false;
System.out.println("-------成功退出零钱通-------");
}
}
}
再用一个 SmallChangeSysAPP 类来调用 SmallChangeSysOOP 类:
package com.zy.smallchange.oop;
public class SmallChangeSysAPP {
public static void main(String[] args) {
SmallChangeSysOOP mySmallChangeSysOOP = new SmallChangeSysOOP();
mySmallChangeSysOOP.mainMenu();
}
}



