輸出複合命題的真值表
阿新 • • 發佈:2022-04-10
這份程式碼是我們的離散實驗。
實驗內容與要求
本實驗要求大家利用 C++語言,實現任意輸入公式的真值表計算。
請注意以下約定:
輸入公式要由( )確定優先順序。
同時為了方便鍵盤輸入做如下規定:
- 用 ! 代替 非 操作
- 用 && 代替 ∧ 操作
- 用 || 代替 ∨ 操作
- 用 <> 代替 ↔ 操作
- 保持操作→ 不變
要求依據上述運算規則,實現任意給定公式真值表的計算,並顯示運算結果。
實驗資料及結果分析
實驗執行結果示例如下:
P∧Q∨R ↔ ┐S 真值,
應輸入:((P&&Q)||R)<>(!S)
執行結果如下:
Q R S P ((P&&Q)||R)<>(!S)
0 0 0 0 0
0 0 0 1 0
0 0 1 0 1
0 0 1 1 1
0 1 0 0 1
0 1 0 1 1
0 1 1 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 1 1
1 0 1 0 1
1 0 1 1 0
1 1 0 0 1
1 1 0 1 1
1 1 1 0 0
1 1 1 1 0
我的程式碼
我覺得大概弄懂這份程式碼的話,想要修改還是挺容易的,這裡面我有些模稜兩可和偷懶的地方,都很好改動。
#include<bits/stdc++.h> using namespace std; const int N=1e3; char all[N]; bool e[N]; int cnt=0,sum=0; stack<char>Stack; stack<bool>cal;//calculate string s,temp; void cinn() { cout<<"輸入邏輯表達公式:"<<endl; cin>>temp; } //Determine operator precedence bool judge(char a,char b) { int x=0,y=0; if(a=='!') x=5; else if(a=='&') x=4; else if(a=='|') x=3; else if(a=='-') x = 2; else if(a=='=') x=1; if(b=='!') y=5; else if(b=='&') y=4; else if(b=='|') y=3; else if(b=='-') y=2; else if(b=='=') y=1; return x>y; } bool deny(bool p){return !p;} bool And(bool p, bool q){return p&&q;} bool Or(bool p, bool q){return p||q;} bool doublecondition(bool p,bool q){return (!p||q)&&(!q||p);} bool equall(bool p,bool q){return p==q;} bool Calculate() { while(!cal.empty()) cal.pop(); int num=0; for(int i=0;i<cnt;i++){ bool x,y; if(all[i]<='Z'&&all[i]>='A'){ cal.push(e[num++]); } else if(all[i]=='!'){ x=cal.top(); cal.pop(); cal.push(deny(x)); } else{ x=cal.top(); cal.pop(); y=cal.top(); cal.pop(); if(all[i]=='&') cal.push(And(x,y)); else if(all[i]=='|') cal.push(Or(x,y)); else if(all[i] == '-') cal.push(doublecondition(x,y)); else if(all[i]=='=') cal.push(equall(x,y)); } } return cal.top(); } void solve() { for(int i=0;i<s.size();i++){ if(s[i]<='Z'&&s[i]>='A'){ all[cnt++]=s[i]; } else{ if(s[i]=='(') Stack.push(s[i]); else if(s[i]==')'){ //如果是有括號彈掉左括號之前的所以的運算子 while(!(Stack.top()=='(')){ all[cnt++]=Stack.top(); Stack.pop();//彈左括號 } } else{ if(Stack.empty()) Stack.push(s[i]); else{ //如果當前複合優先順序小於等於棧頂符號的就彈棧 while(!judge(s[i],Stack.top())){ all[cnt++]=Stack.top(); Stack.pop(); if(Stack.empty()) break; } Stack.push(s[i]); } } } } while(!Stack.empty()){ if(Stack.top()!='('&&Stack.top()!=')') all[cnt++]=Stack.top(); Stack.pop(); } } void dfs(int deep) { if(deep>=sum){ for(int i=0;i<sum;i++){ cout<<e[i]<<" "; } cout<<Calculate()<<endl; return; } e[deep]=1; dfs(deep+1); e[deep]=0; dfs(deep+1); } void change() { int j=0,k=0; for(int i=0;i<temp.size();i++){ if(temp[i]<='Z'&&temp[i]>='A'){ s+=temp[i];sum++; } else if(temp[i]=='&'&&temp[i+1]=='&'){ s+='&';i++; } else if(temp[i]=='|'&&temp[i+1]=='|'){ s+='|';i++; } else if(temp[i]=='<'&&temp[i+1]=='>'){ s+='-';i++; } else if(temp[i]=='-'&&temp[i+1]=='>'){ s+='=';i++; } else if(temp[i]=='!') s+=temp[i]; else if(temp[i]=='(') s+=temp[i]; else if(temp[i]==')') s+=temp[i]; } } int main() { cinn(); change(); solve(); for(int i=0;i<s.size();i++){ if(s[i]<='Z'&&s[i]>='A') printf("%c ",s[i]); } for(int i=0;i<temp.size();i++){ cout<<temp[i]; }cout<<endl; dfs(0); }