一、 项目开发流程说明
(一)、 项目需求说明
使用java开发零钱通项目,可以完成收益入账,消费,查看明细,退出系统等功能
(二)、 项目效果图
二、 项目思路及代码实现
(一)、先完成显示菜单,并可以选择菜单,给出相应提示
思路:
1. 零钱通菜单显示
2. 菜单要在做出操作之后重新显示,且启动程序先出现菜单,因此先执行再判断的循环用 do--while,还需要一个布尔值变量控制do-while的循环
3. 用户做出功能选择,因此要定义一个变量接收用户输入
4. 根据输入的数字做出相关的操作,因此用switch循环来判断输入数字,进行相应的操作。
5. 退出do-while循环只需要将布尔值变量变为false
代码实现:
(二)、完成零钱通明细
思路:
1. 零钱通明细显示收益入账、消费等记录可以用数组、字符串拼接、对象等方式来存储这些记录。
2. 数组不能动态扩展,不知道如何定义数组长度,这里使用字符串的写法
3. 定义一个字符串变量接受零钱通明细
4. 在收益入账和消费操作中只需要将操作内容拼接到字符串中
感悟:
代码无非考虑用什么东西存、什么东西取(数据结构),有什么业务需求,如排序、求最大值。(算法)
实现代码:
(三)、完成收益入账
思路:
1. 定义用来表示金额和余额的变量
2. 定义表示日期的变量
2. 在收益入账模块中完成 用户金额输入、金额添加到余额中、将收益入账信息拼接到字符串中
感悟:
根据功能来驱动程序员增加新的变化和代码
实现代码:
(四)、完成消费
思路:
1. 定义消费项目变量
2. 在消费模块中完成 消费项目输入、消费金额输入、金额从余额中扣除
实现代码:
(五)、完善代码
上面的代码还存在以下问题:
1. 用户输入4退出时,给出提示"你确定要退出吗?y/n",必须输入正确的y/n,否则循环输入指令,直到输入y或者n
2. 在收益入账和消费时,判断金额是否合理,并给出相应的提示。
3. 将面向过程的代码修改成面向对象(OOP)的方法
①判断退出
思路:
1. 定义一个变量 choice,接收用户的输入 y/n
2. 使用while break 来处理接收到的y/n
实现代码:
②判断收益入账
思路:
1. 使用while break 来处理收益入账金额是否正确,如果不正确就循环输入语句
2. 输入金额(money)大于0时,是正确的,反之,输入金额小于等于0就显示错误
实现代码:
③判断消费
思路:
1. 使用while break 来处理正确,如果不正确就循环输入语句
2. 输入消费金额(money)大于0时,是正确的,反之,输入消费金额小于0就显示错误
3.消费金额(money)要小于余额(balance)
感悟:
代码的编写都是 先搭大框架-分块完成业务-业务细节完善
实现代码:
(六)、全部代码展示
package com.wpy.project.lingqiantong;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.logging.SimpleFormatter;
/**
* @Author wy
* @Date 2022/7/5 13:49
* @Version 1.0
* 零錢通
*/
public class SmallChangeSys {
public static void main(String[] args) {
// 控制循環
boolean loop = true;
// 接收用戶輸入
Scanner scanner = new Scanner(System.in);
String key = "";
// 输出零钱通明细
String details = "";
//收益入账
double money = 0.0;// 交易金额
double balance = 0.0;// 余额
Date date = null;// 日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //日期格式化
//消费
String note ; // 消费的项目
do {
// 零錢通菜單
System.out.println("\n===================零錢通菜單===================");
System.out.println(" 1 零錢通明細 ");
System.out.println(" 2 收益入賬 ");
System.out.println(" 3 消費 ");
System.out.println(" 4 退出 ");
System.out.println("請選擇(1-4):");
// 接收用戶輸入
key = scanner.next();
//使用switch循環,來判斷輸入數字的操作
switch (key){
case "1":
System.out.println("-------------------零錢通明細-------------------");
System.out.println(details);
break;
case "2":
System.out.println("-------------------收益入賬-------------------");
while (true){
System.out.println("输入收益入账金额:");
money = scanner.nextDouble();
if (money <= 0){
System.out.println("你输入的金额有误!请重新输入!\n");
}else {
// 将收入放到余额中
balance += money;
//获取当前日期
date = new Date(); // Tue Jul 05 15:37:30 CST 2022
//拼接收益入账到details中
details += "\n收益入账\t"+"+"+money+"\t"+sdf.format(date)+"\t"+"余额:"+balance;
break;
}
}
break;
case "3":
System.out.println("-------------------消費-------------------");
System.out.println("输入消费项目:");
note = scanner.next();
while (true){
System.out.println("输入消费金额:");
money = scanner.nextDouble();
if (money < 0 ){
System.out.println("你输入的金额有误!请重新输入!\n");
}else if (money > balance){
System.out.println("你没有那么多钱!请重新输入!\n");
}else {
balance -= money;
date = new Date();
details += "\n"+note+"\t"+"-"+money+"\t"+sdf.format(date)+"\t"+"余额:"+balance;
break;
}
}
break;
case "4":
while (true){
System.out.println("你确定要退出吗?y/n");
String choice = scanner.next();
if ("y".equals(choice)){
System.out.println("-------------------退出-------------------");
loop = false;
break;
}else if ("n".equals(choice)){
break;
}else {
System.out.println("你输入有误!请重新输入!\n");
}
}
break;
default:
System.out.println("輸入有誤!");
}
}while(loop);
}
}
三、 面向对象代码实现
package com.wpy.project.lingqiantong;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* @Author wy
* @Date 2022/7/5 21:00
* @Version 1.0
*/
public class SmallChangeSysOOP {
// 控制循環
boolean loop = true;
// 接收用戶輸入
Scanner scanner = new Scanner(System.in);
String key = "";
// 输出零钱通明细
String details = "";
//收益入账
double money = 0.0;// 交易金额
double balance = 0.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(" 1 零錢通明細 ");
System.out.println(" 2 收益入賬 ");
System.out.println(" 3 消費 ");
System.out.println(" 4 退出 ");
System.out.println("請選擇(1-4):");
// 接收用戶輸入
key = scanner.next();
//使用switch循環,來判斷輸入數字的操作
switch (key){
case "1":
detail();
break;
case "2":
income();
break;
case "3":
pay();
break;
case "4":
exit();
break;
default:
System.out.println("輸入有誤!");
}
}while(loop);
}
/**
* 零钱通明细
*/
public void detail(){
System.out.println("-------------------零錢通明細-------------------");
System.out.println(details);
}
/**
* 收益入账
*/
public void income(){
System.out.println("-------------------收益入賬-------------------");
while (true){
System.out.println("输入收益入账金额:");
money = scanner.nextDouble();
if (money <= 0){
System.out.println("你输入的金额有误!请重新输入!\n");
}else {
// 将收入放到余额中
balance += money;
//获取当前日期
date = new Date(); // Tue Jul 05 15:37:30 CST 2022
//拼接收益入账到details中
details += "\n收益入账\t"+"+"+money+"\t"+sdf.format(date)+"\t"+"余额:"+balance;
break;
}
}
}
/**
* 消费
*/
public void pay(){
System.out.println("-------------------消費-------------------");
System.out.println("输入消费项目:");
note = scanner.next();
while (true){
System.out.println("输入消费金额:");
money = scanner.nextDouble();
if (money < 0 ){
System.out.println("你输入的金额有误!请重新输入!\n");
}else if (money > balance){
System.out.println("你没有那么多钱!请重新输入!\n");
}else {
balance -= money;
date = new Date();
details += "\n"+note+"\t"+"-"+money+"\t"+sdf.format(date)+"\t"+"余额:"+balance;
break;
}
}
}
/**
* 退出
*/
public void exit(){
while (true){
System.out.println("你确定要退出吗?y/n");
String choice = scanner.next();
if ("y".equals(choice)){
System.out.println("-------------------退出-------------------");
loop = false;
break;
}else if ("n".equals(choice)){
break;
}else {
System.out.println("你输入有误!请重新输入!\n");
}
}
}
}
package com.wpy.project.lingqiantong;
/**
* @Author wy
* @Date 2022/7/5 21:11
* @Version 1.0
*/
public class SmallChangeSysDemo {
public static void main(String[] args) {
// 调用
SmallChangeSysOOP smallChangeSysOOP = new SmallChangeSysOOP();
smallChangeSysOOP.mainMenu();
}
}