Cod sursa(job #2599613)

Utilizator avtobusAvtobus avtobus Data 11 aprilie 2020 16:18:09
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <stdio.h>
#include <bits/stdc++.h>

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

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int INF = 0x3f3f3f3f;

ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

string A;
// indirect recursion. split expression into terms separated by '+', '-'
int eval(const string &A, int &p, int lvl);

// a combination of factors separated by '', '/'
int termen(const string &A, int &p, int lvl);

// factor can be either a number or an expression enclosed in parentheses: '(', ')'
int factor(const string &A, int &p, int lvl);

int eval(const string &A, int &p, int lvl) {
  // cout << string(lvl*2, '-') << "Eval. p=" << p << endl;
  int r = termen(A, p, lvl);
  while(p < A.size() && (A[p] == '-' || A[p] == '+')) {
    if (A[p] == '-') {
      p++;
      r -= termen(A, p, lvl);
    } else { // A[p] == '+'
      p++;
      r += termen(A, p, lvl);
    }
  }
  // cout << string(lvl*2, '-') << "Eval. p="<< p << "; r=" << r << endl;
  return r;
}

int termen(const string &A, int &p, int lvl) {
  // cout << string(lvl*2, '-') << "Termen. p=" << p << endl;
  int r = factor(A, p, lvl);
  while(p < A.size() && (A[p] == '*' || A[p] == '/')) {
    if (A[p] == '*') {
      p++;
      r *= factor(A, p, lvl);
    } else { // A[p] == '/'
      p++;
      r /= factor(A, p, lvl);
    }
  }
  // cout << string(lvl*2, '-') << "Termen. p="<< p << "; r=" << r << endl;
  return r;
}

int factor(const string &A, int &p, int lvl) {
  // cout << string(lvl*2, '-') << "Factor. p=" << p << endl;
  if (p >= A.size()) { return 0; }

  int r = 0;
  if (A[p] == '(') {
    p++;
    r = eval(A, p, lvl+1);
    p++; // A[p] == ')' here
  } else {
    while(p < A.size() && A[p] - '0' >= 0 && A[p] - '0' < 10) {
      r = r*10 + A[p] - '0';
      p++;
    }
  }
  // cout << string(lvl*2, '-') << "Factor. p="<< p << "; r=" << r << endl;
  return r;
}

int main(void) {
  fin >> A;
  int p = 0;
  int res = eval(A, p, 0);

  fout << res << endl;

  return 0;
}