Cod sursa(job #2843323)

Utilizator AndreiN96Andrei Nicula AndreiN96 Data 2 februarie 2022 12:27:44
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.14 kb
#include <fstream>
#include <cstring>

using namespace std;

const int D = 1001 , N = 100;
char sir[D] , modif[N] , aux[D];
int num , k , poz;
bool val[N];

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

int expresie()
{
    int expr = termen();
    while (aux[poz] == '|')
    {
        poz ++;
        expr = expr | termen();
    }
    return expr;
}
int termen()
{
    int eval = factor();
    while (aux[poz] == '&')
    {
        poz ++;
        eval = eval & termen();
    }
    return eval;
}
int factor()
{
    int val = 0;
    while (aux[poz] == '!')
    {
        poz ++;
        if (val == 0)
            val = 1;
        else
            val = 0;
    }
    if (aux[poz] == '(')
    {
        poz ++;
        val = expresie();
        poz ++;
        return val;
    }
    return val;
}

int main()
{
    ifstream in("bool.in");
    ofstream out("bool.out");

    in.getline(aux , D);
    in >> ws >> num >> ws;
    in.getline(modif , N);
    in.close();

    int dim = strlen(aux);
    for (int i = 0 ; i < dim ; i ++)//rescriere expresie
    {
        if (strchr("()" , aux[i]) == NULL)
        {
            int prim , ult;
            if ((i == 0 || strchr(" ()" , aux[i - 1]) != NULL)
            && (i == dim - 1 || strchr(" ()" , aux[i + 1]) != NULL))
            {
                sir[k ++] = aux[i];
            }
            else
            {
                if (strncmp(aux + i , "TRUE" , 4) == 0)
                {
                    sir[k ++] = '1';
                    i += 3;
                }
                else if (strncmp(aux + i , "FALSE" , 5) == 0)
                {
                    sir[k ++] = '0';
                    i += 4;
                }
                else if (strncmp(aux + i , "AND" , 3) == 0)
                {
                    sir[k ++] = '&';
                    i += 2;
                }
                else if (strncmp(aux + i , "OR" , 2) == 0)
                {
                    sir[k ++] = '|';
                    i ++;
                }
                else if (strncmp(aux + i , "NOT" , 3) == 0)
                {
                    sir[k ++] = '!';
                    i += 2;
                }
            }
        } 
        else
        {
            sir[k ++] = aux[i];
        }
    }

    strcpy(aux , sir);
    aux[k] = '\0';
    for (int i = 0 ; i < num ; i ++)
    {
        for (int j = 0 ; j < k ; j ++)
        {
            if ('A' <= aux[j] && aux[j] <= 'Z')
            {
                if (aux[j] == modif[i])
                {
                    if (!val[i])
                    {
                        aux[j] = '1';
                        val[i] = true;
                    }
                    else
                    {
                        aux[j] = '0';
                        val[i] = false;
                    }
                }
                else
                {
                    if (!val[i])
                    {
                        aux[j] = '0';
                    }
                    else
                    {
                        aux[j] = '1';
                    }
                }
            }
        }
        //out << aux << ' ';
        out << expresie();
    }

    return 0;
}