Pagini recente » Cod sursa (job #719913) | Cod sursa (job #67726)
Cod sursa(job #67726)
#include <cstdio>
#define Nmax 32
#define Lmax 100005
int n, pos;
int v[Nmax];
char sir[Lmax];
void citire()
{
int i;
scanf("%d\n", &n);
for (i = 1; i <= n; ++i)
scanf("%d\n", &v[i]);
fgets(sir, Lmax, stdin);
}
int evalexp();
int evalterm()
{
int sgn = 1, ret;
while (sir[pos] == '-' || sir[pos] == '+')
{
if (sir[pos] == '-') sgn = -sgn;
++pos;
}
if (sir[pos] == '[')
{
++pos;
ret = evalexp();
++pos;
return ret * ret * sgn;
}
else if (sir[pos] == '(')
{
++pos;
ret = evalexp();
++pos;
}
else if ('a' <= sir[pos] && sir[pos] <= 'z')
{
ret = v[sir[pos] - 'a' + 1];
++pos;
}
return sgn * ret;
}
int evalmul()
{
int ret = 0;
ret = evalterm();
while (sir[pos] == '*')
{
++pos;
ret *= evalterm();
}
return ret;
}
int evalexp()
{
int ret = 0, sgn;
ret = evalmul();
while (sir[pos] == '+' || sir[pos] == '-')
{
if (sir[pos] == '-') sgn = -1;
else sgn = 1;
++pos;
ret += sgn * evalmul();
}
return ret;
}
void solve()
{
int i, ret;
pos = 0;
ret = evalexp();
printf("%d\n", ret);
}
int main()
{
freopen("eval.in", "r", stdin);
freopen("eval.out", "w", stdout);
citire();
solve();
return 0;
}