Averageif函数等价于C++

Averageif function equivalent for C++

本文关键字:C++ 等价于 函数 Averageif      更新时间:2023-10-16

我是一个编码初学者,正在尝试缩减一段大的、容易出错的代码。我非常想要它,所以

if (tileBlocked[row - 1][col] == true)
{ 
    add tileAir[row - 1][col] to averaging
}

这样,只有当tileBlocked没有将该区域列为阻塞时,我才会找到数组tileAir中值的平均值。我四处寻找,唯一找到的是Averageif,据我所知,它只适用于excel。有什么等效的或某种方式可以减少这段代码的大小并允许更好的扩展能力吗?

现在这是我当前的代码:

for (int row = 1; row < 255; ++row) // Repeats for all rows, skipping the first and final row
    {
        for (int col = 1; col < 255; ++col) // Repeats for all columns, skipping the first and final column
        {
            bool check[4] = { tilesBlocked[row - 1][col], tilesBlocked[row][col - 1], tilesBlocked[row][col + 1], tilesBlocked[row + 1][col] }; // Creates an Array for testing what tiles should be ommited from the calculation
            if (tilesBlocked[row][col][0] == true) // If the tile being calculated is blocked, skip it
            {
            }
            else if (check[0] == true && check[1] == true && check[2] == true && check[3] == true)
            {
            }
            else if (check[0] == false && check[1] == false && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 5);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == false && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1]) / 4);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == false && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1] + tilesOxygen[row + 1][col]) / 4);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == false && check[2] == true && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1]) / 3);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 4);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col + 1]) / 3);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row + 1][col]) / 3);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == true && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col]) / 2);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 4);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1]) / 3);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1] + tilesOxygen[row + 1][col]) / 3);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == true && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1]) / 2);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == true && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 3);
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == true && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col + 1]) / 2);
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == true && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row + 1][col]) / 2);
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else
            {
                std::cout << "Something Broke";
            }
        } 
    }

正如您所看到的,这是高度不可扩展的,并且容易出错。在此特定示例中,tileAir被替换为tileOxygen。

至少,对于任何布尔表达式foofoo==true可以仅用foo替换,foo==false可以用!foo. 替换

在C++的excel中似乎没有等效的Averageif。然而,通过使用函数降低了出错的可能性,并提高了可读性。

如果我已经理解了你的意图和代码,你的循环可以这样转换:

// Repeats for all rows, skipping the first and final row
for (int row = 1; row < 255; ++row) 
{
    // Repeats for all columns, skipping the first and final column
    for (int col = 1; col < 255; ++col) 
    {
        // If the tile being calculated is blocked, skip it
        if ( tilesBlocked[row][col]
            || ( tilesBlocked[row - 1][col] && tilesBlocked[row][col - 1]
            && tilesBlocked[row][col + 1] && tilesBlocked[row + 1][col] )) 
        {
            continue;
        }
        double avg = tilesOxygen[row][col];    // educated guess about the type
        int count = 1;
        if ( !tilesBlocked[row + 1][col] ) {
            avg += tilesOxygen[row + 1][col];
            ++count;
        }
        if ( !tilesBlocked[row][col + 1] ) {
            avg += tilesOxygen[row][col + 1];
            ++count;
        }
        if ( !tilesBlocked[row][col - 1] ) {
            avg += tilesOxygen[row][col - 1];
            ++count;
        }
        if ( !tilesBlocked[row - 1][col] ) {
            avg += tilesOxygen[row - 1][col];
            ++count;
        }
        avg /= count;
        tilesOxygen[row][col] = avg;
        if ( !tilesBlocked[row + 1][col] ) {
            tilesOxygen[row + 1][col] = avg;
        }
        if ( !tilesBlocked[row][col + 1] ) {
            tilesOxygen[row][col + 1] = avg;
        }
        if ( !tilesBlocked[row][col - 1] ) {
            tilesOxygen[row][col - 1] = avg;
        }
        if ( !tilesBlocked[row - 1][col] ) {
            tilesOxygen[row - 1][col] = avg;
        }
        tilesOxygen[0][col] = 0;
        tilesOxygen[row][0] = 0;
        tilesOxygen[255][col] = 0;
        tilesOxygen[row][255] = 0;
    } 
}