Cod sursa(job #2473597)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 13 octombrie 2019 21:23:22
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 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;
}