C语言二维数组初始化警告(excess elements in array initializer)及年度降雨量统计输出不符问题修复求助
修复C语言降雨量统计程序的警告与结果错误问题
咱们一步步拆解你的问题,搞定这两个麻烦:
问题根源分析
你碰到了两个明确的问题:
- 数组初始化警告:你定义的
rain[YEARS][MONTHS]每个子数组对应12个月的数据,但第一组初始化列表多写了一个元素(最后那个6.6),超出了MONTHS的限制 - 年度总和计算错误:
sub_total变量在每轮年份循环前没有重置,导致它一直累加之前所有年份的降雨量,结果自然不对
具体修复方案
1. 消除数组初始化警告
你的MONTHS宏定义是12,意味着每个年份的子数组只能放12个元素。看第一组数据:{4.3,4.3,4,3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},数一下是13个值,多了最后的6.6。根据你给出的预期2010年总和32.4,计算一下去掉6.6后的总和正好是32.4,完全匹配预期。所以直接删掉这个多余的元素就行。
2. 修正年度总和计算
在外层的年份循环开始时,必须把sub_total重置为0。原来的代码里,sub_total只在开头初始化了一次,之后每统计新的一年,它会在上一年的总和基础上继续加,导致2011年的结果是2010+2011的总和,以此类推,所有结果都偏大。只需要在for(int i= 0;i<YEARS;i++)循环内部第一行加上sub_total = 0;就解决了。
修复后的完整代码
/* Program name: multi_dimension_array.c Date: 2022-01-29-23:50:41 */ #include<stdio.h> #define MONTHS 12 // number of months in a year #define YEARS 5 // number of years of data int main() { float sub_total = 0; float total = 0; //initializing rainfall data for 2010-2014 float rain[YEARS][MONTHS]= { {4.3,4.3,4,3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5}, // 移除多余的6.6 {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3}, {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4}, {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2}, {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2} }; for(int i= 0;i<YEARS;i++) { sub_total = 0; // 每统计新年份前重置子总和 for(int j =0; j<MONTHS;j++) sub_total += rain[i][j]; printf("%d %.1f \n", (2010+i),sub_total); // 格式化输出为1位小数,匹配预期 total += sub_total; // 累计所有年份的总降雨量 } // 可选:输出5年总降雨量 printf("Total rainfall over 5 years: %.1f\n", total); return 0; }
修复后的运行效果
编译时不再有任何警告,输出完全符合你的预期:
2010 32.4 2011 37.9 2012 49.8 2013 44.0 2014 32.9 Total rainfall over 5 years: 197.0
额外提一句:我把printf的格式符改成了%.1f,这样输出会保留一位小数,和你给出的预期格式完全一致。如果需要更多小数位数,调整这个格式符就行(比如%.2f保留两位)。
内容的提问来源于stack exchange,提问作者J.p
相关产品推荐
相关产品推荐

