此循环中的先前值是多少?

时间:2012-10-18 14:50:32

标签: c++

这是我的代码的一部分。其余的只是函数定义。我有一个20 x 20的数组记录板的温度。我需要通过一个循环重复,直到数组中的单元格没有变化超过0.1度(我每次迭代刷新值)你如何监视数组中任何单元格的最大变化,以确定何时停止迭代?现在我已经尝试过这个,但输出不正确。我相信这是因为我错误地定义了我之前的那个以将当前的那个与。

进行比较
while (true)
{
    bool update = false;
    for (int a = 1; a < array_size -1; a++)
    {
        for (int b = 1; b < array_size -1; b++)
        {             
            hot_plate[a][b] = sum_cell(hot_plate, a, b);

        }
    } 

    for (int a = 1; a < array_size-1; a++)
    {
        for (int b = 1; b < array_size-1; b++)
        {
            hot_plate_next[a][b]=sum_cell(hot_plate_next, a,b);
            if (abs(hot_plate_next[a][b] - hot_plate[a][b]) > 0.1)
            {
                update = true;
            }
            hot_plate_next[a][b] = hot_plate[a][b];
            cout << hot_plate[a][b] << " ";
        }  
    }

    if (!update) {
        break;
    }
}

2 个答案:

答案 0 :(得分:1)

当你把:

        if (abs(hot_plate_next[a][b] - hot_plate[a][b]) < 0.1)
        {
            update = false;
        }

在第二个嵌套的for循环中,你正在设置&#34;更新&#34;如果任何单元格在当前和先前的检查之间的差异小于0.1,则为false,而不是您想要的所有单元格。

按如下方式更新您的代码:

    bool update = false;

    if (abs(hot_plate_next[a][b] - hot_plate[a][b]) > 0.1)
    {
        update = true;
    }

(我会把&gt; =,但你说&#34;直到数组中的单元格没有变化超过0.1度&#34;)

按要求编辑:要干净地输出矩阵,请添加以下行:

 cout << "\n";

这里:

for (int a = 1; a < array_size-1; a++)
{
    for (int b = 1; b < array_size-1; b++)
    {
        hot_plate_next[a][b]=sum_cell(hot_plate_next, a,b);
        if (abs(hot_plate_next[a][b] - hot_plate[a][b]) > 0.1)
        {
            update = true;
        }
        hot_plate_next[a][b] = hot_plate[a][b];
        cout << hot_plate[a][b] << " ";
    }  
    cout << "\n"; // Add this line
}

答案 1 :(得分:1)

问题是,当某个单元格的较小更改时,您会覆盖update。在这种情况下,任何具有较小变化的单元格都将停止迭代。

像这样构建你的循环:

float largest_change = 0.0f;
do {
    largest_change = 0.0f;

    for (...) {
        float new_value = ...
        float change = abs(new_value - hot_plate[a][b]);
        if (change > largest_change)
            largest_change = change;
        hot_plate[a][b] = change;
    }
} while (largestChange > 0.1f);