Cod sursa(job #1309991)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 6 ianuarie 2015 12:07:52
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include<fstream>
#include<string>
using namespace std;
int n, i, m, j;
string c;
int v[100];
char s[1005], lt;
ifstream fin("bool.in");
ofstream fout("bool.out");
int expresie();
int termen1();
int termen2();
int factor();
int expresie(){
    int r = termen1();
    while(s[i] == '|'){
        i++;
        r |= termen1();
    }
    return r;
}
int termen1(){
    int r = termen2();
    while(s[i] == '&'){
        i++;
        r &= termen2();
    }
    return r;
}
int termen2(){
    int r;
    if(s[i] == '!'){
        i++;
        r = factor();
        if(r == 0){
            r = 1;
        }
        else{
            r = 0;
        }
    }
    else{
        r = factor();
    }
    return r;
}
int factor(){
    int r;
    if(s[i] == '('){
        i++;
        r = expresie();
        i++;
    }
    else{
        if(s[i] == '0' || s[i] == '1'){
            r = s[i] - '0';
        }
        else{
            r = v[s[i]];
        }
        i++;

    }
    return r;
}

int main(){
    getline(fin, c);
    m = c.length();
    i = 0;
    for(j = 0; j < m; j++){
        if(c[j] >= 'A' && c[j] <= 'Z' && (j == m - 1 || c[j+1] == ' ' || c[j+1] == ')') && (j == 0 || c[j-1] == ' ' || c[j-1] == '(')){
            s[++i] = c[j];
        }
        else{
            if(c[j] == '(' || c[j] == ')'){
                s[++i] = c[j];
            }
            else{
                if(c[j] == 'F' && c[j+1] == 'A'){
                    s[++i] = '0';
                }
                else{
                    if(c[j] == 'T' && c[j+1] == 'R'){
                        s[++i] = '1';
                    }
                    else{
                        if(c[j] == 'N' && c[j+1] == 'O'){
                            if(s[i] != '!'){
                                s[++i] = '!';
                            }
                            else{
                                i--;
                            }
                        }
                        else{
                            if(c[j] == 'A' && c[j+1] == 'N'){
                                s[++i] = '&';
                            }
                            else{
                                if(c[j] == 'O' && c[j+1] == 'R'){
                                    s[++i] = '|';
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    fin>> n;
    for(j = 1; j <= n; j++){
        fin>> lt;
        if(v[lt] == 0){
            v[lt] = 1;
        }
        else{
            v[lt] = 0;
        }
        i = 1;
        fout<< expresie();
    }
    return 0;
}