Cod sursa(job #1243136)

Utilizator danny794Dan Danaila danny794 Data 15 octombrie 2014 16:58:19
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>

#define NMAX 100005
#define isDigit(x) ((x) >= '0' && (x) <= '9')

using namespace std;

char expr[NMAX];

int solve(int &pos);

int parseInt(int &pos)
{
  int res = 0;
  while(isDigit(expr[pos]))
  {
    res = res * 10 + expr[pos] - '0';
    pos++;
  }
  return res;
}

int compute(int a, int b, char c)
{
  switch(c){
    case '+' : return a + b;
    case '-' : return a - b;
    case '*' : return a * b;
    case '/' : return a / b;
    default  : return 0;
  }
}

int getFirstThing(int &pos, char prev)
{
  int res = 0;

  if(isDigit(expr[pos]))
    res = parseInt(pos);
  else if(expr[pos] == '(')
  {
    pos++;
    res = solve(pos);
  }

  if(prev == '*' || prev == '/')
    return res;

  if(expr[pos] == '*')
  {
    pos++;
    return res * getFirstThing(pos, '*');
  }
  else if(expr[pos] == '/')
  {
    pos++;
    return res / getFirstThing(pos, '/');
  }

  return res;
}

int solve(int &pos)
{
  int a = 0, b = 0;
  char c = '+';
  while(c != '\0' && c != ')')
  {
    b = getFirstThing(pos, c);
    switch(c)
    {
      case '+' : a += b; break;
      case '-' : a -= b; break;
      case '*' : a *= b; break;
      case '/' : a /= b; break;
    }
    c = expr[pos];
    pos++;
  }

  return a;
}

void read()
{
  freopen("evaluare.in", "r", stdin);
  freopen("evaluare.out", "w", stdout);
  scanf("%s", expr);
}

int main() {
  int pos = 0;
  read();
  int rez = solve(pos);
  printf("%d", rez);
	return 0;
}