Cod sursa(job #1644629)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 10 martie 2016 01:09:42
Problema Bool Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 5.06 kb
#include<stdio.h>

#define PRI 0

FILE *in, *out;

int poz, val[30];
char v[700];
int termen();
int factor();

int expresie()
{
    int r;
if(PRI)printf("expre poz = %d\n", poz);
    r = termen();
    while(v[poz] == '|') {
            poz++;
            r = r | termen();
    }
    /*
    if(v[poz] == ')') {
            poz++;
    }
    */
    //poz++;
    return r;
}

int termen()
{
    int r;
if(PRI)printf("termen poz = %d\n", poz);
    r = factor();
if(PRI)printf("termenHUWHUW poz = %d\n", poz);
    while(v[poz] == '&') {
            //printf("OK");
            poz++;
            r = r & factor();
    }
    //poz++;
    return r;
}

int factor()
{
    int r;
if(PRI)printf("factor poz = %d\n", poz);
    if(v[poz] == '!') {
            poz++;
            if(v[poz] == '(') {
                poz++;
                r = expresie();
                poz++;
            } else {
                //if(v[poz] != 0 && v[poz] != 1)
                r = val[v[poz] - 'A'];
            }
            r = (r + 1) % 2;
    } else {
        if(v[poz] == '(') {
            poz++;
            r = expresie();
            poz++;

        } else {
            r = val[v[poz] - 'A'];
        }
    }

    poz++;
    return r;
}




int main ()
{
    char c;
    int lung, i, ture;

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

    poz = 0;
    c = fgetc(in);
    while(c != '\n') {
            switch(c) {
                case '(':
                case ')':
                    v[poz] = c;
                    poz++;
                    break;
                case 'A':
                    c = fgetc(in);
                    if(c != 'N') {
                            v[poz] = 'A';
                            poz++;
                            if(c == ')') {
                                v[poz] = c;
                                poz++;
                            }
                    } else {
                        v[poz] = '&';
                        poz++;
                        fgetc(in);
                        fgetc(in);
                    }
                    break;
                case 'N':
                    c = fgetc(in);
                    if(c == 'O') {
                        fgetc(in);
                        v[poz] = '!';
                        poz++;
                    } else {
                        v[poz] = 'N';
                        poz++;
                        if(c == ')') {
                            v[poz] = c;
                            poz++;
                        }
                    }
                    break;
                case 'O':
                    c = fgetc(in);
                    if(c == 'R') {
                        v[poz] = '|';
                        poz++;
                        fgetc(in);
                    } else {
                        v[poz] = 'O';
                        poz++;
                        if(c == ')') {
                            v[poz] = c;
                            poz++;
                        }
                    }
                    break;
                case 'T':
                    c = fgetc(in);
                    if(c == 'R') {
                        v[poz] = 'A' + 27;
                        poz++;
                        fgetc(in);
                        fgetc(in);
                    } else {
                        v[poz] = 'T';
                        poz++;
                        if(c == ')') {
                            v[poz] = c;
                            poz++;
                        }
                    }
                    break;
                case 'F':
                    c = fgetc(in);
                    if(c == 'A') {
                        v[poz] = 'A' + 26;
                        poz++;
                        fgetc(in);
                        fgetc(in);
                        fgetc(in);
                    } else {
                        v[poz] = 'F';
                        poz++;
                        if(c == ')') {
                            v[poz] = c;
                            poz++;
                        }
                    }
                    break;
                case ' ':
                    break;
                default:
                    v[poz] = c;
                    poz++;
                    break;
            }
            c = fgetc(in);
    }
    lung = poz;
    /*
    for(i = 0; i < lung; i++) {
            printf("%c", v[i]);
    }
    printf("\n");
    //*/

    fscanf(in, "%d", &ture);

    fgetc(in);
    val[26] = 0;
    val[27] = 1;

    for(i = 0; i < ture; i++) {
            c = fgetc(in);
            val[c - 'A'] = (val[c - 'A'] + 1) % 2;
            /*
            for(poz = 0; poz < 26; poz++) {
                    printf("%d ", val[poz]);
            }
            */
            //printf("\n");
            poz = 0;
            fprintf(out, "%d", expresie());
    }

    fclose(in);
    fclose(out);

    return 0;
}