练手零钱通系统
需求:实现入账和支出功能,并显示具体的入账、支出时间
注:这道题主要是用来练手的,熟悉面向对象和面向过程的差异! 这里展示两段代码,面向对象和面向过程的代码
方法一:面向过程
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
public static void main(String[] args) {
boolean loop = true; //判定是否循环的标识符
Scanner scanner = new Scanner(System.in);
String key = "";
String details = "-----------------零钱通明细------------------";
double money = 0;
double balance = 0;
Date date = null; // date 是 java.util.Date 类型,表示日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //可以用于日期格式化的
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.print("请选择(1-4): ");
key = scanner.next();
//使用switch 分支控制
switch (key) {
case "1":
System.out.println(details);
break;
case "2":
System.out.print("收益入账金额:");
money = scanner.nextDouble();
//money 的值范围应该校验 -》 一会在完善
//老师思路, 编程思想
//找出不正确的金额条件,然后给出提示, 就直接break
if(money <= 0) {
System.out.println("收益入账金额 需要 大于 0");
break;
}
//找出正确金额的条件
balance += money;
//拼接收益入账信息到 details
date = new Date(); //获取当前日期
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "3":
System.out.print("消费金额:");
money = scanner.nextDouble();
if(money <= 0 || money > balance) {
System.out.println("你的消费金额 应该在 0-" + balance);
break;
}
System.out.print("消费说明:");
note = scanner.next();
balance -= money;
//拼接消费信息到 details
date = new Date(); //获取当前日期
details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "4":
String choice = "";
while (true) { //要求用户必须输入y/n ,否则就一直循环
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
}
//当用户退出while ,进行判断
if (choice.equals("y")) {
loop = false;
}
break;
default:
System.out.println("选择有误,请重新选择");
}
} while (loop);
System.out.println("-----退出了零钱通项目-----");
}
}
方法二:面向对象
// 功能类
package moneyT;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Moeny {
// 基础版零钱通管理系统
private String details = "================零钱通细明===============";
private double balance; //余额
private double change;//消费、收入
String answer = "";//判断退出循环的标识符
Scanner mys = new Scanner(System.in);
Date d = new Date();
boolean flag = true;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
public void mainMenu() {
do {
System.out.println();
System.out.println("\n================零钱通菜单(OOP)===============");
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.print("请选择(1-4): ");
int key = mys.nextInt();
switch (key) {
case 1:
this.detail();
break;
case 2:
this.addMoney();
break;
case 3:
this.pay();
break;
case 4:
this.exit();
break;
default:
System.out.println("请输入正确指令数字!");
break;
}
} while (flag);
}
// 1.零钱通细明
public void detail() {
System.out.println(details);
}
// 2. 收益入栈
public void addMoney() {//收益入账
System.out.println("请输入入账金额:");
double n = mys.nextDouble();
balance += n;
// 字符串拼接显示余额
details += "\n收益入账 +" + n + "\t" + sdf.format(d) + "\t余额:" + balance;
}
// 3. 消费
public void pay() {
System.out.println("请输入消费原因:");
String str = mys.next();
System.out.println("请输入消费金额:");
double n = mys.nextDouble();
if (n > balance) {
System.out.println("消费金额大于余额啦,请勿过渡消费!");
return;
}
balance -= n;
details += "\n" + str + " -" + n + "\t" + sdf.format(d) + "\t余额:" + balance;
}
// 4 退出
public void exit() {
while (true) {
System.out.println("是否要退出零钱通系统?(Y/N)");
answer = mys.next();
if (("Y").equals(answer) || ("N").equals(answer)) {
break;
}
}
if (("Y").equals(answer)) {
System.out.println("欢迎下次光临!");
flag = false;
}
}
}
//测试类
package moneyT;
public class Text {
public static void main(String[] args) {
Moeny moeny = new Moeny();
moeny.mainMenu();
}
}
心得体会
- 这道题给自己得感觉就是,面向过程的代码写的很多,都在一个main方法中,不好管理,显得很繁杂
- 棉线过程把主要的功能,都定义成了一个方法,看起来就很有条理,清晰可见,方法在使用的时候直接调用就行了,而且增加了代码的复用性
- 通过字符串拼接来实现零钱通细明效果,也是一个很好的想法,之前一开始想到的是数组存储,但这就有点把简单的问题复杂化了
- 最后的退出系统,再次写一个while循环来判断是否退出,也挺好的,一个代码块负责一个小功能
while (true) {
System.out.println("是否要退出零钱通系统?(Y/N)");
answer = mys.next();
if (("Y").equals(answer) || ("N").equals(answer)) {
break;
}
}
if (("Y").equals(answer)) {
System.out.println("欢迎下次光临!");
flag = false;
}
}
运行结果: