Pagini recente » Cod sursa (job #377414) | Cod sursa (job #921340) | Rating Sicoe Raul Ioan (RaulSicoeCNAI) | Monitorul de evaluare | Cod sursa (job #1661231)
#include <stdio.h>
#define MAX_EXPRESIE 1000
#define MAX_KEYWORDS 5
#define MAX_KEYWORD_LENGTH 5
char expresie[ MAX_EXPRESIE + 1 ];
int cursor;
char keyWords[ MAX_KEYWORDS ][ MAX_KEYWORD_LENGTH + 1 ] = { "AND\0" , "OR\0" , "NOT\0" ,
"TRUE\0" , "FALSE\0" };
char var[ 26 ];
//verificam daca caracterul c este litera
int isAlfa( char c ) {
return 'A' <= c && c <= 'Z';
}
//comparam doua cuvinte
int compWord( char* a , char* b ) {
int i;
i = 0;
while( isAlfa( a[ i ] ) && isAlfa( b[ i ] ) && a[ i ] == b[ i ] )
i++;
return !isAlfa( a[ i ] ) && !isAlfa( b[ i ] );
}
//cautam ce cuvant cheie este a
int getKeyWord( char* a ) {
int i;
i = 0;
while( i < MAX_KEYWORDS && !compWord( a , keyWords[ i ] ) )
i++;
return i;
}
//citim urmatorul caracter ignorand spatiile
void ignoreSpace( ) {
cursor++;
while( expresie[ cursor ] == ' ' )
cursor++;
}
char expr( );
char variabila( );
char subexpr( ) {
char rez , op , var;
rez = variabila( );
op = getKeyWord( expresie + cursor );
while( op == 0 ) { //AND
cursor += 3;
ignoreSpace( );
var = variabila( );
rez = rez && var;
op = getKeyWord( expresie + cursor );
}
return rez;
}
//citim o expresie
char expr( ) {
char rez , op , var;
rez = subexpr( );
op = getKeyWord( expresie + cursor );
while( op == 1 ) { // OR
cursor += 2;
ignoreSpace( );
var = subexpr( );
rez = rez || var;
op = getKeyWord( expresie + cursor );
}
return rez;
}
//citim o variabila
char variabila( ) {
int key;
char rez;
key = getKeyWord( expresie + cursor );
if( key == 5 && isAlfa( expresie[ cursor ] ) ) { // variabila de forma A , B , C , ... sau Z
rez = var[ expresie[ cursor ] - 'A' ];
cursor++;
ignoreSpace( );
} else if( key == 5 ) { // paranteza
ignoreSpace( );
rez = expr( );
ignoreSpace( );
} else if( key == 3 ) { // TRUE
rez = 1;
cursor += 4;
ignoreSpace( );
} else if( key == 4 ) { // FALSE
rez = 0;
cursor += 5;
ignoreSpace( );
} else { //NOT
cursor = cursor + 3;
ignoreSpace( );
rez = !variabila( );
}
return rez;
}
int main() {
int n , i;
char c;
FILE *fin = fopen( "bool.in" , "r" );
cursor = 0;
//citim toata expresia
expresie[ cursor ] = fgetc( fin );
while( expresie[ cursor ] != '\n' ) {
cursor++;
expresie[ cursor ] = fgetc( fin );
}
FILE *fout = fopen( "bool.out" , "w" );
//citim n si ignoram spatiile dupa n
fscanf( fin , "%d" , &n );
c = fgetc( fin );
while( c != '\n' )
c = fgetc( fin );
//citim fiecare schimbare in parte
for( i = 0 ; i < n ; i++ ) {
c = fgetc( fin );
var[ c - 'A' ] = !var[ c - 'A' ];//modificam variabila respectiva
cursor = -1;//setam cursorul la inceputul expresiei
ignoreSpace( );
fprintf( fout , "%d" , expr( ) );//analizam expresia
}
fclose( fin );
fclose( fout );
return 0;
}
/*
expr = subexpr ( "OR" + subexpr )*
subexpr = variabila ( "AND" + variabila )
operator = "AND"
"OR"
variabila = 'A' ... 'Z'
'(' expr ')'
"TRUE"
"FALSE"
"NOT" + variabila
*/