Cod sursa(job #1826351)

Utilizator Coroian_DavidCoroian David Coroian_David Data 10 decembrie 2016 12:53:42
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.48 kb
#include <cstdio>

#include <cstring>

using namespace std;

FILE *f, *g;

bool expresie();
bool termen();
bool factor();

char s[1001], a[1001];

int ap[50];

int n;

int crChar;

bool isChar(char c)
{
    if(c >= 'A' && c <= 'Z')
        return 1;

    return 0;
}

bool isSign1(char c)
{
    if(c == '|')
        return 1;

    return 0;
}

bool isSign3(char c)
{
    if(c == '&')
        return 1;

    return 0;
}

bool expresie()
{
    bool rez = termen(), x;

    while(isSign1(s[crChar]) != 0)
        crChar ++, x = termen(), rez = (x || rez);

    return rez;

}

bool and1(bool a, bool b)
{
    if((a == 1) && (b == 1))
        return 1;

    return 0;
}

bool termen()
{
    bool rez = factor(), x;

    while(isSign3(s[crChar]))
    {
        if(s[crChar] == '&')
            crChar ++, x = factor(), rez = and1(x, rez);
    }

    return rez;
}

bool factor()
{
    bool rez = 0, sign = 1;

    while(s[crChar] == '~')
    {
        sign  = !sign;

        crChar ++;
    }

    if(s[crChar] == '(')
    {
        crChar ++;

        rez = expresie();

        crChar ++;

        if(sign == 0)
            return (!rez);

        return rez;
    }

    if(isChar(s[crChar]))
    {
        rez = ap[s[crChar] - 'A' + 1];

        crChar ++;
    }

    if(s[crChar] == '1' || s[crChar] == '0')
        rez = s[crChar] - '0', crChar ++;

    if(sign == 0)
        return (!rez);

    return rez;
}

int operators(int i)
{
    if(s[i] == 'O' && s[i + 1] == 'R')
        return 1;

    if(s[i] == 'A' && s[i + 1] == 'N')
        return 2;

    if(s[i] == 'N' && s[i + 1] == 'O')
        return 3;

    if(s[i] == 'T' && s[i + 1] == 'R')
        return 4;

    if(s[i] == 'F' && s[i + 1] == 'A')
        return 5;
}

int edits(int op)
{
    if(op == 1)
        return 2;

    if(op == 2 || op == 3)
        return 3;

    if(op == 4)
        return 4;

    return 5;
}

char sign(int op)
{
    if(op == 1)
        return '|';

    if(op == 2)
        return '&';

    if(op == 3)
        return '~';

    if(op == 4)
        return '1';

    return '0';
}

void editString()
{
    int i, op;

    int crCharEdit = 0, crChar = 0;

    int len = strlen(s);

    while(crCharEdit < len)
    {
        if(isChar(s[crCharEdit]))
        {
            if(isChar(s[crCharEdit + 1]))
            {
                op = operators(crCharEdit);

                a[crChar] = sign(op);

                crChar ++;

                crCharEdit += edits(op);
            }

            else
                a[crChar] = s[crCharEdit], crChar ++, crCharEdit ++;
        }

        else
        {
            if(s[crCharEdit] != ' ')
                a[crChar] = s[crCharEdit], crChar ++, crCharEdit ++;

            else
                crCharEdit ++;
        }
    }

    a[crChar] = 0;

    strcpy(s, a);
}

void solve()
{
    f = fopen("bool.in", "r");
    g = fopen("bool.out", "w");

    fgets(s, 1005, f);

    s[strlen(s) - 1] = 0;

    editString();

   // printf("%s*\n", s);

    fscanf(f, "%d\n", &n);

    int i;

    char chr;

    for(i = 1; i <= n; i ++)
    {
        crChar = 0;

        fscanf(f, "%c", &chr);

        ap[chr - 'A' + 1] = !ap[chr - 'A' + 1];

        fprintf(g, "%d", expresie());
    }

    fprintf(g, "\n");

    fclose(f);
    fclose(g);
}

int main()
{
    solve();

    return 0;
}