Pagini recente » Cod sursa (job #1676727) | Cod sursa (job #2422164) | Cod sursa (job #366163) | Cod sursa (job #739661) | Cod sursa (job #70490)
Cod sursa(job #70490)
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define DELIMITER 1
#define VARIABLE 2
#define NUMBER 3
char expr1[1011],aux[1011],*expr,tok_type,token[10],c;
int l,i,j,n,val[30],sol,ind;
void get_token();
void atom(int *answer);
void eval_exp(int *answer);
void eval_exp1(int *answer);//evalueaza OR=+
void eval_exp2(int *answer);//evalueaza AND=*
void eval_exp3(int *answer);//evalueaza NOT=-
void eval_exp4(int *answer);//evalueaza ()
int main()
{
FILE *f,*g;
f=fopen("bool.in","r");
g=fopen("bool.out","w");
fgets(aux,1002,f);
l=strlen(aux);
while(i<l-1)
{ if(aux[i]==' ')i++;
else if(aux[i]=='T'&&aux[i+1]=='R'){expr1[j]='1';i=i+4;j++;}
else if(aux[i]=='F'&&aux[i+1]=='A'){expr1[j]='0';i=i+5;j++;}
else if(aux[i]=='O'&&aux[i+1]=='R'){expr1[j]='+';i=i+2;j++;}
else if(aux[i]=='A'&&aux[i+1]=='N'){expr1[j]='*';i=i+3;j++;}
else if(aux[i]=='N'&&aux[i+1]=='O'){expr1[j]='-';i=i+3;j++;}
else {expr1[j]=aux[i];i++;j++;}
}
expr=expr1;
fscanf(f,"%d",&n);
fscanf(f,"%c",&c);
for(i=1;i<=n;i++)
{ expr=expr1;
fscanf(f,"%c",&c);
ind=(int)(c-'A');
val[ind]=1-val[ind];
eval_exp(&sol);
fprintf(g,"%d",sol);
}
fprintf(g,"\n");
fcloseall();
return 0;
}
void get_token()
{
char *temp;
tok_type=0;
temp=token;
*temp='\0';
if(!*expr) return;
while(isspace(*expr)) ++expr;
if(strchr("+-*()",*expr))
{ tok_type=DELIMITER;
*temp++=*expr++;
}
else
if(isalpha(*expr))
{ tok_type=VARIABLE;
*temp++=*expr++;
}
else
if(isdigit(*expr))
{ tok_type=NUMBER;
*temp++=*expr++;
}
*temp='\0';
}
void atom(int *answer)
{
if(tok_type==NUMBER)
{if(*token=='1') *answer=1;
else *answer=0;
}
else
*answer=val[(int)(token[0]-'A')];
get_token();
}
void eval_exp(int *answer)//initializeaza evaluarea
{
get_token();
eval_exp1(answer);
}
void eval_exp1(int *answer)//evalueaza OR=+
{
char op;
int temp;
eval_exp2(answer);
while(*token=='+')
{
get_token();
eval_exp2(&temp);
*answer=*answer||temp;
}
}
void eval_exp2(int *answer)//evalueaza AND=*
{
int temp;
eval_exp3(answer);
while(*token=='*')
{
get_token();
eval_exp3(&temp);
*answer=*answer&&temp;
}
}
void eval_exp3(int *answer)//evalueaza NOT=-
{
char op=0;
if(*token=='-')
{
op=*token;
get_token();
}
eval_exp4(answer);
if(op=='-')
*answer=!(*answer);
}
void eval_exp4(int *answer)//evalueaza ()
{
if(*token=='(')
{ get_token();
eval_exp1(answer);
get_token();
}
else
atom(answer);
}