输出复合命题的真值表
这份代码是我们的离散实验。
实验内容与要求
本实验要求大家利用 C++语言,实现任意输入公式的真值表计算。
请注意以下约定:
输入公式要由( )确定优先级。
同时为了方便键盘输入做如下规定:
- 用 ! 代替 非 操作
- 用 && 代替 ∧ 操作
- 用 || 代替 ∨ 操作
- 用 <> 代替 ↔ 操作
- 保持操作→ 不变
要求依据上述运算规则,实现任意给定公式真值表的计算,并显示运算结果。
实验数据及结果分析
实验运行结果示例如下:
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);
}

浙公网安备 33010602011771号