C 遍历多维数组并添加浮点

C 遍历多维数组并添加浮点,c,C,该程序的目的是迭代多维数组,将浮点数添加到数组中。在大多数情况下,程序都可以运行,但我不知道的是,在第一次迭代中,第0行没有添加任何浮点数。我确信这是我错过的非常简单的东西,因为我对C相当陌生 int main() { int i, j; float rainFall = 0.0; float weather[5][12] = {{2010, 1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},

该程序的目的是迭代多维数组,将浮点数添加到数组中。在大多数情况下,程序都可以运行,但我不知道的是,在第一次迭代中,第0行没有添加任何浮点数。我确信这是我错过的非常简单的东西,因为我对C相当陌生

int main()
{
    int i, j;
    float rainFall = 0.0;
    float weather[5][12] =
                {{2010, 1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
                {2011,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
                {2012,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
                {2013,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
                {2014,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},

    };

    //  outer loop iterates through years
    for(i = 0; i < 5; i++)
    {
        printf("%.f\n", weather[i][0]);
        printf("Average rainfall is %.2f\n", rainFall);
        rainFall = 0;
        //  inner loop iterates through months
        //  adds in to rainFall average
        for(j = 1; j < 12; j++)
        {
            rainFall += weather[i][j] / 12;
        }
     }

    return 0;
}
intmain()
{
int i,j;
浮雨量=0.0;
浮云天气[5][12]=
{{2010, 1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
{2011,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
{2012,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
{2013,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
{2014,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
};
//外循环在几年内循环
对于(i=0;i<5;i++)
{
printf(“%.f\n”,天气[i][0]);
printf(“平均降雨量为%.2f\n”,降雨量);
降雨量=0;
//内部循环在几个月内迭代
//加上平均降雨量
对于(j=1;j<12;j++)
{
降雨量+=天气[i][j]/12;
}
}
返回0;
}

首先,您的天气矩阵似乎表示每行一年的信息。第一项是年号,其他元素是每个月的信息。因为一年有12个月,我觉得把它改成
weather[5][13]
即便如此,当您设置天气值时,您在每行上只键入10个月,因此矩阵将不完整

最后,您应该在打印其值之前计算平均值。按照您所做的方式,您将“丢失一个”,并显示在上一次迭代中计算的行的平均值。在第一次迭代中,您将立即打印0。我建议修改的代码如下:

int main()
{
    int i, j;
    float rainFall = 0.0;
    float weather[5][13] =
                {
//      year, 01   02   03  04  05  06  07  08  09  10  11  12
        {2010,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2011,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2012,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2013,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2014,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},

    };

    //  outer loop iterates through years
    for(i = 0; i < 5; i++)
    {
        rainFall = 0;
        //  inner loop iterates through months
        //  adds in to rainFall average
        for(j = 1; j < 13; j++)
        {
            rainFall += weather[i][j] / 12;
        }
        printf("%.f\n", weather[i][0]);
        printf("Average rainfall is %.2f\n", rainFall);
     }

    return 0;
}

当然,要将这类问题形象化,你可以在不同的年份用不同的预期值对其进行测试,这样你就可以看到我提到的“一个一个”了。

首先,你的天气矩阵似乎代表了每行一年的信息。第一项是年号,其他元素是每个月的信息。因为一年有12个月,我觉得把它改成
weather[5][13]
即便如此,当您设置天气值时,您在每行上只键入10个月,因此矩阵将不完整

最后,您应该在打印其值之前计算平均值。按照您所做的方式,您将“丢失一个”,并显示在上一次迭代中计算的行的平均值。在第一次迭代中,您将立即打印0。我建议修改的代码如下:

int main()
{
    int i, j;
    float rainFall = 0.0;
    float weather[5][13] =
                {
//      year, 01   02   03  04  05  06  07  08  09  10  11  12
        {2010,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2011,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2012,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2013,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},
        {2014,1.1, 1.1, 1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1},

    };

    //  outer loop iterates through years
    for(i = 0; i < 5; i++)
    {
        rainFall = 0;
        //  inner loop iterates through months
        //  adds in to rainFall average
        for(j = 1; j < 13; j++)
        {
            rainFall += weather[i][j] / 12;
        }
        printf("%.f\n", weather[i][0]);
        printf("Average rainfall is %.2f\n", rainFall);
     }

    return 0;
}
当然,要将这类问题可视化,您可以在不同的年份使用不同的预期值对其进行测试,这样您就可以看到我提到的“一个一个”了。

因为您将年份(一个整数)保留在第零个元素中,所以每行需要12+1(13)个元素。我的建议是将年份存储在最后一个位置(而不是第一个位置),以减少意外错误。将年份存储为浮点数是不寻常的。你可以考虑将雨量存储为“定点”整数,在这里你可以手动缩放数字(这将减少数值误差的积累,如果你能决定测量的最小分辨率)。 由于您有5年的时间,我建议您使用contants(或#defined)将降雨2D数组声明为年、月、

float weather[YEARS][1+MONTHS];
您确实需要将每一行分配为float[1+12](将1放在第一位,以提示下一个开发人员或未来的您正在做一些不同的事情

#define YEARS (5)
#define MONTHS (12)

int main()
{
    int year, month;
    float rainFall = 0.0, avg_rainFall = 0.0;
    float weather[YEARS][1+MONTHS] = {
          {2010, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2011, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2012, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2013, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2014, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
    };

    //  outer loop iterates through years
    for(year= 0; year < YEARS; year++)
    {
        printf("%.f\n", weather[year][0]);
        printf("Average rainfall is %.2f\n", rainFall);
        total_rainFall = 0;
        //  inner loop iterates through months
        //  adds in to rainFall average
        for(month = 0; month < MONTHS; month++)
        {
            rainFall += weather[year][1+month];
        }
        avg_rainFall = rainFall / MONTHS;
     }

    return 0;
}
#定义年份(5)
#定义月份(12)
int main()
{
int年,月;
浮动降雨量=0.0,平均降雨量=0.0;
浮动天气【年】【1个月】={
{2010, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
,{2011, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
,{2012, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
,{2013, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
,{2014, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
};
//外循环在几年内循环
用于(年=0;年<年;年+)
{
printf(“%.f\n”,天气[年][0]);
printf(“平均降雨量为%.2f\n”,降雨量);
总降雨量=0;
//内部循环在几个月内迭代
//加上平均降雨量
对于(月=0;月<月;月++)
{
降雨量+=天气[年][1+月];
}
平均降雨量=降雨量/月;
}
返回0;
}
累积一年的降雨量,然后计算平均值。这会减少小浮点数值误差的累积(请参阅:数值分析)。这也会将除数减少12倍(此处不重要,但在处理大型数据集时非常重要).

由于将年份(整数)保留在第0个元素中,因此每行需要12+1(13)个元素。我的建议是将年份存储在最后一个位置(而不是第一个位置)保持一年的浮存量是不寻常的。你可以考虑将降雨存储为“定点”整数,在这里你可以手动缩放数字(如果你能决定测量的最小分辨率,这将减少数值误差的累积)。 由于您有5年的时间,我建议您使用contants(或#defined)将降雨2D数组声明为年、月、

float weather[YEARS][1+MONTHS];
您确实需要将每一行分配为float[1+12](将1放在第一位,以提示下一个开发人员或未来的您正在做一些不同的事情

#define YEARS (5)
#define MONTHS (12)

int main()
{
    int year, month;
    float rainFall = 0.0, avg_rainFall = 0.0;
    float weather[YEARS][1+MONTHS] = {
          {2010, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2011, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2012, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2013, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
         ,{2014, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1}
    };

    //  outer loop iterates through years
    for(year= 0; year < YEARS; year++)
    {
        printf("%.f\n", weather[year][0]);
        printf("Average rainfall is %.2f\n", rainFall);
        total_rainFall = 0;
        //  inner loop iterates through months
        //  adds in to rainFall average
        for(month = 0; month < MONTHS; month++)
        {
            rainFall += weather[year][1+month];
        }
        avg_rainFall = rainFall / MONTHS;
     }

    return 0;
}
#定义年份(5