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); }
代码小解释:
monthTotals数组专门存每个月份的总和,初始化全为0是C语言里的好习惯,防止未知值影响计算结果。- 外层循环锁定月份,内层循环遍历所有年份累加,完美实现按列求和的需求。
- 最后额外计算总降雨量,算是给功能加个小彩蛋~
额外优化:让输入更友好
你的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
相关产品推荐
相关产品推荐

