簡體   English   中英

如何簡化復合求反邏輯

[英]How to simplify compound negated 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,我仍然只需要發生一次)

您可以使用函數指針數組。

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

@編輯。

如果您想在單擊B[i]=true停止調用tasks功能,請使用以下代碼。

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

函數指針是這里的方法。 如果您不喜歡函數指針,則可以使用如下所示的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;
}

等等

(假設您不想多次執行相同的任務,即使原始代碼可以完成)

制作一個函數doTask() ,它將使用要執行的任務的數量(或僅制作一個函數指針數組)。 接着:

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

或更簡而言之:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM