Cod sursa(job #1572892)

Utilizator robertispasIspas Robert robertispas Data 19 ianuarie 2016 11:01:47
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <iostream>
#include <fstream>

using namespace std;

const int N = 1001;
char s[N], aux[N], variabile[101];
bool vr[26];
int p, t;

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

void transforma(char *aux, char *s)
{
    int i, n=0;
    for(i = 0; aux[i]; i++)
        if(aux[i] == 'A' && aux[i+1]=='N')
        {
            s[n++] = '&';
            i+=2;
        }
        else if (aux[i] == 'F' && aux[i+1] == 'A')
        {
            s[n++]='0';
            i+=4;
        }
        else if (aux[i] == 'N' && aux[i+1] == 'O')
        {
            s[n++]='!';
            i+=2;
        }
        else if (aux[i] == 'O' && aux[i+1] == 'R')
        {
            s[n++]='|';
            i++;
        }
        else if (aux[i] == 'T' && aux[i+1] == 'R')
        {
            s[n++]='1';
            i+=3;
        }
        else if (aux[i] != ' ' && aux[i] != '/')
            s[n++]=aux[i];
        s[n]=0;
}

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

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

bool factor()
{
    bool val, semn = true;
    while (s[p] == '!')
    {
        semn = (!semn);
        p++;
    }
    if (s[p] == '(')
    {
        p++;
        val=expresie();
        p++;
        if (!semn)
            val = (!val);
        return val;
    }
    if (s[p] == '0')
        val = false;
    else if (s[p] == '1')
        val = true;
    else
        val = vr[s[p] - 'A'];
    if (!semn)
        return (!val);
    return val;
}


int main()
{
    ifstream in("bool.in");
    ofstream out("bool.out");
    in.getline(aux, N);
    transforma(aux, s);
    //out<<s;
    in >> t >> ws;
    in.getline(variabile, t + 1);
    for (int i = 0; i < t; i++)
    {
        vr[variabile[i] - 'A'] = (!vr[variabile[i] - 'A']);
        out << expresie();
    }
    return 0;
}