Cod sursa(job #1948897)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 1 aprilie 2017 16:00:29
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<iostream>
#include<fstream>
#include<algorithm>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
int i, n, f[410], k;
char v[1010],c, s[1010];
int expresie(), termen(),factor(),OR();

int expresie()
{
    int r=OR();
    while(s[i]=='&')
    {
        i++;
        r&=OR();
    }
    return r;
}

int OR()
{
    int r=termen();
    while(s[i]=='|')
    {
        i++;
        r|=termen();
    }
    return r;
}

int termen()
{
    int r=factor();
    while(s[i]=='!')
    {
        i++;
        r=r^factor();
    }
    return r;
}

int factor()
{
    int r=0;
    if(s[i]=='(')
    {
        i++;
        r=expresie();
        i++;
    }
    else
    {
        if(s[i]>='A'&&s[i]<='Z')
        {
            r=f[s[i]];
            i++;
        }
        else
        {
            r=s[i]-'0';
            i++;
        }
    }
    return r;
}


int main()
{
    fin.get(v, 1010);
    for(i=0;v[i]!=0;i++)
    {
        if(v[i]=='A'&&v[i+1]=='N')
        {
            s[++k]='&';
            i+=2;
        }
        else
            if(v[i]=='O'&&v[i+1]=='R')
            {
                s[++k]='|';
                i+=1;
            }
            else
                if(v[i]=='N'&&v[i+1]=='O')
                {
                    s[++k]='!';
                    i+=2;
                }
                else
                    if(v[i]=='F'&&v[i+1]=='A')
                    {
                        s[++k]='0';
                        i+=4;
                    }
                    else
                        if(v[i]=='T' && v[i+1]=='R')
                        {
                            s[++k]='1';
                            i+=3;
                        }
                        else
                            if(v[i]!=' ')
                            {
                                s[++k]=v[i];
                            }
    }
    fin>>n;
    int j;
    for(j=1;j<=n;j++)
    {
        fin>>c;
        f[c]=1-f[c];
        i=1;
        fout<<expresie();
    }
    fin.close();
    fout.close();
    return 0;
}