Cod sursa(job #2473612)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 13 octombrie 2019 21:45:08
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <cstring>
using namespace std;

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

char x[1001], buff[1010];
int i, lg;

bool v[128];

bool var();
bool si();
bool sau();

bool var()
{
    bool r;
    if (x[i] == '(')
    {
        i++;
        r = sau();
        i++;
    }
    else if (x[i] == '!')
    {
        bool sch = 0;
        while (x[i] == '!')
        {
            i++;
            sch = !sch;
        }
        r = var();
        if (sch == 1)
            r = !r;
    }
    else
    {
        if (isalpha(x[i]))
            r = v[x[i]];
        else if (x[i] == '0')
            r = 0;
        else
            r = 1;
        i++;
    }
    return r;
}

bool si()
{
    bool r = var();
    while (i<lg && x[i] == '&')
    {
        i++;
        r = r & var();
    }
    return r;
}

bool sau()
{
    bool r = si();
    while (i<lg && x[i] == '|')
    {
        i++;
        r = r | si();
    }
    return r;
}

int main()
{
    int n, k;
    char y[101];
    fin.getline(buff, sizeof(buff));
    for (i = 0; i<strlen(buff);i++)
    {
        if (isalpha(buff[i]) == 0)
        {
            if (buff[i] != ' ')
            {
                x[lg] = buff[i];
                lg++;
            }
        }
        else
        {
            //fout << i << ' ';
            if (buff[i] == 'A' && buff[i+1] == 'N')
            {
                x[lg] = '&';
                i= i+2;
            }
            else if (buff[i] == 'O' && buff[i+1] == 'R')
            {
                x[lg] = '|';
                i++;
            }
            else if (buff[i] == 'N' && buff[i+1] == 'O')
            {
                x[lg] = '!';
                i= i+2;
            }
            else if (buff[i] == 'F' && buff[i+1] == 'A')
            {
                x[lg] = '0';
                i= i+4;
            }
            else if (buff[i] == 'T' && buff[i+1] == 'R')
            {
                x[lg] = '1';
                i =i+3;
            }
            else
                x[lg] = buff[i];
            lg++;
        }
    }
    //fout << x << '\n';
    fin >> n >> y;
    for (k = 0; k<n; k++)
    {
        v[y[k]] = !v[y[k]];
        i = 0;
        fout << sau();
    }
}