Cod sursa(job #2789591)

Utilizator LuciBBadea Lucian LuciB Data 27 octombrie 2021 17:59:00
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>
#define MAX 1000
char expr[MAX], f[26];
int len, i;

int calcOr();

int trueFalse() {
    int retval;
    if(expr[i] == 'T' && expr[i + 1] == 'R') { // TRUE
        i += 4;
        while(expr[i] == ' ')
            i++;
        retval = 1;
    } else if(expr[i] == 'F' && expr[i + 1] == 'A') { // FALSE
        i += 5;
        while(expr[i] == ' ')
            i++;
        retval = 0;
    } else 
        retval = f[expr[i++] - 'A'];

    return retval;
}

int calcNot() {
    int retval, neg;

    neg = 0;
    while(expr[i] == 'N' && expr[i + 1] == 'O') { // NOT
        neg = 1 - neg;
        i += 3;
        while(expr[i] == ' ')
            i++;
    }
    if(expr[i] == '(') {
        i++;
        retval = calcOr();
        i++;
        while(expr[i] == ' ')
            i++;
    } else
        retval = trueFalse();
    retval ^= neg;

    return retval;
}
int calcAnd() {
    int retval;

    retval = calcNot();
    while(expr[i] == ' ')
        i++;
    while(expr[i] == 'A' && expr[i + 1] == 'N') { // AND
        i += 3;
        while(expr[i] == ' ')
            i++;
        retval &= calcNot();
        while(expr[i] == ' ')
            i++;
    }

    return retval;
}

int calcOr() {
    int retval;

    retval = calcAnd();

    while(expr[i] == ' ')
        i++;

    while(expr[i] == 'O' && expr[i + 1] == 'R') {
        i += 2;
        while(expr[i] == ' ')
            i++;
        retval |= calcAnd();
        while(expr[i] == ' ')
            i++;
    }

    return retval;
}

int main() {
    int q;
    char ch;
    FILE *fin, *fout;

    fin = fopen("bool.in", "r");
    fout = fopen("bool.out", "w");

    fgets(expr, MAX, fin);

    fscanf(fin, "%d ", &q);
    while(q--) {
        ch = fgetc(fin);
        f[ch - 'A'] = 1 - f[ch - 'A'];
        i = 0;
        fprintf(fout, "%d", calcOr());
    }
    fclose(fin);
    fclose(fout);

    return 0;
}