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

C语言二维数组初始化警告(excess elements in array initializer)及年度降雨量统计输出不符问题修复求助

修复C语言降雨量统计程序的警告与结果错误问题

咱们一步步拆解你的问题,搞定这两个麻烦:

问题根源分析

你碰到了两个明确的问题:

  1. 数组初始化警告:你定义的rain[YEARS][MONTHS]每个子数组对应12个月的数据,但第一组初始化列表多写了一个元素(最后那个6.6),超出了MONTHS的限制
  2. 年度总和计算错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:32:31