需要帮助理解功能的逻辑

时间:2015-12-03 03:42:30

标签: c arrays pointers struct

monthly->maxTemperature = yearData[i].high;
monthly->minTemperature = yearData[i].low;

我似乎无法理解迭代将会是什么样的逻辑,或者如何访问数据数组中的正确元素以获取每个月的正确数据....而不会破坏数据。谢谢!

2 个答案:

答案 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;
...

其中maxTemperatureminTemperature等是您在进入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
}

* 即使它看起来像一个数组,它仍然作为指针传递