离散数学逻辑运算符C++实现
来源:互联网 发布:贵州省政法委数据维稳 编辑:程序博客网 时间:2024/05/17 08:25
/*离散数学老师留的课下实验,上网查找没有免费的,较为完善的C++代码,
就通过学习,自己敲了一组代码,实现各个逻辑运算符之间的简单运算,
用到了STL,栈的出入,逆波兰表达式和递归,对初学者来说有一点小难度
程序还有许多不完美的地方,但大体功能已经可以实现,
希望能给需要的同学带来帮助*/
#include<iostream>
#include<map>
#include<vector>
#include<stack>
#include<string.h>
using namespace std;
string s;
stack<char>a,b;
vector<char>v;
map<char,int>c;
//非!,合取+,析取-,条件~,双条件#
int k;
bool flag0;
int Combine(int flag1,int flag2)
{
if(flag1==1&&flag2==1)
return 1;
else
return 0;
}
int Also(int flag1,int flag2)
{
if(flag1==1||flag2==1)
return 1;
else
return 0;
}
int Condition(int flag1,int flag2)
{
if(flag2==1&&flag1==0)//前真后假则为假,其余为真
{
return 0;
}
else
return 1;
}
int Deny(int flag0)
{
if(flag0==0)
{
return 1;
}
else if(flag0==1)
{
return 0;
}
}
int Double_Condition(int flag1,int flag2)
{
if(flag1==0&&flag2==1)
return 0;
if(flag1==1&&flag2==0)
return 0;
return 1;
}
int cal_expression_P1_Q0()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=1;
return 1;
}
else if(v[k]=='Q')
{
flag=0;
return 0;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P1_Q0();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=1;
return 1;
}
else if(v[k]=='Q')
{
k++;
flag=0;
return 0;
}
return flag;
}
int cal_expression_P0_Q0()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=0;
return flag;
}
else if(v[k]=='Q')
{
flag=0;
return flag;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P0_Q0();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=0;
return flag;
}
else if(v[k]=='Q')
{
k++;
flag=0;
return flag;
}
return flag;
}
int cal_expression_P1_Q1()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=1;
return flag;
}
else if(v[k]=='Q')
{
flag=1;
return flag;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P1_Q1();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=1;
return flag;
}
else if(v[k]=='Q')
{
k++;
flag=1;
return flag;
}
return flag;
}
int cal_expression_P0_Q1()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=0;
return flag;
}
else if(v[k]=='Q')
{
flag=1;
return flag;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P0_Q1();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=0;
return flag;
}
else if(v[k]=='Q')
{
k++;
flag=1;
return flag;
}
return flag;
}
int main()
{
int num=1;
c['~']=1,c['-']=2,c['+']=3,c['!']=4,c['(']=0;
cout<<"输入以字母,括号(英文),操作符组合的命题换元公式"<<endl<<endl;
cout<<"只能输入任意数量的P,Q(大写)两种命题组成公式"<<endl<<endl;
cout<<"对于输入的每组公式,输出其真值表"<<endl<<endl;
cout<<"****** ! 表示非 ******"<<endl<<endl;
cout<<"****** - 表示析取 ******"<<endl<<endl;
cout<<"****** + 表示合取 ******"<<endl<<endl;
cout<<"****** ~ 表示条件 ******"<<endl<<endl;
cout<<"****** # 表示双条件 ******"<<endl<<endl;
cout<<"****** 输入Quit退出 ******"<<endl<<endl;
cout<<"例如:"<<"P~(P-Q+P)"<<endl;
cout<<endl<<"公式1:";
while(cin>>s)
{
if(s=="Quit")
{
break;
}
while(!a.empty())
a.pop();
while(!b.empty())
b.pop();
v.clear();
for(int i=0;i<s.length();i++)
{
if(s[i]=='P'||s[i]=='Q')
{
a.push(s[i]);
}
else
{
if(b.empty())
b.push(s[i]);
else
{
char temp;
if(s[i]==')')
{
while(b.top()!='(')
{
temp=b.top();
a.push(temp);
b.pop();
}
b.pop();
}
else if(s[i]=='(')
{
b.push(s[i]);
}
else
{
temp=b.top();
if(c[s[i]]>=c[temp])//如果新字符优先级大
b.push(s[i]);//直接入b栈
else//如果新字符优先级小
{
a.push(temp);//将出栈元素压入a栈
b.pop();//b中栈顶元素出栈
b.push(s[i]);
}
}
}
}
}
while(!b.empty())
{
char temp2=b.top();
a.push(temp2);
b.pop();
}
while(!a.empty())
{
char temp1=a.top();
v.push_back(temp1);
a.pop();
}
cout<<"P"<<" "<<"Q"<<" "<<s<<endl;
k=0;
cout<<"1"<<" "<<"0"<<" "<<cal_expression_P1_Q0()<<endl;
k=0;
cout<<"0"<<" "<<"0"<<" "<<cal_expression_P0_Q0()<<endl;
k=0;
cout<<"1"<<" "<<"1"<<" "<<cal_expression_P1_Q1()<<endl;
k=0;
cout<<"0"<<" "<<"1"<<" "<<cal_expression_P0_Q1()<<endl;
cout<<endl<<"公式"<<++num<<":";
}
return 0;
}
就通过学习,自己敲了一组代码,实现各个逻辑运算符之间的简单运算,
用到了STL,栈的出入,逆波兰表达式和递归,对初学者来说有一点小难度
程序还有许多不完美的地方,但大体功能已经可以实现,
希望能给需要的同学带来帮助*/
#include<iostream>
#include<map>
#include<vector>
#include<stack>
#include<string.h>
using namespace std;
string s;
stack<char>a,b;
vector<char>v;
map<char,int>c;
//非!,合取+,析取-,条件~,双条件#
int k;
bool flag0;
int Combine(int flag1,int flag2)
{
if(flag1==1&&flag2==1)
return 1;
else
return 0;
}
int Also(int flag1,int flag2)
{
if(flag1==1||flag2==1)
return 1;
else
return 0;
}
int Condition(int flag1,int flag2)
{
if(flag2==1&&flag1==0)//前真后假则为假,其余为真
{
return 0;
}
else
return 1;
}
int Deny(int flag0)
{
if(flag0==0)
{
return 1;
}
else if(flag0==1)
{
return 0;
}
}
int Double_Condition(int flag1,int flag2)
{
if(flag1==0&&flag2==1)
return 0;
if(flag1==1&&flag2==0)
return 0;
return 1;
}
int cal_expression_P1_Q0()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=1;
return 1;
}
else if(v[k]=='Q')
{
flag=0;
return 0;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P1_Q0();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P1_Q0();
flag2=cal_expression_P1_Q0();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=1;
return 1;
}
else if(v[k]=='Q')
{
k++;
flag=0;
return 0;
}
return flag;
}
int cal_expression_P0_Q0()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=0;
return flag;
}
else if(v[k]=='Q')
{
flag=0;
return flag;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P0_Q0();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P0_Q0();
flag2=cal_expression_P0_Q0();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=0;
return flag;
}
else if(v[k]=='Q')
{
k++;
flag=0;
return flag;
}
return flag;
}
int cal_expression_P1_Q1()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=1;
return flag;
}
else if(v[k]=='Q')
{
flag=1;
return flag;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P1_Q1();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P1_Q1();
flag2=cal_expression_P1_Q1();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=1;
return flag;
}
else if(v[k]=='Q')
{
k++;
flag=1;
return flag;
}
return flag;
}
int cal_expression_P0_Q1()
{
int flag;
int flag1,flag2;
if(k==v.size()-1)
{
if(v[k]=='P')
{
flag=0;
return flag;
}
else if(v[k]=='Q')
{
flag=1;
return flag;
}
}
if(v[k]=='+')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Combine(flag1,flag2);
}
else if(v[k]=='-')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Also(flag1,flag2);
}
else if(v[k]=='~')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Condition(flag1,flag2);
}
else if(v[k]=='!')
{
k++;
flag1=cal_expression_P0_Q1();
flag=Deny(flag1);
}
else if(v[k]=='#')
{
k++;
flag1=cal_expression_P0_Q1();
flag2=cal_expression_P0_Q1();
flag=Double_Condition(flag1,flag2);
}
else if(v[k]=='P')
{
k++;
flag=0;
return flag;
}
else if(v[k]=='Q')
{
k++;
flag=1;
return flag;
}
return flag;
}
int main()
{
int num=1;
c['~']=1,c['-']=2,c['+']=3,c['!']=4,c['(']=0;
cout<<"输入以字母,括号(英文),操作符组合的命题换元公式"<<endl<<endl;
cout<<"只能输入任意数量的P,Q(大写)两种命题组成公式"<<endl<<endl;
cout<<"对于输入的每组公式,输出其真值表"<<endl<<endl;
cout<<"****** ! 表示非 ******"<<endl<<endl;
cout<<"****** - 表示析取 ******"<<endl<<endl;
cout<<"****** + 表示合取 ******"<<endl<<endl;
cout<<"****** ~ 表示条件 ******"<<endl<<endl;
cout<<"****** # 表示双条件 ******"<<endl<<endl;
cout<<"****** 输入Quit退出 ******"<<endl<<endl;
cout<<"例如:"<<"P~(P-Q+P)"<<endl;
cout<<endl<<"公式1:";
while(cin>>s)
{
if(s=="Quit")
{
break;
}
while(!a.empty())
a.pop();
while(!b.empty())
b.pop();
v.clear();
for(int i=0;i<s.length();i++)
{
if(s[i]=='P'||s[i]=='Q')
{
a.push(s[i]);
}
else
{
if(b.empty())
b.push(s[i]);
else
{
char temp;
if(s[i]==')')
{
while(b.top()!='(')
{
temp=b.top();
a.push(temp);
b.pop();
}
b.pop();
}
else if(s[i]=='(')
{
b.push(s[i]);
}
else
{
temp=b.top();
if(c[s[i]]>=c[temp])//如果新字符优先级大
b.push(s[i]);//直接入b栈
else//如果新字符优先级小
{
a.push(temp);//将出栈元素压入a栈
b.pop();//b中栈顶元素出栈
b.push(s[i]);
}
}
}
}
}
while(!b.empty())
{
char temp2=b.top();
a.push(temp2);
b.pop();
}
while(!a.empty())
{
char temp1=a.top();
v.push_back(temp1);
a.pop();
}
cout<<"P"<<" "<<"Q"<<" "<<s<<endl;
k=0;
cout<<"1"<<" "<<"0"<<" "<<cal_expression_P1_Q0()<<endl;
k=0;
cout<<"0"<<" "<<"0"<<" "<<cal_expression_P0_Q0()<<endl;
k=0;
cout<<"1"<<" "<<"1"<<" "<<cal_expression_P1_Q1()<<endl;
k=0;
cout<<"0"<<" "<<"1"<<" "<<cal_expression_P0_Q1()<<endl;
cout<<endl<<"公式"<<++num<<":";
}
return 0;
}
1 0
- 离散数学逻辑运算符C++实现
- 用C\C++实现离散数学简单逻辑运算
- <<离散数学>>逻辑运算
- C语言实现离散数学中的命题逻辑
- C语言逻辑运算符
- C的逻辑运算符
- C 逻辑运算符
- C语言逻辑运算符
- C语言中的逻辑运算符
- C语言(10)------逻辑运算符
- C语言中的逻辑运算符
- 53 C语言逻辑运算符
- 1.9 c++_逻辑运算符
- C语言 实现离散数学合式公式真值表
- C逻辑运算
- 浅谈C语言程序设计的逻辑运算符
- c语言逻辑运算符使用分析.
- C语言位操作--逻辑运算符组合
- 0416
- 如何快速转载CSDN中的博客
- JAVA保存文件
- 面向对象原则:高内聚、低耦合。
- 机器学习实战 step-01
- 离散数学逻辑运算符C++实现
- Q104:怎么用ray tracing画基于磨边楔形的“花环(Rosette)”
- java--面向对象
- <<HTML5从入门到精通>>
- 计算某日是该年第几天
- JAVA去重复字符串
- android标题栏中添加返回按钮
- Spring Task 任务调度器
- layabox笔记 目录结构