Cod sursa(job #1074799)

Utilizator gapdanPopescu George gapdan Data 7 ianuarie 2014 23:09:06
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
#include<cstring>
using namespace std;
int val[50];;
char s[1001],sir[101],v[1001];
int n,p;
int eval();
int termen();
int factor();
int AND();
int main()
{
    fstream f("bool.in",ios::in);
    fstream g("bool.out",ios::out);
    f.getline(s,1001);
    int x=strlen(s);
    int i=0,k=-1;
    while (i<x)
    {
        if (s[i]=='A' && s[i+1]=='N') {v[++k]='&',i+=3;}
            else if (s[i]=='O' && s[i+1]=='R') {v[++k]='|',i+=2;}
                else if (s[i]=='N' && s[i+1]=='O') {v[++k]='!',i+=3;}
                    else if (s[i]=='T' && s[i+1]=='R') {v[++k]='1';i+=4;}
                        else if (s[i]=='F' && s[i+1]=='A') {v[++k]='0';i+=5;}
                    else if (s[i]!=' ') v[++k]=s[i],++i;
                        else ++i;
    }
    f>>n;
    char c;
    for (int o=1;o<=n;++o)
    {
        f>>c;
        val['Z'-c]=!val['Z'-c];
        p=0;
       g<<eval();
    }
    g<<'\n';
    return 0;
}
int eval()
{
    int r=AND();
    while (v[p]=='|')
    {
                ++p;
                int x=AND();
                r|=x;
    }
    return r;
}
int AND()
{
    int r=termen();
   while (v[p]=='&')
   {
        ++p;
        int x=termen();
        r&=x;
    }
    return r;
}
int termen()
{
  int r=factor();
    while (v[p]=='!')
    {
        ++p;
        r=!factor();
    }
    return r;
}
int factor()
{
    int r=0;
    if (v[p]=='(') {++p;r=eval();++p;}
        else if (v[p]>='A' && v[p]<='Z') r=val['Z'-v[p]],p+=1;
            else if (v[p]=='0') return 0;
                else if (v[p]=='1') return 1;
    return r;
}