Cod sursa(job #2950303)

Utilizator andreea_chivuAndreea Chivu andreea_chivu Data 3 decembrie 2022 14:35:51
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 1004

char a[NMAX];
bool t[30];

bool calc_or();
bool calc_and();
bool factor();

int p = 0;

bool calc_or() {
    bool rez = calc_and();
    while(a[p] == '|') {
        p++;
        rez = (calc_and() || rez);
    }
    return rez;
}

bool calc_and() {
    bool rez = factor();
    while(a[p] == '&') {
        p++;
        rez = (factor() && rez);
    }
    return rez;
}

bool factor() {
    bool semn = true;
    bool val;
    while(a[p] == '!') {
        semn = (!semn);
        p++;
    }
    if(a[p] == '(') {
        p++;
        val = calc_or();
        p++;
        if(semn == false) {
            val = (!val);
        }
        return val;
    }
    if(a[p] == '0')
        val = false;
    else if(a[p] == '1')
        val = true;
    else if(a[p] >= 'A' && a[p] <= 'Z')
        val = t[a[p] - 'A'];
    if(semn == false) {
        val = (!val);
    }
    p++;
    return val;
}

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

    int nc = 0;
    char ch;
    char ant;
    fin.get(ch);
    a[nc++] = ch;
    ant = ch;
    fin.get(ch);
    while(ch != '\n') {
        if(ch != ' ') {
            if('A' <= ch && ch <= 'Z') {
                if(ch == 'D') {
                    if(ant == 'N') { //suntem intr-o structura de tip &
                        a[nc - 2] = '&';
                        nc = nc - 1;
                    } else {
                        a[nc++] = ch;
                    }
                } else if(ch == 'R') {
                    if(ant == 'O') {
                        a[nc - 1] = '|';
                        nc = nc;
                    } else {
                        a[nc++] = ch;
                    }
                } else if(ch == 'T') {
                    if(ant == 'O') {
                        a[nc - 2] = '!';
                        nc = nc - 1;
                    } else {
                        a[nc++] = ch;
                    }
                } else if(ch == 'E') {
                    if(ant == 'U') {
                        a[nc - 3] = '1';
                        nc = nc - 2;
                    } else if(ant == 'S') {
                        a[nc - 3] = '0';
                        nc = nc - 2;
                    } else {
                        a[nc++] = ch;
                    }
                } else {
                    a[nc++] = ch;
                }
            } else {
                a[nc++] = ch;
            }
        }
        ant = ch;
        fin.get(ch);
    }

    /*for(int i = 0; i < nc; i++) {
        fout << a[i];
    }
    fout << "\n";
    */

    int n;
    fin >> n;
    fin.get(ch);//am citit \n
    for(int i = 0; i < n; i++) {
        fin.get(ch);
        t[ch - 'A'] = !t[ch - 'A'];
        p = 0;
        fout << calc_or();
    }

    fin.close();
    fout.close();
    return 0;
}