Cod sursa(job #2256088)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 7 octombrie 2018 22:25:33
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");


int expresie();
int sau();
int si();

int i,fv[30],lg;
char c,s[1100],S[1100];


int expresie()
{
    int val,ok=0;
    if(S[i]=='(')
    {
        i++;
        val=sau();
        i++;
    }
    else if(S[i]=='!')
    {

        i++;
        ok=1;
        val=expresie();

    }
    else if('A'<=S[i]&&S[i]<='Z')
    {

        val=fv[S[i]-'A'+1];
        i++;
    }
    else if(S[i]=='0'||S[i]=='1')
    {

        val=S[i]-'0';
    }

    if(ok==1)
    {
        if(val==1)val=0;
        else val=1;
    }

    return val;
}


int si()
{

    int val;
    val=expresie();
    while(i<lg && (S[i]=='&'))
    {
        i++;
        val=(val&expresie());

    }
    return val;
}

int sau()
{

    int val;
    val=si();

    while(i<=lg && (S[i]=='^'))
    {
        i++;
        val=(val|si());
    }
    return val;
}


int n,j;
int main()
{
    f.getline(s,1100);
    lg=-1;
    i=0;
    while(i<strlen(s))
    {
        if(s[i]=='('||s[i]==')')
        {
            lg++;
            S[lg]=s[i];
             i++;
        }
        else if(s[i]=='A'&&s[i+1]=='N')
        {
            i=i+3;
            lg++;
            S[lg]='&';

        }
        else if(s[i]=='O'&&s[i+1]=='R')
        {
            i=i+2;
            lg++;
            S[lg]='^';
        }
        else if(s[i]=='N'&&s[i+1]=='O')
        {
            i=i+3;
            lg++;
            S[lg]='!';
        }
        else if(s[i]=='F'&&s[i+1]=='A')
        {
            i=i+5;
            lg++;
            S[lg]='0';
        }
        else if(s[i]=='T'&&s[i+1]=='R')
        {
            i=i+4;
            lg++;
            S[lg]='1';
        }
        if(s[i]==' '){i++;}
        else
        {

            lg++;
            S[lg]=s[i];
            i++;
        }
    }

    S[lg+1]='\0';



    f>>n;

    for(j=1;j<=n;j++)
    {
        f>>c;
        if(fv[c-'A'+1]==0)fv[c-'A'+1]=1;
        else fv[c-'A'+1]=0;
        i=0;
        g<<sau();

    }


    return 0;
}