讲师中心 微信公众号
AI工具推荐 视频效率加速

Java月度降雨量统计与分析系统开发指南

落磊小哥_8845

落磊小哥_8845

发布时间:2025-11-14 17:56:02

|

966人浏览过

|

来源于php中文网

原创

Java月度降雨量统计与分析系统开发指南

本教程旨在指导读者使用java开发一个功能全面的月度降雨量统计与分析程序。文章将详细讲解如何设计并实现多个独立方法,包括用户输入验证、数据展示、年度总降雨量计算、月平均降雨量计算以及统计降雨量超标月份。通过清晰的代码示例和最佳实践建议,帮助读者构建一个结构清晰、易于维护的降雨数据处理系统。

一、系统概述与方法设计

开发一个降雨量统计系统需要处理数据的输入、存储、展示和多种计算功能。为了实现代码的模块化和可维护性,我们将程序功能拆分为以下几个独立的方法:

  1. getRainfall: 负责从用户处获取12个月的降雨量数据,并存储到数组中。该方法需包含输入验证,确保降雨量为非负数。
  2. displayRainfall: 接收降雨量数组作为参数,并以友好的格式显示每个月的降雨量。
  3. getTotalRainfall: 接收降雨量数组,计算并返回全年的总降雨量。
  4. getAverageRainfall: 接收降雨量数组,计算并返回月平均降雨量。该方法应利用 getTotalRainfall 方法来避免重复逻辑。
  5. getRainfallAbove: 接收降雨量数组和一个阈值,返回降雨量超过该阈值的月份数量。

所有方法都将在 main 方法中被调用,以演示程序的完整功能。

二、核心方法实现

我们将创建一个 RainfallAnalyzer 类来封装所有相关方法。

1. getRainfall 方法:获取月度降雨量数据

此方法负责与用户交互,获取每个月的降雨量。关键在于实现输入验证,防止用户输入负数。

立即学习“Java免费学习笔记(深入)”;

import java.util.Scanner;

public class RainfallAnalyzer {

    public static final int MONTHS = 12;
    public static final String[] MONTH_NAMES = {
        "一月", "二月", "三月", "四月", "五月", "六月",
        "七月", "八月", "九月", "十月", "十一月", "十二月"
    };

    /**
     * 从用户获取每个月的降雨量,并存储到数组中。
     * 确保输入值为非负数。
     * @param rainfallData 存储降雨量的数组。
     * @param keyboard 用于读取用户输入的Scanner对象。
     */
    public static void getRainfall(double[] rainfallData, Scanner keyboard) {
        System.out.println("请输入每个月的降雨量(英寸):");
        for (int i = 0; i < MONTHS; i++) {
            double input;
            do {
                System.out.print("请输入 " + MONTH_NAMES[i] + " 的降雨量: ");
                // 验证输入是否为数字
                while (!keyboard.hasNextDouble()) {
                    System.out.println("无效输入,请输入一个数字。");
                    keyboard.next(); // 消耗掉无效输入
                    System.out.print("请输入 " + MONTH_NAMES[i] + " 的降雨量: ");
                }
                input = keyboard.nextDouble();
                if (input < 0) {
                    System.out.println("降雨量不能为负数,请重新输入。");
                }
            } while (input < 0); // 循环直到输入非负数
            rainfallData[i] = input;
        }
    }
    // ... 其他方法将在此处添加
}

注意事项:

  • MONTHS 和 MONTH_NAMES 被定义为 public static final 常量,方便在整个类中复用。
  • Scanner 对象作为参数传入,避免在每个方法中重复创建和关闭。
  • hasNextDouble() 用于检查用户输入是否为有效的浮点数,提高了程序的健壮性。
  • do-while 循环确保用户输入的降雨量是非负数。

2. displayRainfall 方法:显示月度降雨量

该方法遍历降雨量数组,并打印出每个月的降雨量。

    // ... 在 RainfallAnalyzer 类中

    /**
     * 显示每个月的降雨量。
     * @param rainfallData 包含月度降雨量的数组。
     */
    public static void displayRainfall(double[] rainfallData) {
        System.out.println("\n--- 月度降雨量明细 ---");
        for (int i = 0; i < MONTHS; i++) {
            System.out.printf("%-10s: %.2f 英寸\n", MONTH_NAMES[i], rainfallData[i]);
        }
    }
    // ... 其他方法

格式化输出:

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • printf 方法用于格式化输出,%-10s 用于左对齐字符串并占用10个字符宽度,%.2f 用于格式化浮点数,保留两位小数。

3. getTotalRainfall 方法:计算年度总降雨量

此方法通过遍历数组累加所有月份的降雨量,并返回总和。

    // ... 在 RainfallAnalyzer 类中

    /**
     * 计算并返回年度总降雨量。
     * @param rainfallData 包含月度降雨量的数组。
     * @return 年度总降雨量。
     */
    public static double getTotalRainfall(double[] rainfallData) {
        double total = 0.0;
        for (double value : rainfallData) { // 使用增强for循环遍历数组
            total += value;
        }
        return total;
    }
    // ... 其他方法

设计原则:

  • 该方法只负责计算并返回结果,不负责打印输出。打印操作应在 main 方法中进行,以保持方法的单一职责。

4. getAverageRainfall 方法:计算月平均降雨量

月平均降雨量可以通过年度总降雨量除以月份数得到。为了避免重复计算逻辑,此方法会调用 getTotalRainfall。

    // ... 在 RainfallAnalyzer 类中

    /**
     * 计算并返回月平均降雨量。
     * @param rainfallData 包含月度降雨量的数组。
     * @return 月平均降雨量。
     */
    public static double getAverageRainfall(double[] rainfallData) {
        // 利用 getTotalRainfall 方法避免重复计算和打印
        return getTotalRainfall(rainfallData) / MONTHS;
    }
    // ... 其他方法

优势:

  • 复用 getTotalRainfall 方法,减少代码冗余,提高代码一致性。

5. getRainfallAbove 方法:统计降雨量超标月份

此方法遍历降雨量数组,统计降雨量超过指定阈值的月份数量。

    // ... 在 RainfallAnalyzer 类中

    /**
     * 统计降雨量超过指定阈值的月份数量。
     * @param rainfallData 包含月度降雨量的数组。
     * @param threshold 降雨量阈值。
     * @return 降雨量超过阈值的月份数量。
     */
    public static int getRainfallAbove(double[] rainfallData, double threshold) {
        int count = 0;
        for (double value : rainfallData) {
            if (value > threshold) {
                count++;
            }
        }
        return count;
    }
} // 类结束

三、主方法(main)的实现与程序流程

main 方法是程序的入口点,它负责初始化降雨量数组和 Scanner 对象,然后按顺序调用上述所有方法,并输出最终结果。

import java.util.Scanner;

public class RainfallAnalyzer {

    public static final int MONTHS = 12;
    public static final String[] MONTH_NAMES = {
        "一月", "二月", "三月", "四月", "五月", "六月",
        "七月", "八月", "九月", "十月", "十一月", "十二月"
    };

    public static void main(String[] args) {
        double[] rainfallData = new double[MONTHS]; // 声明并初始化降雨量数组
        Scanner keyboard = new Scanner(System.in); // 创建Scanner对象

        try {
            // 1. 获取月度降雨量数据
            getRainfall(rainfallData, keyboard);

            // 2. 显示月度降雨量
            displayRainfall(rainfallData);

            // 3. 计算并显示年度总降雨量
            double totalRainfall = getTotalRainfall(rainfallData);
            System.out.printf("\n年度总降雨量: %.2f 英寸\n", totalRainfall);

            // 4. 计算并显示月平均降雨量
            double averageRainfall = getAverageRainfall(rainfallData);
            System.out.printf("月平均降雨量: %.2f 英寸\n", averageRainfall);

            // 5. 统计降雨量超标的月份
            double threshold = 5.0; // 设定一个示例阈值
            int monthsAboveThreshold = getRainfallAbove(rainfallData, threshold);
            System.out.printf("有 %d 个月份的降雨量超过 %.2f 英寸。\n", monthsAboveThreshold, threshold);

        } catch (Exception e) {
            // 捕获可能发生的任何异常,提高程序健壮性
            System.err.println("程序执行过程中发生错误: " + e.getMessage());
        } finally {
            // 确保 Scanner 对象在程序结束时被关闭,释放系统资源
            keyboard.close();
        }
    }

    // ... (getRainfall, displayRainfall, getTotalRainfall, getAverageRainfall, getRainfallAbove 方法代码)
}

关键点:

  • 数组 rainfallData 在 main 方法中声明并初始化,然后作为参数传递给各个方法。
  • Scanner 对象也在 main 方法中创建,并通过参数传递给 getRainfall 方法,最后在 finally 块中关闭,确保资源被正确释放。
  • 使用 try-catch-finally 结构处理潜在的运行时错误,并保证 Scanner 始终被关闭。

四、注意事项与最佳实践

在开发此类程序时,遵循一些最佳实践可以提高代码质量和可维护性:

  1. 参数传递与返回值:
    • 方法应尽量通过参数接收所需数据,并通过返回值提供计算结果。避免在方法内部直接进行不必要的输入/输出操作,特别是计算方法。
    • 数组作为引用类型传递时,方法内部对数组元素的修改会影响到原始数组。
  2. 单一职责原则:
    • 每个方法应只负责一项明确的任务。例如,getTotalRainfall 只负责计算总和并返回,不负责打印。
  3. 常量定义:
    • 使用 public static final 定义程序中不变的常量(如月份数量、月份名称),提高代码的可读性和可维护性。
  4. 资源管理:
    • 像 Scanner 这样的系统资源,在使用完毕后务必调用 close() 方法关闭,以避免资源泄露。通常将其放在 finally 块中。
  5. 输入验证:
    • 对用户输入进行严格验证是必不可少的,以防止无效数据导致程序崩溃或产生错误结果。本教程中的 getRainfall 方法演示了如何检查非负数和非数字输入。
  6. 避免全局变量滥用:
    • 除非有明确

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6304

2023.10.24

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

908

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

5085

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2150

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1878

2023.08.03

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn