Cod sursa(job #1393333)

Utilizator karlaKarla Maria karla Data 19 martie 2015 12:10:52
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <stdio.h>
#include <string.h>

using namespace std;

FILE*f=fopen("bool.in","r"),*g=fopen("bool.out","w");
int n, k, p[1020], t;
char s[1020], ch;

void modificare()
{
    for(int i = 0; i < n; i++)
    {
        if(s[i] == ch)
        {
            if(p[i] == 1)
                p[i] = 0;
            else if(p[i] == 0)
                p[i] = 1;
        }
    }
}

int expresie();
int factor();
int termen();
int paranteze();

void afisare(char a[])
{
        fprintf(g,"%s\n",a);
}

int main()
{
    fgets(s,1010,f);
    n = strlen(s) - 1;
    for(int i = 0; i < n; i++)
    {
        if(s[i] == 'T' && s[i+1] == 'R')
        {
            char t[1020];
            strcpy(t, s + i + 4);
            strcpy(s + i + 1, t);
            s[i] = '1';
            p[i] = 1;
            n -= 3;
        }
        if(s[i] == 'F' && s[i+1] == 'A')
        {
            char t[1020];
            strcpy(t, s + i + 5);
            strcpy(s + i + 1, t);
            s[i] = '0';
            n -= 4;
        }
        if(s[i] == 'A' && s[i+1] == 'N')
        {
            char t[1020];
            strcpy(t, s + i + 3);
            strcpy(s + i + 1, t);
            s[i] = '&';
            n -= 2;
        }
        if(s[i] == 'O' && s[i+1] == 'R')
        {
            char t[1020];
            strcpy(t, s + i + 2);
            strcpy(s + i + 1, t);
            s[i] = '|';
            n -= 1;
        }
        if(s[i] == 'N' && s[i+1] == 'O')
        {
            char t[1020];
            strcpy(t, s + i + 3);
            strcpy(s + i + 1, t);
            s[i] = '~';
            n -= 2;
        }
        if(s[i] == ' ')
        {
            char t[1020];
            strcpy(t, s + i + 1);
            strcpy(s + i, t);
            n--;
            i--;
        }
    }
    fscanf(f,"%d\n",&t);
    for(int i = 1; i <= t; i++)
    {
        k = 0;
        fscanf(f,"%c", &ch);
        modificare();
        int sol = expresie();
        fprintf(g,"%d",sol);
    }
    return 0;
}


int expresie()
{
    int r = termen();
    while(s[k] == '|')
    {
        k++;
        r |= termen();
    }
    return r;
}
int termen()
{
    int r = factor();
    while(s[k] == '&')
    {
        k++;
        r &= factor();
    }
    return r;
}
int factor()
{
    int r = paranteze();
    while(s[k] == '~')
    {
        k++;
        r = ~paranteze();
    }
    return r;
}
int paranteze()
{
    int r = 0;
    if(s[k] == '(')
    {
        k++;
        r = expresie();
        k++;
    }
    else if((s[k] >= 'A' && s[k] <= 'Z') || (s[k] == '1') || (s[k] == '0'))
    {
        r = p[k];
        k++;
    }
    return r;
}