Cod sursa(job #1887340)

Utilizator GhiciCineRazvan Dumitriu GhiciCine Data 21 februarie 2017 15:42:24
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
#include <cstdlib>

#define MAXN 100000

using namespace std;

// declarare

char s[MAXN + 5];

int expr( );
int term( );
int fact( );
bool cif( char c );

int i;

// main

int main( ){
  freopen( "evaluare.in", "r", stdin );
  freopen( "evaluare.out", "w", stdout );

  i = 0;
  char c;

  c = fgetc( stdin );
  while( c != '\n' && c != EOF ) { // citeste sirul
    s[i] = c;
    c = fgetc( stdin );
    i++;
  }
  i = 0;
  printf( "%d", expr( ) ); // afiseaza rezultatul expresiei
  return 0;
}

// functii

bool cif( char c ) { // testeaza daca un caracter e cifra
  if( c >= '0' && c <= '9' )
    return true;
  return false;
}

int expr( ) { // evalueaza o expresie
  int rez = term( );
  while( s[i] == '+' || s[i] == '-' ) {
    if( s[i] == '+' )
      i++, rez += term( ); // cauta termenul cu care trebuie sa adune rezultatul
    else
      i++, rez -= term( ); // cauta termenul care trebuie scazut din rezultat
  }
  return rez;
}

int term( ) { // inmulteste un termen cu un factor
  int rez = fact( );
  while( s[i] == '*' || s[i] == '/' ) {
    if( s[i] == '*' )
      i++, rez *= fact( ); // inmulteste termenul cu factorul gasit
    else
      i++, rez /= fact( ); // imparte termenul la factorul gasit
  }
  return rez;
}

int fact( ) { // gaseste factorul cu care trebuie inmultit termenul
  int rez = 0;
  if( s[i] == '(' ) { // daca in loc de factor intalneste o expresie
    i++; // trece peste paranteza deschisa...
    rez = expr( ); // rezolva paranteza
    i++; // trece peste paranteza inchisa...
  } else {
    while( cif( s[i] ) == true ) { // transforma factorul din char in int
      rez = rez * 10 + s[i] - '0';
      i++;
    }
  }
  return rez;
}