Pagini recente » Cod sursa (job #1120461) | Cod sursa (job #1250594) | Cod sursa (job #2742822) | Cod sursa (job #2694419) | Cod sursa (job #2815927)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
char s[100005];
int verifparanteze(int st, int dr)
{
int p=0;
for(int i=st;i<=dr;i++)
{
if(s[i]==')')
p--;
else if(s[i]=='(')
p++;
if(p<0)
return 0;
}
return p==0;
}
int formarenumar(int st, int dr)
{
int nr=0;
for(int i=st;i<=dr;i++)
{
int c=s[i]-'0';
nr=nr*10+c;
}
return nr;
}
int semn(int st,int dr, char semn1,char semn2)
{
int p=0; //paranteze
for(int i=dr;i>=st;i--)
{
if(s[i]==')')
p--;
else if(s[i]=='(')
p++;
else
if((s[i]==semn1 || s[i]==semn2)&&p==0)
return i;
}
return -1;
}
int eval(int st, int dr)
{
if(s[st]=='(' && s[dr]==')')
if(verifparanteze(st+1,dr-1))
{
return eval(st+1,dr-1);
}
int p=semn(st,dr,'+','-'); //pozitie semn
if(p==-1)
{
p=semn(st,dr,'*','/');
}
if(p==-1)
return formarenumar(st,dr);
switch(s[p])
{
case '+':
return eval(st,p-1)+eval(p+1,dr);
case '-':
return eval(st,p-1)-eval(p+1,dr);
case '/':
return eval(st,p-1)/eval(p+1,dr);
case '*':
return eval(st,p-1)*eval(p+1,dr);
}
}
int main()
{
fin>>s;
fout<<eval(0,strlen(s)-1);
return 0;
}