输出复合命题的真值表

这份代码是我们的离散实验。

实验内容与要求

本实验要求大家利用 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);
}

我参考学习的链接

posted @ 2022-04-10 15:44  KSZBE  阅读(426)  评论(0)    收藏  举报