Cod sursa(job #2721381)

Utilizator bibiancapitu2004Pitu Bianca bibiancapitu2004 Data 11 martie 2021 19:03:25
Problema Bool Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#include<cstring>
using namespace std;

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

const int N = 1005;
int idx = 0;
char s[N], c[N];
bool f[30];

int expresie();
int factor();
int termen();
int numar();

int expresie()
{
   int rez = termen();
   while(c[idx] == '|')
   {
       idx ++;
       int tmp = termen();
       rez = rez || tmp;
    }
   return rez;
}
int termen()
{
    int rez = factor();
    while(c[idx] == '&')
    {
        idx ++;
        int tmp = factor();
        rez = rez && tmp;
    }
    return rez;
}
int factor()
{
    bool x = 0;
    while(c[idx] == '!')
    {
        x = 1 - x;
        idx ++;
    }
    int rez = numar();
    return (1 - rez) * x + rez * (1 - x);
}

int numar()
{
    int rez;
    if(c[idx] == '(')
    {
        idx ++;
        rez = expresie();
        idx ++;
    }
    else{
        if( 'A'<= c[idx] && c[idx] <= 'Z')
        {
            rez = f[c[idx] - 'A'];
            idx ++;
        }
        else{
            rez = c[idx] - '0';
            idx ++;
        }
    }
    return rez;

}
int main()
{
    cin.get(s,N);
    int n = strlen(s), k = 0, poz = 0 , q;

    while(k < n)
    {
        if(s[k] >= 'A'  && s[k] <= 'Z')
        {
           if(s[k + 1] >= 'A'  && s[k + 1] <= 'Z')
           {
               if(s[k] == 'A')
               {
                   c[poz ++] = '&';
                   k += 3;
               }
               else if(s[k] == 'O')
               {
                   c[poz ++] = '|';
                   k += 2;
               }
               else if(s[k] == 'N')
               {
                   c[poz ++] = '!';
                   k += 3;
               }
               else if(s[k] == 'F')
               {
                   c[poz ++] = '0';
                   k += 4;
               }
               else if(s[k] == 'T')
               {
                   c[poz ++] = '1';
                   k += 4;
               }
           }
           else{
              c[poz ++] = s[k];
              k ++;

           }
        }
        else if(s[k] == ' ')
            k ++;
        else if(s[k] == '(' || s[k] == ')')
        {
            c[poz ++] = s[k];
            k ++;
        }
    }
    cin >> q;
    char l;


    for(int i = 0;i < q;i ++)
    {
      cin >> l;
      f[l - 'A'] = !f[l - 'A'];
      idx = 0;
      cout << expresie();
    }

    return 0;
}