Pagini recente » Borderou de evaluare (job #1816777) | Cod sursa (job #2170787) | Cod sursa (job #3345151) | Cod sursa (job #3000979) | Cod sursa (job #3326545)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
char s[100005];
int suma(int st,int dr);
int produs(int st,int dr);
int paranteza(int st,int dr);
int suma(int st,int dr){
int ans=0;
bool ok=0;
for(int i=st;i<=dr;i++){
int nr=0;
for(int j=i;j<=dr;j++){
if(s[j]=='(') nr++;
if(s[j]==')') nr--;
if((s[j]=='+'||s[j]=='-')&&nr==0){
if(s[i-1]=='-') ans-=produs(i,j-1);
else ans+=produs(i,j-1);
i=j;
ok=1;
break;
}
if(j==dr){
if(s[i-1]=='-') ans-=produs(i,j);
else ans+=produs(i,j);
i=j;
ok=1;
break;
}
}
}
if(ok==0) return produs(st,dr);
return ans;
}
int produs(int st,int dr){
int ans=1;
bool ok=0;
for(int i=st;i<=dr;i++){
int nr=0;
for(int j=i;j<=dr;j++){
if(s[j]=='(') nr++;
if(s[j]==')') nr--;
if((s[j]=='*'||s[j]=='/')&&nr==0){
if(s[i-1]=='/') ans/=paranteza(i,j-1);
else ans*=paranteza(i,j-1);
ok=1;
i=j;
break;
}
if(j==dr){
if(s[i-1]=='/') ans/=paranteza(i,j);
else ans*=paranteza(i,j);
ok=1;
i=j;
break;
}
}
}
if(ok==0) return paranteza(st,dr);
return ans;
}
int paranteza(int st,int dr){
bool ok=1;
int nr=0;
for(int i=st;i<=dr;i++){
if(s[i]<48||s[i]>57){
ok=0;
break;
}
nr=nr*10+s[i]-'0';
}
if(ok==1) return nr;
else return suma(st+1,dr-1);
}
int main()
{
cin>>s;
int nr=1;
int n=strlen(s);
cout<<suma(0,n-1);
return 0;
}