Pagini recente » Borderou de evaluare (job #1878462) | Cod sursa (job #2536909) | Cod sursa (job #724410) | Cod sursa (job #2505607) | Cod sursa (job #537108)
Cod sursa(job #537108)
#include<fstream>
#define MAX 100001
using namespace std;
char buf[MAX],semn[MAX];
int v[MAX], ind, inds;
void generate()
{
int i=0,size = strlen(buf),nr = 0,ok = 0;
while(i<size)
{
nr = ok = 0;
while(buf[i]>='0' && buf[i]<='9')
{
ok = 1;
nr = nr*10 + int(buf[i]) - int('0');
++i;
}
if(ok)
v[++ind] = nr;
if(buf[i] != '\n')
semn[++inds] = buf[i++];
else i = size;
}
}
void scoate_semn(int x)
{
for(;x<=inds;++x)
semn[x] = semn[x+1];
--inds;
}
void scoate_nr(int x)
{
for(;x<=ind;++x)
v[x] = v[x+1];
--ind;
}
int solve(int x)
{
int i,ok;
for(i = x;i<=inds;++i)
{
if(semn[i] == '(')
{
scoate_semn(i);
solve(i);
}
}
//* || /
for(i = x;i<=inds && semn[i] != ')';++i)
{
ok = 0;
if(semn[i] == '*')
{
v[i]*=v[i+1];
ok = 1;
}
if(semn[i] == '/')
{
v[i]/=v[i+1];
ok = 1;
}
if(ok)
{
scoate_nr(i+1);
scoate_semn(i);
--i;
}
}
//+ || -
for(i = x;i<=inds && semn[i] != ')';++i)
{
ok = 0;
if(semn[i] == '+')
{
v[i]+=v[i+1];
ok = 1;
}
if(semn[i] == '-')
{
v[i]-=v[i+1];
ok = 1;
}
if(ok)
{
scoate_nr(i+1);
scoate_semn(i);
--i;
}
}
if(semn[i] == ')')
scoate_semn(i);
return v[x];
}
int main()
{
ifstream f("evaluare.in");
f.getline(buf,MAX);
f.close();
generate();
ofstream g("evaluare.out");
g<<solve(1)<<"\n";
g.close();
return 0;
}