零钱通
项目介绍
项目需求说明
使用 Java 开发零钱通项目 , 可以完成收益入账,消费,查看明细,退出系统等功能。
项目的界面
项目开发流程说明
化繁为简:
- 先完成显示菜单,并可以选择
- 完成零钱通明细
- 完成收益入账
- 消费
- 退出
项目代码实现
零钱通菜单
完成显示菜单,并可以选择菜单,给出对应提示。
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
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 退出");
break;
default:
System.out.println("选择有误,请重新选择");
}
}while(loop);
System.out.println("-----退出了零钱通项目-----");
零钱通明细
完成零钱通明细。
思路:
- 可以把收益入账和消费,保存到数组
- 可以使用对象
- 简单的话可以使用string拼接
String details = "-----------------零钱通明细-----------------";
完善case “1”
的输出内容:
case "1":
System.out.println(details);
break;
零钱通收益
完成收益入账,完成功能驱动程序员增加新的变化和代码。
定义新的变量:
double money = 0;
double balance = 0;
Date date = null;//date 是 java.until.Date 类型,表示日期
- 注意:记得添加
java.until.Date
date = new Date();//获取当前日期
System.out.println(date);
输出格式不对:
需要格式化日期:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
完善case “2”
的输出内容:
case "2":
System.out.println("收益入账金额:");
money = scanner.nextDouble();
//money 的值范围应该校验 -》 一会儿再完善
balance += money;
//拼接收益入账信息到 details
date = new Date();//获取当前日期
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
System.out.println(details);
break;
零钱通消费
定义新变量,保存消费的原因:
String note = "";
完善case “3”
的输出内容:
case "3":
System.out.println("消费金额:");
money = scanner.nextDouble();
scanner.nextLine(); // 消耗掉换行符
//money 的值范围应该校验 -》 一会儿再完善
System.out.println("消费说明:");
note = scanner.nextLine();
balance -= money;
//拼接消费信息到 details
date = new Date();//获取当前日期
details += "\n" + note + "\t-" + money + "\t"+ sdf.format(date) + "\t" + balance;
System.out.println(details);
break;
注意(代码第4 行):
在接收消费说明之前,使用了 scanner.nextDouble()
来读取消费金额,然后使用 scanner.nextLine()
来读取消费说明。但是在输入消费金额后按下回车键时,scanner.nextLine()
会读取回车键后的换行符,而不是想要的消费说明。
解决方法是在读取消费说明之前,先执行一个空的 scanner.nextLine()
来消耗掉之前 nextDouble()
方法产生的换行符,然后再读取消费说明。
零钱通退出确认
完善case “4”
的输出内容:
case "4":
//用户输入4退出时,给出提示"你确定要退出吗?y/n",必须输入正确的y/n
// 否则循环输入指令,直到输入y或者n
// 思路分析
// (1)定义一个变量 choice,接收用户的输入
// (2)使用 while +break,来处理接收到的输入时 y或者 n
// (3)退出 while 后,再判断 choice 是y还是n,就可以决定是否退出
// (4)建议一段代码完成一个小功能,尽量不要混在一起
String choice = "";
while (true) {
System.out.println("你确定要退出吗?y/n");
choice = scanner.nextLine();
if(choice.equals("y")) {
break;
}
}
//当用户退出 while,进行判断
if(choice.equals("y")) {
loop = false;
}
System.out.println("4 退出");
break;
零钱通金额校验
再完善case “2”
的输出内容:
case "2":
System.out.println("收益入账金额:");
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;
System.out.println(details);
break;
再完善case “3”
的输出内容:
case "3":
System.out.println("消费金额:");
money = scanner.nextDouble();
scanner.nextLine(); // 消耗掉换行符
//money 的值范围应该校验
//找出金额不正确的情况
if (money <= 0 || money > balance) {
System.out.println("你的消费金额应该在0-" + balance);
break;
}
System.out.println("消费说明:");
note = scanner.nextLine();
balance -= money;
//拼接消费信息到 details
date = new Date();//获取当前日期
details += "\n" + note + "\t-" + money + "\t"+ sdf.format(date) + "\t" + balance;
System.out.println(details);
break;
代码汇总
package com.smallchange;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
//化繁为简
//1. 先完成显示菜单,并可以选择菜单,给出对应提示
//2. 完成零钱通明细
//3. 完成收益入账,完成功能驱动程序员增加新的变化和代码
//4. 消费
//5. 退出
//6. 用户输入4退出时,给出提示"你确定要退出吗?y/n",必须输入正确的 y/n ,否则循环输入指令,直到输入 y 或者 n
//7. 在收益入账和消费时,判断金额是否合理,并给出相应的提示
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.until.Date 类型,表示日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-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.println("请选择(1-4): ");
key = scanner.next();
//使用switch 分支控制
switch(key){
case "1":
System.out.println(details);
break;
case "2":
System.out.println("收益入账金额:");
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;
System.out.println(details);
break;
case "3":
System.out.println("消费金额:");
money = scanner.nextDouble();
scanner.nextLine(); // 消耗掉换行符
//money 的值范围应该校验
//找出金额不正确的情况
if (money <= 0 || money > balance) {
System.out.println("你的消费金额应该在0-" + balance);
break;
}
System.out.println("消费说明:");
note = scanner.nextLine();
balance -= money;
//拼接消费信息到 details
date = new Date();//获取当前日期
details += "\n" + note + "\t-" + money + "\t"+ sdf.format(date) + "\t" + balance;
System.out.println(details);
break;
case "4":
//用户输入4退出时,给出提示"你确定要退出吗?y/n",必须输入正确的y/n
// 否则循环输入指令,直到输入y或者n
// 思路分析
// (1)定义一个变量 choice,接收用户的输入
// (2)使用 while +break,来处理接收到的输入时 y或者 n
// (3)退出 while 后,再判断 choice 是y还是n,就可以决定是否退出
// (4)建议一段代码完成一个小功能,尽量不要混在一起
String choice = "";
while (true) {
System.out.println("你确定要退出吗?y/n");
choice = scanner.nextLine();
if(choice.equals("y")) {
break;
}
}
//当用户退出 while,进行判断
if(choice.equals("y")) {
loop = false;
}
System.out.println("4 退出");
break;
default:
System.out.println("选择有误,请重新选择");
}
}while(loop);
System.out.println("-----退出了零钱通项目-----");
}
}
零钱通OOP版
SmallChangeSysOOP
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 = "";
String details = "-----------------零钱通明细-----------------";
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String note = "";
//先完成显示菜单,并可以选择
public void mainMenu(){
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(key){
case "1":
this.detail();
break;
case "2":
this.income();
case "3":
this.pay();
case "4":
this.exit();
break;
default:
System.out.println("选择有误,请重新选择");
}
}while(loop);
}
//完成零钱通明细
public void detail(){
System.out.println(details);
}
//完成收益入账
public void income() {
System.out.println("收益入账金额:");
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;
System.out.println(details);
}
//完成消费
public void pay(){
System.out.println("消费金额:");
money = scanner.nextDouble();
scanner.nextLine();
if (money <= 0 || money > balance) {
System.out.println("你的消费金额应该在0-" + balance);
return;
}
System.out.println("消费说明:");
note = scanner.nextLine();
balance -= money;
date = new Date();
details += "\n" + note + "\t-" + money + "\t"+ sdf.format(date) + "\t" + balance;
System.out.println(details);
}
//完成退出
public void exit(){
String choice = "";
while (true) {
System.out.println("你确定要退出吗?y/n");
choice = scanner.nextLine();
if(choice.equals("y")) {
break;
}
}
//当用户退出 while,进行判断
if(choice.equals("y")) {
loop = false;
}
}
}
SmallChangeSysApp
package com.smallchange.oop;
/**
* 这里我们直接调用SmallChangeSysOOP对象,显示主菜单即可
*/
public class SmallChangeSysApp {
public static void main(String[] args) {
new SmallChangeSysOOP().mainMenu();
}
}