Как упростить составную отрицательную логику - PullRequest
0 голосов
/ 15 февраля 2019

Допустим, у меня есть массив логических значений B [], или я выясняю true / false, используя функцию.Как я могу упростить этот код, если есть много значений (может быть, десятки)?Вот псевдокод:

if(!B[0]){
    doTask1;
}
if(!B[0] && !B[1]){
    doTask1;
    doTask2;
}
if(!B[0] && !B[1] && !B[2]){
    doTask1;
    doTask2;
    doTask3;
}
...

Редактировать 1: я забыл упомянуть, что я хочу, чтобы doTask1 и т. Д. Происходили только один раз (если любое из этих значений имеет значение true), не делая это несколько раз (если, например, 1.st, если это правда, второй тоже верно, мне все еще нужно случиться только один раз)

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

(при условии, что вы не хотите выполнить одно и то же задание более одного раза, даже если ваш оригинальный код будет)

Создайте функцию doTask(), которая будет принимать числозадача, которую нужно выполнить (или просто создать массив указателей на функции).А затем:

for(i=0; i < numberOfTasks; i++)
{
     if (!B[i])
         doTask(i);
     else
         break;
}

Или более кратко:

for(i=0; i < numberOfTasks && !B[i]; i++)
{
     doTask(i);
}
0 голосов
/ 15 февраля 2019

Вы можете использовать массив указателей на функции.

typedef void *(* funcPtr)(void);

funcPtr arrayFunPtr[N];

Затем сохранить функции в массиве.

arrayFunPtr[0]= task1;
arrayFunPtr[1]= task2;
....
arrayFunPtr[N-1]= taskN;

Затем зациклить массив bool и вызвать соответствующую индексную функцию.

  for(int i=0;i<N;i++)
  {
    if(!B[i]) arrayFunPtr[i]();
  }

@Edit.

Если вы хотите прекратить вызывать функцию tasks после нажатия B[i]=true, используйтекод ниже.

  for(int i=0;i<N && !B[i] ;i++)
  {
      arrayFunPtr[i]();
  }
0 голосов
/ 15 февраля 2019

Функциональные указатели - путь сюда.Если вам не нравится указатель на функцию, вы можете использовать конструкцию switch, как показано ниже:

switch(i) {
    case 3:
       if(!B[0] && !B[1] && !B[2]) doTask3();
    case 2:
       if(!B[0] && !B[1]) doTask2();
    case 1:
       if(!B[0]) doTask1();
}

Или вы можете сделать:

Вы можете написать метод:

simplify(int[] B, int l) {
   for (int i =0 ; i < l, i++) {
       // write the code using &&
   }
}

Затем можно вызвать этот метод как:

if(simplify(B, 1){
   doTask1;
}

if(simplify(B, 2){
   doTask1;
   doTask2;
}

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...