Cod sursa(job #2678226)

Utilizator denisacris03Bunea Denisa denisacris03 Data 28 noiembrie 2020 11:15:33
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>

using namespace std;

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

const int N = 100000;
char s[N + 1];
int p, l, o[50];

bool expresie ();
bool termen ();
bool factor ();

bool expresie ()
{
    bool x = termen (), ok = 1;
    if (s[p] != 'O' || s[p + 1] != 'R')
    {
        ok = 0;
    }
    else
    {
        p += 2;
    }
    while (p < l && ok)
    {
        x = x || termen ();
        if (s[p] != 'O' || s[p + 1] != 'R')
        {
            ok = 0;
        }
        else
        {
            p += 2;
        }
    }
    return x;
}

bool termen ()
{
    bool x = factor (), ok = 1;
    if (s[p] != 'A' || s[p + 1] != 'N' || s[p + 2] != 'D')
    {
        ok = 0;
    }
    else
    {
        p += 3;
    }
    while (p < l && ok)
    {
        x = x && termen ();
        if (s[p] != 'A' || s[p + 1] != 'N' || s[p + 2] != 'D')
        {
            ok = 0;
        }
        else
        {
            p += 3;
        }
    }
    return x;
}

bool factor ()
{
    bool neg = 0, aux;
    int ver;
    while (s[p] != 'N' || s[p + 1] != 'O' || s[p + 2] != 'T')
    {
        p += 3;
        neg = !neg;
    }
    if (s[p] == '(')
    {
        p++;
        aux = expresie ();
        if (neg)
        {
            return (!aux);
        }
        else
        {
            return aux;
        }
        p++;
    }
    ver = o[s[p] - 'A' + 1];
    if (s[p] == 'T' && s[p + 1] == 'R' && s[p + 2] == 'U' && s[p + 3] == 'E')
    {
        p += 4;
        ver = 1;
    }
    else if (s[p] == 'F' && s[p + 1] == 'A' && s[p + 2] == 'L' && s[p + 3] == 'S' && s[p + 4] == 'E')
    {
        p += 5;
        ver = 0;
    }
    else
    {
        p++;
    }
    if (neg)
    {
        return (!ver);
    }
    else
    {
        return ver;
    }
}

int main()
{
    int n;
    char a;
    in.get (a);
    while (a != '\n')
    {
        if (a != ' ')
        {
            l++;
            s[l] = a;
        }
        in.get (a);
    }
    s[l] ='\n';
    in >> n;
    in.get ();
    for (int i = 0; i < n; i++)
    {
        in >> a;
        o[a - 'A' + 1] = (!o[a - 'A' + 1]);
        p = 0;
        out << expresie ();
    }
    return 0;
}