【Java】—— 使用Java在控制台实现海豚记账软件

news2025/1/20 3:42:45

目录

1. 项目背景

2. 代码思路

2.1 主要功能

2.2 数据结构

2.3 控制流程

3. 实现步骤

3.1 初始化变量

3.2 显示菜单

3.3 处理用户输入

3.4 退出程序

4. 知识点解析

4.1 Scanner类

4.2 字符与数字转换

4.3 循环与条件判断

5.完整代码

6.运行结果展示


1. 项目背景

        海豚记账软件是一款简单的个人财务管理工具,可以帮助用户记录收入和支出,以便更好地管理个人财务。本软件提供了收支明细、登记收入、登记支出等功能,方便用户进行日常的财务管理。

2. 代码思路

2.1 主要功能

  • 收支明细:展示用户的收支情况,包括收支类型、账户金额、收支金额和说明等。
  • 登记收入:允许用户输入收入金额和说明,更新账户余额。
  • 登记支出:允许用户输入支出金额和说明,更新账户余额。
  • 退出程序:用户可以选择退出程序。

2.2 数据结构

  • balance:用于存储账户余额。
  • info:用于存储收支明细信息。

2.3 控制流程

  • 主循环:通过一个布尔变量 isFlag 控制程序是否继续运行。
  • 菜单选择:根据用户的输入选择相应的功能。
  • 功能实现:根据用户的选择执行相应的操作。

3. 实现步骤

3.1 初始化变量

boolean isFlag = true;
int balance = 100000;
String info = "";

3.2 显示菜单

使用 Utility.readMenuSelection() 方法获取用户的选项,并根据选项执行相应的操作。

while (isFlag) {
    System.out.println("---------------海豚记账软件--------------\n");
    System.out.println("               1、收支明细");
    System.out.println("               2、登记收入");
    System.out.println("               3、登记支出");
    System.out.println("               4、退   出\n");
    System.out.println("              请选择(1-4):");
    char selection = Utility.readMenuSelection();
    // ...
}

3.3 处理用户输入

根据用户的选择,调用相应的方法处理用户输入的数据,并更新账户余额和收支明细。

switch (selection) {
    case '1':
        // 显示收支明细
        break;
    case '2':
        // 登记收入
        break;
    case '3':
        // 登记支出
        break;
    case '4':
        // 退出程序
        break;
}

3.4 退出程序

当用户选择退出时,询问用户是否确认退出,如果用户确认,则设置 isFlagfalse,结束程序。

case '4':
    System.out.println("\n确认是否退出(Y/N):");
    char isExit = Utility.readConfirmSelection();
    if (isExit == 'Y') {
        isFlag = false;
    }
    break;

4. 知识点解析

4.1 Scanner类

        在本项目中,我们使用了 Scanner来读取用户的键盘输入。Scanner 是 Java 的一个实用工具类,可以方便地从不同的输入流(如键盘输入、文件输入等)中读取不同类型的数据。在本项目中,我们使用 Scanner 类的 nextLine() 方法读取一行字符串,然后进行处理。

4.2 字符与数字转换

        在处理用户输入时,我们需要将字符转换为数字。在本项目中,我们使用了 Integer.parseInt() 方法将字符串转换为整数。需要注意的是,如果用户输入的不是有效的整数,parseInt() 方法会抛出 NumberFormatException 异常,因此我们需要使用 try-catch 语句来捕获这个异常,并提示用户重新输入。

4.3 循环与条件判断

        在本项目中,我们使用了 while 循环来实现主菜单的循环显示,以及 switch-case 语句来实现不同选项的功能。同时,我们还使用了 if-else 语句来判断用户是否确认退出程序。这些控制结构使得程序能够根据用户的输入执行相应的操作,并保持程序的正常运行。

5.完整代码

Utility.java

import java.util.Scanner;
/**
 Utility工具类:
 将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。
 */
public class Utility {
    private static Scanner scanner = new Scanner(System.in);
    /**
     用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’4’中的任意字符,则方法返回。返回值为用户键入字符。
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1);
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' && c != '4') {
                System.out.print("选择错误,请重新输入:");
            }
            else
                break;
        }
        return c;
    }
    /**
     用于收入和支出金额的输入。该方法从键盘读取一个不超过4位长度的整数,并将其作为方法的返回值。
     */
    public static int readNumber() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(4);
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     用于收入和支出说明的输入。该方法从键盘读取一个不超过8位长度的字符串,并将其作为方法的返回值。
     */
    public static String readString() {
        String str = readKeyBoard(8);
        return str;
    }

    /**
     用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。
     */
    public static char readConfirmSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }


    private static String readKeyBoard(int limit) {
        String line = "";

        while (scanner.hasNext()) {
            line = scanner.nextLine();
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }

        return line;
    }
}

DolphinAcount.java


// 海豚记账软件的实现
public class DolphinAcount {
    public static void main(String[] args) {
        boolean isFlag = true;

        //初始金额
        int balance = 100000;
        //记录收支的信息
        String info = "";

        while (isFlag){
            System.out.println("---------------海豚记账软件--------------\n");
            System.out.println("               1、收支明细");
            System.out.println("               2、登记收入");
            System.out.println("               3、登记支出");
            System.out.println("               4、退   出\n");
            System.out.println("              请选择(1-4):");

            char selection = Utility.readMenuSelection();    // 获取用户的选项:'1'  '2'  '3'  '4'

            switch (selection){
                case '1':
                    System.out.println("--------------当前收支明细---------------");
                    System.out.println("收支\t\t账户金额\t收支金额\t说  明");
                    System.out.println(info);
                    System.out.println("---------------------------------------\n");
                    break;
                case '2':
                    System.out.print("本次收入金额:");
                    int money1 = Utility.readNumber();
                    if (money1 > 0){
                        balance += money1;
                    }
                    System.out.print("本次收入说明:");
                    String addDesc = Utility.readString();
                    info += "收入\t\t" + balance + "\t" + money1 + "\t\t" + addDesc + "\n";

                    System.out.println("================登记完成===================");
                    break;
                case '3':
                    System.out.print("本次支出金额:");
                    int money2 = Utility.readNumber();
                    if (money2 > 0 && balance >= money2){
                        balance -= money2;
                    }
                    System.out.print("本次支出说明:");
                    String minusDesc = Utility.readString();
                    info += "支出\t\t" + balance + "\t" + money2 + "\t\t" + minusDesc + "\n";
                    System.out.println("================登记完成===================");
                    break;
                case '4':
                    System.out.println("\n确认是否退出(Y/N):");
                    char isExit = Utility.readConfirmSelection();
                    if (isExit == 'Y'){
                        isFlag = false;
                    }
                    break;
            }
        }
    }
}

6.运行结果展示

1、收支明细

2、登记收入

3、登记支出

4、退出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【秋招笔试】8.18字节跳动秋招(第一场)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

IOS 12 自定义用户协议对话框

实现效果 实现逻辑 本文使用QMUI里面提供的控制器 自定义控件 实现。 添加依赖 #腾讯开源的UI框架&#xff0c;提供了很多功能&#xff0c;例如&#xff1a;圆角按钮&#xff0c;空心按钮&#xff0c;TextView支持placeholder #https://github.com/QMUI/QMUIDemo_iOS #http…

《向量数据库指南》——解决方案:采用安全、高性能的Milvus Cloud向量数据库,赋能Dopple AI的创新与发展

解决方案:采用安全、高性能的Milvus Cloud向量数据库,赋能Dopple AI的创新与发展 在当今这个数据驱动的时代,向量数据库作为机器学习、人工智能等领域的重要基础设施,正发挥着越来越关键的作用。对于Dopple AI这样一个致力于创新的前沿团队来说,选择一个合适的向量数据库…

盘点8大跨境电商平台发展前景及选品分析(亚马逊、速卖通篇)

跨境电商行业在全球范围内持续发展&#xff0c;各大平台各有特色&#xff0c;针对不同的市场和消费者群体提供多元化的服务。以下是亚马逊、Shopee、TikTok、TEMU、速卖通、eBay、Lazada、SHEIN这八大跨境电商平台的背景、主要针对群体、消费者购物偏好及选品建议的简要介绍&am…

C语言:函数详解(1)

目录 一、函数的概念 二、库函数 三、自定义函数 3.1 函数的语法形式 3.2 函数的举例 四、形参和实参 4.1 实参 4.2 形参 4.3 实参与形参的关系 一、函数的概念 数学中我们其实就见过函数的概念&#xff0c;比如&#xff1a;⼀次函数 ykxb &#xff0c;k和b都是常数&am…

[Meachines] [Easy] Buff Gym-CMS-RCE+Chisel端口转发+CloudMe云文件存储-缓冲区溢出权限提升

信息收集 IP AddressOpening Ports10.10.10.198TCP:7680,8080 $ nmap -p- 10.10.10.198 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 7680/tcp open pando-pub? 8080/tcp open http Apache httpd 2.4.43 ((Win64) OpenSSL/1.1.1g PHP/7.4.6) |…

力扣:移动零

文章目录 需求分析优化下双指针结尾 需求 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,1…

中国平安银行笔试考什么?及如何通过平安测评|附真题库面试攻略

一、中国平安银行公司介绍 中国平安银行&#xff0c;作为中国金融领域的重要力量&#xff0c;以其雄厚的实力和创新的金融服务在行业内脱颖而出。平安银行依托中国平安集团的强大资源&#xff0c;致力于为客户提供全方位的金融解决方案。 平安银行拥有广泛的业务网络&#xff0…

堆排序的插入和删除

插入&#xff1a; 1. 检查你的顺序表是否还有位置去插入&#xff0c;如果没有需要扩展 2. 插入到已有序列的后一位置 3. 和其父节点进行比较&#xff0c;是否满足大根堆/小根堆规则 4. 不满足则需要交换数值 删除&#xff1a; 1. 将最后一个元素覆盖将要删除的元素&#xff0…

第八季完美童模全球十佳人气超模【许馨予】荣耀加冕 见证星芒风采!

7月20-23日&#xff0c;2024第八季完美童模全球总决赛在青岛圆满落幕&#xff0c;在盛大的颁奖典礼上&#xff0c; 全球观众网友通过现场参与和网络直播的方式&#xff0c;见证了一位人气榜样的诞生&#xff01;在众多优秀的小超模中&#xff0c;性格开朗的10岁女孩许馨予从本次…

二叉树 - 二叉树的层序遍历

二叉树的层序遍历 102. 二叉树的层序遍历 /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)…

揭秘!华为手表如何成为运动达人的秘密武器

巴黎奥运会已经告一段落&#xff0c;但大家的运动热情仍旧高涨。我发现&#xff0c;身边喜欢健身的小伙伴都需要更智能的设备去精准的记录运动轨迹、心率、配速等数据&#xff0c;想要成为一个运动健身达人&#xff0c;拥有一款适合自己的运动穿戴设备&#xff0c;会让你的健身…

数据结构----双向链表

一丶双向链表 1.特点 逻辑结构&#xff1a;线性结构 存储结构&#xff1a;链式存储 操作&#xff1a;增删改查 2.函数的操作 创空 双链表从中间插入 双向链表尾插 删除中间节点 删除尾节点 #include <stdio.h> #include <stdlib.h> typedef int datatype; /…

全自动商用油炸锅介绍:

全自动商用油炸锅‌是一种专门为商业用途设计的厨房设备&#xff0c;旨在高效、节能、卫生地完成大量食品的油炸加工。这种设备通常采用油水混合技术&#xff0c;能够自动过滤残渣&#xff0c;延长换油周期&#xff0c;从而大大降低用油成本。全自动商用油炸锅适合中、小型油炸…

来聊一聊JVM

为什么需要JVM&#xff0c;不要JVM可以吗&#xff1f; 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译&#xff0c;到处运行 2.JVM可以运行Class文件 我们的编译器到底干了什么事&#xff1f; 仅仅是将我们的 .java 文件转换成了 .class 文件&#xff0c;实际上就是文件格式…

C的温故而知新:结构和其他数据形式(C Primer Plus第十四章)

第十四章&#xff1a;结构和其他数据形式 在我们使用语言进行程序编程设计的时候&#xff0c;经常会出现很多复杂的数据&#xff0c;&#xff0c;每到这种时候&#xff0c;就需要创建很多的变量去存储各种各类的数据。还有一种情况&#xff0c;不同类型的数据是相互关联的&…

通过 MATLAB 的 cylinder 函数生成圆柱体的表面坐标,生成表示一个具有非标准形状的圆柱体(在本例中是杯子)

MATLAB的机器人系统工具箱&#xff08;RST&#xff09;的官方例程Plan a Reaching Trajectory with Multiple Kinematic Constraints规划具有多个运动学约束的到达轨迹 % 创建用于视觉化杯子的点 [X,Y,Z] cylinder(cupRadius*linspace(0,1,50).^0.125); % 调整 Z 坐标的比例…

element-plus form 表单嵌套表格树单行校验问题

需要实现这样的效果&#xff0c;单行校验表格树 公共方法可以直接用 const findPosi (tree, targetId, path "") > {for (let i 0; i < tree.length; i) {const node tree[i];if (node.id targetId) {return path i;}if (node.sub_parameters &&a…

网站服务包含哪些

网站服务是指一系列通过互联网提供的服务&#xff0c;涵盖了多个方面&#xff0c;从基本的网站建设到更高级的在线业务解决方案。以下是网站服务可能包含的一些主要方面&#xff1a; 网站设计与开发&#xff1a; 网站设计&#xff1a; 包括整体网站结构、用户界面设计、图形设…

一、插件开发入门【Qt环境-mingw6.5.3-qmake版】-封装dll调用

1.先创建一个名为mainProject的主项目,并进行简单的ui布局 2.使用C Library库创建动态库项目作为主项目的子插件 2.1 Qt模块选择为Widgets 2.2 环境配置和主项目要一致 3.给插件添加qt界面设计类 4.给subPlugin插件添加一个名为PluginInterface.h的头文件 #ifndef PLUGININTERF…