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

C语言多维数组列分组求和函数实现求助

解决C语言中按列分组求和的问题

嘿,作为编程新手遇到多维数组的问题太正常啦,别慌!我来帮你一步步搞定按列(也就是每个月份)分组求和的功能,顺便把你没写完的代码补全。

首先先看你现有代码里的小问题:printdata函数的循环写了一半(month < NU...),咱们先把这个补好,再实现核心的sumdata函数。

第一步:补全printdata函数

原来的打印提示用数字不够直观,咱们直接用你定义好的years和months字符串数组,让输出更清晰,同时补全循环条件:

// Function to printdata
void printdata() {
    printf("\n--- 降雨量数据 ---\n");
    printf("year\t month\t rain\n");
    for (int year = 0; year < NUMYEARS; year++) {
        for (int month = 0; month < NUMMONTHS; month++) {
            // 用字符串显示年份和月份,同时控制小数位数让输出整齐
            printf("%s\t %s\t %.2f\n", years[year], months[month], Raindata[year][month]);
        }
    }
}

第二步:实现sumdata函数(按列分组求和)

按列求和的逻辑很简单:固定每一个月份(也就是数组的列),遍历所有年份(数组的行),把对应月份的降雨量累加起来。具体实现如下:

// Function to sum data by column (month)
void sumdata() {
    printf("\n--- 各月份总降雨量统计 ---\n");
    // 定义数组存储每个月份的总和,初始化为0避免垃圾值干扰
    float monthTotals[NUMMONTHS] = {0.0};

    // 外层循环遍历每一个月份(列)
    for (int month = 0; month < NUMMONTHS; month++) {
        // 内层循环遍历所有年份,累加该月份的降雨量
        for (int year = 0; year < NUMYEARS; year++) {
            monthTotals[month] += Raindata[year][month];
        }
        // 打印当前月份的总和
        printf("%s: %.2f\n", months[month], monthTotals[month]);
    }

    // 可选:额外计算5年的总降雨量
    float totalAll = 0.0;
    for (int i = 0; i < NUMMONTHS; i++) {
        totalAll += monthTotals[i];
    }
    printf("\n5年总降雨量: %.2f\n", totalAll);
}

代码小解释:

  1. monthTotals数组专门存每个月份的总和,初始化全为0是C语言里的好习惯,防止未知值影响计算结果。
  2. 外层循环锁定月份,内层循环遍历所有年份累加,完美实现按列求和的需求。
  3. 最后额外计算总降雨量,算是给功能加个小彩蛋~

额外优化:让输入更友好

你的inputdata函数里的提示可以改成用年份和月份字符串,用户输入时能更清楚自己在输什么:

// function to inputdata
void inputdata() {
    float Rain = 1.0;
    for (int year = 0; year < NUMYEARS; year++) {
        for (int month = 0; month < NUMMONTHS; month++) {
            printf("Enter rain for %s, %s:\n", years[year], months[month]);
            scanf("%f", &Rain);
            Raindata[year][month] = Rain;
        }
    }
}

完整可运行代码

把所有修改整合起来,就是完整的程序啦:

#define NUMMONTHS 12
#define NUMYEARS 5
#include <stdio.h>
// function prototypes
void inputdata();
void printdata();
void sumdata();
// Global variables
float Raindata[NUMYEARS][NUMMONTHS];
char years[NUMYEARS][5] = { "2011","2012","2013","2014","2015" };
char months[NUMMONTHS][12] = { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };

int main() {
    char enterData = 'y';
    printf("Do you want to input Precipitation data? (y for yes)\n");
    scanf("%c", &enterData);
    // 可选优化:输入y后的换行符会留在缓冲区,加这句吃掉换行
    // getchar();

    if (enterData == 'y') {
        inputdata();
        printdata();
        sumdata();
    } else {
        printf("No data was input at this time\n");
    }
    printf("Please try the Precipitation program again. \n");
    return 0;
}

// function to inputdata
void inputdata() {
    float Rain = 1.0;
    for (int year = 0; year < NUMYEARS; year++) {
        for (int month = 0; month < NUMMONTHS; month++) {
            printf("Enter rain for %s, %s:\n", years[year], months[month]);
            scanf("%f", &Rain);
            Raindata[year][month] = Rain;
        }
    }
}

// Function to printdata
void printdata() {
    printf("\n--- 降雨量数据 ---\n");
    printf("year\t month\t rain\n");
    for (int year = 0; year < NUMYEARS; year++) {
        for (int month = 0; month < NUMMONTHS; month++) {
            printf("%s\t %s\t %.2f\n", years[year], months[month], Raindata[year][month]);
        }
    }
}

// Function to sum data by column (month)
void sumdata() {
    printf("\n--- 各月份总降雨量统计 ---\n");
    float monthTotals[NUMMONTHS] = {0.0};

    for (int month = 0; month < NUMMONTHS; month++) {
        for (int year = 0; year < NUMYEARS; year++) {
            monthTotals[month] += Raindata[year][month];
        }
        printf("%s: %.2f\n", months[month], monthTotals[month]);
    }

    float totalAll = 0.0;
    for (int i = 0; i < NUMMONTHS; i++) {
        totalAll += monthTotals[i];
    }
    printf("\n5年总降雨量: %.2f\n", totalAll);
}

小提醒:

  • 全局变量虽然新手用着方便,但以后尽量减少使用,最好通过函数参数传递数据,不过这个阶段先这样就好~
  • 输入时的换行问题:如果输入y后按回车,后续的scanf可能会读到换行符,加注释里的getchar()就能解决。

这样你的程序就能正常输入、打印数据,还能按月份求和啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:35