如何简化复合求反逻辑

时间:2019-02-15 17:18:01

标签: c if-statement logic

让我们说我有布尔值B []的数组,或者我正在使用函数确定是非。我如何简化此代码,因为它有很多值(可能是几十个)?这是伪代码:

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 if为true,第二个为true)同样,我仍然只需要发生一次)

3 个答案:

答案 0 :(得分:2)

您可以使用函数指针数组。

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]();
  }

答案 1 :(得分:1)

函数指针是解决问题的方法。 如果您不喜欢函数指针,则可以使用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;
}

答案 2 :(得分:1)

(假设您希望多次执行同一任务,即使您的原始代码会这样做)

制作一个函数doTask(),该函数将采用要执行的任务的编号(或仅创建一个函数指针数组)。然后:

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

或更简洁地说:

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