Cod sursa(job #1501174)

Utilizator MirceaSSebe Mircea Octavian MirceaS Data 13 octombrie 2015 00:45:39
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 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)
{
    bool val = false;
    bool neg = false;
    char op = 'o';
    while(true)
    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));
        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");

    s[0]='(';
    char *p=s+1;
    fin.getline(p,1000);
    s[strlen(s)+1]=s[strlen(s)];
    s[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);
    }
    fout<<endl;
return 0;
}