Cod sursa(job #2337674)

Utilizator vladadAndries Vlad Andrei vladad Data 6 februarie 2019 16:52:23
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int p = 0,n,j;
char v[1005],s[1005];
int variabile[1005];
int termen();
int NOT();
int nr();
int expresie()
{

    int rez = termen();
    while(s[p] == '|')
    {
        p++;
        rez = rez | termen();
    }
    return rez;
}
int termen()
{
    int rez = NOT();
    while(s[p] == '&')
    {
        p++;
        rez = rez & NOT();
    }
    return rez;
}
int NOT()
{
    int termen = 0,semn = 0;
    while(s[p] == '!')
    {
        semn = 1 - semn;
        p++;
    }
    if(s[p] == '(')
    {
        p++;
        termen = expresie();
        p++;
        if(semn)
            return !termen;
        return termen;
    }
    p++;
    if((s[p-1] == '1' || s[p-1] == '0'))
    {
        if(semn)
            return !(s[p-1] - '0');
        return (s[p-1] - '0');
    }
    if(semn)
    {
        return !(variabile[s[p-1] - 'A' + 1]);
    }
    return (variabile[s[p-1] - 'A' + 1]);
}
int main()
{
    int i;
    f.getline(v, 1005);

    int n = strlen(v);
    for(i = 0; i < n;)
    {
        if(v[i] == 'A' && v[i + 1] == 'N' && v[i+2] == 'D')
        {
            s[j++] = '&';
            i += 3;
        }
        else if(v[i] == 'O' && v[i + 1] == 'R')
        {
            s[j++] = '|';
            i+=2;
        }
        else if(v[i] == 'F' && v[i + 1] == 'A' && v[i+2] == 'L' && v[i+3] == 'S' && v[i+4] == 'E')
        {
            s[j++] = '0';
            i += 5;
        }
        else if(v[i] == 'T' && v[i+1] == 'R' && v[i+2] == 'U' && v[i+3] == 'E')
        {
            s[j++] = '1';
            i += 4;
        }
        else if(v[i] == 'N' && v[i+1] == 'O' && v[i+2] == 'T')
        {
            s[j++] = '!';
            i += 3;
        }
        else if(v[i] == '(')
        {
            s[j++] = '(';
            i++;
        }
        else if(v[i] == ')')
        {
            s[j++] = ')';
            i++;
        }
        else if(v[i] >= 'A' && v[i] <= 'Z')
        {
            s[j++] = v[i];
            i++;
        }
        else
        {
            i++;
        }
    }

    f >> n;
    for(i = 1; i <= n; i++)
    {
        char ch;
        f >> ch;
        p = 0;
        variabile[ch - 'A' + 1] = 1 -variabile[ch - 'A' + 1];
        g << expresie();
    }

    return 0;
}