Cod sursa(job #1369001)

Utilizator DiClauDan Claudiu DiClau Data 2 martie 2015 21:04:14
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.09 kb
#include<stdio.h>
using namespace std;
const int L = 1005;
char v[L];
int p;
bool litere[26];
bool eAnd();
bool eOr();
bool eNot();
bool factor();
bool eOr()
{
    bool term = eAnd();
    while (v[p] == '|')
    {
        p++;
        if (eAnd() == 1)
            term = 1;
    }
    return term;
}
bool eAnd()
{
    bool term = eNot();
    while (v[p] == '&')
    {
        p++;
        if (eNot() == 0)
            term = 0;
    }
    return term;
}
bool eNot()
{
    bool term = factor();
    while (v[p] == '!')
    {
        p++;
        term = factor();
        term = 1 - term;
    }
    return term;
}
bool factor()
{
    bool termen;
    if (v[p] == '(')
    {
        p++;
        termen = eOr();
    }
    if (v[p] == ')')
    {
        p++;
        return termen;
    }
    char aux;
    aux = v[p];
    if (v[p] >= 'A' && v[p] <= 'Z')
    {
        p++;
        return litere[aux - 'A'];
    }
    if (v[p] == '1')
    {
        p++;
        return true;
    }
    if (v[p] == '0')
    {
        p++;
        return false;
    }
}
int main ()
{
    FILE *in, *out;
    in = fopen ("bool.in", "r");
    out = fopen ("bool.out", "w");
    char x;
    x = fgetc (in);
    while (x != '\n')
    {
        while (x == ' ')
            x = fgetc(in);
        if (x >= 'A' && x <= 'Z')
        {
            if (x == 'A')
            {
                x = fgetc(in);
                if (x == 'N')
                {
                    x = fgetc(in);
                    x = fgetc(in);
                    v[p++] = '&';
                }
                else
                    v[p++] = 'A';
            }
            else
            {
                if (x == 'N')
                {
                    x = fgetc(in);
                    if (x == 'O')
                    {
                        x = fgetc(in);
                        x = fgetc(in);
                        v[p++] = '!';
                    }
                    else
                        v[p++] = 'N';
                }
                else
                {
                    if (x == 'O')
                    {
                        x = fgetc(in);
                        if (x == 'R')
                        {
                            x = fgetc(in);
                            v[p++] = '|';
                        }
                        else
                            v[p++] = 'O';
                    }
                    else
                    {
                        if (x == 'T')
                        {
                            x = fgetc(in);
                            if (x == 'R')
                            {
                                fscanf(in, "UE%c", &x);
                                v[p++] = '1';
                            }
                            else
                                v[p++] = 'T';
                        }
                        else
                        {
                            if (x == 'F')
                            {
                                x = fgetc(in);
                                if (x == 'A')
                                {
                                    fscanf(in, "LSE%c", &x);
                                    v[p++] = '0';
                                }
                                else
                                    v[p++] = 'F';
                            }
                            else
                            {
                                v[p++] = x;
                                x = fgetc(in);
                            }
                        }
                    }
                }
            }
        }
        else
        {
            v[p++] = x;
            x = fgetc(in);
        }
        //fprintf(out, "%c", v[p-1]);
    }
    int n;
    fscanf (in, "%d\n", &n);
    int i;
    for (i = 1; i <= n; i++)
    {
        p = 0;
        x = fgetc(in);
        litere[x - 'A'] = 1 - litere[x - 'A'];
        fprintf(out, "%d", eOr());
    }
    return 0;
}