Cod sursa(job #2739043)

Utilizator avtobusAvtobus avtobus Data 6 aprilie 2021 18:46:28
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < (int)(n); i++)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

ifstream fin {"evaluare.in"};
ofstream fout {"evaluare.out"};

string s;

int eval(size_t &pos);
int termen(size_t &pos);
int factor(size_t &pos);

inline int calc(int a, int b, char op) {
  int res = 0;
  switch(op) {
    case '+':
      res = a+b; break;
    case '-':
      res = a-b; break;
    case '*':
      res = a*b; break;
    case '/':
      res = a/b; break;
  }
  return res;
}

int eval(size_t &pos) {
  int res = termen(pos);
  while(pos < s.size() && (s[pos] == '+' || s[pos] == '-')) {
    char op = s[pos];
    ++pos;
    res = calc(res, termen(pos), op);
  }
  return res;
}

int termen(size_t &pos) {
  int res = factor(pos);
  while(pos < s.size() && (s[pos] == '*' || s[pos] == '/')) {
    char op = s[pos];
    ++pos;
    res = calc(res, factor(pos), op);
  }
  return res;
}

int factor(size_t &pos) {
  int res = 0;
  if (pos >= s.size()) { return res; /* this is an error */ }
  if ('0' <= s[pos] && s[pos] <= '9') {
    while(pos < s.size() && '0' <= s[pos] && s[pos] <= '9') {
      res = res * 10 + s[pos] - '0';
      ++pos;
    }
  } else if (s[pos] == '(') {
    ++pos;
    res = eval(pos);
    ++pos;
  }
  return res;
}

int main(void) {
  // freopen("evaluare.in", "r", stdin);
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL);

  fin >> s;
  size_t pos = 0;
  auto ans = eval(pos);
  fout << ans << '\n';

  return 0;
}