Pagini recente » Cod sursa (job #883478) | Cod sursa (job #1176879) | Cod sursa (job #1307812) | Cod sursa (job #153025) | Cod sursa (job #2790468)
#include <stdio.h>
#include <ctype.h>
#define MAX_LEN 1000
#define ALFA 26
int len, i;
char v[MAX_LEN];
int val[ALFA];
int expresie();
int factor() {
i++;
if ( v[i - 1] == '(' )
return expresie();
if ( v[i - 1] == '!' )
return !factor();
if ( isdigit( v[i - 1] ) )
return v[i - 1] - '0';
return val[v[i - 1] - 'A'];
}
int termen() {
int rez;
rez = 1;
while ( i < len && v[i] != ')' && v[i] != '|' ) {
rez = rez & factor();
if ( v[i] == '&' )
i++;
}
if ( i < len && v[i] != ')' )
i++;
return rez;
}
int expresie() {
int rez;
rez = 0;
while ( i < len && v[i] != ')' )
rez = rez | termen();
i++;
return rez;
}
int main() {
FILE *fin, *fout;
char prev, crt;
int n;
fin = fopen( "bool.in", "r" );
fout = fopen( "bool.out", "w" );
len = 0;
prev = 0;
crt = fgetc( fin );
while ( crt != '\n' ) {
if ( prev == 'O' && crt == 'T' ) { // NOT
len--;
v[len - 1] = '!';
} else if ( prev == 'N' && crt == 'D' ) { // AND
len--;
v[len - 1] = '&';
} else if ( prev == 'O' && crt == 'R' ) // OR
v[len - 1] = '|';
else if ( prev == 'U' && crt == 'E' ) { // TRUE
len -= 2;
v[len - 1] = '1';
} else if ( prev == 'S' && crt == 'E' ) { // FALSE
len -= 2;
v[len - 1] = '0';
} else if ( crt != ' ' ) {
v[len] = crt;
len++;
}
prev = crt;
crt = fgetc( fin );
}
for ( i = 0; i < ALFA; i++ )
val[i] = 0;
fscanf( fin, "%d", &n );
fgetc( fin );
while ( n-- ) {
crt = fgetc( fin ) - 'A';
val[crt] = !val[crt];
i = 0;
fprintf( fout, "%d", expresie() );
}
fclose( fin );
fclose( fout );
return 0;
}