Cod sursa(job #3143794)

Utilizator SSKMFSS KMF SSKMF Data 2 august 2023 11:45:57
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
using namespace std;

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

char expresie[1001] , *pozitie = expresie;
bool valoare[26];

bool Expresie(int);

bool Constanta ()
{
    if (*pozitie == 'T' && *(pozitie + 1) == 'R')
        { pozitie += 4; return true; }

    if (*pozitie == 'F' && *(pozitie + 1) == 'A')
        { pozitie += 5; return false; }

    pozitie++; return valoare[*(pozitie - 1) - 'A'];
}

bool Termen ()
{
    while (*pozitie == ' ')
        pozitie++;

    bool termen;
    if (*pozitie == '(')
        { pozitie++; termen = Expresie(0); pozitie++; }
    else
        if (*pozitie == 'N' && *(pozitie + 1) == 'O')
        {
            pozitie += 3;
            while (*pozitie == ' ')
                pozitie++;

            termen = !Constanta();
        }
    else
        termen = Constanta();

    while (*pozitie == ' ')
        pozitie++;

    return termen;
}

bool Expresie (int adancime)
{
    bool rezultat = (!adancime ? Expresie(1) : Termen());
    while ((adancime == 1 && *pozitie == 'A' && *(pozitie + 1) == 'N') || (adancime == 0 && *pozitie == 'O' && *(pozitie + 1) == 'R'))
        switch(adancime)
        {
            case 0: { bool termen = Termen(); rezultat = rezultat || termen; }
                break;

            case 1: { bool termen = Termen(); rezultat = rezultat & termen; }
                break;
        }
    
    return rezultat;
}

int main ()
{
    cin.getline(expresie , 1001);

    int teste;
    cin >> teste;

    for (char litera ; teste ; teste-- , pozitie = expresie)
        { cin >> litera; valoare[litera - 'A'] = !valoare[litera - 'A']; cout << Expresie(0); }

    cout.close(); cin.close();
    return 0;
}