Pagini recente » Cod sursa (job #2923125) | Cod sursa (job #1055186) | Cod sursa (job #1634284) | Cod sursa (job #3257329) | Cod sursa (job #2871496)
#include <fstream>
#include <string>
using namespace std;
string::iterator findPair(string::iterator pos)
{
int count = 1;
if (*pos == '(')
{
while (count)
{
++pos;
if (*pos == '(')
++count;
if (*pos == ')')
--count;
}
}
if (*pos == ')')
{
while (count)
{
--pos;
if (*pos == '(')
--count;
if (*pos == ')')
++count;
}
}
return pos;
}
int eval(string::iterator left, string::iterator right)
{
for(auto it = right-1; it > left; --it)
{
if (*it == ')')
{
auto jt = findPair(it);
if (it != right-1 || jt != left)
it=jt;
}
if (*it == '+' || *it == '-')
{
auto lft = it;
auto rht = it + 1;
if (*it == '+')
return eval(left, lft) + eval(rht, right);
else
return eval(left, lft) - eval(rht, right);
}
}
for (auto it = right - 1; it > left; --it)
{
if (*it == ')' && it!= right-1)
{
auto jt = findPair(it);
if (it != right-1 || jt != left)
it=jt;
}
if (*it == '*' || *it == '/')
{
auto lft = it;
auto rht = it + 1;
if (*it == '*')
return eval(left, lft) * eval(rht, right);
else
return eval(left, lft) / eval(rht, right);
}
}
int res = 0;
for (auto it = left; it != right; ++it)
res = res * 10 + (* it - 48);
return res;
}
int main()
{
ifstream in("evaluare.in");
string expr;
in >> expr;
in.close();
ofstream out("evaluare.out");
auto beg = expr.begin();
auto end = expr.end();
out << eval(beg, end);
out.close();
return 0;
}