Cod sursa(job #2062669)

Utilizator mariusmagureanmagurean marius mariusmagurean Data 10 noiembrie 2017 18:10:13
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#include<fstream>
#define dim 1010
#include<string>
#include<vector>

using namespace std;

vector<string> s;
bool lit[91];
string aux;
int i;

bool sau();
bool si();
bool nu();
bool exp();

bool sau()
{
    bool rez=si();
    while(i<s.size() && s[i]=="OR")
    {
        ++i;
        bool rez1=si();
        rez=rez||rez1;
    }
    return rez;
}

bool si()
{
    bool rez=nu();
    while(i<s.size() && s[i]=="AND")
    {
        ++i;
        bool rez1=nu();
        rez=rez&&rez1;
    }
    return rez;
}

bool nu()
{
    int nrDeNu=0;
    while(i<s.size() && s[i]=="NOT")
    {
        ++i;
        nrDeNu++;
    }
    bool rez=exp();
    //numaram cati de not sunt si daca sunt numar impar schimbam rez - din 1 facem 0 si invers
    if(nrDeNu%2==1)
        rez=(!rez);
    return rez;
}

bool exp()
{
    bool rez=0;
    if(i<s.size() &&  s[i]=="(")
    {
        ++i;
        rez=sau();
        ++i;
    }
    else
        if(i<s.size() && s[i]=="TRUE")
        {
            ++i;
            rez=1;
        }
        else
            if(i<s.size() && s[i]=="FALSE")
            {
                ++i;
                rez=0;
            }
            else
                if(i<s.size())
                {
                    rez=lit[s[i][0]];
                    ++i;
                }
    return rez;
}

int main()
{
    int n=0,j;
    ifstream fin("bool.in");
    ofstream fout("bool.out");
    //introducem in fiecare componenta a vectorului de stringuri s cate o unitate de sintaxa(paranteze, litere, true, false)
    while(fin>>aux)
    {
        //daca e numarul de evaluari il retin in n
        if(aux[0]>='0' && aux[0]<='9')
        {
            for(j=0;j<aux.size();j++)
                n=n*10+(aux[j]-'0');
            break;
            //aici oprim citirea ca sa putem citi separat secventa de litere mari
        }
        else
        {
            //daca s a citit o paranteza deschisa sau mai multe le copii in vectorul de stringuri s
            while(aux.empty()==0 && aux[0]=='(')
            {
                s.push_back("(");
                aux.erase(aux.begin());
            }
            int nr=0;
            while(aux.empty()==false && aux[aux.size()-1]==')')
            {
                nr++;
                aux.erase(aux.size()-1, aux.size()-1);
            }
            //am curatat stringurile de paranteze, au mai ramas doar true false sau litere mari, le punem in vector
            s.push_back(aux);
            //acum punem pe rand si parantezele inchise
            while(nr!=0)
            {
                s.push_back(")");
                nr--;
            }
        }
    }
    //citim secventa, rulam de n ori evaluarea expresiei cu schimabarea corespunzatoare a valorii booleene din literea mare
    fin>>aux;
    for(j=0;j<n;j++)
    {
        //resetam i
        i=0;
        //modificam din true in false si invers
        lit[aux[j]]=1-lit[aux[j]];
        //apelam evaluarea si afisam
        fout<<sau();
    }
    return 0;
}