Pagini recente » Monitorul de evaluare | Borderou de evaluare (job #618148) | Cod sursa (job #527444)
Cod sursa(job #527444)
#include <stdio.h>
using namespace std;
#define maxe 1024
#define maxn 128
FILE *fin =fopen("bool.in","r");
FILE *fout=fopen("bool.out","w");
int i,j,N,p;
char s[maxe],var[maxn];
bool v[maxn];
void citire()
{
fgets(s,sizeof(s),fin);
fscanf(fin,"%d",&N);
fscanf(fin,"%s",&var);
for(i=N;i;i--) var[i]=var[i-1];
}
void variabile()
{
for(i=1;i<=N;i++)
v[i]=false;
}
bool pr1_or();
bool pr2_and();
bool pr3_not();
bool paranteze();
bool pr1_or()
{
bool r=pr2_and(),r2;
while(s[p]=='O' && s[p+1]=='R')
{
p=p+2;
for(;s[p]==' ';p++);
r2=pr2_and();
r=r || r2;
}
return r;
}
bool pr2_and()
{
bool r=pr3_not();
while(s[p]=='A' && s[p+1]=='N')
{
p=p+3;
for(;s[p]==' ';p++);
r=r && pr3_not();
}
return r;
}
bool pr3_not()
{
bool r;
if(s[p]=='N' && s[p+1]=='O')
while(s[p]=='N' && s[p+1]=='O')
{
p=p+3;
for(;s[p]==' ';p++);
r=not paranteze();
}
else r=paranteze();
return r;
}
bool paranteze()
{
bool r;
if(s[p]=='(')
{
p++;
r=pr1_or();
p++;
}
if(s[p]>='A' && s[p]<='Z' && (s[p+1]<'A' || s[p+1]>'Z'))
{
r=v[s[p]-'A'+1];
p++;
}
if(s[p]=='T' && s[p+1]=='R')
{
p=p+4;
for(;s[p]==' ';p++);
r=true;
}
if(s[p]=='F' && s[p+1]=='A')
{
p=p+5;
for(;s[p]==' ';p++);
r=false;
}
for(;s[p]==' ';p++);
return r;
}
void rez()
{
bool expr;
for(i=1;i<=N;i++)
{
v[var[i]-'A'+1]=!v[var[i]-'A'+1];
p=0;
expr=pr1_or();
if(expr==true) fprintf(fout,"1");
else fprintf(fout,"0");
}
}
int main()
{
citire();
variabile();
rez();
}