C 實現邏輯表示式的真值表建立與等價判定

2022-10-11 11:24:08 字數 2347 閱讀 3491

首先設計真值表的adt:

class truetable

}for(int i=0;itable[i][k1-1]!=t.table[i][k2-1]) return 0;

}return 1;

}void cal_not(string s)

}vectorv;

initiallise_r(v,k); //初始化基本元素的真值表

reorder();

return ;

}void initiallise_r(vectorv,int k)

return ;

} else

return ;}}

void printtable()

}for(int i=0;itable[i][k1-1]!=t.table[i][k2-1]) return 0;

}return 1;

}void cal_not(string s)

}vectorv;

initiallise_r(v,k); //初始化基本元素的真值表

reorder();

return ;

}void initiallise_r(vectorv,int k)

return ;

} else

return ;}}

void printtable()

void logicconstruct(string s,truetable &t)}}

t.initiallise();

for(int i=0;i"+str[1]);

i=i-1;

break;

};case 2: else }}

break;

}case '(':;

case 2: else }}

break;

}case ')':

case ' ':break;}}

return;

}int main()

首先確定將命題與真值分開儲存到兩個動態陣列中,先掃一遍輸入的邏輯表示式,將其中的基本命題新增至真值表中並進行排序,方便後續比較。

再根據基本命題的個數確定真值表的行數column,同時利用遞迴函式代替迴圈的巢狀初始化真值表,將基本命題的真值表構造出來。利用initiallise函式初始化該真值表即可。

然後編寫各種邏輯運算的處理函式,處理完畢後將新的組合命題和真值新增至表中,真值只需要在原有陣列的某尾直接新增即可,行數不變,列數隨著命題數量的增加而增加。

表示式的分析運用到了棧處理運算子與中綴表示式的思路,因此最後乙個完成計算的命題一定是輸入的復合命題,比較真值表時只需要比較最後一列即可。

處理真值與命題的對應關係運用的是搜尋函式,但由於有括號的存在,被儲存的命題最外層是沒有括號的,這就會導致括號包裹後的命題無法被識別,因此搜尋函式需要處理最外層的括號(如果存在的話)。同樣運算子的優先順序用到了矩陣來表示。

由於條件運算子->的程度為2,c++不能用switch處理字串,因此處理運算子在矩陣的下標時需要額外關照->,為其設定乙個額外的判准-,同時處理的如果是條件運算子則用於遍歷的指標i需要跳躍兩格,因此要在末尾額外加一。

switch的處理邏輯不同會導致程式的編寫思路不同,如果用於分類棧頂符號,好處是可以避免二次分類判斷需要呼叫的邏輯運算函式,壞處是要額外判斷當前讀到的符號是否特殊,如佔兩位的"->" 需要指標額外前進一格,空格需要被忽略,是否非運算子而是命題的名稱(這裡小偷乙個懶預設命題的名稱長度為1);若用於分類當前讀到的符號s[i]則需要二次分類判定呼叫的邏輯運算函式,比較優先順序時由於視角不同設定的判准也會有所改變,如遇到右括號在預設語法合法的情況下(其實是懶得寫出錯)可以給棧頂命題加上括號(這個很重要,會影響輸出命題名稱的嚴謹性),而在前一種情況中是不可能分類出右括號的。

當遇到括號時右括號始終不推入棧,而是一直比較直到碰到左括號消除為止。

運算子的優先順序矩陣是非嚴格等級排列的,而只有乙個相對等級,這是因為從左向右運算也是乙個潛在的優先順序判准,以及界限符的一些特殊性質也有所影響。

string[i]的寫法在c++中會返回乙個char型別的資料,不能直接用於棧,因此需要用到string.substr(pos,n)返回從下標"pos"開始的n個字母組成的子串。同時c++中的類編寫沒有js那麼方便,鍵值對的鍵不是字串而是變數,要想通過字串檢索下標只能通過stl的map或者編寫分類函式來實現,不是很方便。

輸出命題公式的真值表 字尾表示式)

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述先輸入乙個正整數n n小於等於10 表示共有n個命題變元,再輸入乙個類似於逆波蘭表示式的字串表示乙個命題公式,約定在該字串中用一位的十進位制數表示乙個命題變元,用a o n i e分別表示且 或 非 蘊含 等值,用類似於逆波蘭表...

離散數學中的命題表示式計算並生成真值表

雖然很簡單吧,但是畢竟算是除了刷題外第乙個自己寫出來的有一點用的 所以還是打算水一篇部落格 主要思路就是把式子轉化成字尾表示式,然後再用字尾表示式求值的方法來計算,其中每個命題變元的情況是用沒有剪枝的深搜列舉出來的 下面是 ps 第一版 的條件語句計算出了點問題,已經改了,順便加了個多組輸入 inc...

離散數學中的命題表示式計算並生成真值表

雖然很簡單吧,但是畢竟算是除了刷題外第乙個自己寫出來的有一點用的 所以還是打算水一篇部落格 主要思路就是把式子轉化成字尾表示式,然後再用字尾表示式求值的方法來計算,其中每個命題變元的情況是用沒有剪枝的深搜列舉出來的 下面是 ps 第一版 的條件語句計算出了點問題,已經改了,順便加了個多組輸入 inc...