Pagini recente » Cod sursa (job #2762761) | Cod sursa (job #2840905) | Borderou de evaluare (job #2015764) | Cod sursa (job #2931813) | Cod sursa (job #3248901)
#include <fstream>
#include <string>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
string remove_spaces(const string &s)
{
string ans = "";
for (const char &c : s)
if (c == ' ')
continue;
else
ans += c;
return ans;
}
string read()
{
string answer = "";
f >> answer;
return remove_spaces(answer);
}
int eval(const string &s, int &i);
int termen(const string &s, int &i);
int factor(const string &s, int &i);
/// s = (t1) + (t2) - (t3) + .... + (tk)
int eval(const string &s, int &i)
{
int answer = termen(s, i);
while ((i < (int)s.size()) && (s[i] == '+' || s[i] == '-'))
{
if (s[i] == '+')
++i, answer += termen(s, i);
else
++i, answer -= termen(s, i);
}
return answer;
}
/// t_i = (f1) * (f2) / (f3) * ....
int termen(const string &s, int &i)
{
int answer = factor(s, i);
while ((i < (int)s.size()) && (s[i] == '*' || s[i] == '/'))
{
if (s[i] == '*')
++i, answer *= factor(s, i);
else
++i, answer /= factor(s, i);
}
return answer;
}
int factor(const string &s, int &i)
{
if (i >= (int)s.size())
return 0;
if (s[i] == '(')
{
++i;
int answer = eval(s, i);
/// am ramas pe ')'
++i;
return answer;
}
int nr = 0;
while ((i < (int)s.size()) && (s[i] >= '0' && s[i] <= '9'))
nr = (nr * 10 + (int)(s[i] - '0')), ++i;
return nr;
}
int main()
{
string s = read();
int i = 0;
g << eval(s, i) << '\n';
return 0;
}