Cod sursa(job #2491303)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 12 noiembrie 2019 11:48:34
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int NMAX = 105;
const int LMAX = 1005;
int p;
bool v[30];
char s[LMAX], sir[LMAX];

bool termen();
bool expresie();
bool factor();

bool expresie() {
    bool x = termen();
    while (sir[p] == '|') {
        p++;
        x = x | termen();
    }
    return x;
}

bool termen() {
    bool y = factor();
    while (sir[p] == '&') {
        p++;
        y = y & factor();
    }
    return y;
}

bool factor () {
    int semn;
    bool val;
    while (sir[p] == '!') {
        p++;
        semn++;
    }
    semn %= 2;
    if (sir[p] == '(') {
        p++;
        val = expresie();
        p++;
        if (semn == 0)
            return val;
        return !val;
    }
    if (sir[p] == '1' || sir[p] == '0')
        val = sir[p] = '0';
    else
        val = v[sir[p] - 'A'];
    if (semn == 0)
        return val;
    return !val;
}

int main() {

    freopen ("bool.in", "r", stdin);
    freopen ("bool.out", "w", stdout);

    int n, i, q, k, cuv;
    char ch;

    cin.getline(s, LMAX);
    n = strlen(s);
    i = k = 0;
    while (i < n) {
        if (s[i] >= 'A' && s[i] <= 'Z') {
            if (s[i] == 'T' || s[i] == 'F' || s[i] == 'A' || s[i] == 'O' || s[i] == 'N') {
                i++;
                if (i == n || s[i] == ' ' || s[i] ==')') {
                    sir[k++] = s[i - 1];
                    i--;
                }
                else {
                    i--;
                    if (s[i] == 'T') {
                        cuv = 4;
                        sir[k++] = '1';
                    }
                    if (s[i] == 'F') {
                        cuv = 5;
                        sir[k++] = '0';
                    }
                    if (s[i] == 'A') {
                        cuv = 3;
                        sir[k++] = '&';
                    }
                    if (s[i] == 'O') {
                        cuv = 2;
                        sir[k++] = '|';
                    }
                    if (s[i] == 'N') {
                        sir[k++] = '!';
                        cuv = 3;
                    }
                    i += cuv;
                }
            }
            else
                sir[k++] = s[i];
        }
        else if (s[i] != ' ')
            sir[k++] = s[i];
        i++;
    }
    sir[k] = '\0';

    scanf ("%d ", &q);
    for (i = 1; i <= q; i++) {
        scanf ("%c", &ch);
        v[ch - 'A'] = 1 - v[ch - 'A'];
        printf ("%d", expresie());
    }

    return 0;
}