Cod sursa(job #2453741)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 5 septembrie 2019 17:17:21
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <fstream>
#include <cstring>
#include <string>
using namespace std;

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

bool v[91];

char x[1001];
int i, lg;

//not > and > or

bool var(); //NOT este operator unar si il includem in var()
bool si();
bool sau();

bool var()
{
    bool r;
    bool inv = 0;
    if (x[i] == '!')
    {
        inv = 1;
        i++;
    }
    if (x[i] == '(')
    {
        i++; //sar peste '('
        r = sau();
        i++; //sar peste ')'
    }
    else
    {
        if (x[i] == '0')
            r = 0;
        else if (x[i] == '1')
            r = 1;
        else
            r = v[x[i]];
        i++;
    }
    if (inv == 1)
        return (!r);
    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()
{
    string buff;
    getline(fin, buff);
    int lgb = buff.size();
    for (i = 0; i<lgb; i++)
    {
        if (buff[i] == 'A')
        {
            if (i<lgb && buff[i+1] == 'N')
            {
                x[lg] = '&';
                lg++;
                i = i+2;
            }
            else
            {
                x[lg] = 'A';
                lg++;
            }
        }
        else if (buff[i] == 'O')
        {
            if (i<lgb && buff[i+1] == 'R')
            {
                x[lg] = '|';
                lg++;
                i++;
            }
            else
            {
                x[lg] = 'O';
                lg++;
            }
        }
        else if (buff[i] == 'N')
        {
            if (i<lgb && buff[i+1] == 'O')
            {
                x[lg] = '!';
                lg++;
                i=i+2;
            }
            else
            {
                x[lg] = 'N';
                lg++;
            }
        }
        else if (buff[i] == 'T')
        {
            if (i<lgb && buff[i+1] == 'R')
            {
                x[lg] = '1';
                lg++;
                i = i+3;
            }
            else
            {
                x[lg] = 'T';
                lg++;
            }
        }
        else if (buff[i] == 'F')
        {
            if (i < lgb && buff[i+1] == 'A')
            {
                x[lg] = '0';
                lg++;
                i = i+4;
            }
            else
            {
                x[lg] = 'F';
                lg++;
            }
        }
        else if (buff[i] != ' ')
        {
            x[lg] = buff[i];
            lg++;
        }
    }
    int n, k;
    char sch;
    fin >> n;
    fin.get();
    for (k = 1; k<=n; k++)
    {
        fin.get(sch);
        v[sch] = !v[sch];
        i = 0;
        fout << sau();
    }
    return 0;
}