Pagini recente » Cod sursa (job #793836) | Cod sursa (job #1650560) | Cod sursa (job #1026281) | Cod sursa (job #2279227) | Cod sursa (job #3276380)
#include <bits/stdc++.h>
using namespace std;
const int L_MAX = 1e5 + 5;
char s[L_MAX];
int p = 0;
void SetInput(string name)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
(void)!freopen((name + ".in").c_str(), "r", stdin);
(void)!freopen((name + ".out").c_str(), "w", stdout);
}
int Factor();
int Termen();
int Eval() /// aduna / scade operatii simplificate din interiorul ulei paranteze
{
int r = Termen();
while(s[p] == '+' || s[p] == '-')
if(s[p] == '+')
{
p++;
r += Termen();
}
else /// s[p] == '-'
{
p++;
r -= Termen();
}
return r;
}
int Termen() /// inmulteste / impartieste numere
{
int r = Factor();
while(s[p] == '*' || s[p] == '/')
if(s[p] == '*')
{
p++;
r *= Factor();
}
else /// s[p] == '/'
{
p++;
r /= Factor();
}
return r;
}
int Factor() /// returneaza urmatorul numar, sau expresie daca este cazul
{
int r = 0;
if(s[p] == '(') /// incepe o noua paranteza
{
p++;
r = Eval();
p++;
}
else
{
while(s[p] >= '0' && s[p] <= '9')
{
r = r * 10 + s[p] - '0';
p++;
}
}
cerr << p << ' ' << r << '\n';
return r;
}
void ReadInput()
{
cin.getline(s, L_MAX);
}
int main()
{
SetInput("evaluare");
ReadInput();
cout << Eval();
return 0;
}