Cod sursa(job #1887351)

Utilizator GhiciCineRazvan Dumitriu GhiciCine Data 21 februarie 2017 15:48:09
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
// traiasca sublime text 3
// traiasca macOS si toate macbook-urile mai vechi de 2011 (who needs a touchbar anyway)
// daca sfintii ar fi programatori, ar indenta la 2 spatii

#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 (daca acesta exista; daca nu exista, termenul isi pastreaza valoarea initiala si se revine in functia expr( ), unde este scazut din rezultat
  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 (daca termenul trebuie inmultit cu vreun factor, acesta se cauta. daca trebuie inmultit cu o paranteza, se evalueaza paranteza apoi se inmulteste cu rezultatul acesteia)
  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;
}