2016-05-05 1 views
-1

Я начинаю программировать и пытаюсь сжать большую часть ошибок, подверженных ошибкам. Довольно много я хочу это такСреднее значение эквивалента для C++

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

таким образом, что я найти среднее из значений в массиве tileAir только если tileBlocked не перечисляет эту область как заблокированный. Я обыскал, и единственное, что я нашел, это 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"; 
      } 
     } 
    } 

Как вы можете видеть, это очень unexpandable и подвержен ошибкам. В этом конкретном примере tileAir заменяется на tileOxygen.

+2

Использование функции в C++ в случае повторяющегося кода. В таких случаях ошибка фиксируется в одной конкретной функции вместо целого кода. –

+0

Я не думаю, что он компилируется. 'tilesBlocked [row-1] [col]' похоже, является bool, тогда как вы можете разыменовать его в третий раз: 'tilesBlocked [row] [col] [0]' – seleciii44

+0

@RishitSanmukhani Как это будет работать с parallel_for (с точки зрения совместимости). На каждый тип воздуха на самом деле будет 6 различных потоков. Кроме того, любые идеи о том, как мне настроить эту функцию? –

ответ

0

По крайней мере, для любого логического выражения foo, foo==true может быть заменен только foo и foo==false можно заменить !foo.

+0

Спасибо! Я буду использовать это в переписывании. –

0

Там кажется, нет никакого эквивалента в СРЕСЛИ в Excel для C++. Однако вероятность ошибки была уменьшена, а читаемость была увеличена за счет использования функций.

0

Если я понял ваши намерения и ваш код, ваш цикл может быть преобразована следующим образом:

// 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; 
    } 
} 
+0

Это относительно похоже на мой текущий код. –