Pagini recente » Cod sursa (job #2356170) | Cod sursa (job #1990033) | Cod sursa (job #647839) | Cod sursa (job #427613) | Cod sursa (job #3214955)
/* Evaluare expresie aritmetica.
Operatori I: +- => Expresie
Operatori II: /* => Termeni
Operatori III: () => Factor
Constante: n ∈ ℕ
Definim:
-Expresie elemente ce urmeaza sa se adune cu prioritate minima
-Termeni elemente cu prioritate II ce sunt continute in expresii mari, ce se impart in factori
-Factori constante sau paranteze (care reprezinta o noua expresie)
Exemplu: (10+(1+1)*13)/8+2*5/3-5 = 2
*/
#include <fstream>
#include <string>
#include <cstring>
#define LL long long
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
// Lucram in scope global cu parcurgerea
string s;
int i = 0; // Observatie: fiecare functie se ocupa cu avansarea contorului doar cand indica operatia specifica
// Functii cu dependență circulară
LL expresie();
LL termen();
LL factor();
LL constanta();
int main()
{
cin >> s;
cout << expresie();
return 0;
}
LL expresie()
{
// primul termen al expresiei
LL e = termen();
while (s[i] == '+' or s[i] == '-')
if (s[i] == '+')
i++, e += termen(); // urmatorul termen
else if (s[i] == '-')
i++, e -= termen(); // urmatorul termen
return e;
}
LL termen()
{
LL t = factor();
while (s[i] == '*' || s[i] == '/')
if (s[i] == '*')
i++, t *= factor();
else if (s[i] == '/')
i++, t /= factor();
return t;
}
LL factor()
{
LL f;
if (s[i] == '(')
{
i++; // sar paranteza deschisa
f = expresie();
i++; // sar paranteza inchisa
}
else
f = constanta();
return f;
}
LL constanta()
{
LL c = 0;
while (isdigit(s[i]))
c = c * 10 + (s[i++] - '0');
return c;
}