Cod sursa(job #1825415)

Utilizator andrei20003Ionescu Andrei andrei20003 Data 9 decembrie 2016 09:16:52
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include<cstdio>
#include<cstring>

const int LMAX=1001;

char s[LMAX];
int poz;
bool val['Z'-'A'];

char operatori[2][5]={"AND","OR"},constante[2][7]={"FALSE","TRUE"};

int Operator_tip()
{
 for(int i=0;i<2;i++)
     if(strncmp(s+poz,operatori[i],strlen(operatori[i]))==0)
        return i;
 return -1;
}

int Constante_tip()
{
 for(int i=0;i<2;i++)
     if(strncmp(s+poz,constante[i],strlen(constante[i]))==0)
        return i;
 return -1;
}

bool Termen();

bool Expresie()
{
 bool termen=Termen();
 while(s[poz]=='|')
       {
        if(s[poz]=='|')
           {
            poz++;
            termen=(Termen() || termen);
           }
       }
 return termen;
}

bool Factor()
{
 bool semn=false;
 while(s[poz]=='!')
       {
        poz++;
        semn=!semn;
       }
 int valuare=0;
 if(s[poz]=='(')
    {
     poz++;
     valuare=Expresie();
     if(semn)
        valuare=!valuare;
     poz++;
     return valuare;
    }
 if(s[poz]=='0' || s[poz]=='1')
    {
     poz++;
     return s[poz-1]-'0';
    }
 for(char i='A';i<='Z';i++)
     if(s[poz]==i)
        {
         poz++;
         if(semn)
            return !val[i-'A'];
         return val[i-'A'];
        }
}

bool Termen()
{
 bool factor=Factor();
 while(s[poz]=='&')
       {
        if(s[poz]=='&')
           {
            poz++;
            factor=(Factor() && factor);
           }
       }
 return factor;
}

bool Is_NOT()
{
 return strncmp(s+poz,"NOT",strlen("NOT"))==0;
}

int main()
{
 FILE *in=fopen("bool.in","r");
 fgets(s,sizeof s,in);
 int n;
 n=strlen(s);
 if(s[n-1]=='\n')
    s[n-1]='\0';
 int j=0;
 for(int i=0;i<n;i++)
     {
      if(s[i]==' ')
         continue;
      int tip=0;
      poz=i;
      if((tip=Operator_tip())!=-1)
         s[j++]=tip?'|':'&',i+=strlen(operatori[tip])-1;
      else
         {
          if((tip=Constante_tip())!=-1)
             s[j++]='0'+tip,i+=strlen(constante[tip])-1;
          else
             if((tip=Is_NOT()))
                s[j++]='!',i+=2;
             else
                s[j++]=s[i];
         }
     }
 s[j]=NULL;//'\0';
 fprintf(stderr,"%s ",s);
 fscanf(in,"%d ",&n);
 FILE *out=fopen("bool.out","w");
 for(int i=1;i<=n;i++)
     {
      char x;
      fscanf(in,"%c ",&x);
      val[x-'A']=(!val[x-'A']);
      poz=0;
      int rasp=Expresie();
      fprintf(out,"%d",rasp);
     }
 fprintf(out,"\n");
}