Cod sursa(job #1362427)

Utilizator andi12Draghici Andrei andi12 Data 26 februarie 2015 12:33:04
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <cstdio>

using namespace std;
char s1[1005];
char s[1005];
char v[101];
int p;
bool vec[50];
bool factor();
bool exp();
bool termen();
bool fc(bool x)
{
    if(x==true)
        return false;
    else
        return true;
}
bool exp()
{
    bool val=factor();
    while(s[p]=='|')
    {
        p++;
        val=(val || factor());
    }
    return val;
}
bool factor()
{
    bool val=termen();
    while(s[p]=='&')
    {
        p++;
        val=(val && termen());
    }
    return val;
}
bool termen()
{
    bool val,semn=0;
    while(s[p]=='-')
    {
        p++;
        semn=fc(semn);
    }
    if(s[p]=='(')
    {
        p++;
        val=exp();
        p++;
        if(semn==false)
            return val;
        else
            return fc(val);
    }
    if(s[p]=='1')
    {
        p++;
        val=1;
        if(semn==false)
            return val;
        else
            return fc(val);
    }
    if(s[p]=='2')
    {
        p++;
        val=0;
        if(semn==false)
            return val;
        else
            return fc(val);
    }
    if(s[p]>='A' && s[p]<='Z')
    {
        val=vec[s[p]-'A'];
        p++;
    }
    if(semn==false)
        return val;
    else
        return fc(val);
}
int main()
{
    FILE *in,*out;
    in=fopen("bool.in","r");
    out=fopen("bool.out","w");
    int n,i,nr1=0,ok;
    char c;
    bool ras;
    fgets(s1,1000,in);
    fscanf(in,"%d\n",&n);
    //c=fgetc(in);
    fgets(v,100,in);
    for(i=0;i<=1000;i++)
    {
        ok=0;
        if(s1[i]=='O' && s1[i+1]=='R')
        {
            s[nr1]='|';
            nr1++;
            i=i+1;
            ok=1;
        }
        if(s1[i]=='A' && s1[i+1]=='N' && s1[i+2]=='D')
        {
            s[nr1]='&';
            nr1++;
            i=i+2;
            ok=1;
        }
        if(s1[i]=='N' && s1[i+1]=='O')
        {
            s[nr1]='-';
            nr1++;
            i=i+2;
            ok=1;
        }
        if(s1[i]=='T' && s1[i+1]=='R')
        {
            s[nr1]='1';
            nr1++;
            i=i+3;
            ok=1;
        }
        if(s1[i]=='F' && s1[i+1]=='A')
        {
            s[nr1]='2';
            nr1++;
            i=i+4;
            ok=1;
        }
        if(s1[i]!=' ' && ok==0)
        {
            s[nr1]=s1[i];
            nr1++;
        }
    }
    //fprintf(out,"%s",s);
    for(i=0;i<n;i++)
    {
        vec[v[i]-'A']=fc(vec[v[i]-'A']);
        ras=exp();
        fprintf(out,"%d",ras);
        p=0;
    }
    return 0;
}