Cod sursa(job #1700197)

Utilizator TincaMateiTinca Matei TincaMatei Data 9 mai 2016 19:51:01
Problema Evaluarea unei expresii Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>

FILE *fin , *fout;
char cursor;

void nextChar() {
  cursor = fgetc( fin );
}

//calculeaza un factor care poate fi un numar sau o expresie
/*
Gramatica: fact = ( ('0' | '1' | ... | '9' )+ ) / expr
*/
int fact() {
  int nr;
  nr = 0;
  if( '0' <= cursor && cursor <= '9' ) {//caracterul curent este o cifra,deci tb calculat
    //un numar
    while( '0' <= cursor && cursor <= '9' ) {
      nr = nr * 10 + cursor - '0';
      nextChar();
    }
  } else if( cursor == '(' ) {//caracterul curent este o paranteza, deci tb calculata o expresie
    nextChar();
    nr = expr();
    nextChar();
  }
  return nr;
}

//calculeaza un termen care poate fi un produs
/*
  Gramatica : term = fact + ( '*' / '/' + fact )*
*/
int term() {
  int p , b;
  char semn;
  p = fact();

  while( cursor == '*' || cursor == '/' ) {
    semn = cursor;
    nextChar();
    b = fact();
    if( semn == '*' )
      p *= b;
    else
      p /= b;
  }
  return p;
}

//calculeaza o suma, o expresie
/*
Gramatica : expr = ( term ( '+' / '-' term )* )
*/
int expr( ) {
  int b , s;
  char semn;

  //initializez suma
  s = term( );

  //citesc fiecare termen in parte
  while( cursor != '\n' && cursor != ')' ) {
    semn = cursor;
    nextChar();
    b = term();
    if( semn == '+' )
      s += b;
    else
      s -= b;
  }

  return s;
}

int main(){
  fin = fopen( "evaluare.in" , "r" );
  fout = fopen( "evaluare.out" , "w" );

  cursor = fgetc( fin );

  fprintf( fout , "%d" , expr( ) );

  fclose( fin );
  fclose( fout );
  return 0;
}