Pagini recente » Cod sursa (job #1614087) | Cod sursa (job #2279404) | Cod sursa (job #2639831) | Cod sursa (job #488649) | Cod sursa (job #2111687)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char a[5000];
void citire()
{
fin.getline(a,1000);
}
int pozitie(char semn1,char semn2,int st, int dr)
{ int nr=0;
for(int i=dr; i>=st; i--)
{
if(a[i]==')')
nr--;
else if(a[i]=='(')
nr++;
if((a[i]==semn1||a[i]==semn2) && nr==0)
return i;
}
return -1;
}
int scp(int st,int dr)
{
int nr=0;
for(int i=st; i<=dr; i++)
{
if(a[i]=='(')
nr++;
if(a[i]==')')
nr--;
if(nr==-1)
{
return 0;
}
}
if(nr==0)
return 1;
else
return 0;
}
void elimpara(int &st,int &dr)
{
while(a[st]=='(' && a[dr]==')')
{
if(scp(st+1,dr-1) == 0)
return;
st++;
dr--;
}
}
int int_str(int st,int dr)
{
int nr=0;
for(int i=st; i<=dr; i++)
{
nr=nr*10+(a[i]-'0');
}
return nr;
}
int eval(int st, int dr)
{
elimpara(st,dr);
int p=pozitie('+','-',st,dr);
if(p==-1)
{
p=pozitie('*','/',st,dr);
if(p==-1)
return int_str(st,dr);
}
int v1=eval(st,p-1);
int v2=eval(p+1,dr);
switch (a[p])
{
case '+':
return v1+v2;
case '-':
return v1-v2;
case '*':
return v1*v2;
case '/':
return v1/v2;
}
return -1;
}
int main()
{
citire();
int st=0;
int dr=strlen(a)-1;
fout<<eval(st,dr);
return 0;
}