Cod sursa(job #1823056)

Utilizator penetavyPene Cosmin-Octavian penetavy Data 5 decembrie 2016 21:00:02
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <stdio.h>
#include <string.h>

#define MAX_LEN 1000

using namespace std;

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

int N;
char EXPR[MAX_LEN + 1];
int LEN;
bool val[30];

int p;

int expresie();
int f_and();
int f_or();

int expresie() {
    int cmp1 = f_or(), cmp2 = 0;
    while (EXPR[p] == 'o') {
        p++;
        if (p < LEN)
            cmp2 = f_or();
        if (cmp2 == 1)
            cmp1 = 1;
    }

    return cmp1;
}


int f_or() {
    int cmp1 = f_and(), cmp2 = 1;
    while (EXPR[p] == 'a') {
        p++;
        if (p < LEN)
            cmp2 = f_or();
        if (cmp2 == 0)
            cmp1 = 0;
    }

    return cmp1;
}

int f_and() {
    int cmp1, ver = 1;
    while (EXPR[p] == 'n') {
        p++;
        if (ver == 1)
            ver = 0;
        else
            ver = 1;
    }
    if (EXPR[p] == '(') {
        p++;
        cmp1 = expresie();
        p++;
        if (ver == 0) {
            if (cmp1 == 1)
                cmp1 = 0;
            else
                cmp1 = 1;
        }

        return cmp1;
    }
    else if (EXPR[p] == 't'){
        p++;
        if (ver == 1)
            return 1;
        else
            return 0;
    }
    else if (EXPR[p] == 'f'){
        p++;
        if (ver == 1)
            return 0;
        else
            return 1;
    }
    else if (p < LEN) {
        cmp1 = val[EXPR[p] - 'A'];
        p++;
        if (ver == 0) {
            if (cmp1 == 1)
                cmp1 = 0;
            else
                cmp1 = 1;
        }

        return cmp1;
    }
}

int main(){
    int i, j;
    char c;

    fgets(EXPR, 1000, fin);
    int len = strlen(EXPR) - 1;
    int k = 0;
    for (i = 0; i < len; i++) {
        while (EXPR[i] == ' ')
            i++;
        if (EXPR[i] == 'A' && EXPR[i + 1] == 'N') {
            EXPR[k++] = 'a';
            i += 2;
        }
        else if (EXPR[i] == 'O' && EXPR[i + 1] == 'R') {
            EXPR[k++] = 'o';
            i++;
        }
        else if (EXPR[i] == 'N' && EXPR[i + 1] == 'O') {
            EXPR[k++] = 'n';
            i += 2;
        }
        else if (EXPR[i] == 'T' && EXPR[i + 1] == 'R') {
            EXPR[k++] = 't';
            i += 3;
        }
        else if (EXPR[i] == 'F' && EXPR[i + 1] == 'A') {
            EXPR[k++] = 'f';
            i += 4;
        }
        else {
            EXPR[k++] = EXPR[i];
        }
    }

    EXPR[k] = '\0';
    LEN = k;
    fscanf(fin, "%d\n", &N);
    for (i = 1; i <= N; i++) {
        fscanf(fin, "%c", &c);
        if (val[c - 'A'] == 1)
            val[c - 'A'] = 0;
        else
            val[c - 'A'] = 1;
        p = 0;
        fprintf(fout, "%d", expresie());
    }
    fprintf(fout, "\n");

    fclose(fin);
    fclose(fout);
    return 0;
}