Pagini recente » Cod sursa (job #411526) | Cod sursa (job #1231170) | Cod sursa (job #677824) | Cod sursa (job #528102) | Cod sursa (job #67515)
Cod sursa(job #67515)
#include <stdio.h>
#include <string.h>
#define MAX_N (1 << 17)
typedef long long real;
int N, i;
real V[64];
char A[MAX_N];
real expresie(void);
real termen(void);
real factor(void);
real expresie(void)
{
real ret = termen();
char sgn;
while( i < N && (A[i] == '+' || A[i] == '-') )
{
sgn = A[i++];
if(sgn == '+')
ret += termen();
else
ret -= termen();
}
return ret;
}
real termen(void)
{
real ret = factor();
while(i < N && A[i] == '*')
i++, ret *= factor();
return ret;
}
real factor(void)
{
int t = 0;
real ret;
if(A[i] >= 'a' && A[i] <= 'z')
{
ret = V[A[i]-'a'];
i++;
return ret;
}
if(A[i] == '(')
{
i++, ret = expresie(), i++;
return ret;
}
if(A[i] == '[')
{
i++, ret = expresie(), i++;
return ret*ret;
}
while(A[i] == '+' || A[i] == '-')
t += (A[i] == '-'), i++;
ret = factor();
if(t&1)
ret *= (-1);
return ret;
}
void read_and_solve(void)
{
int j, k, P, sgn;
real ret;
char sir[1024];
scanf("%d\n", &P);
for(j = 0; j < P; j++)
scanf("%lld\n", &V[j]);
scanf("%s\n", &A), N = strlen(A);
ret = expresie();
printf("%lld\n", ret);
}
int main(void)
{
freopen("eval.in", "rt", stdin);
freopen("eval.out", "wt", stdout);
read_and_solve();
return 0;
}