You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用函数返回二维数组的行索引?年度降雨量分析模块化C++程序返回值异常(持续返回0)求助

年度降雨量分析程序问题排查与解决方案

首先,我帮你梳理了代码里的几个关键bug,这些问题直接导致了程序返回0或者行为异常,同时也实现了你需求里缺失的wettestMonth和displayReport函数:

代码中的核心问题排查

  • 循环逻辑与变量冲突:totalRainfall函数的循环顺序完全搞反了——你的数组是[months][rain](行对应12个月,列对应单月降雨量),但原代码里先遍历column(当成月份)再遍历row(当成降雨量),导致累加了错误的数组元素,总降雨量计算完全错误。另外,函数形参和全局常量months/rain重名,容易造成逻辑混淆。
  • driestMonth函数的致命错误:
    • 循环增量写错:for(int column = 0; column < rain; rain++)应该改为column++,否则会陷入死循环,程序无法正常执行。
    • 未初始化关键变量:leastMonth没有初始值,直接用它和降雨量比较会导致判断逻辑基于垃圾值,结果不可靠。
    • 比较逻辑错误:应该拿当前降雨量和leastRainMonth(最小降雨量)比较,而不是和leastMonth(月份编号)比较。
    • 返回类型不匹配:函数声明返回double,但实际要返回的是整数类型的月份编号,应该改为int类型。
  • 缺少必要依赖:代码未包含<iostream>头文件,也未指定std::命名空间,导致cout/cin无法正常使用。
  • 函数命名不统一:原代码的averageRain函数和需求里的averageRainfall名称不一致,建议统一命名以符合需求。

修复后的完整代码

#include <iostream>
#include <iomanip> // 用于格式化输出
using namespace std;

const int months = 12;
const int rain_cols = 1; // 避免和rain变量重名

// 函数声明
void getData(double rainfall[months][rain_cols], int num_months, int num_cols);
double totalRainfall(double rainfall[months][rain_cols], int num_months, int num_cols);
double averageRainfall(double total, int num_months);
int driestMonth(double rainfall[months][rain_cols], int num_months, int num_cols);
int wettestMonth(double rainfall[months][rain_cols], int num_months, int num_cols);
void displayReport(double rainfall[months][rain_cols], double total, double avg, int driest, int wettest);

int main() {
    double rainfall[months][rain_cols];
    double total, avg;
    int driest_idx, wettest_idx;

    getData(rainfall, months, rain_cols);
    total = totalRainfall(rainfall, months, rain_cols);
    avg = averageRainfall(total, months);
    driest_idx = driestMonth(rainfall, months, rain_cols);
    wettest_idx = wettestMonth(rainfall, months, rain_cols);

    displayReport(rainfall, total, avg, driest_idx, wettest_idx);

    return 0;
}

void getData(double rainfall[months][rain_cols], int num_months, int num_cols) {
    double rainAmount;
    for(int row = 0; row < num_months; row++) {
        for(int col = 0; col < num_cols; col++) {
            cout << "Enter rainfall for month " << (row + 1) << ": ";
            cin >> rainAmount;
            // 校验输入合法性
            while(rainAmount < 0) {
                cout << "Rainfall cannot be negative. Please re-enter: ";
                cin >> rainAmount;
            }
            rainfall[row][col] = rainAmount;
        }
    }
}

double totalRainfall(double rainfall[months][rain_cols], int num_months, int num_cols) {
    double total = 0;
    for(int row = 0; row < num_months; row++) {
        for(int col = 0; col < num_cols; col++) {
            total += rainfall[row][col];
        }
    }
    return total;
}

double averageRainfall(double total, int num_months) {
    return total / num_months;
}

int driestMonth(double rainfall[months][rain_cols], int num_months, int num_cols) {
    int driest_idx = 0;
    double min_rain = rainfall[0][0];
    for(int row = 0; row < num_months; row++) {
        if(rainfall[row][0] < min_rain) {
            min_rain = rainfall[row][0];
            driest_idx = row;
        }
    }
    // 返回0-based索引,后续可以+1转成1-based月份编号
    return driest_idx;
}

int wettestMonth(double rainfall[months][rain_cols], int num_months, int num_cols) {
    int wettest_idx = 0;
    double max_rain = rainfall[0][0];
    for(int row = 0; row < num_months; row++) {
        if(rainfall[row][0] > max_rain) {
            max_rain = rainfall[row][0];
            wettest_idx = row;
        }
    }
    return wettest_idx;
}

void displayReport(double rainfall[months][rain_cols], double total, double avg, int driest, int wettest) {
    cout << "\n=== Annual Rainfall Report ===" << endl;
    cout << fixed << setprecision(2);
    cout << "Total annual rainfall: " << total << " units" << endl;
    cout << "Average monthly rainfall: " << avg << " units" << endl;
    cout << "Driest month: Month " << (driest + 1) << " with " << rainfall[driest][0] << " units" << endl;
    cout << "Wettest month: Month " << (wettest + 1) << " with " << rainfall[wettest][0] << " units" << endl;
}

关于返回二维数组行索引的说明

要返回二维数组的行索引非常简单:

  • 让函数返回int类型的值,这个值就是数组的行下标(0-based,比如0对应第一个月,11对应第十二个月)。
  • 你可以在调用函数后,通过返回的索引直接访问数组对应的行,比如rainfall[driest_idx][0]就能拿到最干旱月份的降雨量。
  • 如果需要返回1-based的月份编号(比如1-12),只需要在函数返回时返回row + 1,或者在调用后给索引加1即可,就像displayReport函数里做的那样。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:27:49