【JavaSE】如何实现简易的零钱通项目?附完整代码

本篇主要解决内容:

  • 使用面向过程的思路完成零钱通项目⭐️
  • 使用面向对象的思路完成零钱通项目⭐️

❤️ 个人主页:Nezuko627的博客 欢迎来访~~~
在这里插入图片描述


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();
    }
}

3 面向对象方式实现

🍑 在该部分,我们只需要将面向过程实现部分的代码进行优化即可。
首先我们创建一个类 SmallChange,里面需要包含该程序的基础属性以及基础功能的方法 ,参考代码如下:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class SmallChange {
    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 = "";  // 用于存储消费说明

    // 显示菜单
    public void mainMenu(){
        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":  // 零钱通明细部分
                    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.println("=================收益入账=================");
        System.out.println("收益入账金额: ");
        money = in.nextDouble();
        // 校验money范围
        if(money <= 0){
            System.out.println("入账信息有误!");  // 提示错误信息
            return;
        }
        balance += money;
        // 拼接入账信息到 details
        date = new Date();  // 获取当前日期
        details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
        return;
    }

    // 消费
    public void pay(){
        System.out.println("消费金额: ");
        money = in.nextDouble();
        // money 校验
        if(money <= 0 || balance < money){
            System.out.println("消费金额不正确或余额不足,无法进行消费!");
            return;
        }
        System.out.println("消费说明: ");
        note = in.next();
        balance -= money;
        // 拼接消费信息到 details
        date = new Date();  // 获取当前日期
        details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
        return;
    }

    // 退出
    public void exit(){
        // 询问用户是否退出
        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;
        }
        return;
    }
}

🍎 而后,我们只需要在主函数中创建对象,来调用相应的方法,即可实现零钱通功能,相关代码如下:

public class ShowSmallChange {
    public static void main(String[] args) {
        SmallChange sc = new SmallChange();
        sc.mainMenu();
    }
}

4 功能展示

⭐️ Star 1: 输入 2 ,收账 100,再次输入 2,收账 200;
1
⭐️ Star 2: 输入 3,消费 99,消费信息为 肯德基;
2
⭐️ Star 3: 输入 1,展示一下零钱明细;
3
⭐️ Star 4: 输入 4,而后输入 y,退出程序。
在这里插入图片描述


写在最后

🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!
共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
在这里插入图片描述

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣使然黄小黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值