逻辑等价判断

写一段程序,测试p和q两个逻辑表达式是否逻辑相等
 用真值表判断
 输入的逻辑表达式为命题逻辑表达式
 输入的逻辑表达式可以为复合命题,可包含四种联接词:与,或,非,条件

编写代码,接收两个命题逻辑表达式。
2 分别为每种联接词实现其真值运算。
3.从左到右计算逻辑表达式,生成真值表,判断两个逻辑表达式是否等价

有一部分是参考别人的思路

include

include

include

include

include

using namespace std;
bool calls(char p[], bool n, bool m, bool l)
{
int length = strlen(p);
int o = 0;
bool a = 0, b = 0;
bool no = 0;
for (int i = 0; i <= length; i++)
{
if (p[i] == ‘p’)
{
b = n;
if (no == 1)
{
b = !b;
}
no = 0;
}
else if (p[i] == ‘q’)
{
b = m;
if (no == 1)
{
b = !b;
}
no = 0;
}
else if (p[i] == ‘r’)
{
b = l;
if (no == 1)
{
b = !b;
}
no = 0;
}
else
{
if (p[i] == ‘!’)
{
no = !no;
}
else if (o == 0)
{
a = b;
}
else if (o == 1)
{
a = a && b;
}
else if (o == 2)
{
a = a || b;
}
else if (o == 4)
{
a = !a || b;
}

        if (p[i] == '&' && p[i+1] == '&')
        {
            o = 1;
            i++;
        }
        else if (p[i] == '|' && p[i+1] == '|')
        {
            o = 2;
            i++;
        }
        else if (p[i] == '-' && p[i+1] == '>')
        {
            o = 4;
            i++;
        }
    }
}
return a;

}
void call(char m[],bool n[]) //进行每种情况
{

n[0] = calls(m, 1, 1, 1);
n[1] = calls(m, 1, 1, 0);
n[2] = calls(m, 1, 0, 1);
n[3] = calls(m, 1, 0, 0);
n[4] = calls(m, 0, 1, 1);
n[5] = calls(m, 0, 1, 0);
n[6] = calls(m, 0, 0, 1);
n[7] = calls(m, 0, 0, 0);

}
// 从左到右计算逻辑表达式,生成真值表

bool equ(bool a[],bool b[]) // 对打表的数值进行比较完全相等则返回1
{
for(int i=0;i<8;i++)
if(a[i]!=b[i])
return 0;
return 1;
}
int main()
{
char p[100]={0};
char q[100]={0};
bool p1[8],q1[8];
while(1)
{
cin>>q;
fflush(stdin);
cin>>p;
call(p,p1);
call(q,q1);
if(equ(p1,q1))
cout<<”YES”<

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StriveZs

用爱发电

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值