离散数学逻辑运算符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;
}
1 0