深圳幻海软件技术有限公司 欢迎您!

真值表(Ⅱ)

2023-07-03

题目描述第二阶段的任务是给定一个逻辑表达式,生成真值表。输入同真值表(Ⅰ)。输出对于每一个逻辑表达式,输出其对应的真值表即可。相对于任务一,输出的最右边增加了一列,包含了表达式和它的各个值。具体见样例。样例输入pp->qp||q样例输出pp1100pqp->q111100011001pq

题目描述

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

输入

同真值表(Ⅰ)。

输出

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

样例输入

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览48678 人正在系统学习中