Cod sursa(job #2642931)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 17 august 2020 18:49:01
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("bool.in");
ofstream fout ("bool.out");

char s[1002];
int o[27];
int i, lg;

bool EvaluareExpresie();
bool EvaluareTermen();
bool EvaluareFactor();


int main()
{
    int n, y;
    char h;

    fin.get(h);
    while(h!='\n')
    {
        if(h!=' ')
        {
            lg++;
            s[lg-1]=h;
        }

        fin.get(h);
    }

    s[lg]='\0';
    //cout<<s<<"\n";

    fin>>n; fin.get();

    for(y=1; y<=n; y++)
    {
        fin>>h;
        o[h-'A'+1]=(o[h-'A'+1]==1?0:1);

        i=0;
        fout<<EvaluareExpresie();
    }

}

bool EvaluareExpresie()
{
    bool x=EvaluareTermen();
    bool ok;

    //cout<<"x= "<<x<<"\ni= "<<i<<"\n\n";

    ok=1;
    if(s[i]!='O' || s[i+1]!='R')
    {
        ok=0;
    }

    else i=i+2;

    while(i<lg && ok)
    {
        //cout<<"i= "<<i<<"\n";
        bool evaluare=EvaluareTermen();
        //cout<<"evaluare= "<<evaluare<<"\n";
        x=(x || evaluare );

        //cout<<"x= "<<x<<"\n\n";

        if(s[i]!='O' || s[i+1]!='R')
        {
            ok=0;
        }

        else i=i+2;
    }

    if(s[i]==')')
    {
        i++; //sar peste paranteza
    }

    return x;

}

bool EvaluareTermen()
{
    bool x=EvaluareFactor();
    bool ok;

    //cout<<"x= "<<x<<"\ni= "<<i<<"\n\n";

    ok=1;
    if(s[i]!='A' || s[i+1]!='N' || s[i+2]!='D')
    {
        ok=0;
    }

    else i=i+3;

    while(i<lg && ok )
    {
        //cout<<"i= "<<i<<"\n";
        bool evaluare=EvaluareFactor();
        //cout<<"evaluare= "<<evaluare<<"\n";
        x=(x && evaluare );
        //cout<<"x= "<<x<<"\n\n";

        if(s[i]!='A' || s[i+1]!='N' || s[i+2]!='D')
        {
            ok=0;
        }

        else i=i+3;

    }

    return x;
}

bool EvaluareFactor()
{
    bool neg=0, aux;
    int ver;

    while(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
    {
        i=i+3; //sar peste "NOT"
        neg=(neg==1?0:1);
    }

    if(s[i]=='(')
    {
        i++; //sar peste paranteza
        aux=EvaluareExpresie();

        if(neg==0)return aux;
        //else
        return (aux==1?0:1);

    }

    //else
    //cout<<"i= "<<i+1<<"\n";

    //verific daca este "TRUE" sau "FALSE"

    ver=o[ s[i]-'A'+1 ]; //in cazul in care este doar o variabila

    if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
    {
        i=i+4;
        ver=1;
    }

    else if(s[i]=='F' && s[i+1]=='A' && s[i+2] == 'L' && s[i+3]=='S' && s[i+4]=='E')
    {
        i=i+5;
        ver=0;
    }

    else i++; //sar peste caracter

    if(neg==0)
    {
        //cout<<ver<<"\n";
        return (ver==1?1:0);
    }
    //else
   // cout<<(ver==1?0:1)<<"\n";

    return (ver==1?0:1);
}