1 零钱通项目介绍
✈️ Hi ~ 大家好,我是 Nezuko ,英文名不好记,你也可以叫我黄小黄🐕。今天我们来简单实现一个零钱通的项目,我们先来看一下微信中零钱账单都有哪些内容叭!
通过分析,我们可以知道,一个零钱通程序需要具备的基本功能有:
⭐️ 零钱明细展示功能 : 即展示收账、入账的全部信息;
⭐️ 收账功能 :即收款,增加自己的余额,需要展示收入金额;
⭐️ 消费功能 :即购买物品、餐厅就餐或者转账等操作,减少自己的余额。需要展示消费用途、消费金额以及消费时间的信息;
⭐️ 退出零钱通程序 :即结束或者终止用户的操作。
我们需要利用 Java 已学的知识,来设计一个程序,实现上述基本功能而不必设计界面,简化操作,重在逻辑。下面,我们通过面向过程与面向对象两种思路来实现零钱通项目。
2 面向过程方式实现
2.1 菜单设计实现
🍑 菜单设计如下图:
进入程序时,我们直接进入菜单,根据用户的输入来进入相应的功能, 比如:当用户输入 2 的时候,则进入消费入账的功能,当用户输入 4 的时候则退出程序。
那么,如何让程序刚开始就进入菜单呢? 我们可以考虑使用一个 boolean 变量来控制循环,在循环内使用 switch 语句,来实现相应的功能,菜单的框架就很容易实现啦!参考代码如下:
Scanner in = new Scanner(System.in); // 菜单部分相关变量 boolean loop = true; // 用于控制循环 String key = ""; // 菜单选项 do{ // 具体菜单 System.out.println("=================零钱通菜单================="); 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\t4 退出"); System.out.println("请选择(1-4): "); key = in.next(); switch (key){ case "1": // 零钱通明细部分 break; case "2": // 收益入账 break; case "3": // 消费 break; case "4": // 退出零钱通 loop = false; break; default: System.out.println("输入有误!"); } }while (loop); in.close();
2.2 零钱明细展示功能实现
🍑 该部分功能用于展示零钱的收支等信息,考虑使用 String 类型的变量来存储信息,并在相应的功能区展示,即 case 1 部分,相关代码如下:
// 零钱通明细相关变量 String details = "=================零钱通明细================="; // 展示 ... case "1": // 零钱通明细部分 System.out.println(details); break; ...
2.3 收益入账功能实现
🍑 收益入账部分我们需要设计两个变量,一个用于存储收入,一个用于存储余额。需要注意的是收入不能小于0!收入操作完成后,我们将信息与零钱通明细展示信息变量整合。相关代码如下:
// 收益入账相应的变量 double money = 0; // 入账金额 double balance = 0; // 余额 Date date = null; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 日期格式化 ... case "2": // 收益入账 System.out.println("=================收益入账================="); System.out.println("收益入账金额: "); money = in.nextDouble(); // 校验money范围 if(money <= 0){ System.out.println("入账信息有误!"); // 提示错误信息 break; } balance += money; // 拼接入账信息到 details date = new Date(); // 获取当前日期 details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance; break; ...
2.4 消费功能的实现
🍑 在该部分,我们可以使用在收入部分的变量,只不过判断条件不同,即消费不能为负数,也不能超过所剩余额。当然,为了方便信息的展示,我们需要额外设置个变量,来存储消费信息。相关代码如下:
// 消费部分 String note = ""; // 用于存储消费说明 ... case "3": // 消费 System.out.println("消费金额: "); money = in.nextDouble(); // money 校验 if(money <= 0 || balance < money){ System.out.println("消费金额不正确或余额不足,无法进行消费!"); break; } System.out.println("消费说明: "); note = in.next(); balance -= money; // 拼接消费信息到 details date = new Date(); // 获取当前日期 details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance; break; ...
2.5 程序退出实现
🍑 在该部分,当用户输入4时,则询问用户是否退出程序。当用户输入 y 时,则退出程序;当用户输入 n 时,则继续运行程序;当用户输入其他值时,程序继续询问用户是否退出程序,相关代码如下:
... case "4": // 退出零钱通 // 询问用户是否退出 String choice = ""; while (true){ System.out.println("你确定要退出吗?y/n: "); choice = in.next(); if("y".equals(choice) || "n".equals(choice)){ break; } } // 用户输入 y 则退出, 输入 n 则不退出 if(choice.equals("y")){ loop = false; } break; ...
2.6 *完整代码
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class SmallChange { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 菜单部分相关变量 boolean loop = true; // 用于控制循环 String key = ""; // 菜单选项 // 零钱通明细相关变量 String details = "=================零钱通明细================="; // 展示明细 // 收益入账相应的变量 double money = 0; // 入账金额 double balance = 0; // 余额 Date date = null; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 日期格式化 // 消费部分 String note = ""; // 用于存储消费说明 do{ // 具体菜单 System.out.println("=================零钱通菜单================="); 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\t4 退出"); System.out.println("请选择(1-4): "); key = in.next(); switch (key){ case "1": // 零钱通明细部分 System.out.println(details); break; case "2": // 收益入账 System.out.println("=================收益入账================="); System.out.println("收益入账金额: "); money = in.nextDouble(); // 校验money范围 if(money <= 0){ System.out.println("入账信息有误!"); // 提示错误信息 break; } balance += money; // 拼接入账信息到 details date = new Date(); // 获取当前日期 details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance; break; case "3": // 消费 System.out.println("消费金额: "); money = in.nextDouble(); // money 校验 if(money <= 0 || balance < money){ System.out.println("消费金额不正确或余额不足,无法进行消费!"); break; } System.out.println("消费说明: "); note = in.next(); balance -= money; // 拼接消费信息到 details date = new Date(); // 获取当前日期 details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance; break; case "4": // 退出零钱通 // 询问用户是否退出 String choice = ""; while (true){ System.out.println("你确定要退出吗?y/n: "); choice = in.next(); if("y".equals(choice) || "n".equals(choice)){ break; } } // 用户输入 y 则退出, 输入 n 则不退出 if(choice.equals("y")){ loop = false; } break; default: System.out.println("输入有误!"); } }while (loop); in.close(); } }