Cod sursa(job #2376532)

Utilizator Vlad_NituNitu Vlad-Petru Vlad_Nitu Data 8 martie 2019 16:11:44
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("bool.in") ;
ofstream g ("bool.out");
int N ;
char v[105] ,c,  s[105] ;
int fv[35] ;
int i  = 0 , k = -1, cnt = 0;
int eval() ;
int termen() ;
int factor();
void prelucrare()
{
    while (i < cnt)
    {
        if ((isupper(v[i]) && !isalpha(v[i-1]) && !isalpha(v[i+1])) || v[i] == ' ')
        {
            if (v[i] == ' ') i ++ ;
            else
            {
                s[++k] = v[i] ;
                i ++ ;
            }
        }
        if (v[i] == '(') s[++k] = '(' , i++;
        if (v[i] == ')') s[++k] = ')' , i++;
        if (v[i] == 'A' && v[i+1] == 'N' && v[i+2] == 'D')
        {
            i += 3;
            s[++k] = '&';
        }
        if (v[i] =='O' && v[i+1] == 'R')
        {
            i += 2;
            s[++k] = '|';
        }
        if (v[i] == 'N' && v[i+1] == 'O' && v[i+2] == 'T')
        {
            i += 3;
            s[++k] = '!' ;
        }
        if (v[i] == 'T' && v[i+1] == 'R' && v[i+2] == 'U' && v[i+3] == 'E')
        {
            i += 4;
            s[++k] = '1';
        }
        if (v[i] == 'F' && v[i+1] == 'A' && v[i+2] == 'L' && v[i+3] == 'S' && v[i+4] == 'E')
        {
            i += 5;
            s[++k] = '0';
        }



    }
}

int eval()
{
    int r = termen();
    if (s[i] == '|')
    {
        i ++ ;
        r = (r | termen());
    }
    return r;
}
int termen()
{
    int r = factor();
    if (s[i] == '&')
    {
        i ++ ;
        r = (r & factor()) ;
    }
    return r;
}
int factor()
{
    int r = 0 ;
    if (s[i] == '(')
    {
        i ++ ;
        r = eval() ;
        i ++ ;
    }


            else
                {
            if (s[i] == '!') i ++ , r = !factor() ;

            if (s[i] == '1')r = 1;
            else if (s[i] == '0')r = 0;
            else r = fv[s[i]-'A'];
                }
    return r;
}
int main()
{
    f.getline(v,102) ;
    i = 0 ;
    cnt = strlen(v);

    prelucrare();
     i = 0;
     k ++ ;
     /* k = strlen(s)
     for (i = 0 ;i < k ; ++i)
        g << s[i] ;*/
        f >> N ;
    for (int query = 1 ; query <= N ; ++ query)
    {
            f >> c;
            fv[c-'A'] = 1 - fv[c-'A'];
            g << eval();
    }
}