Cod sursa(job #1818471)

Utilizator cristianursacheCristian Ursache cristianursache Data 29 noiembrie 2016 12:03:29
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int N = 1001;
char s[N],aux[N],op[101];
bool v[26];
int p;

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

bool expresie()
{
    bool val = termen();
    while(aux[p] == '|')
    {
        p++;
        val = (val || termen());
    }
    return val;
}

bool termen()
{
    bool val2 = factor();
    while(aux[p] == '&')
    {
        p++;
        val2 = (val2 && factor());
    }
    return val2;
}

bool factor()
{
    bool semn = true,val3;
    while(aux[p] == '!')
    {
        p++;
        semn = (!semn);
    }
    if(aux[p] == '(')
    {
        p++;
        val3 = expresie();
        p++;
        if(semn)
            return val3;
        else
            return !val3;
    }
    val3 = v[aux[p] - 'A'];
    p++;
    if(semn)
        return val3;
    return !val3;
}


int main()
{
    int n, x, j = 0;
    in.getline(s,1000);
    n = strlen(s);
    in>>x>>ws;
    in.getline(op,101);
    for(int i = 0; i <= n; i++)
    {
        if(s[i] == ' ')
            continue;
        else if(s[i] == 'A'&& s[i+1] == 'N')
        {
            aux[j++] = '&';
            i+=2;
        }
        else if(s[i] == 'O'&& s[i+1] == 'R')
        {
            aux[j++] = '|';
            i++;
        }
        else if(s[i] == 'N'&& s[i+1] == 'O')
        {
            aux[j++] = '!';
            i+=2;
        }
        else if(s[i] == 'T' && s[i+1] == 'R')
        {
            aux[j++] = '1';
            i+=3;
        }
        else if(s[i] == 'F'&& s[i+1] == 'A')
        {
            aux[j++] = '0';
            i+=4;
        }
        else if(s[i] == '(')
            aux[j++] = '(';
        else if(s[i] == ')')
            aux[j++] = ')';
        else
            aux[j++] = s[i];
    }
    aux[j++] = '\0';
    //out << aux << "\n";
    for(int i = 0; i < x; i++)
    {
        p = 0;
        v[op[i] - 'A'] = (!v[op[i] - 'A']);
        out<<expresie();
    }
    return 0;
}