Cod sursa(job #2642906)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 17 august 2020 17:37:34
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include <fstream>

using namespace std;

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

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

int EvaluareExpresie();
int EvaluareTermen();
int EvaluareFactor();


int main()
{
    int n, y;

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

        fin.get(x);
    }

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

    fin>>n; fin.get();

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

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

}

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

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

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

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

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

        else i=i+2;
    }

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

    return x;

}

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

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


    while(i<lg && ok )
    {
        x=(x && EvaluareFactor() );

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

        else i=i+3;

    }

    return x;
}

int EvaluareFactor()
{
    bool neg=0;
    int aux, 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;
    }
    //else
   // cout<<(ver==1?0:1)<<"\n";

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