首页 > Java > java教程 > 正文

Java程序设计:实现月度降雨量统计与分析

花韻仙語
发布: 2025-11-14 16:35:12
原创
625人浏览过

java程序设计:实现月度降雨量统计与分析

本文详细阐述了如何使用Java语言设计一个模块化的程序,用于收集、存储并分析年度月度降雨量数据。教程涵盖了输入验证、数据展示、总降雨量计算、平均降雨量计算以及根据阈值统计降雨量超出月份等核心功能,并通过分离的方法实现,旨在提升代码的可读性、可维护性和复用性,同时提供完整的示例代码和关键实现细节。

软件开发中,将复杂任务分解为更小、更易管理的部分是提高代码质量的关键。对于处理年度月度降雨量数据统计的需求,我们可以采用面向方法(Method-Oriented)的编程思想,将数据的输入、显示、计算和分析等功能分别封装到独立的Java方法中。这种结构不仅使代码逻辑清晰,也便于未来的扩展和维护。

核心功能设计与实现

本教程将围绕以下几个核心功能进行方法设计与实现:

  1. 获取降雨量数据 (getRainfall): 从用户处读取12个月的降雨量数据,并进行输入验证,确保数据非负。
  2. 显示降雨量数据 (displayRainfall): 打印每个月的降雨量。
  3. 计算总降雨量 (getTotalRainfall): 计算一年中所有月份的总降雨量。
  4. 计算平均降雨量 (getAverageRainfall): 计算一年中每月的平均降雨量。
  5. 统计超标月份 (getRainfallAbove): 统计降雨量超过特定阈值的月份数量。

所有数据都将存储在一个双精度浮点型数组中,并在 main 方法中进行协调调用。

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

1. 获取降雨量数据 (getRainfall)

此方法负责与用户交互,获取每个月的降雨量。为了确保数据的有效性,需要实现一个循环,直到用户输入一个非负数为止。

import java.io.IOException;
import java.util.Scanner;

public class RainfallAnalyzer {

    public static final int MONTHS = 12; // 定义常量表示月份数

    /**
     * 从用户处获取12个月的降雨量数据,并进行输入验证。
     * 不接受负数作为降雨量。
     * @return 包含12个月降雨量的double数组。
     */
    public static double[] getRainfall() {
        String[] monthNames = { "January", "February", "March", "April", "May", "June", "July",
                                "August", "September", "October", "November", "December" };
        double[] rainData = new double[MONTHS];
        Scanner keyboard = new Scanner(System.in);

        for (int i = 0; i < MONTHS; i++) {
            double currentRainfall;
            do {
                System.out.print("Enter rainfall for " + monthNames[i] + ": ");
                currentRainfall = keyboard.nextDouble();
                if (currentRainfall < 0) {
                    System.out.println("Error: Rainfall cannot be a negative number. Please re-enter.");
                }
            } while (currentRainfall < 0); // 循环直到输入非负数
            rainData[i] = currentRainfall;
        }
        // keyboard.close(); // 在实际应用中,Scanner通常在main方法结束时关闭,这里避免过早关闭
        return rainData;
    }
}
登录后复制

注意事项: Scanner 对象在整个程序生命周期中通常只创建一次并在不再需要时关闭。在多个方法中创建和关闭 Scanner 可能导致问题。在本示例中,我们选择在 getRainfall 方法中创建,但注释掉了关闭操作,以允许 main 方法或其他方法继续使用 System.in。一个更健壮的方法是,将 Scanner 作为参数传入,或者在 main 方法中创建并传递给需要它的方法,并在 main 方法结束时关闭。

2. 显示降雨量数据 (displayRainfall)

此方法接收降雨量数组作为参数,并按月份顺序打印出每个月的降雨量。

    /**
     * 显示每个月的降雨量数据。
     * @param rainData 包含降雨量的double数组。
     */
    public static void displayRainfall(double[] rainData) {
        String[] monthNames = { "January", "February", "March", "April", "May", "June", "July",
                                "August", "September", "October", "November", "December" };
        System.out.println("\n--- Monthly Rainfall Data ---");
        for (int i = 0; i < MONTHS; i++) {
            System.out.printf("%-10s: %.2f inches%n", monthNames[i], rainData[i]);
        }
    }
登录后复制

注意事项: 使用 printf 方法可以更好地控制输出格式,例如对浮点数保留两位小数,并对月份名称进行左对齐。

3. 计算总降雨量 (getTotalRainfall)

此方法遍历降雨量数组,累加所有月份的降雨量,并返回总和。此方法应只负责计算并返回结果,不应在内部打印。

设计师AI工具箱
设计师AI工具箱

最懂设计师的效率提升平台,实现高效设计出图和智能改图,室内设计,毛坯渲染,旧房改造 ,软装设计

设计师AI工具箱 124
查看详情 设计师AI工具箱
    /**
     * 计算并返回一年的总降雨量。
     * @param rainData 包含降雨量的double数组。
     * @return 一年的总降雨量。
     */
    public static double getTotalRainfall(double[] rainData) {
        double total = 0.0;
        for (double value : rainData) { // 使用增强for循环遍历数组
            total += value;
        }
        return total;
    }
登录后复制

最佳实践: 计算方法应专注于计算并返回结果。将输出逻辑分离到 main 方法或其他专门的显示方法中,可以提高方法的复用性。

4. 计算平均降雨量 (getAverageRainfall)

平均降雨量是总降雨量除以月份数。此方法可以调用 getTotalRainfall 方法来获取总和,然后进行除法运算。

    /**
     * 计算并返回每月的平均降雨量。
     * @param rainData 包含降雨量的double数组。
     * @return 每月的平均降雨量。
     */
    public static double getAverageRainfall(double[] rainData) {
        // 调用getTotalRainfall获取总和,避免重复计算逻辑
        double total = getTotalRainfall(rainData); 
        return total / MONTHS;
    }
登录后复制

常见错误与纠正: 原始代码中 getAverageRainfall 内部调用了 getTotalRainfall 并且 getTotalRainfall 内部也进行了打印,这会导致重复输出。正确的做法是 getTotalRainfall 只返回总和,而 getAverageRainfall 使用这个返回的总和进行计算,并在 main 方法中统一处理输出。

5. 统计超标月份 (getRainfallAbove)

此方法接收降雨量数组和一个阈值,统计有多少个月的降雨量超过了这个阈值。

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

main 方法:程序入口与协调

main 方法是程序的执行起点,负责调用上述所有方法,并组织它们的执行顺序,以及最终的输出。

    public static void main(String[] args) {
        // 1. 获取降雨量数据
        double[] monthlyRainfall = getRainfall();

        // 2. 显示降雨量数据
        displayRainfall(monthlyRainfall);

        // 3. 计算并显示总降雨量
        double totalRain = getTotalRainfall(monthlyRainfall);
        System.out.printf("\nTotal annual rainfall: %.2f inches%n", totalRain);

        // 4. 计算并显示平均降雨量
        double averageRain = getAverageRainfall(monthlyRainfall);
        System.out.printf("Average monthly rainfall: %.2f inches%n", averageRain);

        // 5. 统计超标月份 (示例:统计降雨量超过 5.0 英寸的月份)
        double threshold = 5.0;
        int monthsAboveThreshold = getRainfallAbove(monthlyRainfall, threshold);
        System.out.printf("Number of months with rainfall above %.2f inches: %d%n", threshold, monthsAboveThreshold);
    }
}
登录后复制

完整示例代码

将以上所有方法整合到同一个 RainfallAnalyzer.java 文件中,即可得到一个完整的、可运行的程序。

import java.io.IOException;
import java.util.Scanner;

public class RainfallAnalyzer {

    public static final int MONTHS = 12; // 定义常量表示月份数

    /**
     * 从用户处获取12个月的降雨量数据,并进行输入验证。
     * 不接受负数作为降雨量。
     * @return 包含12个月降雨量的double数组。
     */
    public static double[] getRainfall() {
        String[] monthNames = { "January", "February", "March", "April", "May", "June", "July",
                                "August", "September", "October", "November", "December" };
        double[] rainData = new double[MONTHS];
        Scanner keyboard = new Scanner(System.in); // 在方法内部创建Scanner

        for (int i = 0; i < MONTHS; i++) {
            double currentRainfall;
            do {
                System.out.print("Enter rainfall for " + monthNames[i] + ": ");
                currentRainfall = keyboard.nextDouble();
                if (currentRainfall < 0) {
                    System.out.println("Error: Rainfall cannot be a negative number. Please re-enter.");
                }
            } while (currentRainfall < 0);
            rainData[i] = currentRainfall;
        }
        // 注意:这里不关闭Scanner,因为System.in可能在其他地方被使用。
        // 通常在main方法中创建并关闭Scanner,或者作为参数传递。
        return rainData;
    }

    /**
     * 显示每个月的降雨量数据。
     * @param rainData 包含降雨量的double数组。
     */
    public static void displayRainfall(double[] rainData) {
        String[] monthNames = { "January", "February", "March", "April", "May", "June", "July",
                                "August", "September", "October", "November", "December" };
        System.out.println("\n--- Monthly Rainfall Data ---");
        for (int i = 0; i < MONTHS; i++) {
            System.out.printf("%-10s: %.2f inches%n", monthNames[i], rainData[i]);
        }
    }

    /**
     * 计算并返回一年的总降雨量。
     * @param rainData 包含降雨量的double数组。
     * @return 一年的总降雨量。
     */
    public static double getTotalRainfall(double[] rainData) {
        double total = 0.0;
        for (double value : rainData) {
            total += value;
        }
        return total;
    }

    /**
     * 计算并返回每月的平均降雨量。
     * @param rainData 包含降雨量的double数组。
     * @return 每月的平均降雨量。
     */
    public static double getAverageRainfall(double[] rainData) {
        double total = getTotalRainfall(rainData); // 调用getTotalRainfall获取总和
        return total / MONTHS;
    }

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

    public static void main(String[] args) {
        // 1. 获取降雨量数据
        double[] monthlyRainfall = getRainfall();

        // 2. 显示降雨量数据
        displayRainfall(monthlyRainfall);

        // 3. 计算并显示总降雨量
        double totalRain = getTotalRainfall(monthlyRainfall);
        System.out.printf("\nTotal annual rainfall: %.2f inches%n", totalRain);

        // 4. 计算并显示平均降雨量
        double averageRain = getAverageRainfall(monthlyRainfall);
        System.out.printf("Average monthly rainfall: %.2f inches%n", averageRain);

        // 5. 统计超标月份 (示例:统计降雨量超过 5.0 英寸的月份)
        double threshold = 5.0;
        int monthsAboveThreshold = getRainfallAbove(monthlyRainfall, threshold);
        System.out.printf("Number of months with rainfall above %.2f inches: %d%n", threshold, monthsAboveThreshold);
    }
}
登录后复制

总结

通过本教程,我们学习了如何利用Java方法将一个降雨量统计程序模块化。这种方法不仅提高了代码的组织性和可读性,还增强了每个功能的独立性和复用性。关键点在于:

  • 明确方法职责: 每个方法应只负责一个明确的任务(如输入、显示、计算)。
  • 输入验证: 对用户输入进行有效性检查,防止程序因无效数据而崩溃。
  • 返回结果与输出分离: 计算方法应返回计算结果,而不是在内部直接打印。输出任务应由 main 方法或专门的显示方法负责。
  • 使用常量: 定义常量(如 MONTHS)可以提高代码的可维护性和可读性。
  • main 方法的协调作用: main 方法负责按照业务逻辑调用各个功能方法,并处理最终的输出展示。

遵循这些原则,可以编写出结构清晰、易于理解和维护的Java应用程序。

以上就是Java程序设计:实现月度降雨量统计与分析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号