Cod sursa(job #1003544)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 30 septembrie 2013 21:33:44
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;

#define NMAX 1002
#define alfa 27

class Expresie {
    char c[NMAX],*p;
    int value[alfa];

public :
    Expresie ();
    Expresie (char *);
    void invert_value(char);
    void reset();
    int check(char *, char *);
    int evalueaza();
    int termen();
    int factor();

};

Expresie :: Expresie()
{
    p = c;
    memset(value,0,sizeof(value));
}

Expresie :: Expresie(char sir[])
{
    int i,n,m;
    memset(c,0,sizeof(c));
    memset(value,0,sizeof(value));
    n=strlen(sir)-1;
    m=-1;
    for(i=0;i<=n;i++)
        if(sir[i]!=' ')
            c[++m]=sir[i];
    p = c;
}

int Expresie :: check(char *a, char *b)
{
    int i, n;
    n = strlen(b)-1;
    for(i=0;i<=n;i++)
        if(*(a+i)!=*(b+i))
            return 0;
    return 1;
}

void Expresie :: invert_value(char c)
{
    value[c-'A']=!value[c-'A'];
}

void Expresie :: reset()
{
    p = c;
}

int Expresie :: evalueaza()
{
    int r;
    r = termen();
    while(check(p,"OR")) {
        p=p+2;
        r|=termen();
    }
    return r;
}

int Expresie :: termen()
{
    int r;
    r = factor();
    while(check(p,"AND")) {
        p=p+3;
        r&=factor();
    }
    return r;
}

int Expresie :: factor()
{
    int r,neg;
    if(check(p,"NOT")) {
        p=p+3;
        neg=1;
    }
    else neg=0;
    if(*p=='(') {
        p++;
        r=evalueaza();
        p++;
    }
    else if(check(p,"TRUE")) {
        r=1;
        p=p+4;
    }
    else if(check(p,"FALSE")) {
        r=0;
        p=p+5;
    }
    else if(*p>='A' && *p<='Z') {
        r=value[*p-'A'];
        p++;
    }
    if(neg)
        r=!r;
    return r;
}

char sir[NMAX];

int main ()
{
    int n,i;
    char c;
    ifstream f("bool.in");
    ofstream g("bool.out");
    f.get(sir,NMAX-1);
    f>>n;
    Expresie s(sir);
    for(i=1;i<=n;i++) {
        f>>c;
        s.invert_value(c);
        g<<s.evalueaza();
        s.reset();
    }
    f.close();
    g.close();
    return 0;
}