程序的要点是遍历多维数组,将浮点数添加到rainFall中。在大多数情况下,该程序都可以运行,但是我不知道在第一次迭代中,第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;
}
答案 0 :(得分:1)
首先,您的天气矩阵看起来像是每行一年的信息。第一项是年号,其他元素是每个月的信息。由于一年有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;
}
给出预期的输出:
2010
Average rainfall is 1.10
2011
Average rainfall is 1.10
2012
Average rainfall is 1.10
2013
Average rainfall is 1.10
2014
Average rainfall is 1.10
当然,要可视化此类问题,您可以在不同的年份使用不同的期望值对其进行测试,因此您会看到我提到的“一对一”。
答案 1 :(得分:1)
由于将年份(整数)保留在第零个元素中,因此每行需要12 + 1(13)个元素。我的建议是将年份存储在最后一个位置(而不是第一个位置),以减少意外错误。将年份保持为浮动状态是不寻常的。您可能会考虑将降雨量存储为“定点”整数,您可以在其中手动缩放数字(如果可以确定测量的最小分辨率,则可以减少数字误差的累积)。
由于您已经有5年了,所以建议您使用contant(或#defines)将降雨2D数组声明为YEARS,MONTHS,
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;
}
累积一年的降雨量,然后计算平均值。这样可以减少小浮点数值误差的累积(请参阅:数值分析)。这也将除数减少了12倍(此处不重要,但在处理大型数据集时非常重要)。
答案 2 :(得分:0)
将数据重组为更好地满足您需求的格式可以帮助减少代码中的某些复杂性。它将它从多维数组变成结构化数组。
除非您使用C90,否则请不要在需要变量之前声明它们。
在我建议的更改中,数值数据也更改为它们表示的类型。添加const
来声明此数据不变。 double
用于最小化舍入错误的风险。由于使用了数据结构,因此现在年份以整数而不是浮点数表示。
#include <stdio.h>
#include <stdlib.h>
enum { MONTHS = 12 };
struct Data {
int year;
float monthRain[MONTHS];
};
int main(void) {
enum { YEARS = 5 };
struct Data const weather[YEARS] =
{{2010, {1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f, 1.1f}},
{2011, {1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f}},
{2012, {1.3f, 1.3f, 1.3f, 1.3f, 1.3f, 1.3f, 1.3f, 1.3f, 1.3f, 1.3f, 1.3f, 1.3f}},
{2013, {1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f}},
{2014, {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f}}};
// outer loop iterates through years
for (int yearIndex = 0; yearIndex < YEARS; yearIndex++) {
double totalRainFallInYear = 0.0;
// inner loop iterates through months
for (int monthIndex = 0; monthIndex < MONTHS; monthIndex++) {
totalRainFallInYear += weather[yearIndex].monthRain[monthIndex];
}
double const avgRainFallPerMonth = totalRainFallInYear / (double)MONTHS;
printf("Year %d\nAverage rainfall is %.2f\n", weather[yearIndex].year,
avgRainFallPerMonth);
}
return EXIT_SUCCESS;
}