Averageif函数等价于C++
Averageif function equivalent for C++
我是一个编码初学者,正在尝试缩减一段大的、容易出错的代码。我非常想要它,所以
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。
至少,对于任何布尔表达式foo
,foo==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;
}
}
相关文章:
- c++ AVX512 本质上等价于 _mm256_broadcast_ss()?
- 等价于将c++上的char赋值给c#
- 什么是提升等价于标准::可选空选项
- 什么是 gtkmm 等价于 g_signal_handlers_block_by_func()
- 等价于元组的std::转换
- 等价于C++中的Java静态方法
- Averageif函数等价于C++
- C++等价于Java导入等问题
- C++等价于从C#中选择XML节点
- C等价于新对象(构造函数)
- C++等价于在python中传递lambda函数作为参数
- Microtime()等价于C和C++
- go等价于c类型
- 等价于使用Lua_newsthread在C++中创建Lua协程
- 迭代等价于递归算法
- delete(Object) 等价于调用 Object.~Object() 吗?
- 什么是LIBCURL等价于--N/--无缓冲区
- C++等价于简单的Java多态性
- 有没有一个类似/等价于Functional Java的C++库
- 多重if不带else不等价于if else?c++