Pagini recente » Cod sursa (job #1530079) | Cod sursa (job #359819) | Cod sursa (job #138867) | Cod sursa (job #1465482) | Cod sursa (job #2111646)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char sir[100005];
int st, dr, p;
void verifparanteze(int &st, int &dr)
{
int nr=0, ok=1;
while (sir[st]=='(' && sir[dr]==')' && nr==0 && ok==1)
{
nr=0;
for (int i=st+1; i<=dr-1; i++)
{
if (sir[i]==')')
nr--;
else if (sir[i]=='(')
nr++;
if (nr<0)
ok=0;
}
if (nr==0 && ok==1)
st++,dr--;
}
}
int cautare(char c1, char c2, int st, int dr)
{
int nr=0;
for (int i=dr; i>=st; i--)
{
if (sir[i]==')')
nr--;
else if (sir[i]=='(')
nr++;
if ((sir[i]==c1 || sir[i]==c2)&& nr==0)
return i;
}
return -1;
}
int chrtoint(int st, int dr)
{
int aux=0;
for (int i=st; i<=dr; i++)
{
aux=aux*10+(sir[i]-'0');
}
return aux;
}
int evaluare(int st, int dr)
{
verifparanteze(st,dr);
int p=cautare('+','-',st,dr);
if (p==-1)
{
p=cautare('*','/',st,dr);
if (p==-1)
{
return chrtoint(st, dr);
}
}
int v1=evaluare(st,p-1);
int v2=evaluare(p+1,dr);
switch(sir[p])
{
case '+':return v1+v2;
case '-':return v1-v2;
case '*':return v1*v2;
case '/':return v1/v2;
}
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
fgets(sir,100001,stdin);
int n=strlen(sir);
if (sir[n-1]=='\n')
{
sir[n-1]=='\0';
n--;
}
printf("%d",evaluare(0,n-1));
return 0;
}