Cod sursa(job #1574159)

Utilizator AndreiITCuriman Andrei AndreiIT Data 20 ianuarie 2016 11:23:26
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
const int MAX = 2005, MAXI = 2005;
char s[MAX], a[MAXI];
int n, p;
bool var[500];
bool expresie();
bool termen();
bool factor();
int main()
{
    cin.get(s, MAX);
    cin>>n;
    int poz = 0, bune = 0;
    for(poz = 0; s[poz]; ++poz)
    {
        if(s[poz] == 'N' and s[poz+1] == 'O')
        {
            s[bune++] = '!';
            poz += 2;
            continue;
        }
        if(s[poz] == 'A' and s[poz+1] == 'N')
        {
            s[bune++] = '&';
            poz += 2;
            continue;
        }
        if(s[poz] == 'O' and s[poz+1] == 'R')
        {
            s[bune++] = '|';
            poz += 1;
            continue;
        }
        if(s[poz] == 'T' and s[poz+1] == 'R')
        {
            s[bune++] = '1';
            poz += 3;
            continue;
        }
        if(s[poz] == 'F' and s[poz+1] == 'A')
        {
            s[bune++] = '0';
            poz += 4;
            continue;
        }
        if(s[poz] == ' ') continue;
        s[bune++] = s[poz];
    }
    s[bune] = NULL;
    //cout<<s<<endl;
    for(int i=1; i<=n; ++i)
    {
        char ch; cin>>ch;
        var[ ch-'A' ] = ! var[ ch-'A' ];
        p = 0;
        cout<<expresie();
    }
    return 0;
}
bool expresie()
{
    bool rez, ans = termen();
    while(s[p] == '|')
    {
        p++;
        rez = termen();
        ans = (ans or rez);
    }
    return ans;
}
bool termen()
{
    bool rez, ans = factor();
    while(s[p] == '&')
    {
        p++;
        rez = factor();
        ans = (ans and rez);
    }
    return ans;
}
bool factor()
{
    bool r;
    while (s[p] == '!')
    {
        p++;
        r = factor();
        return !r;
    }
    if (s[p] == '(')
    {
        p++;
        r = expresie();
    }
    else if (s[p] == '1'){ r = true; }
    else if (s[p] == '0'){ r = false; }
    else r = var[s[p] - 'A'];
    p++;
    return r;
}