Cod sursa(job #1501180)

Utilizator MirceaSSebe Mircea Octavian MirceaS Data 13 octombrie 2015 00:52:46
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

bool var[30];
char s[1006];

void app(bool& val, bool& neg, char op, bool newval)
{
    if(neg){newval = !newval; neg = false;}
    switch(op)
    {
    case 'o':
        val = val||newval;
        break;
    case 'a':
        val = val&&newval;
        break;
    }
}
bool evaluate(char str[], int& pos, int len)
{
    bool val = false;
    bool neg = false;
    char op = 'o';
    while(true)
    {
        if(pos==len)return val;
        switch(str[pos])
        {
        case ' ':
            pos++;
            break;
        case 'T':
            if(str[pos+1]=='R'){pos+=4; app(val,neg,op,true);}
            else{pos++; app(val,neg,op,var['T'-'A']);}
            break;
        case 'F':
            if(str[pos+1]=='A'){pos+=5; app(val,neg,op,false);}
            else{pos++; app(val,neg,op,var['F'-'A']);}
            break;
        case 'N':
            if(str[pos+1]=='O'){pos+=3; neg=!neg;}
            else{pos++; app(val,neg,op,var['N'-'A']);}
            break;
        case 'A':
            if(str[pos+1]=='N'){pos+=3; op='a';}
            else{pos++; app(val,neg,op,var['A'-'A']);}
            break;
        case 'O':
            if(str[pos+1]=='R'){pos+=2; op='o';}
            else{pos++; app(val,neg,op,var['O'-'A']);}
            break;
        case '(':
            pos++;
            app(val,neg,op,evaluate(str,pos,len));
            break;
        case ')':
            pos++;
            return val;
            break;
        default:
            app(val,neg,op,var[str[pos]-'A']);
            pos++;
            break;
        }
    }
}

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

    fin.getline(s,1000);
    int len = strlen(s);
    int n;
    char x;
    fin>>n;
    for(int i=0;i<n;i++)
    {
        fin>>x;
        var[x-'A']=!var[x-'A'];
        int pos = 0;
        fout<<(int)evaluate(s,pos,len);
    }
    fout<<endl;
return 0;
}