Cod sursa(job #2023943)

Utilizator shantih1Alex S Hill shantih1 Data 19 septembrie 2017 18:27:38
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");

int n, i, j, p;
bool v[30];
string s, c;

bool termAND();
bool factNOT();

bool evalOR ()
{
    bool r = termAND();
    while (s[p] == 'O' && s[p+1] == 'R')
    {
        p += 2;
        if (s[p] == ' ')    p++;
        if (termAND() == 1 || r == 1)     r = 1;
        else r = 0;
    }
    return r;
}

bool  termAND ()
{
    bool r = factNOT();
    while (s[p] == 'A' && s[p+1] == 'N' && s[p+2] == 'D')
    {
        p += 3;
        if (s[p] == ' ')    p++;
        if (factNOT() == 1 && r == 1)   r = 1;
        else r = 0;
    }
    return r;
}

bool factNOT ()
{
    bool r = 0, k = 0;
    if (s[p] == 'N' && s[p+1] == 'O' && s[p+2] == 'T')
    {
        p += 3;     k = 1;
        if (s[p] == ' ')    p++;
    }
    if (s[p] == '(')
    {
        p++;    if (s[p] == ' ')    p++;
        r = evalOR();
        p++;    if (s[p] == ' ')    p++;
    }
    else if (s[p]  >= 65 && s[p] <= 90)
    {
        if (s[p+1] == ')' || s[p+1] == ' ' || p+1 == s.size()-1)
        {
            int x = s[p] - 64;
            r = v[x];
            p++;
        }
        else if (s[p] == 'T' && s[p+1] == 'R' && s[p+2] == 'U' && s[p+3] == 'E')
        {       p += 4;     r = 1;      }
        
        else if (s[p] == 'F' && s[p+1] == 'A' && s[p+2] == 'L' && s[p+3] == 'S' && s[p+4] == 'E')
        {       p += 5;     r = 0;      }
        
        if (s[p] == ' ')    p++;
    }
    
    if (r == 0 && k == 1)   r = 1;
    else if (r == 1 && k == 1)   r = 0;
    return r;
}

int main () {
    
    getline(fin, s);
    fin >> n;   getline(fin, c);
    getline(fin, c);
    
    int x = 0;
    for (i = 0; i < n; i++)
    {
        x = c[i] - 64;
        if (v[x] == 1)  v[x] = 0;
        else if (v[x] == 0) v[x] = 1;
        
        p = 0;
        fout << evalOR();
    }
}