1、项目开发流程说明:
(1)项目需求说明:
使用java开发零钱通项目,可以完成收益入账,消费,查看明细,退出系统等功能
(2)项目的界面:
(3)项目代码实现:
编写文件SmallChangeSys.java完成基本功能(先使用过程编程,后面改成OOP版本)
(2)项目代码实现改进:
1)用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或n
2)在收益入账和消费时,判断金额是否合理,并给出相应的提示
3)将面向过程的代码修改成面向对象的方法,编写SmallChanageSysOOP.java类,并使用SmallChanageSysApp.java完成测试
2、过程编程:
(1)先完成显示菜单,并可以选择菜单,给出对应提示
package smallchange;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
public static void main(String[] args) {
boolean loop=true;
Scanner scanner=new Scanner(System.in);
String key="";
do{
System.out.println("========================零钱通========================");
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.println("请选择(1-4):");
key=scanner.next();
//使用switch分支控制
switch (key){
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 退 出");
loop=false;
break;
default:
System.out.println("选择有误,请重新选择!");
}
}while(loop);
System.out.println("========================退出了零钱通========================");
}
}
(2)完成零钱通明细
package smallchange;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
public static void main(String[] args) {
boolean loop=true;
Scanner scanner=new Scanner(System.in);
String key="";
//2、完成零钱通明细
//思路:(1)可以把收益入账和消费保存到数组
//(2)可以使用对象
//(3)可以使用String拼接
String details="========================零钱通明细========================";
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.println("请选择(1-4):");
key=scanner.next();
//使用switch分支控制
switch (key){
case"1":
System.out.println(details);
break;
case"2":
System.out.println("2 收益入账");
break;
case"3":
System.out.println("3 消费");
break;
case"4":
System.out.println("4 退 出");
loop=false;
break;
default:
System.out.println("选择有误,请重新选择!");
}
}while(loop);
System.out.println("========================退出了零钱通========================");
}
}
(3)完成收益入账
package smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
public static void main(String[] args) {
boolean loop=true;
Scanner scanner=new Scanner(System.in);
String key="";
//2、完成零钱通明细
//思路:(1)可以把收益入账和消费保存到数组
//(2)可以使用对象
//(3)可以使用String拼接
String details="========================零钱通明细========================";
//3、完成收益入账
//定义新的变量
double money=0;
double balance=0;
Date date=null;//date是java.util.Date类型,表示日期
SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd hh:mm");//日期格式化
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的值是否在合理范围内
balance+=money;
//获取当前日期
date=new Date();
//拼接收益信息到details
details+="\n收益入账\t+"+money+"\t"+sdf.format(date)+"\t"+balance;
break;
case"3":
System.out.println("3 消费");
break;
case"4":
System.out.println("4 退 出");
loop=false;
break;
default:
System.out.println("选择有误,请重新选择!");
}
}while(loop);
System.out.println("========================退出了零钱通========================");
}
}
(4)消费
package smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
public static void main(String[] args) {
boolean loop=true;
Scanner scanner=new Scanner(System.in);
String key="";
//2、完成零钱通明细
//思路:(1)可以把收益入账和消费保存到数组
//(2)可以使用对象
//(3)可以使用String拼接
String details="========================零钱通明细========================";
//3、完成收益入账
//定义新的变量
double money=0;
double balance=0;
Date date=null;//date是java.util.Date类型,表示日期
SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd hh:mm");//日期格式化
//4、消费
//定义新的变量,保存消费的原因
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的值是否在合理范围内
//当前余额
balance+=money;
//获取当前日期
date=new Date();
//拼接收益信息到details
details+="\n收益入账\t+"+money+"\t"+sdf.format(date)+"\t"+balance;
break;
case"3":
System.out.print("消费金额::");
money=scanner.nextDouble();
//校验消费金额是否在合理范围内
System.out.println("消费说明:");
note=scanner.next();
balance-=money;
//拼接信息到details
date=new Date();//获取当前日期
details+="\n"+note+"\t-"+money+"\t"+sdf.format(date)+"\t"+balance;
break;
case"4":
System.out.println("4 退 出");
loop=false;
break;
default:
System.out.println("选择有误,请重新选择!");
}
}while(loop);
System.out.println("========================退出了零钱通项目========================");
}
}
(5)退出提示
package smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
public static void main(String[] args) {
//变量loop是控制显示菜单的
boolean loop=true;
Scanner scanner=new Scanner(System.in);
String key="";
//2、完成零钱通明细
//思路:(1)可以把收益入账和消费保存到数组
//(2)可以使用对象
//(3)可以使用String拼接
String details="========================零钱通明细========================";
//3、完成收益入账
//定义新的变量
double money=0;
double balance=0;
Date date=null;//date是java.util.Date类型,表示日期
SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd hh:mm");//日期格式化
//4、消费
//定义新的变量,保存消费的原因
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的值是否在合理范围内
//当前余额
balance+=money;
//获取当前日期
date=new Date();
//拼接收益信息到details
details+="\n收益入账\t+"+money+"\t"+sdf.format(date)+"\t"+balance;
break;
case"3":
System.out.print("消费金额::");
money=scanner.nextDouble();
//校验消费金额是否在合理范围内
System.out.println("消费说明:");
note=scanner.next();
balance-=money;
//拼接信息到details
date=new Date();//获取当前日期
details+="\n"+note+"\t-"+money+"\t"+sdf.format(date)+"\t"+balance;
break;
case"4":
//思路:
//(1)定义一个变量choice,接收用户的输入
//(2)使用while+break循环来处理接收到的输入
//(3)退出while后,再判断choice是y还是n,就可以决定是否退出
//(4)建议一段代码,完成一个小功能,尽量不要混在一起
String choice="";
//while要求用户必须输入y/n,否则就一直循环
while(true){
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("========================退出了零钱通项目========================");
}
}
(6)代码改进
package smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
//1、先完成显示菜单,并可以选择菜单,给出对应提示
public static void main(String[] args) {
//变量loop是控制显示菜单的
boolean loop=true;
Scanner scanner=new Scanner(System.in);
String key="";
//2、完成零钱通明细
//思路:(1)可以把收益入账和消费保存到数组
//(2)可以使用对象
//(3)可以使用String拼接
String details="========================零钱通明细========================";
//3、完成收益入账
//定义新的变量
double money=0;
double balance=0;
Date date=null;//date是java.util.Date类型,表示日期
SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd hh:mm");//日期格式化
//4、消费
//定义新的变量,保存消费的原因
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的值是否在合理范围内
//找出不正确的金额(是找出正确的,还是不正确的,是有考究的)
if(money<=0){
System.out.println("收益入账金额需要大于0");
break;
}
//当前余额
balance+=money;
//获取当前日期
date=new Date();
//拼接收益信息到details
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.println("消费说明:");
note=scanner.next();
balance-=money;
//拼接信息到details
date=new Date();//获取当前日期
details+="\n"+note+"\t-"+money+"\t"+sdf.format(date)+"\t"+balance;
break;
case"4":
//思路:
//(1)定义一个变量choice,接收用户的输入
//(2)使用while+break循环来处理接收到的输入
//(3)退出while后,再判断choice是y还是n,就可以决定是否退出
//(4)建议一段代码,完成一个小功能,尽量不要混在一起
String choice="";
//while要求用户必须输入y/n,否则就一直循环
while(true){
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("========================退出了零钱通项目========================");
}
}
3、面向对象编程:
SmallChangeSysOOP:功能类
package smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
//该类是完成零钱通的各个功能的类
//使用OOP(面向对象编程)
//将各个功能对应一个方法
public class SmallChangeSysOOP {
//变量loop是控制显示菜单的
boolean loop=true;
Scanner scanner=new Scanner(System.in);
String key="";
//2、完成零钱通明细
//思路:(1)可以把收益入账和消费保存到数组
//(2)可以使用对象
//(3)可以使用String拼接
String details="========================零钱通明细========================";
//3、完成收益入账
//定义新的变量
double money=0;
double balance=0;
Date date=null;//date是java.util.Date类型,表示日期
SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd hh:mm");//日期格式化
//4、消费
//定义新的变量,保存消费的原因
String note="";
//完成显示菜单
public void mainMenu(){
do{
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):");
key=scanner.next();
//使用switch分支控制
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();
//校验money的值是否在合理范围内
//找出不正确的金额(是找出正确的,还是不正确的,是有考究的)
if(money<=0){
System.out.println("收益入账金额需要大于0");
return;//退出方法,不再执行后面的代码
}
//当前余额
balance+=money;
//获取当前日期
date=new Date();
//拼接收益信息到details
details+="\n收益入账\t+"+money+"\t"+sdf.format(date)+"\t"+balance;
}
public void pay(){
System.out.print("消费金额:");
money=scanner.nextDouble();
//校验消费金额是否在合理范围内
//找出不正确的金额
//过关斩将的校验方式
if(money<=0||money>balance){
System.out.println("你的消费金额应该在0-"+balance);
return;
}
System.out.print("消费说明:");
note=scanner.next();
balance-=money;
//拼接信息到details
date=new Date();//获取当前日期
details+="\n"+note+"\t-"+money+"\t"+sdf.format(date)+"\t"+balance;
}
public void exit(){
//思路:
//(1)定义一个变量choice,接收用户的输入
//(2)使用while+break循环来处理接收到的输入
//(3)退出while后,再判断choice是y还是n,就可以决定是否退出
//(4)建议一段代码,完成一个小功能,尽量不要混在一起
String choice="";
//while要求用户必须输入y/n,否则就一直循环
while(true){
System.out.println("你确定要退出吗?y/n");
choice=scanner.next();
if("y".equals(choice)||"n".equals(choice)){
break;
}
}
//当用户退出while后,进行判断是否真的退出
if(choice.equals("y")) {
loop = false;
}
}
}
SmallChangeSysApp:调用类
package smallchange;
//这里直接调用SmallChangeSysOOP对象,显示主菜单
public class SmallChangeSysApp {
public static void main(String[] args) {
new SmallChangeSysOOP().mainMenu();
}
}
//变量——>属性——>功能——>方法——>调用
/*输出:
========================零钱通菜单OOP========================
1 零钱通明细
2 收益入账
3 消费
4 退 出
请选择(1-4):2
收益入账金额:200
========================零钱通菜单OOP========================
1 零钱通明细
2 收益入账
3 消费
4 退 出
请选择(1-4):2
收益入账金额:500
========================零钱通菜单OOP========================
1 零钱通明细
2 收益入账
3 消费
4 退 出
请选择(1-4):3
消费金额:100
消费说明:吃饭
========================零钱通菜单OOP========================
1 零钱通明细
2 收益入账
3 消费
4 退 出
请选择(1-4):3
消费金额:50
消费说明:看电影
========================零钱通菜单OOP========================
1 零钱通明细
2 收益入账
3 消费
4 退 出
请选择(1-4):1
========================零钱通明细========================
收益入账 +200.0 2022-11-11 10:57 200.0
收益入账 +500.0 2022-11-11 10:58 700.0
吃饭 -100.0 2022-11-11 10:58 600.0
看电影 -50.0 2022-11-11 10:58 550.0
========================零钱通菜单OOP========================
1 零钱通明细
2 收益入账
3 消费
4 退 出
请选择(1-4):4
你确定要退出吗?y/n
y
进程已结束,退出代码0
*/