目标: 编写一个Java程序,实现一个简单的零钱通管理系统,该系统允许用户进行以下操作:
- 查看零钱通明细:显示所有收益入账和消费记录。
- 收益入账:用户可以输入收入来源和金额,系统将更新余额并记录交易详情。
- 消费:用户可以输入消费去处和金额,系统将从余额中扣除相应金额并记录交易详情。
- 退出系统:允许用户退出程序。
功能要求:
- 零钱通明细:程序应能够显示所有交易记录,包括收益入账和消费。
- 收益入账:
- 用户输入收入来源。
- 用户输入收益金额,金额必须大于0。
- 系统更新余额并记录交易详情,包括来源、金额、交易时间和更新后的余额。
- 消费:
- 用户输入消费去处。
- 用户输入消费金额,金额必须大于0且不超过当前余额。
- 系统从余额中扣除相应金额并记录交易详情,包括去处、金额、交易时间和更新后的余额。
- 退出系统:
- 用户选择退出时,系统将提示用户确认。
- 用户输入'y'确认退出,输入'n'返回主菜单。
结果如下图:
有两个方式实现,一个是面向过程,另一个是面向对象
面向过程代码如下(直接在一个类中实现即可):
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.Date;
public class SmallChangeSys {
public static void main(String[] args){
boolean loop = true;
Scanner sc = new Scanner(System.in);
String key = "";
//1 零钱通明细
String detail = "--------------零钱通明细--------------";
//2 收益入账
double money = 0,balance = 0;
String incomeSources = ""; //收入来源
//2 日期
Date date =null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//3 消费
String incomeDestination =""; //消费去处
do{System.out.println("\n==============零钱通菜单==============");
System.out.println("\t\t\t\t1 零钱通明细");
System.out.println("\t\t\t\t2 收益入账");
System.out.println("\t\t\t\t3 消费");
System.out.println("\t\t\t\t1 退出系统");
System.out.println("==============零钱通菜单==============");
key = sc.next();
switch(key){
case "1":
System.out.println("\t\t\t\t1 零钱通明细");
System.out.println(detail);
break;
case "2":
System.out.println("\t\t\t\t2 收益入账");
System.out.println("请输入您的收入来源:");
incomeSources = sc.next();
System.out.println("请输入您的收益金额:");
money = sc.nextDouble();
if(money<=0){ //收入符合正常逻辑
System.out.println("收益入账的金额需要 大于等于 0");
break;
}
balance+=money;
date = new Date();//获取当前的时间
System.out.println(sdf.format(date));
detail += "\n收益入账\t来源\t"+incomeSources+"\t+"+money+"\t"+sdf.format(date)+"\t"+"余额\t"+balance;
System.out.println(detail);
break;
case "3":
System.out.println("\t\t\t\t3 消费");
System.out.println("请输入您的消费去处:");
incomeDestination = sc.next();
System.out.println("请输入您的消费金额:");
money = sc.nextDouble();
if(money<=0 || money> balance){ //消费符合正常逻辑
System.out.println("您的消费应该在\t0-"+balance);
break;
}
balance-=money;
date = new Date();//获取当前的时间
System.out.println(sdf.format(date));
detail += "\n余额消费\t去处\t"+incomeDestination+"\t-"+money+"\t"+sdf.format(date)+"\t"+"余额\t"+balance;
System.out.println(detail);
break;
case "4":
System.out.println("您确定要退出系统吗? y/n");
String choice = sc.next();
while (true){
if(choice.equals("y")){
System.out.println("\t\t\t\t1 退出系统");
loop = false;
break;
}
else if(choice.equals("n")){
break;
}
System.out.println("您输入的选择不对,请重新输入 y/n");
choice = sc.next();
}
break;
default:
System.out.println("您输入的有错,请重新输入");
}
}while(loop);
}
}
面向对象则需要两个文件类,如下图所示:
SmallChangeOop类的代码如下:
package SmallChangeAPP;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeOop {
boolean loop = true;
Scanner sc = new Scanner(System.in);
String key = "";
//1 零钱通明细
String detail = "--------------零钱通明细--------------";
//2 收益入账
double balance = 0;
String incomeSources = ""; //收入来源
//2 日期
Date date =null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//3 消费
String incomeDestination =""; //消费去处
public void mainMenu(){
do{System.out.println("\n==============零钱通菜单==============");
System.out.println("\t\t\t\t1 零钱通明细");
System.out.println("\t\t\t\t2 收益入账");
System.out.println("\t\t\t\t3 消费");
System.out.println("\t\t\t\t1 退出系统");
System.out.println("==============零钱通菜单==============");
key = sc.next();
switch(key){
case "1":
this.billDetails();
break;
case "2":
this.incom();
break;
case "3":
this.outcome();
break;
case "4":
this.exit();
break;
default:
System.out.println("您输入的有错,请重新输入");
}
}while(loop);
}
public void billDetails(){
System.out.println("\t\t\t\t1 零钱通明细");
System.out.println(detail);
}
public void incom(){
System.out.println("\t\t\t\t2 收益入账");
System.out.println("请输入您的收入来源:");
incomeSources = sc.next();
System.out.println("请输入您的收益金额:");
double money = 0;
money = sc.nextDouble();
if(money<=0){ //收入符合正常逻辑
System.out.println("收益入账的金额需要 大于等于 0");
return;
}
balance+=money;
date = new Date();//获取当前的时间
System.out.println(sdf.format(date));
detail += "\n收益入账\t来源\t"+incomeSources+"\t+"+money+"\t"+sdf.format(date)+"\t"+"余额\t"+balance;
System.out.println(detail);
}
public void outcome(){
System.out.println("\t\t\t\t3 消费");
System.out.println("请输入您的消费去处:");
incomeDestination = sc.next();
System.out.println("请输入您的消费金额:");
double money = 0;
money = sc.nextDouble();
if(money<=0 || money> balance){ //消费符合正常逻辑
System.out.println("您的消费应该在\t0-"+balance);
return;
}
balance-=money;
date = new Date();//获取当前的时间
System.out.println(sdf.format(date));
detail += "\n余额消费\t去处\t"+incomeDestination+"\t-"+money+"\t"+sdf.format(date)+"\t"+"余额\t"+balance;
System.out.println(detail);
}
public void exit(){
System.out.println("您确定要退出系统吗? y/n");
String choice = sc.next();
while (true){
if(choice.equals("y")){
System.out.println("\t\t\t\t1 退出系统");
loop = false;
break;
}
else if(choice.equals("n")){
break;
}
System.out.println("您输入的选择不对,请重新输入 y/n");
choice = sc.next();
}
}
}
SmallChangeMain代码如下:
package SmallChangeAPP;
public class SmallChangeMain {
public static void main(String[] args) {
SmallChangeOop p = new SmallChangeOop();
p.mainMenu();
}
}