Cod sursa(job #1661231)

Utilizator TincaMateiTinca Matei TincaMatei Data 23 martie 2016 18:25:57
Problema Bool Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 3.13 kb
#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 

*/