1. 程式人生 > 其它 >輸出複合命題的真值表

輸出複合命題的真值表

這份程式碼是我們的離散實驗。

實驗內容與要求

本實驗要求大家利用 C++語言,實現任意輸入公式的真值表計算。
請注意以下約定:
輸入公式要由( )確定優先順序。
同時為了方便鍵盤輸入做如下規定:

  1. 用 ! 代替 非 操作
  2. 用 && 代替 ∧ 操作
  3. 用 || 代替 ∨ 操作
  4. 用 <> 代替 ↔ 操作
  5. 保持操作→ 不變

要求依據上述運算規則,實現任意給定公式真值表的計算,並顯示運算結果。

實驗資料及結果分析

實驗執行結果示例如下:

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

我參考學習的連結