package com.use.project;
import com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChange {
public static <SimpleDate> void main(String[] args) {
//先完成显示菜单
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
double money = 0;
double balance = 0;
String name = "";
double spend = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String details = "------------------零钱通明细------------------";
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.println("请选择(1-4): ");
key = scanner.next();
switch (key) {
case "1":
//显示零钱通明细
System.out.println(details);
break;
case "2":
//收益入账
System.out.println("2.收益入账");
System.out.print("收益入账金额:");
money = scanner.nextDouble();//判断金额是否合理
//找出不正确的金额,避免代码冗余
if (money <= 0) {
System.out.println("金额必须大于0!");
break;
}
balance += money;
Date data = new Date();
details += "\n收益入账\t+" + money +"\t" + sdf.format(data) +"\t"+"余额:" + balance;
break;
case "3":
//消费
System.out.println("3.消费");
System.out.println("请输入消费的商家名称:");
name = scanner.next();
System.out.println("请输入消费金额:");
spend = scanner.nextDouble();//判断金额是否合理
if(spend <= 0 || spend >= balance){
System.out.println("您的消费金额应在0-"+ balance +"之间!");
break;
}
balance -= spend;
Date data2 = new Date();
details += "\n" + name + "\t-" + spend + "\t" + sdf.format(data2) +"\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后再判断输入的到底是y还是n
if ("y".equals(choice)) {
loop = false;
}
break;
default:
System.out.println("输入错误,请重新输入!");
}
}while (loop) ;
System.out.println("-------退出了零钱通项目--------");
}
}
以上是完整的面向过程的代码,以下是具体实现成果
以下是将各个对应的功能封装成方法,以面向对象的方法编程的代码
package com.use.project.oop;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeOop {
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
double money = 0;
double balance = 0;
String name = "";
double spend = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String details = "------------------零钱通明细------------------";
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.println("请选择(1-4): ");
key = scanner.next();
switch (key) {
case "1":
this.detail();
break;
case "2":
this.income();
break;
case "3":
this.spend();
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;//面向过程编码中对应的是break,这里用return,后面的语句不再执行
}
balance += money;
Date data = new Date();
details += "\n收益入账\t+" + money +"\t" + sdf.format(data) +"\t"+"余额:" + balance;
}
public void spend(){
System.out.println("请输入消费的商家名称:");
name = scanner.next();
System.out.println("请输入消费金额:");
spend = scanner.nextDouble();//判断金额是否合理
if(spend <= 0 || spend >= balance){
System.out.println("您的消费金额应在0-"+ balance +"之间!");
return;
}
balance -= spend;
Date data2 = new Date();
details += "\n" + name + "\t-" + spend + "\t" + sdf.format(data2) +"\t"+"余额:" +balance;
}
public void exit(){
String choice = "";
while(true) {//要求用户必须输入y/n否则一直循环
System.out.println("是否要退出?(y/n)");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;//这里的break不需要再改成return否则下面的if将不会执行
}
}//等用户退出while后再判断输入的到底是y还是n
if ("y".equals(choice)) {
loop = false;
}
}
}
使用以下代码中的主方法进行调用,实现的功能和上面面向过程编程相同,但是把方法进行封装之后,可以完成其他的功能实现,更加方便
package com.use.project.oop;
public class SmallChangeAPP {
public static void main(String[] args) {
new SmallChangeOop().mainMenu();
}
}
在进行这个项目运行测试的过程中,遇到的问题是idea控制台无法输入中文。当提示我输入消费商家的时候,在中文输入法的情况下在控制台无法进行输入,只有切换成英文,才能输入字母和数字,检查了我控制台的编码方式以及Scanner类的导入都是正常的,翻阅了网上各种解决方法尝试也没有得到解决,最终发现这个bug是idea版本2024.2的一个特有的bug,并且目前没有解决的方法,除非降低版本号重新安装低版本的idea,否则只能通过复制粘贴的手法才能将中文“写在”输入台上,个人认为这并不是我们以后开发中要面临的问题,并不影响我们测试项目,所以如果遇到这种问题复制粘贴解决一下就行,所以大家不必一直纠结。