Cod sursa(job #1099955)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 6 februarie 2014 14:14:50
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <stdio.h>

#define Nmax 105
#define Lmax 1005

char exp[Lmax], changes[Nmax];
char *p;
bool values[30];
int n;

bool eval2();
bool eval3();
bool factor();

inline int check(char *p)
{
    if (*p == 'F' && *(p + 1) == 'A')
        return 0;
    else if (*p == 'T' && *(p + 1) == 'R')
        return 1;
    else if (*p == 'O' && *(p + 1) == 'R')
        return 2;
    else if (*p == 'A' && *(p + 1) == 'N')
        return 3;
    else if (*p == 'N' && *(p + 1) == 'O')
        return 4;
    else if (*p != ' ' && *p != '\n')
        return 5;

    return -1;
}

void read()
{
    freopen("bool.in", "r", stdin);
    char c[Lmax], *p;
    int i = 0, d;

    fgets(c, Lmax, stdin);
    p = c;
    while (*p != '\n'){
        if (*p == ' ')
            ++p;
        while (*p == '(' || *p == ')'){
            exp[i++] = *p;
            ++p;
        }
        d = check(p);
        if (d == 0){
            exp[i++] = '0';
            p += 5;
        } else if (d == 1){
            exp[i++] = '1';
            p += 4;
        } else if (d == 2){
            exp[i++] = '+';
            p += 2;
        } else if (d == 3){
            exp[i++] = '*';
            p += 3;
        } else if (d == 4){
            exp[i++] = '^';
            p += 3;
        } else if (d == 5){
            exp[i++] = *p;
            ++p;
        }
    }
    exp[i] = '\0';
    scanf("%d%s", &n, changes);

    fclose(stdin);
}

bool eval()
{
    bool r = eval2();
    bool r2;
    while (*p == '+'){
        ++p;
        r2 = eval2();
        r = r || r2;
    }
    return r;
}

bool eval2()
{
    bool r = eval3();
    bool r2;
    while (*p == '*'){
        ++p;
        r2 = eval3();
        r = r && r2;
    }
    return r;
}

bool eval3()
{
    bool r;
    bool r2;
    if (*p == '^'){
        while (*p == '^'){
            ++p;
            r2 = factor();
            r = !r2;
        }
    } else
        r = factor();
    return r;
}

bool factor()
{
    bool r;
    if (*p == '('){
        ++p;
        r = eval();
        ++p;
    } else{
        r = values[ *p - 'A' ];
        ++p;
    }
    return r;
}

int main()
{
    freopen("bool.out", "w", stdout);

    read();
    for (int i = 0; i < n; ++i){
        if (values[ changes[i] - 'A' ] == 0)
            values[ changes[i] - 'A' ] = 1;
        else
            values[ changes[i] - 'A' ] = 0;
        p = exp;
        printf("%d", eval());
    }
    fclose(stdout);
    return 0;
}