monthly->maxTemperature = yearData[i].high;
monthly->minTemperature = yearData[i].low;
我似乎无法理解迭代将会是什么样的逻辑,或者如何访问数据数组中的正确元素以获取每个月的正确数据....而不会破坏数据。谢谢!
答案 0 :(得分:1)
你走在正确的轨道上:
void stats(int mth, const struct Data yearData[], int size, struct Monthly* monthStats)
{
// These are used to calc averages
int highSum = 0;
int lowSum = 0;
int days = 0;
// Initialize data
monthly->maxTemperature = INT_MIN;
monthly->minTemperature = INT_MAX;
monthly->totalPrecip = 0;
for (int i = 0; i < size; ++i) {
// Only use data from given month
if (yearData[i].month == mth) {
days += 1;
if (yearData[i].high > monthly->maxTemperature) monthly->maxTemperature = yearData[i].high;
if (yearData[i].low < monthly->minTemperature) monthly->minTemperature = yearData[i].low;
highSum += yearData[i].high;
lowSum + yearData[i].low;
monthly->totalPrecip += yearData[i].precip;
}
}
if (0 != days) {
monthly->avgHigh = highSum / days;
monthly->avgLow = lowSum / days;
}
}
答案 1 :(得分:0)
在完成任务之前,最好检查一下您需要实现的API以获取线索。首先要注意的是,struct Monthly
被指针传递给函数的原因是你可以将结果设置到它中。这与将struct Data
作为指针 * 传递的原因不同,后者是使用传递C中可用数组的唯一机制传递数组。const
限定符是强烈表示您不得尝试修改yearData
之外的任何内容,只能修改monthStats
。
这告诉您如何处理您在函数中找到的最小值,最大值,平均值和总数:这些需要分配到monthStats
的字段,如下所示:
monthStats->maxTemperature = maxTemperature;
monthStats->minTemperature = minTemperature;
...
其中maxTemperature
,minTemperature
等是您在进入for
循环之前声明的局部变量。
就for
循环而言,您的问题是您完全忽略mth
变量。您需要使用其值来确定是否应该考虑yearData
的元素进行计算。最简单的方法是在if
循环中添加for
:
int maxTemperature = INT_MIN; // you need to include <limits.h>
int minTemperature = INT_MAX; // to get definitions of INT_MIN and INT_MAX
for(int i = 0; i<size; ++i) {
if (yearData[i].month < mth) continue;
if (yearData[i].month > mth) break;
... // Do your computations here
}
* 即使它看起来像一个数组,它仍然作为指针传递