真值表(Ⅱ)

题目描述

第二阶段的任务是给定一个逻辑表达式,生成真值表。

输入

真值表(Ⅰ)

输出

对于每一个逻辑表达式,输出其对应的真值表即可。相对于任务一,输出的最右边增加了一列,包含了表达式和它的各个值。具体见样例。

样例输入

p
p->q
p||q

样例输出

p p
1 1
0 0
p q p->q
1 1 1
1 0 0
0 1 1
0 0 1
p q p||q
1 1 1
1 0 1
0 1 1
0 0 0

解决方案

#include <bits/stdc++.h>
#define MAXSIZE 201
using namespace std;
 
int re(int aa,int bb,char ch)
{
    if(ch=='|')
    {
        if(aa==0&&bb==0)
            return 0;
        else return 1;
    }
    else if(ch=='^')
    {
        if(aa==1&&bb==1)
            return 1;
        else return 0;
    }
    else if(ch=='-')
    {
        if(aa==1&&bb==1)
            return 1;
        else if(aa==1&&bb==0)
            return 0;
        else return 1;
    }
    else if(ch=='<')
    {
        if(aa==1&&bb==1)
            return 1;
        else if(aa==0&&bb==0)
            return 1;
        else
            return 0;
    }
    return 0;
}
 
void cal(int sum,int j,char b[],char alg[])
{
    int i;
    int a[11]= {0};
    int flag=0;
    while(sum/2)
    {
        a[flag]=sum%2;
        flag++;
        sum/=2;
    }
    a[flag]=sum;
    flag++;
    for(i=j-1; i>=0; i--)
    {
        printf("%d ",a[i]);
    }
    stack<int> opnd;
    stack<char> optr;
    sort(alg,alg+j);
    for(i=0; i<strlen(b);)
    {
        if(b[i]>='a'&&b[i]<='z')
        {
            for(int jj=0; jj<j; jj++)
            {
                if(b[i]==alg[jj])
                {
                    opnd.push(a[j-jj-1]);
                }
            }
            i++;
            continue;
        }
        if((optr.empty()==true)&&(!(b[i]>='a'&&b[i]<='z')))
        {
            optr.push(b[i]);
            if(b[i]=='|'||b[i]=='-')
            {
                i+=2;
            }
            else if(b[i]=='^'||b[i]=='!'||b[i]=='('||b[i]==')')
            {
                i++;
            }
            else if(b[i]=='<')i+=3;
            continue;
        }
        if(opnd.empty()==true&&b[i]=='!')
        {
            optr.push(b[i]);
            i++;
            continue;
        }
        int pan,x,y;
        if((optr.top()=='(')&&(b[i]==')'))
        {
            pan=0;
        }
        else if(b[i]==')')pan=1;
        else if(optr.top()=='(')pan=-1;
        else if(b[i]=='(')pan=-1;
        else
        {
            if(b[i]=='!')x=5;
            else if(b[i]=='^')x=4;
            else if(b[i]=='|')x=3;
            else if(b[i]=='-')x=2;
            else x=1;
            if(optr.top()=='!')y=5;
            else if(optr.top()=='^')y=4;
            else if(optr.top()=='|')y=3;
            else if(optr.top()=='-')y=2;
            else y=1;
            if(x-y>0)pan=-1;
            else pan=1;
        }
        switch(pan)
        {
        case -1:
        {
            optr.push(b[i]);
            break;
        }
        case 0:
        {
            optr.pop();
            break;
        }
        case 1:
        {
            char ch;
            ch=optr.top();
            optr.pop();
            if(ch=='!')
            {
                int aa=opnd.top();
                aa=!aa;
                opnd.top()=aa;
                break;
            }
            else
            {
                int aa,bb;
                bb=opnd.top();
                opnd.pop();
                aa=opnd.top();
                opnd.pop();
                opnd.push(re(aa,bb,ch));
                break;
            }
        }
        }
        if(pan==1)continue;
        if((b[i]=='|')||(b[i]=='-'))
        {
            i+=2;
        }
        else if((b[i]=='^')||(b[i]=='!')||(b[i]=='(')||(b[i]==')'))
        {
            i++;
        }
        else
        {
            i+=3;
        }
    }
    while(optr.empty()!=true)
    {
        char ch;
        ch=optr.top();
        optr.pop();
        if(ch=='!')
        {
            int aa;
            aa=opnd.top();
            aa=!aa;
            opnd.top()=aa;
        }
        else
        {
            int bb,aa;
            bb=opnd.top();
            opnd.pop();
            aa=opnd.top();
            opnd.pop();
            opnd.push(re(aa,bb,ch));
        }
    }
    printf("%d",opnd.top());
    printf("\n");
}
 
int main()
{
    char str[MAXSIZE];
    int i,j,k;
    while(gets(str))
    {
        int a[260]= {0};
        char alg[260];
        char b[200];
        j=k=0;
        for(i=0; str[i]!='\0'; i++)
        {
            if(str[i]!=' ')
            {
                b[k]=str[i];
                k++;
            }
            if(str[i]>='a'&&str[i]<='z')
            {
                int b=str[i];
                if(a[b-97]==0)
                {
                    a[b-97]=1;
                    alg[j]=str[i];
                    j++;
                }
            }
 
        }
        b[k]='\0';
        for(i=0; i<=25; i++)
        {
            if(a[i]==1)
            {
                printf("%c ",i+97);
            }
        }
        cout<<str<<endl;
        int sum=pow(2,j)-1;
        while(sum>=0)
        {
            cal(sum,j,b,alg);
            sum--;
        }
    }
    return 0;
}

  • 17
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值