Pagini recente » Cod sursa (job #1733058) | Cod sursa (job #2154931) | Cod sursa (job #2068322) | Cod sursa (job #54966) | Cod sursa (job #2109925)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
char a[100010], n;
int cautasemn(int st, int dr)
{
int nr=0, poz1=-1, poz2=-1;
for (int i=st; i<=dr; i++)
{
if ((a[i]=='-' || a[i]=='+') && nr==0)
{
poz1=i;
}
if ((a[i]=='*' || a[i]=='/') && nr==0)
{
poz2=i;
}
if (a[i]=='(')
nr++;
if (a[i]==')')
nr--;
}
if (poz1!=-1)
return poz1;
return poz2;
}
int paranteze(int st, int dr)
{
int nr=0, p=0;
for (int i=st; i<=dr; i++)
{
if (nr==0 && p==1)
return 0;
if (a[i]=='(')
{
nr++;
p=1;
}
if (a[i]==')')
nr--;
}
if (p==1)
return 1;
return 0;
}
int valoare(char x)
{
return x-48;
}
int calcul(int x, int y, char a)
{
if (a=='-')
return x-y;
if (a=='+')
return x+y;
if (a=='*')
return x*y;
return x/y;
}
int num(int st, int dr)
{
int numar=0;
for (int i=st; i<=dr; i++)
numar=numar*10+valoare(a[i]);
return numar;
}
int ex(int st, int dr)
{
if (paranteze(st, dr))
return ex(st+1, dr-1);
int semn=cautasemn(st, dr);
if (semn==-1)
return num(st, dr);
int e1=ex(st, semn-1), e2=ex(semn+1, dr);
return calcul(e1, e2, a[semn]);
}
int main()
{
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
fin.getline(a, 100010);
n=strlen(a);
fout << ex(0, n-1);
return 0;
}