Pagini recente » Istoria paginii utilizator/tudorvatca | Istoria paginii utilizator/vladbuzetelu | Cod sursa (job #946087) | Monitorul de evaluare | Cod sursa (job #1898051)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char v[1000];
char val[28];
FILE *fin, *fout;
void citire_sir(){
int poz;
char ch;
fscanf( fin, "%s", v );
ch = fgetc( fin );
poz = 0;
val[26] = 1;///codificam true ca z+1 si false ca z+2
while( ch!='\n'){
while( v[poz]=='(' || v[poz]==')' )
poz++;
if( strcmp( v+poz, "TRUE")==0 ){
v[poz] = 'Z'+1;
v[poz+1] = 0;
}
else if( strcmp( v+poz, "FALSE") == 0 ){
v[poz] = 'Z'+2;
v[poz+1] = 0;
}
else if( strcmp( v+poz, "NOT" ) == 0 ){
v[poz] = '!';
v[poz+1] = 0;
}
else if( strcmp( v+poz, "OR" ) == 0 ){
v[poz] = '|';
v[poz+1] = 0;
}
else if( strcmp( v+poz, "AND" ) == 0 ){
v[poz] = '&';
v[poz+1] = 0;
}
poz += 1 + strlen( v+poz+1 );
fscanf( fin, "%s", v+poz );
ch = fgetc( fin );
}
}
int poz;
int eval();
int exp_sau();
int exp_si();
int eval(){
int exp = exp_sau();
while( v[poz]=='&' ){
poz++;
exp = exp & exp_sau();
}
return exp;
}
int exp_sau(){
int exp = exp_si();
while( v[poz]=='|' ){
poz++;
exp = exp | exp_si();
}
return exp;
}
int exp_si(){
int exp, not1, not2, exp2;
exp = exp2 = 0;
not1 = not2 = 0;
if( v[poz]=='!' ){
not1 = 1;
poz++;
}
if( isalpha( v[poz] ) != 0 ){
exp = val[ v[poz] - 'A' ];
poz++;
}
else if( v[poz]=='(' ){
poz++;
exp = eval();
poz++;
}
if( not1==1 )
exp = 1 - exp;
/*while( v[poz] == '&' ){
poz++;
if( v[poz]=='!' ){
not2 = 1;
poz++;
}
else
not2 = 0;
if( isalpha( v[poz] ) !=0 ){
exp2 = val[ v[poz] - 'A' ];
poz++;
}
else if( v[poz]=='(' ){
poz++;
exp2 = eval();
poz++;
}
if( not2==1 )
exp2 = 1 - exp2;
exp = exp & exp2;
}
*/
return exp;
}
int main(){
int n, i;
char ch;
fin = fopen( "bool.in", "r" );
fout = fopen( "bool.out", "w" );
citire_sir();
fscanf( fin, "%d\n", &n );
//printf("%s",v);
for( i=0; i<n; i++ ){
ch = fgetc( fin );
val[ ch - 'A' ] = 1 - val[ ch - 'A' ];
poz = 0;
fprintf( fout, "%d", eval() );
}
fclose( fin );
fclose( fout );
return 0;
}