Cod sursa(job #2059096)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 6 noiembrie 2017 17:27:37
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

int n, val[200], i;

char ch;

string str;

vector<string> s;

int evalueaza();
int factor();
int termen1();
int termen2();

int evalueaza(){
    int r = termen1();
    while(i < s.size() && s[i] == "OR"){
        ++ i;
        r = r || termen1();
    }
    return r;
}

int termen1(){
    int r = termen2();
    while(i < s.size() && s[i] == "AND"){
        ++ i;
        r = r && termen2();
    }
    return r;
}

int termen2(){
    int nr = 0;
    while(i < s.size() && s[i] == "NOT"){
        ++ nr;
        ++ i;
    }
    int r = factor();
    if(nr % 2 == 1)
        r = !r;
    return r;
}

int factor(){
    int r = 0;
    if(i < s.size() && s[i] == "("){
        ++ i;
        r = evalueaza();
        ++ i;
    }
    else if(i < s.size() && s[i] == "TRUE"){
            ++ i;
            r = 1;
         }
    else if(i < s.size() && s[i] == "FALSE"){
            ++ i;
            r = 0;
         }
    else if(i < s.size()){
        r = val[s[i][0]];
        ++ i;
    }
    return r;
}


int main(){

    while(true){
        f>>str;
        int nr = 0;
        if(str[0] <= '9' && str[0] >= '0'){
            for(int i = 0; i < str.size(); ++ i)
                n = n * 10 + str[i] - '0';
            break;
        }
        else{
            while(!str.empty() && str[0] == '('){
                s.push_back("(");
                str.erase(str.begin());
            }
            while(!str.empty() && str[str.size() - 1] == ')'){
                ++nr;
                str.erase(str.size() - 1, str.size() - 1);
            }
            s.push_back(str);
            for(int i = 1; i <= nr; ++ i)
                s.push_back(")");
        }
    }



    for(int j = 1; j <= n; ++ j){
        i = 0;
        f>>ch;
        val[ch] = 1 - val[ch];
        int res = evalueaza();
        g<<res;
    }

    g<<'\n';
    for(int i = 0; i < s.size(); ++ i){
        g<<s[i]<<" ";
    }





    return 0;
}