设计实现简单的零钱通,这里没有使用到数据库,分为面向过程版和面向对方版,帮助理解面向对象的特点,要求实现如下效果:
一、面向过程版本
SmallChangeSys.java
package com.smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
public static void main(String[] args) {
boolean loop = true;//默认零钱通菜单为true
Scanner scanner = new Scanner(System.in);
String key = "";//用于接收用户选择
//1.完成零钱通明细
String details = "----------零钱通明细----------";
//2.完成收益入账
//定义新的变量
double money = 0;//金额
double balance = 0;//余额
Date date = null;//时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//转换时间格式
//3.接收消费说明
String name = "";
//4.接收退出选择
String str = "";
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 退 出");
System.out.print("请选择(1-4):");
key = scanner.next();
switch (key) {
case "1":
System.out.println(details);
break;
case "2":
System.out.print("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("收益入账金额需要大于0");
break;
}
balance += money;
date = new Date();
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
break;
case "3":
System.out.print("消费金额:");
money = scanner.nextDouble();
if (money > balance || money <= 0) {
System.out.println("消费金额应该在0-"+balance);
break;
}
System.out.print("消费名称:");
name = scanner.next();
balance -= money;
date = new Date();
details += "\n" + name + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
break;
case "4":
//使用while+break
//退出while后,再判断str是y还是n
while (true) {//要求用户必须输入y/n,否则一直循环
System.out.print("你确定要退出吗?(输入y/n):");
str = scanner.next();
if ("y".equals(str) || "n".equals(str)) {
break;
}
}
if (str.equals("y")) {
loop = false;
}
break;
default:
System.out.println("选择有误,请重新选择");
}
} while (loop);
System.out.println("---------退出了零钱通项目-----------");
}
}
二、面向对象版本
新建一个SmallChangeSysOOP类,该类是完成零钱通的各个功能的类,使用oop(面向对象编程)将各个功能对应一个方法
SmallChangeSysOOP.java
package com.smallchange.oop;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 该类是完成零钱通的各个功能的类
* 使用oop(面向对象编程)
* 将各个功能对应一个方法
*/
public class SmallChangeSysOOP {
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
//1.完成零钱通明细
String details = "----------零钱通明细----------";
//2.完成收益入账
//定义新的变量
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//3.消费
String name = "";
//4.退出
String str = "";
//完成显示菜单
public void mainMenu() {
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 退 出");
System.out.print("请选择(1-4):");
key = scanner.next();
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(details);
}
public void income() {
System.out.print("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("收益入账金额需要大于0");
return;//退出方法不再执行后面的代码
}
balance += money;
date = new Date();
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
}
public void pay() {
System.out.print("消费金额:");
money = scanner.nextDouble();
if (money > balance || money <= 0) {
System.out.println("消费金额应该在0-" + balance);
return;
}
System.out.print("消费名称:");
name = scanner.next();
balance -= money;
date = new Date();
details += "\n" + name + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
}
public void exit() {
while (true) {//要求用户必须输入y/n,否则一直循环
System.out.print("你确定要退出吗?(输入y/n):");
str = scanner.next();
if ("y".equals(str) || "n".equals(str)) {
break;
}
}
if (str.equals("y")) {
loop = false;
System.out.println("退出成功..");
}
}
}
SmallChangeSysApp.java
package com.smallchange.oop;
public class SmallChangeSysApp {
public static void main(String[] args) {
SmallChangeSysOOP smallChangeSysOOP = new SmallChangeSysOOP();
smallChangeSysOOP.mainMenu();
}
}
在 SmallChangeSysApp里new一个对象后直接调用mainMenu方法即可,输出效果同上。